ONNX 形式の scikit-learn モデルを使用して予測を行う
Open Neural Network Exchange(ONNX)は、ML フレームワークを統一された形式で表現するためのフォーマットです。ONNX に対する BigQuery ML サポートにより、次のことが可能になります。
- 使い慣れたフレームワークを使用してモデルをトレーニングします。
- モデルを ONNX 形式に変換します。詳細については、ONNX 形式への変換をご覧ください。
- ONNX モデルを BigQuery にインポートし、BigQuery ML を使用して予測を行います。
このチュートリアルでは、scikit-learn でトレーニングされた ONNX モデルを BigQuery データセットにインポートし、SQL クエリから予測を行う方法について説明します。ONNX モデルのインポートに使用できるインターフェースは次のとおりです。
- Google Cloud コンソール
- bq コマンドライン ツールの
bq query
コマンド - BigQuery API
形式やストレージの要件など、ONNX モデルを BigQuery にインポートする方法については、ONNX モデルをインポートする CREATE
MODEL
ステートメントをご覧ください。
目標
このチュートリアルの内容は次のとおりです。
- scikit-learn でモデルを作成してトレーニングします。
- sklearn-onnx を使用してモデルを ONNX 形式に変換します。
- ONNX モデルを BigQuery にインポートして予測を行います。
scikit-learn で分類モデルをトレーニングする
Iris データセットで scikit-learn パイプラインを作成してトレーニングします。
import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
data = load_iris()
X = data.data[:, :4]
y = data.target
ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()
pipe = Pipeline([('scaler', StandardScaler()),
('clr', RandomForestClassifier())])
pipe.fit(X, y)
モデルを ONNX 形式に変換して保存する
sklearn-onnx を使用して、scikit-learn パイプラインを pipeline_rf.onnx
という名前の ONNX モデルに変換します。
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}
# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
('sepal_length', FloatTensorType([None, 1])),
('sepal_width', FloatTensorType([None, 1])),
('petal_length', FloatTensorType([None, 1])),
('petal_width', FloatTensorType([None, 1])),
]
# Convert the model.
model_onnx = convert_sklearn(
pipe, 'pipeline_rf', initial_types=initial_types, options=options
)
# And save.
with open('pipeline_rf.onnx', 'wb') as f:
f.write(model_onnx.SerializeToString())
ONNX モデルを Cloud Storage にアップロードする
ONNX モデルファイルを保存する Cloud Storage バケットを作成し、保存した ONNX モデルファイルを Cloud Storage バケットにアップロードします。詳細については、ファイル システムからオブジェクトをアップロードするをご覧ください。
ONNX モデルを BigQuery にインポートする
この手順では、ONNX モデルが Cloud Storage バケットにアップロードされていることを前提としています。サンプルのモデルは gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
に保存されています。
コンソール
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のような
CREATE MODEL
ステートメントを入力します。CREATE OR REPLACE MODEL `mydataset.mymodel` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='gs://bucket/path/to/onnx_model/*')
例:
CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')
上記のクエリでは、
gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
にある ONNX モデルをimported_onnx_model
という BigQuery モデルとしてインポートします。新しいモデルが [リソース] パネルに表示されます。プロジェクト内の各データセットを展開すると、データセット内の他の BigQuery リソースとともに、モデルが一覧表示されます。モデルにはモデルアイコン がついています。
[リソース] パネルで新しいモデルを選択すると、そのモデルに関する情報がクエリエディタの下に表示されます。
bq
ONNX モデルを Cloud Storage からインポートするには、次のようなコマンドを入力して、バッチクエリを実行します。
bq query \
--use_legacy_sql=false \
"CREATE MODEL
`mydataset.mymodel`
OPTIONS
(MODEL_TYPE='ONNX',
MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
例:
bq query --use_legacy_sql=false \
"CREATE OR REPLACE MODEL
`example_dataset.imported_onnx_model`
OPTIONS
(MODEL_TYPE='ONNX',
MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')"
モデルをインポートすると、bq ls [dataset_name]
の出力に表示されます。
$ bq ls example_dataset
tableId Type Labels Time Partitioning
--------------------- ------- -------- -------------------
imported_onnx_model MODEL
API
新しいジョブを挿入し、次に示すリクエストの本文のように jobs#configuration.query プロパティに値を入力します。
{
"query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
}
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
ONNXModel
オブジェクトを使用してモデルをインポートします。
インポートした ONNX モデルを使用して予測を行う
コンソール
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のように
ML.PREDICT
を使用してクエリを入力します。SELECT * FROM ML.PREDICT(MODEL
example_dataset.imported_onnx_model
, ( SELECT * FROMbigquery-public-data.ml_datasets.iris
) )上記のクエリでは、現在のプロジェクトの
example_dataset
データセットにあるimported_onnx_model
という名前のモデルを使用して、プロジェクトbigquery-public-data
のデータセットml_datasets
にある公開テーブルiris
の入力データから予測を行います。この ONNX モデルでは、手順 2 で定義したinitial_types
と一致する 4 つの浮動小数点数の入力(sepal_length
、sepal_width
、petal_length
、petal_width
)が想定されているため、サブクエリは、これらの 4 つの入力列を含むbigquery-public-data
テーブル全体に対してSELECT
を実行します。このモデルは、
label
列、probabilities
列、入力テーブルの列を出力します。label
は予測されたクラスラベルを表します。probabilities
は、各クラスの確率を表す配列です。
クエリ結果は次のようになります。
bq
テーブル input_data
の入力データから予測を行うには、インポートした ONNX モデル my_model
を使用して、次のようなコマンドを入力します。
bq query \
--use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `my_project.my_dataset.my_model`,
(SELECT * FROM input_data))'
例:
bq query \
--use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'
API
新しいジョブを挿入し、次に示すリクエストの本文のように jobs#configuration.query プロパティに値を入力します。
{
"query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
predict
関数を使用して、リモートモデルを実行します。
次のような結果になります。
次のステップ
- ONNX モデルのインポートの詳細については、ONNX モデルの
CREATE MODEL
ステートメントをご覧ください。 - 利用可能な ONNX コンバータとチュートリアルの詳細については、ONNX 形式への変換をご覧ください。
- BigQuery ML の概要で BigQuery ML の概要を確認する。
- BigQuery ML の使用を開始するには、BigQuery ML で機械学習モデルを作成するをご覧ください。
- モデルの操作の詳細については、次のリソースをご覧ください。