Jalur deployment

Ekspor ONNX, serving, dan pengenalan edge deployment.

Daftar isi

Jalur deployment memindahkan model dari notebook Python ke lingkungan yang tidak memiliki Python, dan urutannya adalah ekspor ke format netral, verifikasi numeriknya, lalu melayanannya di belakang sebuah endpoint. Topik ini menjalankan seluruh jalur pada model kecil, mulai dari TorchScript hingga ONNX dan onnxruntime, serta menutupnya dengan gambaran deployment pada perangkat edge. Setelah selesai, perbedaan antara menyimpan checkpoint dan mengekspor model siap-serving menjadi tegas.

Kenapa checkpoint tidak cukup untuk serving#

Checkpoint state_dict yang disimpan pada pelacakan eksperimen hanya berisi bobot, sehingga memuatnya kembali menuntut definisi kelas Python yang persis sama beserta pustaka PyTorch yang cocok. Lingkungan serving nyata jarang memberi jaminan itu, karena server produksi bisa berupa layanan tanpa Python, perangkat edge dengan sumber daya terbatas, atau runtime lain bahasa yang berbeda. Ekspor menyelesaikannya dengan membekukan grafik komputasi beserta bobotnya ke format yang dimaknai runtime tanpa definisi kelasnya.

Dua format menutup sebagian besar kebutuhan. Program ekspor PyTorch lewat torch.export membekukan grafik dalam wujud yang dijalankan runtime PyTorch sendiri, dan cocok bila lingkungan tujuan tetap memakai PyTorch, dengan TorchScript sebagai pendahulunya yang kini tergugur pada PyTorch versi 2.15. ONNX adalah format pertukaran terbuka yang dimaklumi banyak runtime seperti onnxruntime, dan cocok bila lingkungan tujuannya berbeda pustaka maupun bahasa, serta menjadi pintu menuju akselerator khusus inference.

Ekspor torch.export dan verifikasinya#

torch.export menangkap grafik penuh model pada contoh masukan, dan hasilnya disimpan sebagai berkas program yang dimuat ulang tanpa definisi kelas Python. Kode berikut mengekspor model linier kecil, menyimpan programnya, memuatnya kembali, dan memverifikasi kesamaan keluarannya dengan aslinya.

python Contoh: ekspor torch.export dan verifikasi numerik
import torch
import torch.nn as nn

torch.manual_seed(0)
model = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 2))
model.eval()
x = torch.randn(1, 4)
with torch.no_grad():
    y_asli = model(x)
program = torch.export.export(model, (x,))
torch.export.save(program, "model_export.pt2")
muat = torch.export.load("model_export.pt2")
with torch.no_grad():
    y_ekspor = muat.module()(x)
print("keluaran identik:", torch.allclose(y_asli, y_ekspor))
print("bentuk keluaran :", tuple(y_ekspor.shape))
text Keluaran
keluaran identik: True
bentuk keluaran : (1, 2)

Keluaran yang identik menegaskan sifat penting seluruh jalur deployment, yaitu ekspor tidak boleh mengubah angka, dan verifikasi numerik pada beberapa masukan sampel adalah pemeriksaan wajib sebelum berkasnya diteruskan. Berkas yang tersimpan dapat dimuat runtime PyTorch mana pun tanpa definisi kelasnya, dan mode eval sebelum ekspor memastikan perilaku dropout dan batch normalization yang sudah benar, sebagaimana diulang dari modul Disiplin pelatihan.

Ekspor ONNX dan inference onnxruntime#

Ekspor ONNX mengambil grafik yang sama dan menuliskannya ke format pertukaran, lalu onnxruntime menjalankannya tanpa PyTorch sama sekali. Kode berikut mengekspor model yang sama, menjalankannya dengan onnxruntime, dan membandingkan hasilnya dengan PyTorch.

python Contoh: ekspor ONNX dan inference onnxruntime
import torch
import torch.nn as nn
import onnxruntime as ort

torch.manual_seed(0)
model = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 2))
model.eval()
x = torch.randn(1, 4)
with torch.no_grad():
    y_torch = model(x)
torch.onnx.export(model, x, "model.onnx", input_names=["masukan"],
                  output_names=["keluaran"])
sesi = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
y_ort = torch.tensor(sesi.run(None, {"masukan": x.numpy()})[0])
print("selisih maksimum :", float((y_torch - y_ort).abs().max()))
print("bentuk keluaran  :", tuple(y_ort.shape))
text Keluaran
[torch.onnx] Obtain model graph for `Sequential([...]` with `torch.export.export(..., strict=False)`...
[torch.onnx] Obtain model graph for `Sequential([...]` with `torch.export.export(..., strict=False)`... ✅
[torch.onnx] Run decompositions...
[torch.onnx] Run decompositions... ✅
[torch.onnx] Translate the graph into ONNX...
[torch.onnx] Translate the graph into ONNX... ✅
[torch.onnx] Optimize the ONNX graph...
[torch.onnx] Optimize the ONNX graph... ✅
selisih maksimum : 0.0
bentuk keluaran  : (1, 2)

Ekspor ONNX pada PyTorch 2.15 mencetak tahapan penulisannya sendiri sebelum keluaran program, Untuk kasus ini selisih maksimumnya nol terhadap PyTorch, dan perbedaan urutan operasi antar runtime biasanya menyisakan selisih pada orde 10−7 10^{-7} yang dianggap identik untuk keperluan praktis. Berkas model.onnx inilah artefak yang dipakai server produksi, dan sifat berbentuk berkas tunggalnya yang membuat deployment menjadi soal menyalin berkas, bukan menyalin lingkungan pustaka.

Serving, edge, dan pemantauan yang menyertai#

Serving menempatkan artefak di belakang endpoint HTTP, dan keputusan utamanya menyangkut batching serta ukuran instans. Server inference seperti TorchServe dan Triton menangani batching permintaan, pembagian GPU, dan penjaranya, sehingga kebutuhan kode yang ditulis sendiri berkurang ke pemanggilan endpoint. Ukuran instansnya dipilih dari pengukuran throughput dan latensi nyata, dan mixed precision sering diterapkan ulang pada tahap ini untuk memperkecil biayanya.

Deployment edge menurunkan model ke perangkat dengan memori kecil, dan teknik yang menyertainya berupa kuantisasi yang mengecilkan presisi bobot, pemangkasan yang membuang bobot nyaris nol, dan distilasi yang melatih model kecil meniru model besar. Kuantisasi presisi delapan bit adalah titik awal yang paling umum, dan framework onnxruntime menyediakannya pada model ONNX yang sama. Pemantauan yang menyertai semua jalur ini memantau distribusi masukan dan keluaran sebagaimana dibahas pada topik Mode kegagalan, karena model yang terpasang tetap bisa gagal diam-diam jauh setelah lulus verifikasi numeriknya.

Ringkasan#

  • Checkpoint hanya berisi bobot dan menuntut lingkungan Python yang cocok, sedangkan ekspor membekukan grafik beserta bobotnya ke format yang dimaklumi runtime lain.
  • TorchScript dipakai bila runtime-nya tetap PyTorch, dan ONNX menjadi format pertukaran lintas runtime dengan onnxruntime sebagai pemakainya.
  • Verifikasi numerik pada sampel masukan wajib sebelum artefak diteruskan, dengan mode eval sebelum ekspor.
  • Serving menangani batching dan instans melalui server inference, sedangkan edge menuntut kuantisasi, pemangkasan, atau distilasi.

Referensi#