Traffine I/O

日本語

2023-03-07

Scikit-learnモデルをONNXに変換して推論を実行する方法

はじめに

この記事では、Scikit-learnモデルをONNX形式に変換し、ONNXモデルを使用して推論を実行する方法を説明します。

Scikit-learnモデルの準備

この章では、Scikit-learnモデルを作成してトレーニングし、保存して後で使用する方法について説明します。例として、Irisデータセットを使用してロジスティック回帰モデルを作成します。

Scikit-learnモデルの作成とトレーニング

モデルをONNXに変換する前に、Scikit-learnモデルを作成してトレーニングする必要があります。この例では、Irisデータセットを使用して単純なロジスティック回帰モデルを作成します。

python
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ライブラリを使用できます。

python
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パッケージを使用します。

bash
$ pip install skl2onnx

モデルの変換

skl2onnxパッケージがインストールされたら、Scikit-learnモデルをONNXモデルに変換できます。これには、skl2onnxが提供するconvert_sklearn関数を使用する必要があります。さらに、モデルの入力データ型を指定する必要があります。

この例では、以前に保存したロジスティック回帰モデルを変換します。

python
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を使用してインストールできます。

bash
$ pip install onnxruntime

ONNXモデルのロード

ONNX Runtimeがインストールされたら、ONNXモデルをInferenceSessionクラスを使用してロードできます。

python
import onnxruntime as rt

# Load the ONNX model
sess = rt.InferenceSession('logistic_regression_model.onnx')

推論

ONNXモデルがロードされたので、モデルを使用して推論できます。これには、入力データを準備し、InferenceSessionオブジェクトのrunメソッドを呼び出す必要があります。

この例では、Irisデータセットのテストデータを使用します。

python
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配列として返されます。

参考

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

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!