Pendahuluan
Dalam artikel ini, saya akan membahas proses konversi model PyTorch ke format ONNX, memeriksa model yang telah dikonversi, dan melakukan inferensi menggunakan model ONNX.
Menyiapkan Model Anda
Mari persiapkan model.
Menginstal Dependensi
Untuk memulai, instal paket yang dibutuhkan menggunakan pip:
$ pip install torch onnx onnxruntime
Memuat Model PyTorch yang Telah Dilatih Sebelumnya
Untuk contoh ini, mari gunakan model ResNet-18 yang sudah dilatih pada ImageNet:
import torch
import torchvision.models as models
model = models.resnet18(pretrained=True)
model.eval()
Mengonversi Model PyTorch ke ONNX
Proses konversi melibatkan ekspor model, menetapkan dimensi masukan dan keluaran model, dan menyimpan model dalam format ONNX.
Mengekspor Model
Langkah pertama dalam mengonversi model PyTorch ke format ONNX adalah mengekspor model menggunakan fungsi torch.onnx.export()
. Fungsi ini membutuhkan parameter berikut:
model
: Model PyTorch yang ingin Anda konversi.args
: Sebuah tupel yang berisi tensor masukan yang digunakan untuk melacak model. Ini dapat menjadi satu tensor masukan atau tupel dari tensor masukan jika model memiliki beberapa masukan.f
: Objek berupa file atau string yang berisi jalur ke file ONNX keluaran.
Berikut contoh mengekspor model ResNet-18 yang sudah dilatih sebelumnya:
import torch
import torchvision.models as models
# Load the pretrained ResNet-18 model
model = models.resnet18(pretrained=True)
model.eval()
# Create a dummy input tensor with the expected input shape
dummy_input = torch.randn(1, 3, 224, 224)
# Export the model to ONNX format
onnx_model_path = "resnet18.onnx"
torch.onnx.export(model, dummy_input, onnx_model_path)
Menetapkan Dimensi Masukan dan Keluaran Model
Secara default, model ONNX yang diekspor akan memiliki nama masukan dan keluaran yang ditugaskan secara otomatis. Namun, disarankan untuk memberikan nama yang bermakna untuk tensor masukan dan keluaran, karena ini akan memudahkan dalam penggunaan model di kemudian hari.
Anda dapat menetapkan nama masukan dan keluaran dengan melewati parameter input_names
dan output_names
ke fungsi torch.onnx.export()
, seperti ini:
input_names = ["input"]
output_names = ["output"]
torch.onnx.export(model, dummy_input, onnx_model_path, input_names=input_names, output_names=output_names)
Selain itu, Anda dapat menentukan sumbu dinamis untuk tensor masukan dan keluaran jika model Anda mendukung dimensi masukan yang variabel. Untuk melakukannya, lewati parameter dynamic_axes
ke fungsi torch.onnx.export()
:
dynamic_axes = {
"input": {0: "batch_size", 2: "height", 3: "width"},
"output": {0: "batch_size"}
}
torch.onnx.export(model, dummy_input, onnx_model_path, input_names=input_names, output_names=output_names, dynamic_axes=dynamic_axes)
Dalam contoh ini, kamus sumbu dinamis menentukan bahwa tensor masukan memiliki dimensi yang variabel untuk ukuran batch, tinggi, dan lebar, sedangkan tensor keluaran memiliki dimensi ukuran batch yang variabel.
Memeriksa Model ONNX
Kita akan memberikan penjelasan tentang cara memeriksa model ONNX yang telah dikonversi. Ini termasuk memverifikasi konversi model dan memeriksa lapisan model.
Memverifikasi Konversi Model
Setelah mengonversi model PyTorch ke format ONNX, penting untuk memverifikasi bahwa konversi berhasil. Pustaka ONNX menyediakan fungsi check_model()
untuk memeriksa apakah model valid sesuai dengan spesifikasi ONNX.
Untuk memverifikasi konversi model, ikuti langkah-langkah ini:
- Muat model ONNX menggunakan fungsi
onnx.load()
. - Periksa model menggunakan fungsi
onnx.checker.check_model()
. - Cetak pesan kesuksesan jika model lulus pemeriksaan.
Berikut contoh:
import onnx
onnx_model_path = "resnet18.onnx"
onnx_model = onnx.load(onnx_model_path)
# Check if the ONNX model is valid
onnx.checker.check_model(onnx_model)
print("Model has been successfully converted!")
Memeriksa Lapisan Model
Menginspeksi lapisan model ONNX yang telah dikonversi dapat membantu untuk memastikan bahwa lapisan-lapisannya cocok dengan model PyTorch asli. Pustaka ONNX menyediakan fungsi printable_graph()
untuk menampilkan grafik model dalam format yang mudah dibaca manusia.
Untuk menginspeksi lapisan-lapisan model ONNX, ikuti langkah-langkah ini:
- Muat model ONNX menggunakan fungsi
onnx.load()
(jika Anda belum melakukannya). - Dapatkan representasi grafik model yang dapat dicetak dengan menggunakan fungsi
onnx.helper.printable_graph()
. - Cetak grafik model.
Berikut contoh:
import onnx
onnx_model_path = "resnet18.onnx"
onnx_model = onnx.load(onnx_model_path)
# Print a human-readable representation of the ONNX model graph
printable_graph = onnx.helper.printable_graph(onnx_model.graph)
print(printable_graph)
Ini akan mencetak lapisan-lapisan model dan nama tensor masukan dan keluarannya. Anda dapat membandingkan hasil ini dengan model PyTorch asli untuk memastikan bahwa model ONNX adalah representasi yang benar dari model PyTorch Anda.
Inferensi dengan Model ONNX yang Telah Dikonversi
Saya akan menunjukkan cara melakukan inferensi dengan model ONNX yang telah dikonversi. Ini termasuk memuat model ONNX, memproses masukan, menjalankan inferensi, dan memproses hasil.
Memuat Model ONNX
Untuk melakukan inferensi dengan model ONNX, Anda perlu menggunakan pustaka ONNX Runtime. ONNX Runtime adalah mesin inferensi berkinerja tinggi untuk model ONNX, dirancang untuk kompatibel dengan berbagai platform dan perangkat.
Untuk memuat model ONNX menggunakan ONNX Runtime, ikuti langkah-langkah ini:
- Impor paket
onnxruntime
. - Buat objek
InferenceSession
dengan melewati jalur file model ONNX ke konstruktoronnxruntime.InferenceSession()
.
Berikut contoh:
import onnxruntime
onnx_model_path = "resnet18.onnx"
session = onnxruntime.InferenceSession(onnx_model_path)
Memproses Masukan
Sebelum menjalankan inferensi dengan model ONNX, Anda perlu memproses data masukan agar sesuai dengan persyaratan masukan model. Biasanya, ini melibatkan memuat dan mengubah ukuran gambar masukan, mengonversinya menjadi tensor, normalisasi nilai piksel, dan memperluas dimensi untuk sesuai dengan ukuran batch yang diharapkan.
Berikut contoh pengolahan pra-inferensi dari gambar masukan untuk model ResNet-18:
# Load and preprocess an image
from PIL import Image
import torchvision.transforms as transforms
image_path = "example_image.jpg"
image = Image.open(image_path).convert("RGB")
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(image)
input_batch = input_tensor.unsqueeze(0)
Menjalankan Inferensi dan Memproses Hasil
Setelah data masukan diproses, Anda dapat menjalankan inferensi menggunakan metode run()
dari objek InferenceSession
. Metode run()
mengambil parameter berikut:
output_names
: Daftar nama tensor keluaran model.input_feed
: Kamus pemetaan nama tensor masukan ke data masukan yang sesuai.
Berikut contoh menjalankan inferensi:
import numpy as np
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# Run inference
outputs = session.run([output_name], {input_name: input_batch.numpy()})
# Postprocess the results
output_array = np.array(outputs[0])
predicted_class = np.argmax(output_array)
print("Predicted class:", predicted_class)
Sekarang Anda dapat menjalankan inferensi menggunakan model ONNX yang telah dikonversi seperti halnya dengan model PyTorch.
Referensi