Traffine I/O

Bahasa Indonesia

2023-03-05

Konversi dan Inferensi Model PyTorch dengan ONNX

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:

python
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:

python
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:

python
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():

python
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:

  1. Muat model ONNX menggunakan fungsi onnx.load().
  2. Periksa model menggunakan fungsi onnx.checker.check_model().
  3. Cetak pesan kesuksesan jika model lulus pemeriksaan.

Berikut contoh:

python
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:

  1. Muat model ONNX menggunakan fungsi onnx.load() (jika Anda belum melakukannya).
  2. Dapatkan representasi grafik model yang dapat dicetak dengan menggunakan fungsi onnx.helper.printable_graph().
  3. Cetak grafik model.

Berikut contoh:

python
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:

  1. Impor paket onnxruntime.
  2. Buat objek InferenceSession dengan melewati jalur file model ONNX ke konstruktor onnxruntime.InferenceSession().

Berikut contoh:

python
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:

python
# 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

https://pytorch.org/docs/stable/onnx.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!