PAI-Blade mempercepat inferensi model PyTorch dengan menerapkan optimasi spesifik perangkat keras melalui satu panggilan Python. Panduan ini menjelaskan alur kerja optimasi lengkap—mulai dari memuat model hingga mengukur hasilnya—menggunakan model ResNet50 pada GPU NVIDIA Tesla T4 sebagai contoh.
Yang akan Anda pelajari:
Cara mengonversi model PyTorch ke format ScriptModule untuk PAI-Blade
Cara memanggil
blade.optimizeserta memahami parameter dan nilai kembalinyaCara membaca laporan optimasi dan mengukur percepatan inferensi
Prasyarat
Sebelum memulai, pastikan Anda telah:
Menginstal paket wheel PyTorch dan PAI-Blade. Lihat Instal PAI-Blade
Memiliki model PyTorch yang telah dilatih. Panduan ini menggunakan model ResNet50 publik dari torchvision
Optimalkan model PyTorch
Langkah 1: Impor dependensi
import os
import time
import torch
import torchvision.models as models
import bladeLangkah 2: Muat dan konversi model
PAI-Blade hanya menerima objek torch.jit.ScriptModule—tidak berfungsi dengan model nn.Module standar. Konversi model Anda menggunakan torch.jit.script sebelum diteruskan ke PAI-Blade.
model = models.resnet50().float().cuda() # Muat model ResNet50.
model = torch.jit.script(model).eval() # Konversi ke ScriptModule.
dummy = torch.rand(1, 3, 224, 224).cuda() # Buat input uji.Langkah 3: Jalankan optimasi
Panggil blade.optimize untuk mengoptimalkan model. Metode ini menerima parameter utama berikut:
| Parameter | Deskripsi | Nilai dalam contoh ini |
|---|---|---|
model | Model yang akan dioptimalkan | model (ScriptModule dalam memori) |
'o1' | Tingkat optimasi. Nilai yang valid: o1 dan o2 | 'o1' |
device_type | Jenis perangkat untuk inferensi. Nilai yang valid: gpu, cpu | 'gpu' |
test_data | Tensor input representatif. Berikan daftar tupel — setiap tupel adalah satu set input | [(dummy,)] |
Untuk referensi parameter lengkap, lihat Metode Python.
optimized_model, opt_spec, report = blade.optimize(
model, # Model yang akan dioptimalkan.
'o1', # Tingkat optimasi.
device_type='gpu', # Jenis perangkat target.
test_data=[(dummy,)], # Data input uji.
)blade.optimize mengembalikan tiga objek:
`optimized_model`: Model yang telah dioptimalkan sebagai objek
torch.jit.ScriptModule, siap untuk inferensi.`opt_spec`: Dependensi eksternal (konfigurasi, variabel lingkungan, file sumber daya) yang diperlukan untuk mereproduksi optimasi. Gunakan pernyataan
withdi Python untuk mengaktifkan dependensi ini.`report`: Laporan optimasi, yang dapat langsung Anda cetak. Lihat Laporan optimasi untuk detail setiap bidang.
Optimasi memerlukan waktu. PAI-Blade menjalankan beberapa fase analisis sebelum menghasilkan model yang dioptimalkan. Kemajuan ditampilkan selama proses optimasi berlangsung:
[Progress] 5%, phase: user_test_data_validation.
[Progress] 10%, phase: test_data_deduction.
[Progress] 15%, phase: CombinedSwitch_4.
[Progress] 95%, phase: model_collecting.Kompilasi ini merupakan biaya satu kali. Setelah optimasi selesai, inferensi dengan optimized_model secara konsisten lebih cepat daripada model aslinya.
Langkah 4: Tinjau laporan optimasi
print("Report: {}".format(report))Laporan tersebut menunjukkan optimasi apa saja yang diterapkan dan pengaruhnya terhadap latensi. Contoh laporan:
{
"optimizations": [
{
"name": "PtTrtPassFp32",
"status": "effective",
"speedup": "1.50", // Rasio percepatan untuk optimasi ini.
"pre_run": "5.29 ms", // Latensi sebelum optimasi.
"post_run": "3.54 ms" // Latensi setelah optimasi.
}
],
"overall": {
"baseline": "5.30 ms", // Latensi model asli.
"optimized": "3.59 ms", // Latensi model yang dioptimalkan.
"speedup": "1.48" // Rasio percepatan end-to-end.
}
}Pada contoh ini, percepatan end-to-end adalah 1,48x—model yang dioptimalkan berjalan dalam 3,59 ms dibandingkan 5,30 ms untuk model aslinya. Periksa "status": "effective" untuk mengidentifikasi pass optimasi mana yang memberikan dampak terukur.
Langkah 5: Ukur performa inferensi
Gunakan fungsi berikut untuk mengukur latensi steady-state baik untuk model asli maupun model yang dioptimalkan. 100 eksekusi pertama digunakan untuk pemanasan GPU; 200 eksekusi berikutnya diukur waktunya.
@torch.no_grad()
def benchmark(model, inp):
for i in range(100): # Pemanasan.
model(inp)
start = time.time()
for i in range(200): # Eksekusi yang diukur.
model(inp)
elapsed_ms = (time.time() - start) * 1000
print("Latency: {:.2f}".format(elapsed_ms / 200))
benchmark(model, dummy) # Model asli.
benchmark(optimized_model, dummy) # Model yang dioptimalkan.Muat model dari file
Pada contoh di atas, model diberikan sebagai torch.jit.ScriptModule dalam memori. Anda juga dapat memberikan path file ke model yang disimpan dengan torch.jit.save:
optimized_model, opt_spec, report = blade.optimize(
'path/to/torch_model.pt', # Path ke file ScriptModule yang disimpan.
'o1',
device_type='gpu',
)Langkah selanjutnya
Setelah optimasi, Anda memiliki tiga opsi untuk menjalankan model:
Inferensi Python: Jalankan
optimized_modellangsung di Python menggunakan API yang sama sepertitorch.jit.ScriptModulelainnya.Terapkan sebagai layanan: Terapkan model yang dioptimalkan ke Elastic Algorithm Service (EAS) di Machine Learning Platform for AI (PAI) untuk serving skala produksi.
Integrasi C++: Gunakan SDK C++ PAI-Blade untuk menyematkan model yang dioptimalkan ke dalam aplikasi Anda sendiri.
Untuk instruksi penerapan, lihat Gunakan SDK untuk menerapkan model PyTorch guna inferensi.
Catatan: Jika Anda memiliki pertanyaan selama proses optimasi, bergabunglah dengan grup DingTalk untuk pengguna PAI-Blade guna menghubungi dukungan teknis. Untuk mendapatkan akses, lihat Dapatkan token akses.