Traffine I/O

Bahasa Indonesia

2023-03-06

Konversi Model TensorFlow dan Inferensi dengan ONNX

Pendahuluan

Dalam artikel ini, saya akan membahas cara mengonversi model TensorFlow ke format ONNX, memeriksa model yang telah dikonversi, dan melakukan inferensi menggunakan model ONNX.

Persiapan Model TensorFlow

Dalam bab ini, saya akan membahas instalasi dependensi yang diperlukan, pengunduhan model.

Menginstal Dependensi

Sebelum memulai, pastikan Anda telah menginstal Python 3.6 atau yang lebih tinggi di sistem Anda. Kemudian, instal paket yang diperlukan untuk TensorFlow dan tf2onnx menggunakan pip:

bash
$ pip install tensorflow
$ pip install tf2onnx

Memuat Model

Untuk memuat model TensorFlow, Anda dapat menggunakan fungsi load_model dari modul tensorflow.keras.models. Fungsi ini dapat menangani format SavedModel dan format HDF5.

Untuk SavedModel, berikan path ke direktori yang berisi model:

python
import tensorflow as tf

model_path = "path/to/your/tensorflow/saved_model"
model = tf.keras.models.load_model(model_path)

Untuk model HDF5, berikan path ke file .h5:

python
model_path = "path/to/your/tensorflow/model.h5"
model = tf.keras.models.load_model(model_path)

Jika model Anda memiliki layer atau komponen khusus, Anda mungkin perlu menyediakan kamus custom_objects ke dalam fungsi load_model:

python
custom_objects = {
    'CustomLayer': CustomLayer,
    'custom_metric': custom_metric
}

model = tf.keras.models.load_model(model_path, custom_objects=custom_objects)

Mengonversi Model ke Format ONNX

Dalam bab ini, saya akan menjelajahi proses mengonversi model TensorFlow ke format ONNX menggunakan perpustakaan tf2onnx. Kita akan membahas proses konversi, opsi kustomisasi.

Melakukan Konversi dengan tf2onnx

Untuk mengonversi model TensorFlow ke format ONNX, kita akan menggunakan fungsi convert.from_keras dari modul tf2onnx. Fungsi ini mengambil model TensorFlow sebagai argumen utamanya dan mengembalikan objek protobuf yang mewakili model ONNX:

python
import tf2onnx

# Perform the conversion
model_proto, _ = tf2onnx.convert.from_keras(model)

Selanjutnya, simpan objek protobuf sebagai file ONNX:

python
output_onnx_model = "path/to/output/onnx/model.onnx"

with open(output_onnx_model, "wb") as f:
    f.write(model_proto.SerializeToString())

Menyesuaikan Proses Konversi

Anda dapat menyesuaikan proses konversi dengan menyediakan argumen tambahan untuk fungsi from_keras(). Beberapa argumen yang sering digunakan adalah:

  • target_opset: Tentukan versi opset ONNX target yang akan digunakan. Default adalah versi opset terbaru yang didukung oleh tf2onnx.
python
model_proto, _ = tf2onnx.convert.from_keras(model, target_opset=12)
  • large_model: Jika model Anda terlalu besar untuk muat di memori, Anda dapat mengaktifkan opsi ini untuk mengonversi model dalam chunk.
python
model_proto, _ = tf2onnx.convert.from_keras(model, large_model=True)
  • output_names: Berikan daftar nama output untuk model ONNX. Secara default, nama output dari model TensorFlow digunakan.
python
output_names = ["output1", "output2"]
model_proto, _ = tf2onnx.convert.from_keras(model, output_names=output_names)

Untuk opsi kustomisasi lainnya, lihat dokumentasi tf2onnx.

https://github.com/onnx/tensorflow-onnx

Memeriksa Model ONNX yang Telah Dikonversi

Dalam bab ini, saya akan membahas cara memeriksa dan memvalidasi model ONNX yang telah dikonversi. Kita akan membahas metode untuk memverifikasi struktur model, menguji akurasinya.

Memverifikasi Struktur Model

Untuk memeriksa struktur model ONNX yang telah dikonversi, gunakan perpustakaan onnx untuk memuat model dan melakukan serangkaian pemeriksaan:

python
import onnx

onnx_model = onnx.load(output_onnx_model)
onnx.checker.check_model(onnx_model)

Ini akan menimbulkan pengecualian jika model tidak valid atau mengandung operasi yang tidak didukung. Jika model lulus pemeriksaan, Anda dapat melanjutkan untuk menguji akurasinya.

Menguji Akurasi Model

Untuk menguji akurasi model ONNX, jalankan inferensi pada model TensorFlow asli dan model ONNX yang telah dikonversi, dan bandingkan outputnya. Anda dapat menggunakan langkah-langkah berikut:

  1. Persiapkan input sampel untuk model:
python
import numpy as np

input_data = np.random.rand(1, 224, 224, 3).astype(np.float32)
  1. Jalankan inferensi pada model TensorFlow:
python
tf_output = model.predict(input_data)
  1. Jalankan inferensi pada model ONNX menggunakan ONNX Runtime:
python
from onnxruntime import InferenceSession

sess = InferenceSession(output_onnx_model)
input_name = sess.get_inputs()[0].name
onnx_output = sess.run(None, {input_name: input_data})
  1. Bandingkan output dan hitung perbedaannya:
python
difference = np.abs(tf_output - onnx_output).max()
print("Difference:", difference)
  1. Periksa apakah perbedaan berada dalam rentang yang dapat diterima:
python
assert np.allclose(tf_output, onnx_output, rtol=1e-05, atol=1e-07), "Output values do not match"

Inferensi Menggunakan Model ONNX yang Telah Dikonversi

Dalam bab ini, saya akan menunjukkan cara melakukan inferensi menggunakan model ONNX yang telah dikonversi. Kita akan membahas cara memuat model ONNX dengan ONNX Runtime, mempersiapkan data input, menjalankan inferensi, dan memproses output.

Memuat Model ONNX

Untuk memuat model ONNX yang telah dikonversi, gunakan kelas InferenceSession dari ONNX Runtime:

python
from onnxruntime import InferenceSession

sess = InferenceSession(output_onnx_model)

Memperkenalkan Data Input

Persiapkan data input untuk model. Data input harus sesuai dengan bentuk input dan tipe data yang diharapkan oleh model. Misalnya:

python
import numpy as np

input_data = np.random.rand(1, 224, 224, 3).astype(np.float32)

Menjalankan Inferensi

Untuk menjalankan inferensi dengan model ONNX, panggil metode run pada objek InferenceSession. Anda perlu menyediakan kamus yang memetakan nama input ke data input yang sesuai:

python
input_name = sess.get_inputs()[0].name
output = sess.run(None, {input_name: input_data})

Pada contoh ini, kita melewatkan None sebagai argumen pertama ke metode run, yang berarti output dari semua node output akan dikembalikan. Sebagai alternatif, Anda dapat menyediakan daftar nama output untuk memperoleh output dari node yang spesifik.

Memproses Output

Setelah menjalankan inferensi, Anda dapat memproses output untuk memperoleh informasi atau prediksi yang diinginkan. Format output akan bergantung pada model dan tugas tertentu. Misalnya, jika model adalah classifier, Anda mungkin ingin mencari kelas dengan probabilitas tertinggi:

python
predicted_class = np.argmax(output[0], axis=-1)
print("Predicted class:", predicted_class)

Referensi

https://github.com/onnx/tensorflow-onnx

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!