使用 ONNX 格式的 scikit-learn 模型进行预测

本教程介绍如何导入使用 scikit-learn 训练的开放神经网络交换 (ONNX) 模型。您可以将该模型导入 BigQuery 数据集,并使用该模型通过 SQL 查询进行预测。

ONNX 提供了一种用于表示任何机器学习 (ML) 框架的统一格式。BigQuery ML 对 ONNX 的支持让您可以执行以下操作:

  • 使用您偏好的框架训练模型。
  • 将模型转换为 ONNX 模型格式。
  • 将 ONNX 模型导入 BigQuery 并使用 BigQuery ML 进行预测。

可选:训练模型并将其转换为 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 数据集以存储机器学习模型。

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

  4. 创建数据集 页面上,执行以下操作:

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

    • 保持其余默认设置不变,然后点击创建数据集

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

    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"
  }
}

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

将 ONNX 模型导入 BigQuery

以下步骤介绍了如何使用 CREATE MODEL 语句从 Cloud Storage 导入示例 ONNX 模型。

如需将 ONNX 模型导入数据集,请选择以下选项之一:

控制台

  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 -m bqml_tutorial

    输出内容类似如下:

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

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 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 模型需要将四个 FLOAT 值作为输入:

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

这些输入与您在将模型转换为 ONNX 格式时定义的 initial_types 匹配。

输出包括 labelprobabilities 列,以及输入表中的列。label 表示预测的类标签。probabilities 是一个概率数组,表示每个类的概率。

如需使用导入的 ONNX 模型进行预测,请选择以下选项之一:

控制台

  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 DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

使用 predict 函数运行 ONNX 模型。

import bigframes.pandas as bpd

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

结果类似于以下内容:

预测函数的输出