导出 BigQuery ML 模型以进行在线预测

本教程介绍如何导出 BigQuery ML 模型,然后在 AI Platform 或本地机器上部署该模型。您将使用 BigQuery 公共数据集中的 iris,并完成以下三个端到端场景:

  • 训练和部署逻辑回归模型 - 也适用于 DNN 分类器、DNN 回归器、k-means、线性回归和矩阵分解模型。
  • 训练和部署提升树分类器模型 - 也适用于提升树回归器模型。
  • 训练和部署 AutoML 分类器模型 - 也适用于 AutoML 回归器模型。

费用

本教程使用 Google Cloud 的计费组件,包括:

  • BigQuery ML
  • Cloud Storage
  • AI Platform(可选,用于在线预测)

如需详细了解 BigQuery ML 费用,请参阅 BigQuery ML 价格页面。

如需详细了解 Cloud Storage 费用,请参阅 Cloud Storage 价格页面。

如需详细了解 AI Platform 费用,请参阅预测节点和资源分配页面。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请转到 启用 BigQuery API。

    启用 API

  5. 启用 AI Platform Training and Prediction API and Compute Engine API。

    启用 API

  6. 安装 Google Cloud SDKgcloud 命令行工具

创建数据集

第一步是创建 BigQuery 数据集用于存储您的机器学习模型。如需创建数据集,请执行以下操作:

  1. 在 Google Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 在导航面板的资源部分,点击您的项目名称。

  3. 在右侧的详细信息面板中,点击创建数据集

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial
    • 选择美国 (US) 作为数据位置。目前,公共数据集存储在 US 多区域位置。为简单起见,请将数据集放在同一位置。

      创建数据集页面。

  5. 保留其他所有默认设置不变,然后点击创建数据集

训练和部署逻辑回归模型

训练模型

使用 BigQuery ML CREATE MODEL语句训练一个预测鸢尾花类型的逻辑回归模型。此训练作业大约需要 1 分钟才能完成。

bq query --use_legacy_sql=false \
  'CREATE MODEL `bqml_tutorial.iris_model`
  OPTIONS (model_type="logistic_reg",
      max_iterations=10, input_label_cols=["species"])
  AS SELECT
    *
  FROM
    `bigquery-public-data.ml_datasets.iris`;'

导出模型

使用 bq 命令行工具将模型导出到 Cloud Storage 存储分区。如需了解导出模型的其他方法,请参阅导出 BigQuery ML 模型。此提取作业应在 1 分钟内完成。

bq extract -m bqml_tutorial.iris_model gs://some/gcs/path/iris_model

本地部署和服务

您可以使用 TensorFlow Serving Docker 容器部署导出的 TensorFlow 模型。以下步骤要求您安装 Docker

将导出的模型文件下载到临时目录

mkdir tmp_dir
gsutil cp -r gs://some/gcs/path/iris_model tmp_dir

创建版本子目录

此步骤为模型设置版本号(在本例中为 1)。

mkdir -p serving_dir/iris_model/1
cp -r tmp_dir/iris_model/* serving_dir/iris_model/1
rm -r tmp_dir

拉取 Docker 映像

docker pull tensorflow/serving

运行 Docker 容器

docker run -p 8500:8500 --network="host" --mount type=bind,source=`pwd`/serving_dir/iris_model,target=/models/iris_model -e MODEL_NAME=iris_model -t tensorflow/serving &

运行预测

curl -d '{"instances": [{"sepal_length":5.0, "sepal_width":2.0, "petal_length":3.5, "petal_width":1.0}]}' -X POST http://localhost:8501/v1/models/iris_model:predict

在线部署和服务

本部分使用 gcloud 命令行工具针对导出的模型部署和运行预测。

如需详细了解如何将模型部署到 AI Platform 以进行在线/批量预测,请参阅部署模型

创建模型资源

MODEL_NAME="IRIS_MODEL"
gcloud ai-platform models create $MODEL_NAME

创建模型版本

1) 设置环境变量

MODEL_DIR="gs://some/gcs/path/iris_model"
// Select a suitable version for this model
VERSION_NAME="v1"
FRAMEWORK="TENSORFLOW"

2) 创建版本

gcloud ai-platform versions create $VERSION_NAME --model=$MODEL_NAME --origin=$MODEL_DIR --runtime-version=1.15 --framework=$FRAMEWORK

此步骤可能需要几分钟才能完成。您应该会看到如下消息:Creating version (this might take a few minutes)......

3)(可选)获取有关新版本的信息

gcloud ai-platform versions describe $VERSION_NAME --model $MODEL_NAME

您应该会看到如下所示的输出:

createTime: '2020-02-28T16:30:45Z'
deploymentUri: gs://your_bucket_name
framework: TENSORFLOW
machineType: mls1-c1-m2
name: projects/[YOUR-PROJECT-ID]/models/IRIS_MODEL/versions/v1
pythonVersion: '2.7'
runtimeVersion: '1.15'
state: READY

在线预测

如需详细了解如何对已部署的模型运行在线预测,请访问 https://cloud.google.com/ai-platform/prediction/docs/online-predict#requesting_predictions

1) 为输入创建以换行符分隔的 JSON 文件,例如 instances.json 文件,其中包含以下内容

{"sepal_length":5.0, "sepal_width":2.0, "petal_length":3.5, "petal_width":1.0}
{"sepal_length":5.3, "sepal_width":3.7, "petal_length":1.5, "petal_width":0.2}

2) 设置用于预测的环境变量

INPUT_DATA_FILE="instances.json"

3) 运行预测

gcloud ai-platform predict --model $MODEL_NAME --version $VERSION_NAME --json-instances $INPUT_DATA_FILE

训练和部署提升树分类器模型

训练模型

使用 BigQuery ML CREATE MODEL 语句训练一个预测鸢尾花类型的提升树分类器模型。此训练作业大约需要 7 分钟才能完成。

bq query --use_legacy_sql=false \
  'CREATE MODEL `bqml_tutorial.boosted_tree_iris_model`
  OPTIONS (model_type="boosted_tree_classifier",
      max_iterations=10, input_label_cols=["species"])
  AS SELECT
    *
  FROM
    `bigquery-public-data.ml_datasets.iris`;'

导出模型

使用 bq 命令行工具将模型导出到 Cloud Storage 存储分区。如需了解导出模型的额外方法,请参阅导出 BigQuery ML 模型

bq extract --destination_format ML_XGBOOST_BOOSTER -m bqml_tutorial.boosted_tree_iris_model gs://some/gcs/path/boosted_tree_iris_model

本地部署和服务

在导出的文件中,有一个用于本地运行的 main.py 文件。

将导出的模型文件下载到本地目录

mkdir serving_dir
gsutil cp -r gs://some/gcs/path/boosted_tree_iris_model serving_dir

提取 predictor.py

tar -xvf serving_dir/boosted_tree_iris_model/xgboost_predictor-0.1.tar.gz -C serving_dir/boosted_tree_iris_model/

安装 XGBoost 库

安装 XGBoost 库 - 0.82 或更高版本。

运行预测

cd serving_dir/boosted_tree_iris_model/
python main.py '[{"sepal_length":5.0, "sepal_width":2.0, "petal_length":3.5, "petal_width":1.0}]'

在线部署和服务

本部分使用 gcloud 命令行工具针对导出的模型部署和运行预测。

如需详细了解如何使用自定义例程将模型部署到 AI Platform 以进行在线/批量预测,请参阅部署模型

创建模型资源

MODEL_NAME="BOOSTED_TREE_IRIS_MODEL"
gcloud ai-platform models create $MODEL_NAME

创建模型版本

1) 设置环境变量

MODEL_DIR="gs://some/gcs/path/boosted_tree_iris_model"
VERSION_NAME="v1"

2) 创建版本

gcloud beta ai-platform versions create $VERSION_NAME --model=$MODEL_NAME --origin=$MODEL_DIR --package-uris=${MODEL_DIR}/xgboost_predictor-0.1.tar.gz --prediction-class=predictor.Predictor --runtime-version=1.15

此步骤可能需要几分钟才能完成。您应该会看到如下消息:Creating version (this might take a few minutes)......

3)(可选)获取有关新版本的信息

gcloud ai-platform versions describe $VERSION_NAME --model $MODEL_NAME

您应该会看到如下所示的输出:

createTime: '2020-02-07T00:35:42Z'
deploymentUri: gs://some/gcs/path/boosted_tree_iris_model
etag: rp090ebEnQk=
machineType: mls1-c1-m2
name: projects/[YOUR-PROJECT-ID]/models/BOOSTED_TREE_IRIS_MODEL/versions/v1
packageUris:
- gs://some/gcs/path/boosted_tree_iris_model/xgboost_predictor-0.1.tar.gz
predictionClass: predictor.Predictor
pythonVersion: '2.7'
runtimeVersion: '1.15'
state: READY

在线预测

如需详细了解如何对已部署的模型运行在线预测,请参阅请求预测

1) 为输入创建以换行符分隔的 JSON 文件,例如 instances.json 文件,其中包含以下内容:

{"sepal_length":5.0, "sepal_width":2.0, "petal_length":3.5, "petal_width":1.0}
{"sepal_length":5.3, "sepal_width":3.7, "petal_length":1.5, "petal_width":0.2}

2) 为预测设置环境变量

INPUT_DATA_FILE="instances.json"

3) 运行预测

gcloud ai-platform predict --model $MODEL_NAME --version $VERSION_NAME --json-instances $INPUT_DATA_FILE

训练和部署 AutoML 分类器模型

训练模型

使用 BigQuery ML CREATE MODEL 语句训练一个预测鸢尾花类型的 AutoML 分类器模型。AutoML 模型至少需要 1000 行输入数据。由于 ml_datasets.iris 只有 150 行,因此我们将数据复制 10 次。此训练作业大约需要 2 小时才能完成。

bq query --use_legacy_sql=false \
  'CREATE MODEL `bqml_tutorial.automl_iris_model`
  OPTIONS (model_type="automl_classifier",
      budget_hours=1, input_label_cols=["species"])
  AS SELECT
    * EXCEPT(multiplier)
  FROM
    `bigquery-public-data.ml_datasets.iris`, unnest(GENERATE_ARRAY(1, 10)) as multiplier;'

导出模型

使用 bq 命令行工具将模型导出到 Cloud Storage 存储分区。如需了解导出模型的额外方法,请参阅导出 BigQuery ML 模型

bq extract -m bqml_tutorial.automl_iris_model gs://some/gcs/path/automl_iris_model

本地部署和服务

如需详细了解如何构建 AutoML 容器,请参阅导出模型。以下步骤要求您安装 Docker

将导出的模型文件复制到本地目录

mkdir automl_serving_dir
gsutil cp -r gs://some/gcs/path/automl_iris_model/* automl_serving_dir/

拉取 AutoML Docker 映像

docker pull gcr.io/cloud-automl-tables-public/model_server

启动 Docker 容器

docker run -v `pwd`/automl_serving_dir:/models/default/0000001 -p 8080:8080 -it gcr.io/cloud-automl-tables-public/model_server

运行预测

1) 为输入创建以换行符分隔的 JSON 文件,例如 input.json 文件,其中包含以下内容:

{"instances": [{"sepal_length":5.0, "sepal_width":2.0, "petal_length":3.5, "petal_width":1.0},
{"sepal_length":5.3, "sepal_width":3.7, "petal_length":1.5, "petal_width":0.2}]}

2) 进行预测调用

curl -X POST --data @input.json http://localhost:8080/predict

在线部署和服务

AI Platform 不支持 AutoML 回归器和 AutoML 分类器模型的在线预测。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  • 删除您在教程中创建的项目。
  • 或者,您可以保留项目并删除数据集和 Cloud Storage 存储分区。

停止 Docker 容器

1) 列出所有正在运行的 Docker 容器。

docker ps

2) 停止容器列表中具有适当容器 ID 的容器。

docker stop container_id

删除 AI Platform 资源

1) 删除模型版本。

gcloud ai-platform versions delete $VERSION_NAME --model=$MODEL_NAME

2) 删除模型。

gcloud ai-platform models delete $MODEL_NAME

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Cloud Console 中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 在导航窗格中,点击您创建的 bqml_tutorial 数据集。

  3. 点击窗口右侧的删除数据集。此操作会删除相关数据集、表和所有数据。

  4. 删除数据集对话框中,输入您的数据集的名称 (bqml_tutorial),然后点击删除以确认删除命令。

删除您的 Cloud Storage 存储分区

删除项目将移除项目中的所有 Cloud Storage 存储分区。如果您希望重复使用该项目,则可以删除在本教程中创建的存储分区。

  1. 在 Google Cloud Console 中,转到 Cloud Storage 浏览器页面。

    转到浏览器

  2. 选中与要删除的存储分区对应的复选框。

  3. 点击删除

  4. 在出现的叠加窗口中,点击删除以确认要删除此存储分区及其内容。

删除项目

如需删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤