Transformers documentation
Memperluas exporter
Memperluas exporter
torch.export menelusuri model menjadi sebuah graf, tahap-tahap selanjutnya mentransformasi graf tersebut, dan tahap akhir menurunkan atau mengeluarkannya untuk runtime target. Sebagian besar model melewati proses ini tanpa perubahan. Ketika ada pola PyTorch yang tidak dapat ditangani oleh backend, exporter menerapkan workaround kecil pada tahap tersebut alih-alih mengedit model.
Tambahkan solusi sementara dengan menulis satu fungsi dan mendaftarkannya dengan dekorator. Setiap solusi sementara harus ditempatkan pada tahap terendah yang dapat mengekspresikannya dengan jelas.
Perbaikan dan perbaikan
Solusi sementara berupa patch atau fix. Keduanya berbeda dalam hal apakah dapat dibatalkan atau tidak.
| Patch | Perbaiki | |
|---|---|---|
| Fungsinya | Mengganti atribut (op torch, internal ExecuTorch, atau metode model) selama proses ekspor | Menulis ulang graf atau program yang ditelusuri |
| Dibatalkan | Ya, versi asli dipulihkan setelahnya | Tidak, itu memperbaiki artefak sebelum tahap berikutnya dijalankan |
| Daftar dengan | @register_patch(backend, *paths) | @register_fx_node_fix(backend) atau @register_fx_program_fix(backend) |
Keduanya berada di registry di exporters/utils.py, dan exporter menginstal semua yang terdaftar untuk backend-nya pada tahap yang tepat.
Gunakan patch ketika masalahnya adalah bug lowering pada satu backend: terjemahan ONNX yang hilang, keanehan validasi ORT, atau dekomposisi FX yang menghasilkan op mati. Workaround tetap berada di exporter, dan kode modeling tetap bersih.
Ketika blok pola diekspor ke beberapa backend, seperti loop yang bergantung pada data, cache stateful di luar Cache, atau perhatian split-loop yang ditulis manual, perbaiki modelnya. Memperbaikinya sekali di dalam model akan membantu semua exporter.
Tambahkan patch
Misalkan sebuah metode model melakukan sesuatu yang tidak dapat ditelusuri oleh torch.export. NllbMoeTop2Router._cast_classifier dari NLLB-MoE mengubah bobot klasifikator ke dtype lain, yang tidak dapat ditelusuri. Ganti dengan no-op selama proses ekspor berlangsung.
Tulis sebuah factory yang menerima metode asli dan mengembalikan penggantinya, lalu daftarkan factory tersebut terhadap jalur bertitik (dotted path) metode tersebut:
from transformers.exporters.utils import register_patch
@register_patch("dynamo", "transformers.models.nllb_moe.modeling_nllb_moe.NllbMoeTop2Router._cast_classifier")
def _patch_classifier_cast(_original):
# Replace the untraceable dtype cast with a no-op during export.
return lambda self, *args, **kwargs: NoneEksporertukar metode sebelum pelacakan dan memulihkannya setelahnya, sehingga patch hanya memengaruhi ekspor. Beberapa variasi:
- Lewati jalur tambahan untuk berbagi satu pabrik di antara beberapa titik pemanggilan, misalnya
@register_patch("dynamo", path_a, path_b). - Patch sebuah op
torchdengan menunjuk path ke op tersebut, misalnya@register_patch("onnx", "torch.where"). Factory menerima op asli sebagai argumennya, sehingga penggantian dapat memanggilnya. - Tulis perbaikan (fix) alih-alih tambalan (patch) ketika Anda perlu menulis ulang graf setelah pelacakan (tracing). Mekanismenya sama, yaitu fungsi yang didekorasi di dalam registry yang sesuai.
Referensi tahap
Sumber setiap exporter menandai tahapannya sebagai blok komentar # ── Stage N: … ──, sehingga file dan referensi ini selaras. Lihat di sana untuk operasi dan kelas persis yang ditangani oleh setiap tahap.
DynamoExporter
Ekspor dasar menjalankan satu tahap patch dan empat helper, secara berurutan, di dalam DynamoExporter.export (lihat exporter_dynamo.py).
- Patch tanda tangan forward: memberikan
model.forwardtanda tangan argumen datar agartorch.exporttidak membundel input menjadi satu tuple**kwargs. Ini bersifat internal dan bukan titik ekstensi. - Patch model: ganti metode model yang tidak dapat dilacak dengan padanan yang aman untuk ekspor selama pelacakan. Perluas dengan
@register_patch("dynamo", ...). - Pendaftaran Pytree: daftarkan setiap
CachedanModelOutputagartorch.exportdapat meratakan dan membangunnya kembali (biasanya terjadi secara otomatis). Tambahkan cabang ke_flatten_to_context/_unflatten_from_contextuntuk tipe yang tidak dapat dijangkau oleh penelusuran atribut. - Bentuk dinamis: tetapkan
Dim.AUTOke setiap tensor dan cache daun ketikadynamic=True. Timpa denganDynamoConfig.dynamic_shapes. - Bersihkan state: reset atribut tensor yang diset model di dalam
forwardyang ditinggalkantorch.exportsebagai tensor palsu. Perluas dengan menambahkan nama atribut ke_STATEFUL_CACHE_ATTRS.
OnnxExporter
OnnxExporter menambahkan lima tahap di sekitar torch.onnx.export (lihat exporter_onnx.py).
Cari daftar lengkap patch di file tersebut:
grep -nE "^def (_patch_|_fix_|_aten_)" src/transformers/exporters/exporter_onnx.py- Patch Torch: ganti ops
torchyang tidak dapat diterjemahkan apa adanya oleh exporter ONNX. Perluas dengan@register_patch("onnx", ...). - Perbaikan ONNX: jalankan ulang perbaikan node setelah
run_decompositionssehingga node shape-guard yang baru diperkenalkan diperbaiki sebelum lowering. Menggunakan registry@register_patch("onnx", ...)yang sama. - Perbaikan node FX: menulis ulang node graph yang tidak dapat diturunkan oleh exporter ONNX, seperti operasi alias, view in-place, dan assert mati. Perluas dengan
@register_fx_node_fix("onnx"). - Terjemahan ONNX: sediakan lowering kustom untuk op aten di mana default tidak ada atau memiliki bug (misalnya
aten.index_putatauaten._grouped_mm). Tambahkan fungsi_aten_*ke_ONNX_TRANSLATION_TABLE. - Perbaikan ONNX IR: tulis ulang program ONNX yang sudah selesai untuk menghindari bug ONNX Runtime (misalnya memaksa
TopK(sorted=True)). Tambahkan fungsi_fix_ir_*ke_IR_FIXES.
ExecutorchExporter
ExecutorchExporter menambahkan lima tahap di sekitar to_edge_transform_and_lower dan to_executorch,
dimulai dengan persiapan backend (lihat exporter_executorch.py).
- Persiapan backend: pindahkan model ke perangkat dan dtype target serta pilih partisionernya (
prepare_for_xnnpack,prepare_for_cuda). Tambahkan backend dengan mendaftarkanprepare_for_<name>di_BACKEND_PREPARE. - Patch Torch: ganti ops
torchyang tidak dapat diterima oleh backend ExecuTorch, sepertisplit_copy,chunk, dantopk(k>dim). Perluas dengan@register_patch("executorch", ...). - Patch ExecuTorch: mengganti bagian internal ExecuTorch yang menyebabkan crash pada graf bentuk dinamis yang valid. Menggunakan registry
@register_patch("executorch", ...)yang sama. - Perbaikan program FX: perbaiki program yang diekspor di mana perbaikan memerlukan konteks program keseluruhan, seperti memperlebar batasan rentang atau mengisi metadata placeholder yang hilang. Perluas dengan
@register_fx_program_fix("executorch"). - Perbaikan node FX: menulis ulang node individual, seperti memetakan operasi sim Python ke
executorch_prim.*atau menulis ulangpowsebagai rantaimul. Perluas dengan@register_fx_node_fix("executorch").
Solusi sementara yang diketahui di hulu
Beberapa kelas model mengalami bug yang terkonfirmasi pada optimizer graf onnxscript (constant folding yang crash pada SplitToSequence, inisialisasi FPN yang hilang). ONNX_DISABLE_OPTIMIZE menonaktifkan optimasi onnxscript untuk model-model tersebut. Setiap entri mencatat masalah upstream di samping nama model. Daftar ini diharapkan menyusut seiring dengan perbaikan bug upstream, sehingga entri baru harus merujuk pada bug upstream yang spesifik, bukan sekadar menonaktifkan optimasi secara sewenang-wenang.
EXPORT_SKIPS, opsi untuk mengecualikan sejumlah kelas model dari proses ekspor secara keseluruhan ketika model tersebut secara fundamental tidak dapat diekspor apa adanya (alur kontrol yang bergantung pada data yang tidak dapat divektorisasi, atau modul yang diperlakukan sebagai argumen forward). Setiap entri membawa alasan yang menyebutkan perubahan sisi model yang diperlukan. Daftar ini juga diharapkan menyusut, bukan bertambah.
Update on GitHub