はじめに
この記事では、Scikit-learnモデルをONNX形式に変換し、ONNXモデルを使用して推論を実行する方法を説明します。
Scikit-learnモデルの準備
この章では、Scikit-learnモデルを作成してトレーニングし、保存して後で使用する方法について説明します。例として、Irisデータセットを使用してロジスティック回帰モデルを作成します。
Scikit-learnモデルの作成とトレーニング
モデルをONNXに変換する前に、Scikit-learnモデルを作成してトレーニングする必要があります。この例では、Irisデータセットを使用して単純なロジスティック回帰モデルを作成します。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Load the Iris dataset
iris = load_iris()
X, y = iris.data, iris.target
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train the Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)
train_test_split
関数を使用して、データセットをトレーニング用とテスト用に分割しました。次に、LogisticRegression
クラスのインスタンスを作成し、トレーニングデータを使用してモデルを適合させます。
Scikit-learnモデルの保存
モデルをトレーニングしたら、後で変換または他の目的に使用できるように保存する必要があります。トレーニングされたScikit-learnモデルを保存するには、Scikit-learnモデルなどの大きなNumPy配列を効率的に保存するために適したjoblib
ライブラリを使用できます。
import joblib
# Save the model to a file
joblib.dump(model, 'logistic_regression_model.pkl')
このコードスニペットは、トレーニングされたロジスティック回帰モデルをlogistic_regression_model.pkl
という名前のファイルに保存します。
Scikit-learnモデルをONNXに変換
この章では、Scikit-learnモデルをONNXモデルに変換する手順について説明します。これにより、ONNXのクロスプラットフォーム対応や、様々なディープラーニングフレームワークとの相互運用性など、ONNXの利点を活用できます。
ONNXMLToolsのインストール
Scikit-learnモデルをONNXに変換するには、機械学習フレームワークからONNX形式に変換するためのユーティリティを提供するONNXMLToolsパッケージをインストールする必要があります。Scikit-learnの場合、ONNXMLToolsの一部であるskl2onnx
パッケージを使用します。
$ pip install skl2onnx
モデルの変換
skl2onnx
パッケージがインストールされたら、Scikit-learnモデルをONNXモデルに変換できます。これには、skl2onnx
が提供するconvert_sklearn
関数を使用する必要があります。さらに、モデルの入力データ型を指定する必要があります。
この例では、以前に保存したロジスティック回帰モデルを変換します。
import onnxmltools
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
# Load the Scikit-learn model from the saved file
model = joblib.load('logistic_regression_model.pkl')
# Convert the Scikit-learn model to ONNX
onnx_model = convert_sklearn(model, 'logistic_regression_onnx', [('input', FloatTensorType([None, 4]))])
# Save the ONNX model to a file
onnxmltools.utils.save_model(onnx_model, 'logistic_regression_model.onnx')
このコードスニペットでは、joblib.load
を使用して以前に保存されたScikit-learnモデルをまずロードします。次に、convert_sklearn
関数を呼び出してモデル、ONNXモデルの名前、および入力データ型を渡します。この場合、FloatTensorType
を使用し、バッチサイズを動的に(None
で示される)設定し、固定の特徴サイズを4とします。最後に、変換されたONNXモデルをlogistic_regression_model.onnx
という名前のファイルに保存します。
変換されたONNXモデルを使用した推論
この章では、変換されたONNXモデルを使用して推論を実行する方法を示します。これには、ONNX Runtimeのインストール、ONNXモデルのロード、およびモデルを使用した予測の作成が含まれます。
ONNX Runtimeのインストール
ONNXモデルを使用して推論を実行するには、ONNXモデルの高性能推論エンジンであるONNX Runtimeをインストールする必要があります。ONNX Runtimeは、pipを使用してインストールできます。
$ pip install onnxruntime
ONNXモデルのロード
ONNX Runtimeがインストールされたら、ONNXモデルをInferenceSession
クラスを使用してロードできます。
import onnxruntime as rt
# Load the ONNX model
sess = rt.InferenceSession('logistic_regression_model.onnx')
推論
ONNXモデルがロードされたので、モデルを使用して推論できます。これには、入力データを準備し、InferenceSession
オブジェクトのrun
メソッドを呼び出す必要があります。
この例では、Irisデータセットのテストデータを使用します。
import numpy as np
# Prepare the input data
input_data = np.array(X_test, dtype=np.float32)
input_name = sess.get_inputs()[0].name
# Make predictions using the ONNX model
output_name = sess.get_outputs()[0].name
predictions = sess.run([output_name], {input_name: input_data})[0]
このコードスニペットでは、まず入力データ(つまり、X_test
)をfloat32型のNumPy配列に変換します。次に、get_inputs
メソッドとget_outputs
メソッドを使用してモデルの入力名と出力名を取得します。最後に、run
メソッドをInferenceSession
オブジェクトで呼び出し、出力名と入力名を入力データにマッピングする辞書を渡します。予測はNumPy配列として返されます。
参考