このチュートリアルでは、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 にインポートする。- インポートした ONNX モデルで
ML.PREDICT関数を使用して予測を行う。
費用
このドキュメントでは、課金対象である次の Cloud de Confiance by S3NSコンポーネントを使用します。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
-
Enable the BigQuery and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - このドキュメントのタスクを実行するために必要な権限が付与されていることを確認します。
- BigQuery Studio Admin (
roles/bigquery.studioAdmin) - Storage Object Creator (
roles/storage.objectCreator) -
In the Cloud de Confiance console, go to the IAM page.
Go to IAM - Select the project.
-
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.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
-
In the Cloud de Confiance console, go to the IAM page.
[IAM] に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Workforce Identity プール内のユーザーの ID です。詳細については、IAM ポリシーで Workforce プールユーザーを表すをご覧いただくか、管理者にお問い合わせください。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
- モデルを保存する Cloud Storage バケットを作成します。
- ONNX モデルを Cloud Storage バケットにアップロードします。
Cloud de Confiance コンソールで、[BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
[アクションを表示] > [データセットを作成] をクリックします。
[データセットの作成] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。
残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
データの場所が
USに設定され、BigQuery ML tutorial datasetという説明の付いた、bqml_tutorialという名前のデータセットを作成します。bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
このコマンドでは、
--datasetフラグの代わりに-dショートカットを使用しています。-dと--datasetを省略した場合、このコマンドはデフォルトでデータセットを作成します。データセットが作成されたことを確認します。
bq lsCloud de Confiance コンソールで、[BigQuery Studio] ページに移動します。
クエリエディタで次の
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」のようなメッセージが表示されます。新しいモデルが [リソース] パネルに表示されます。モデルにはモデルアイコン
がついています。[リソース] パネルで新しいモデルを選択すると、そのモデルに関する情報がクエリエディタの横に表示されます。
次の
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」のようなメッセージが表示されます。モデルをインポートしたら、モデルがデータセットに表示されていることを確認します。
bq ls -m bqml_tutorial
出力は次のようになります。
tableId Type --------------------- ------- imported_onnx_model MODEL
sepal_lengthsepal_widthpetal_lengthpetal_width[BigQuery Studio] ページに移動します。
クエリエディタで、
ML.PREDICT関数を使用する次のクエリを入力します。SELECT * FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.iris` ) )
クエリ結果は次のようになります。
- In the Cloud de Confiance console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- In the Cloud de Confiance console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
インポートしたモデルを削除します。
省略可: データセットを削除します。
- ONNX モデルのインポートの詳細については、ONNX モデルの
CREATE MODELステートメントをご覧ください。 - 利用可能な ONNX コンバータとチュートリアルの詳細については、ONNX 形式への変換をご覧ください。
- BigQuery ML の概要で BigQuery ML の概要を確認する。
- BigQuery ML の使用を開始するには、BigQuery ML で ML モデルを作成するをご覧ください。
必要なロール
新しいプロジェクトを作成すると、そのプロジェクトのオーナーになり、このチュートリアルを完了するために必要な Identity and Access Management(IAM)の権限がすべて付与されます。
既存のプロジェクトを使用する場合は、次の手順で操作します。
Make sure that you have the following role or roles on the project:
Check for the roles
Grant the roles
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 データセットを作成します。
コンソール
bq
新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。
API
定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。
ONNX モデルを BigQuery にインポートする
次の手順では、CREATE MODEL ステートメントを使用して Cloud Storage からサンプル ONNX モデルをインポートする方法を示します。
ONNX モデルをデータセットにインポートするには、次のオプションのいずれかを選択します。
コンソール
bq
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。
ONNXModel オブジェクトを使用してモデルをインポートします。
形式やストレージの要件など、BigQuery への ONNX モデルのインポートの詳細については、ONNX モデルをインポートする CREATE MODEL ステートメントをご覧ください。
インポートした ONNX モデルを使用して予測を行う
ONNX モデルをインポートしたら、ML.PREDICT 関数を使用してモデルで予測を行います。
次の手順のクエリでは、imported_onnx_model を使用して、ml_datasets 一般公開データセットの iris テーブルの入力データから予測を行います。ONNX モデルでは、4 つの FLOAT 値を入力として想定しています。
これらの入力は、モデルを ONNX 形式に変換したときに定義された initial_types と一致します。
出力には、label 列と probabilities 列、および入力テーブルの列が含まれます。label は予測されたクラスラベルを表します。probabilities は各クラスの確率を表す配列です。
インポートした ONNX モデルで予測を行うには、次のオプションのいずれかを選択します。
コンソール
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 関数を使用して、ONNX モデルを実行します。
次のような結果になります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
コンソール
gcloud
リソースを個別に削除する
または、このチュートリアルで使用したリソースを個別に削除するには、次の操作を行います。