本教學課程說明如何匯入以 scikit-learn 訓練的開放式神經網路交換 (ONNX) 模型。您將模型匯入 BigQuery 資料集,並使用 SQL 查詢進行預測。
ONNX 提供統一格式,可用於表示任何機器學習 (ML) 架構。BigQuery ML 支援 ONNX,因此您可以執行下列操作:
- 使用您喜愛的架構訓練模型。
- 將模型轉換為 ONNX 模型格式。
- 將 ONNX 模型匯入 BigQuery,並使用 BigQuery ML 進行預測。
目標
- 使用 scikit-learn 建立及訓練模型。
- 使用 sklearn-onnx 將模型轉換為 ONNX 格式。
- 使用
CREATE MODEL陳述式將 ONNX 模型匯入 BigQuery。 - 使用
ML.PREDICT函式,透過匯入的 ONNX 模型進行預測。
費用
在本文件中,您會使用下列 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
啟用 BigQuery 和 Cloud Storage API。
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。- 請確認您具備必要權限,可執行本文件中的工作。
必要的角色
如果您建立新專案,您就是專案擁有者,並已獲得完成本教學課程所需的所有 Identity and Access Management (IAM) 權限。
如果您使用現有專案,請執行下列操作。
請確認您在專案中具備下列角色:
- BigQuery Studio 管理員 (
roles/bigquery.studioAdmin) - Storage 物件建立者 (
roles/storage.objectCreator)
檢查角色
-
前往 Cloud de Confiance 控制台的「IAM」頁面。
前往 IAM - 選取專案。
-
在「主體」欄中,找出所有識別您或您所屬群組的資料列。如要瞭解自己所屬的群組,請與管理員聯絡。
- 針對指定或包含您的所有列,請檢查「角色」欄,確認角色清單是否包含必要角色。
授予角色
-
前往 Cloud de Confiance 控制台的「IAM」頁面。
前往 IAM - 選取專案。
- 按一下「Grant access」(授予存取權)。
-
在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是指員工身分集區中使用者的 ID。詳情請參閱「在 IAM 政策中代表工作團隊集區使用者」,或聯絡管理員。
- 按一下「Select a role」(選取角色),然後搜尋角色。
- 如要授予其他角色,請按一下「Add another role」(新增其他角色),然後新增其他角色。
- 按一下「Save」(儲存)。
如要進一步瞭解 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
儲存模型後,請按照下列步驟操作:
建立資料集
如要建立 BigQuery 資料集,請選取下列任一選項:控制台
前往 Cloud de Confiance 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」中展開專案,然後按一下「Datasets」。
在「資料集」頁面,按一下 「建立資料集」。
在「建立資料集」窗格中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial。選取「資料位置」的「美國」。
其餘預設設定均保留原樣。
點選「建立資料集」。
bq
如要建立新的資料集,請使用 bq mk --dataset 指令。
建立名為
bqml_tutorial的資料集,並將資料位置設為US:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
確認資料集已建立完成:
bq ls
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 模型匯入資料集,請選取下列其中一個選項:
控制台
前往 Cloud 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。新模型會顯示在「資源」面板中。模型會以模型圖示來表示:
在「資源」面板中選取新模型,「查詢編輯器」旁就會顯示該模型的相關資訊。
bq
輸入下列
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
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程,完成 BigQuery DataFrames 設定。詳情請參閱 BigQuery DataFrames 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
使用 bigframes.bigquery.ml.create_model 函式建立模型。
如要進一步瞭解如何將 ONNX 模型匯入 BigQuery (包括格式和儲存空間需求),請參閱匯入 ONNX 模型的 CREATE MODEL 陳述式。
使用匯入的 ONNX 模型進行預測
匯入 ONNX 模型後,您可以使用 ML.PREDICT 函式,透過模型進行預測。
下列步驟中的查詢會使用 imported_onnx_model,根據 ml_datasets 公開資料集 iris 資料表中的輸入資料進行預測。ONNX 模型預期輸入四個 FLOAT 值:
sepal_lengthsepal_widthpetal_lengthpetal_width
這些輸入內容與initial_types相符,是在將模型轉換為 ONNX 格式時定義。
輸出內容包括 label 和 probabilities 資料欄,以及輸入資料表中的資料欄。label 代表預測的類別標籤。
probabilities 是機率陣列,代表每個類別的機率。
如要使用匯入的 ONNX 模型進行預測,請選擇下列其中一個選項:
控制台
前往「BigQuery Studio」頁面。
在查詢編輯器中,輸入使用
ML.PREDICT函式的查詢。SELECT * FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.iris` ) )
查詢結果大致如下:
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」。
使用 bigframes.bigquery.ml.predict 函式執行 ONNX 模型。
結果大致如下:
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
控制台
- 前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
gcloud
刪除 Cloud de Confiance 專案:
gcloud projects delete PROJECT_ID
刪除個別資源
或者,如要移除本教學課程中使用的個別資源,請執行下列操作:
後續步驟
- 如要進一步瞭解如何匯入 ONNX 模型,請參閱ONNX 模型的
CREATE MODEL陳述式。 - 如要進一步瞭解可用的 ONNX 轉換器和教學課程,請參閱「轉換為 ONNX 格式」。
- 如需 BigQuery ML 的總覽,請參閱 BigQuery ML 簡介。
- 如要開始使用 BigQuery ML,請參閱在 BigQuery ML 中建立機器學習模型。