ONNX 形式の scikit-learn モデルを使用して予測を行う


このチュートリアルでは、scikit-learn でトレーニングされた Open Neural Network Exchange(ONNX)モデルをインポートする方法について説明します。モデルを BigQuery データセットにインポートし、SQL クエリを使用して予測を行います。

ONNX は、任意の ML フレームワークを表すように設計された統一された形式を提供します。ONNX に対する BigQuery ML サポートにより、次のことが可能になります。

  • 使い慣れたフレームワークを使用してモデルをトレーニングします。
  • モデルを ONNX 形式に変換します。
  • ONNX モデルを BigQuery にインポートし、BigQuery ML を使用して予測を行います。

目標

  • scikit-learn を使用してモデルを作成してトレーニングします。
  • sklearn-onnx を使用してモデルを ONNX 形式に変換します。
  • CREATE MODEL ステートメントを使用して、ONNX モデルを BigQuery にインポートします。
  • ML.PREDICT 関数を使用して、インポートした ONNX モデルで予測を行います。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Make sure that billing is enabled for your Google Cloud project.

  5. Enable the BigQuery and Cloud Storage APIs.

    Enable the APIs

  6. このドキュメントのタスクを実行するために必要な権限が付与されていることを確認します。

必要なロール

新しいプロジェクトを作成すると、そのプロジェクトのオーナーになります。また、このチュートリアルの完了に必要な Identity and Access Management(IAM)権限がすべて付与されます。

既存のプロジェクトを使用している場合は、次の操作を行います。

Make sure that you have the following role or roles on the project:

Check for the roles

  1. In the Google Cloud console, go to the IAM page.

    Go to IAM
  2. Select the project.
  3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

  4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

Grant the roles

  1. In the Google Cloud console, go to the IAM page.

    [IAM] に移動
  2. プロジェクトを選択します。
  3. [ アクセスを許可] をクリックします。
  4. [新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。

  5. [ロールを選択] リストでロールを選択します。
  6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
  7. [保存] をクリックします。
  8. BigQuery の IAM 権限の詳細については、IAM 権限をご覧ください。

省略可: モデルをトレーニングして ONNX 形式に変換する

次のコードサンプルは、scikit-learn で分類モデルをトレーニングする方法と、生成されたパイプラインを ONNX 形式に変換する方法を示しています。このチュートリアルでは、gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx に保存されている事前構築済みのサンプルモデルを使用します。サンプルモデルを使用している場合は、これらの手順を完了する必要はありません。

scikit-learn で分類モデルをトレーニングする

次のサンプルコードを使用して、Iris データセットで scikit-learn パイプラインを作成してトレーニングします。scikit-learn のインストールと使用方法については、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 にアップロードする

モデルを保存したら、次の操作を行います。

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

Console

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

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. 「アクションを表示」> [データセットを作成] をクリックします。

    [データセットを作成] メニュー オプション。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。

    一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

    値が入力された [データセットを作成する] ページ。

bq

新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

  1. データの場所を US、説明を BigQuery ML tutorial dataset に設定して、bqml_tutorial という名前のデータセットを作成します。

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

  2. データセットが作成されたことを確認します。

    bq ls

API

定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

ONNX モデルを BigQuery にインポートする

次の手順では、CREATE MODEL ステートメントを使用して、Cloud Storage からサンプル ONNX モデルをインポートする方法を示します。

ONNX モデルをデータセットにインポートするには、次のいずれかのオプションを選択します。

Console

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

    BigQuery Studio に移動

  2. クエリエディタで、次の CREATE MODEL ステートメントを入力します。

     CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='BUCKET_PATH')

    BUCKET_PATH は、Cloud Storage にアップロードしたモデルのパスに置き換えます。サンプルモデルを使用している場合は、BUCKET_PATH を次の値 gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx に置き換えます。

    オペレーションが完了すると、Successfully created model named imported_onnx_model のようなメッセージが表示されます。

    新しいモデルが [リソース] パネルに表示されます。モデルにはモデルアイコン [リソース] パネルのモデルアイコン がついています。[リソース] パネルで新しいモデルを選択すると、そのモデルに関する情報が [クエリエディタ] の横に表示されます。

    imported_onnx_model の情報パネル

bq

  1. 次の CREATE MODEL ステートメントを入力して、Cloud Storage から ONNX モデルをインポートします。

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
    `bqml_tutorial.imported_onnx_model`
    OPTIONS
    (MODEL_TYPE='ONNX',
      MODEL_PATH='BUCKET_PATH')"

    BUCKET_PATH は、Cloud Storage にアップロードしたモデルのパスに置き換えます。サンプルモデルを使用している場合は、BUCKET_PATH を次の値 gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx に置き換えます。

    オペレーションが完了すると、Successfully created model named imported_onnx_model のようなメッセージが表示されます。

  2. モデルをインポートしたら、モデルがデータセットに表示されていることを確認します。

    bq ls bqml_tutorial

    出力は次のようになります。

    tableId               Type
    --------------------- -------
    imported_onnx_model  MODEL

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

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 モデルを BigQuery にインポートする方法については、ONNX モデルをインポートする CREATE MODEL ステートメントをご覧ください。

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

ONNX モデルをインポートしたら、ML.PREDICT 関数を使用してモデルで予測を行います。

次の手順のクエリでは、imported_onnx_model を使用して、ml_datasets 一般公開データセットの iris テーブルの入力データから予測を行います。ONNX モデルは、4 つの FLOAT 値を入力として想定しています。

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

これらの入力は、モデルを ONNX 形式に変換したときに定義された initial_types と一致します。

出力には、label 列と probabilities 列、入力テーブルの列が含まれます。label は予測されたクラスラベルを表します。probabilities は、各クラスの確率を表す配列です。

インポートした TensorFlow モデルで予測を行うには、次のいずれかのオプションを選択します。

Console

  1. [BigQuery Studio] ページに移動します。

    BigQuery Studio に移動

  2. クエリエディタで、ML.PREDICT 関数を使用する次のクエリを入力します。

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

    クエリ結果は次のようになります。

    ML.PREDICT クエリの出力

bq

ML.PREDICT を使用するクエリを実行します。

bq query --use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

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)

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

predict 関数の出力

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

Console

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

gcloud

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

リソースを個別に削除する

または、このチュートリアルで使用した個々のリソースを削除するには、次の操作を行います。

  1. インポートしたモデルを削除します

  2. 省略可: データセットを削除します。

次のステップ