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 に保存されています。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. クエリエディタで、次のような 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 モデルとしてインポートします。

  3. 新しいモデルが [リソース] パネルに表示されます。プロジェクト内の各データセットを展開すると、データセット内の他の BigQuery リソースとともに、モデルが一覧表示されます。モデルにはモデルアイコン モデルアイコン がついています。

  4. [リソース] パネルで新しいモデルを選択すると、そのモデルに関する情報がクエリエディタの下に表示されます。

    ONNX モデルの情報

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 オブジェクトを使用してモデルをインポートします。

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID
# You can change the location to one of the valid locations: https://cloud.google.com/bigquery/docs/locations#supported_locations
bigframes.options.bigquery.location = "US"

imported_onnx_model = ONNXModel(
    model_path="gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx"
)

インポートした ONNX モデルを使用して予測を行う

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. クエリエディタで、次のように ML.PREDICT を使用してクエリを入力します。

     SELECT *
       FROM ML.PREDICT(MODEL example_dataset.imported_onnx_model,
         (
          SELECT * FROM bigquery-public-data.ml_datasets.iris
         )
     )
     

    上記のクエリでは、現在のプロジェクトの example_dataset データセットにある imported_onnx_model という名前のモデルを使用して、プロジェクト bigquery-public-data のデータセット ml_datasets にある公開テーブル iris の入力データから予測を行います。この ONNX モデルでは、手順 2 で定義した initial_types と一致する 4 つの浮動小数点数の入力(sepal_lengthsepal_widthpetal_lengthpetal_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 関数を使用して、リモートモデルを実行します。

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.ml_datasets.iris")
predictions = imported_onnx_model.predict(df)
predictions.peek(5)

次のような結果になります。 Result_visualization

次のステップ