使用 scikit-learn 获取在线预测结果

本示例会训练一个模型,以根据人口普查收入数据集预测个人收入水平。在本地训练并保存模型后,您可以将其部署到 AI Platform Prediction,并对其进行查询以获取在线预测结果。

您可以在 AI Platform Prediction 上部署和提供 scikit-learn 流水线。通过 scikit-learn 中的流水线模块,您可以在使用 Estimator 进行训练之前应用多个数据转换。这样可以封装数据处理的多个步骤,并确保每个步骤使用相同的训练数据。

此外,GitHub 上也以 Jupyter 笔记本形式提供了本教程。

如何将模型部署到 AI Platform Prediction

您可以通过以下五个步骤,将模型部署到 AI Platform Prediction 以获取预测结果:

  • 将模型保存为文件
  • 将保存的模型上传到 Cloud Storage
  • 在 AI Platform Prediction 上创建模型资源
  • 创建模型版本,并将其关联到已保存的模型
  • 进行在线预测

准备工作

完成以下步骤以设置 GCP 账号,激活 AI Platform Prediction API,以及安装并激活 Cloud SDK。

设置 GCP 项目

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

设置环境

请在以下选项中选择是在 macOS 本地设置环境,还是在 Cloud Shell 的远程环境中设置环境。

如果您是 macOS 用户,我们建议您按照下面的 MACOS 标签页中的说明设置环境。Cloud Shell 适用于 macOS、Linux 和 Windows 系统,在 CLOUD SHELL 标签页中提供。Cloud Shell 可帮助您快速体验 AI Platform Prediction,但不适用于持续性的开发工作。

macOS

  1. 检查 Python 的安装情况
    确认您是否已安装 Python;如有必要,请安装。

    python -V
  2. 检查 pip 的安装情况
    pip 是 Python 的软件包管理器,包含在当前版本的 Python 中。请运行 pip --version 来检查您是否已安装 pip。如果未安装,请了解如何安装 pip

    您可以使用以下命令升级 pip

    pip install -U pip

    如需了解详情,请参阅 pip 文档

  3. 安装 virtualenv
    virtualenv 是用于创建独立 Python 环境的工具。请运行 virtualenv --version 来检查您是否已安装 virtualenv。如果未安装,请安装 virtualenv

    pip install --user --upgrade virtualenv

    如需为本指南创建一个独立的开发环境,请在 virtualenv 中新建一个虚拟环境。例如,以下命令会激活名为 aip-env 的环境:

    virtualenv aip-env
    source aip-env/bin/activate
  4. 在本教程中,请在虚拟环境中运行其余命令。

    详细了解如何使用 virtualenv。如需退出 virtualenv,请运行 deactivate

Cloud Shell

  1. 打开 Google Cloud 控制台。

    Google Cloud 控制台

  2. 点击控制台窗口顶部的激活 Google Cloud Shell 按钮。

    激活 Google Cloud Shell

    一个 Cloud Shell 会话随即会在控制台底部的新框内打开,并显示命令行提示符。该 Shell 会话可能需要几秒钟来完成初始化。

    Cloud Shell 会话

    您的 Cloud Shell 会话已就绪,可以使用了。

  3. 配置 gcloud 命令行工具以使用您所选的项目。

    gcloud config set project [selected-project-id]

    其中,[selected-project-id] 是您的项目 ID。(忽略中括号)。

安装框架

macOS

在虚拟环境中,您可以运行以下命令,以安装 AI Platform Prediction 运行时版本 2.11 中使用的 scikit-learn 和 Pandas 版本:

(aip-env)$ pip install scikit-learn==1.0.2 pandas==1.3.5

通过在上述命令中提供版本号,您可以确保虚拟环境中的依赖项与运行时版本中的依赖项相匹配。这有助于防止您的代码在 AI Platform Prediction 上运行时出现不符合预期的行为。

如需了解详情、安装选项和问题排查信息,请参阅每个框架的安装说明:

Cloud Shell

运行以下命令可安装 scikit-learn 和 pandas:

pip install --user scikit-learn pandas

如需了解详情、安装选项和问题排查信息,请参阅每个框架的安装说明:

下载数据

本示例中用于训练的人口普查收入数据集UC Irvine 机器学习存储库托管。如需了解详情,请参阅关于数据

  • 训练文件为 adult.data
  • 评估文件为 adult.test

训练和保存模型

要训练和保存模型,请完成以下步骤:

  1. 将数据加载到 Pandas DataFrame 中以准备用于 scikit-learn。
  2. 在 scikit-learn 中训练一个简单的模型。
  3. 将该模型保存到可以上传到 AI Platform Prediction 的文件中。

如果您已经有经过训练的模型要上传,请参阅如何导出模型

加载和转换数据

您可以使用 scikit-learn 或 pickle 中包含的 joblib 版本导出 Pipeline 对象,方法与导出 scikit-learn Estimator 类似。以下示例使用流水线将各个分类特征转换为数值,然后将其组合并使用 RandomForestClassifier 来训练模型。

from sklearn.externals import joblib
import json
import numpy as np
import os
import pandas as pd
import pickle
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer

# Define the format of your input data, including unused columns.
# These are the columns from the census data files.
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)

# Categorical columns are columns that need to be turned into a numerical value to be used by scikit-learn
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)


# Load the training census dataset
with open('./census_data/adult.data', 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)

# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
train_features = raw_training_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').as_matrix().tolist()


# Load the test census dataset
with open('./census_data/adult.test', 'r') as test_data:
    raw_testing_data = pd.read_csv(test_data, names=COLUMNS, skiprows=1)
# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
test_features = raw_testing_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
test_labels = (raw_testing_data['income-level'] == ' >50K.').as_matrix().tolist()


# Since the census data set has categorical features, we need to convert
# them to numerical values. We'll use a list of pipelines to convert each
# categorical column and then use FeatureUnion to combine them before calling
# the RandomForestClassifier.
categorical_pipelines = []

# Each categorical column needs to be extracted individually and converted to a numerical value.
# To do this, each categorical column will use a pipeline that extracts one feature column via
# SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
# A scores array (created below) will select and extract the feature column. The scores array is
# created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
for i, col in enumerate(COLUMNS[:-1]):
    if col in CATEGORICAL_COLUMNS:
        # Create a scores array to get the individual categorical column.
        # Example:
        #  data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
        #         'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
        #  scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        #
        # Returns: [['Sate-gov']]
        scores = []
        # Build the scores array
        for j in range(len(COLUMNS[:-1])):
            if i == j: # This column is the categorical column we want to extract.
                scores.append(1) # Set to 1 to select this column
            else: # Every other column should be ignored.
                scores.append(0)
        skb = SelectKBest(k=1)
        skb.scores_ = scores
        # Convert the categorical column to a numerical value
        lbn = LabelBinarizer()
        r = skb.transform(train_features)
        lbn.fit(r)
        # Create the pipeline to extract the categorical feature
        categorical_pipelines.append(
            ('categorical-{}'.format(i), Pipeline([
                ('SKB-{}'.format(i), skb),
                ('LBN-{}'.format(i), lbn)])))

# Create pipeline to extract the numerical features
skb = SelectKBest(k=6)
# From COLUMNS use the features that are numerical
skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
categorical_pipelines.append(('numerical', skb))

# Combine all the features using FeatureUnion
preprocess = FeatureUnion(categorical_pipelines)

# Create the classifier
classifier = RandomForestClassifier()

# Transform the features and fit them to the classifier
classifier.fit(preprocess.transform(train_features), train_labels)

# Create the overall model as a single pipeline
pipeline = Pipeline([
    ('union', preprocess),
    ('classifier', classifier)
])

导出模型

如需导出模型,您可以使用 joblibPython pickle

joblib

from sklearn.externals import joblib

# Export the model to a file
joblib.dump(pipeline, 'model.joblib')

pickle

# Export the model to a file
with open('model.pkl', 'wb') as model_file:
  pickle.dump(pipeline, model_file)

模型文件命名要求

您保存并上传到 Cloud Storage 的模型文件必须命名为 model.pklmodel.joblib,具体取决于所使用的库。此限制可确保在导入和导出模型时,AI Platform Prediction 均使用相同的模式重建模型。

导出模型时使用的库 正确的模型名称
pickle model.pkl
sklearn.externals.joblib model.joblib

为了在未来进行模型的迭代,请妥善组织您的 Cloud Storage 存储桶,确保每个新模型都有一个专用目录。

将模型存储在 Cloud Storage 中

在本教程中,最简单的方法是使用 AI Platform Prediction 所用的项目中的专用 Cloud Storage 存储桶。

如果您使用的是其他项目中的存储桶,则必须确保您的 AI Platform Prediction 服务账号可以访问 Cloud Storage 中的模型。如果没有适当的权限,创建 AI Platform Prediction 模型版本的请求将失败。请详细了解如何授予访问存储空间的权限

设置 Cloud Storage 存储桶

本部分介绍如何创建新存储桶。您可以使用现有存储桶,但它所在区域必须与您计划运行 AI Platform 作业的区域相同。此外,如果该存储桶不属于您用于运行 AI Platform Prediction 的项目,则您必须明确向 AI Platform Prediction 服务账号授予访问权限

  1. 为新存储桶指定名称。该名称在 Cloud Storage 的所有存储桶中必须是唯一的。

    BUCKET_NAME="YOUR_BUCKET_NAME"

    例如,使用附加了 -aiplatform 的项目名称:

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. 检查您创建的存储桶名称。

    echo $BUCKET_NAME
  3. 为您的存储桶选择一个区域,并设置 REGION 环境变量。

    使用您计划在其中运行 AI Platform Prediction 作业的区域。查看 AI Platform Prediction 服务的可用区域

    例如,以下代码会创建 REGION 并将其设置为 us-central1

    REGION=us-central1
  4. 创建新的存储桶:

    gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION

将导出的模型文件上传到 Cloud Storage

运行以下命令,将已保存的模型文件上传到 Cloud Storage 中的存储桶:

gcloud storage cp ./model.joblib gs://your_bucket_name/model.joblib

设置数据格式以进行预测

在发送在线预测请求之前,您必须设置测试数据的格式以准备供 AI Platform Prediction 预测服务使用。请确保输入实例的格式与模型所需的格式相匹配。

gcloud

创建一个 input.json 文件,其中每个输入实例位于单独的一行。以下示例使用前面步骤中定义的 test_features 列表中的前十个数据实例。

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"]
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"]
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"]
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"]
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"]
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"]
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"]
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"]
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"]
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]

请注意,输入实例的格式需要与模型要求的格式相匹配。在本例中,Census 模型需要 14 个特征,因此您的输入必须是形状为 (num_instances, 14) 的矩阵。

REST API

创建一个 input.json 文件,其格式为每个输入实例位于单独的一行。以下示例使用前面步骤中定义的 test_features 列表中的前十个数据实例。

{
  "instances": [

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"],
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"],
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"],
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"],
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"],
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"],
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"],
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"],
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"],
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]
  ]
}

请注意,输入实例的格式需要与模型要求的格式相匹配。在本例中,Census 模型需要 14 个特征,因此您的输入必须是形状为 (num_instances, 14) 的矩阵。

如需了解详情,请参阅设置用于在线预测的输入数据格式

使用本地预测测试模型

在将模型部署到 AI Platform Prediction 之前,您可以使用 gcloud ai-platform local predict 命令测试模型如何提供预测服务。该命令使用本地环境中的依赖项执行预测,并以 gcloud ai-platform predict 在执行在线预测时使用的同一格式返回结果。在本地测试预测有助于在产生在线预测请求费用之前发现错误。

对于 --model-dir 参数,请指定本地机器或 Cloud Storage 中包含导出的机器学习模型的目录。对于 --framework 参数,请指定 tensorflowscikit-learnxgboost。您不能将 gcloud ai-platform local predict 命令与自定义预测例程搭配使用。

以下示例展示了如何执行本地预测:

gcloud ai-platform local predict --model-dir LOCAL_OR_CLOUD_STORAGE_PATH_TO_MODEL_DIRECTORY/ \
  --json-instances LOCAL_PATH_TO_PREDICTION_INPUT.JSON \
  --framework NAME_OF_FRAMEWORK

部署模型和版本

AI Platform Prediction 使用模型和版本资源来组织经过训练的模型。AI Platform Prediction 模型是存放机器学习模型版本的容器。

如需部署模型,请在 AI Platform Prediction 中创建模型资源,创建该模型的版本,然后将模型版本关联到存储在 Cloud Storage 中的模型文件。

创建模型资源

AI Platform Prediction 使用模型资源来组织模型的不同版本。

此时,您必须确定希望属于此模型的模型版本使用区域端点还是全球端点。在大多数情况下,建议选择区域端点。如果您需要仅旧版 (MLS1) 机器类型才提供的功能,请使用全球端点。

此时,您还必须确定,是否希望属于该模型的模型版本在提供预测时导出任何日志。以下示例不启用日志记录。了解如何启用日志记录

控制台

  1. 打开 Google Cloud 控制台中的 AI Platform Prediction 模型页面:

    转到“模型”页面

  2. 点击模型页面顶部的新建模型按钮。您随即会进入创建模型页面。

  3. 模型名称字段中,输入一个唯一的模型名称。

  4. 选中使用区域端点复选框后,AI Platform Prediction 将使用区域端点。要改为使用全球端点,请清除使用区域端点复选框。

  5. 区域下拉列表中,选择预测节点的位置。可用区域取决于您是使用区域端点还是全球端点。

  6. 点击创建

  7. 确认您已返回模型页面,并且新模型显示在列表中。

gcloud

区域端点

运行以下命令:

gcloud ai-platform models create MODEL_NAME \
  --region=REGION

替换以下内容:

如果您没有指定 --region 标志,则 gcloud CLI 会提示您选择一个区域端点(或在全球端点上使用 us-central)。

或者,您可以ai_platform/region 属性设置为特定区域,以确保 gcloud CLI 始终为 AI Platform Prediction 使用相应的区域端点,即使您未指定 --region 标志也是如此。(此配置不适用于 gcloud ai-platform operations 命令组中的命令。)

全球端点

运行以下命令:

gcloud ai-platform models create MODEL_NAME \
  --regions=REGION

替换以下内容:

如果您没有指定 --regions 标志,则 gcloud CLI 会提示您选择一个区域端点(或在全球端点上使用 us-central1)。

REST API

区域端点

  1. 通过将模型对象放在请求正文中来设置请求的格式。至少,通过替换以下示例中的 MODEL_NAME,为模型指定一个名称:

    {
      "name": "MODEL_NAME"
    }
    
  2. 针对以下网址进行 REST API 调用,并将 PROJECT_ID 替换为您的 Google Cloud 项目 ID:

    POST https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/
    

    替换以下内容:

    例如,您可以使用 curl 命令发出以下请求。该命令使用与您的 Google Cloud CLI 安装关联的凭据向请求授权。

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "MODEL_NAME"}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models"
    

    API 会返回类似于如下所示的响应:

    {
      "name": "projects/PROJECT_ID/models/MODEL_NAME",
      "regions": [
        "REGION"
      ]
    }
    

全球端点

  1. 通过将模型对象放在请求正文中来设置请求的格式。至少,通过替换以下示例中的 MODEL_NAME,为模型指定一个名称,并通过将 REGION 替换为支持旧版 (MLS1) 机器类型的区域来指定区域:

    {
      "name": "MODEL_NAME",
      "regions": ["REGION"]
    }
    
  2. 针对以下网址进行 REST API 调用,并将 PROJECT_ID 替换为您的 Google Cloud 项目 ID:

    POST https://ml.googleapis.com/v1/projects/PROJECT_ID/models/
    

    例如,您可以使用 curl 命令发出以下请求。该命令使用与您的 Google Cloud CLI 安装关联的凭据向请求授权。

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "MODEL_NAME", "regions": ["REGION"]}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://ml.googleapis.com/v1/projects/PROJECT_ID/models"
    

    API 会返回类似于如下所示的响应:

    {
      "name": "projects/PROJECT_ID/models/MODEL_NAME",
      "regions": [
        "REGION"
      ]
    }
    

如需了解详情,请参阅 AI Platform Prediction 模型 API

创建模型版本

现在,您就可以使用先前上传到 Cloud Storage 且经过训练的模型来创建模型版本了。创建版本时,您可以指定多个参数。以下列表介绍了一些常见参数,其中一些是必需的参数:

  • name:在 AI Platform Prediction 模型中必须是唯一的。
  • deploymentUri:Cloud Storage 中模型目录的路径。

    • 如果您要部署 TensorFlow 模型,则此参数是 SavedModel 目录。
    • 如果您要部署 scikit-learn 或 XGBoost 模型,则此参数是包含 model.joblibmodel.pklmodel.bst 文件的目录。
    • 如果您要部署自定义预测例程,则此参数是包含所有模型工件的目录。此目录的总大小不能超过 500 MB
  • frameworkTENSORFLOWSCIKIT_LEARNXGBOOST

  • runtimeVersion:基于模型所需依赖项的运行时版本。如果您要部署 scikit-learn 模型或 XGBoost 模型,则此参数必须至少为 1.4。如果您计划将模型版本用于批量预测,则必须使用运行时版本 2.1 或更早版本。

  • pythonVersion:必须设置为“3.5”(对于运行时版本 1.4 到 1.14)或“3.7”(对于运行时版本 1.15 及更高版本),才能与使用 Python 3 导出的模型文件兼容。如果与运行时版本 1.15 或更早版本配合使用,也可设置为“2.7”。

  • machineType(可选):AI Platform Prediction 用于提供预测服务的节点的虚拟机类型。详细了解机器类型。如果未设置,则默认为在区域端点上使用 n1-standard-2 以及在全球端点上使用 mls1-c1-m2

如需详细了解上述每个参数以及其他不常见的参数,请参阅版本资源的 API 参考文档

此外,如果您在区域端点上创建了模型,请务必在同一区域端点上创建版本

控制台

  1. 打开 Google Cloud 控制台中的 AI Platform Prediction 模型页面:

    转到“模型”页面

  2. 模型页面上,选择要用于创建版本的模型资源的名称。您随即会进入模型详情页面。

  3. 点击模型详情页面顶部的新建版本按钮。您随即会进入创建版本页面。

  4. 名称字段中输入您的版本名称。(可选)在说明字段中,输入版本的说明。

  5. 在相应的下拉框中输入有关您如何训练模型的以下信息:

  6. 选择要运行在线预测的机器类型

  7. 模型 URI 字段中,输入您上传模型文件时使用的 Cloud Storage 存储桶位置。您可以使用浏览按钮查找正确的路径。

    请确保指定的路径指向包含该文件的目录,而非指向模型文件本身。例如,使用 gs://your_bucket_name/model-dir/,而不是 gs://your_bucket_name/model-dir/saved_model.pbgs://your_bucket_name/model-dir/model.pkl

  8. 选择用于在线预测部署的扩缩选项:

    • 如果选择“自动扩缩”,则系统会显示可选的节点数下限字段。您可以输入当服务规模缩减时应始终保持运行的最小节点数。

    • 如果选择“手动扩缩”,则必须输入您希望始终保持运行的节点数

    了解扩缩选项如何因机器类型而异

    如需了解详情,请参阅预测费用的价格

  9. 点击保存即可完成模型版本的创建。

gcloud

  1. 设置环境变量,以存储模型二进制文件所在的 Cloud Storage 目录的路径、模型名称、版本名称和框架选项。

    使用 gcloud CLI 创建版本时,您可以提供带下划线的大写字母框架名称(例如 SCIKIT_LEARN)或带连字符的小写字母框架名称(例如 scikit-learn)。这两种方式具有相同的效果。

    [VALUES_IN_BRACKETS] 替换为适当的值:

    MODEL_DIR="gs://your_bucket_name/"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    MODEL_NAME="[YOUR-MODEL-NAME]"
    FRAMEWORK="[YOUR-FRAMEWORK_NAME]"
    

  2. 创建版本:

    gcloud ai-platform versions create $VERSION_NAME \
      --model=$MODEL_NAME \
      --origin=$MODEL_DIR \
      --runtime-version=2.11 \
      --framework=$FRAMEWORK \
      --python-version=3.7 \
      --region=REGION \
      --machine-type=MACHINE_TYPE
    

    替换以下内容:

    • REGION:您在其上创建模型区域端点的区域。如果您在全球端点上创建模型,请省略 --region 标志。

    • MACHINE_TYPE:一种机器类型,用于确定预测节点可使用的计算资源。

    创建版本需要几分钟时间。完成后,您应该会看到以下输出:

    Creating version (this might take a few minutes)......done.
  3. 获取有关新版本的信息:

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

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

    createTime: '2018-02-28T16:30:45Z'
    deploymentUri: gs://your_bucket_name
    framework: [YOUR-FRAMEWORK-NAME]
    machineType: mls1-c1-m2
    name: projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]
    pythonVersion: '3.7'
    runtimeVersion: '2.11'
    state: READY

REST API

  1. 设置请求正文的格式,使其包含版本对象。以下示例指定了版本 namedeploymentUriruntimeVersionframeworkmachineType。将 [VALUES_IN_BRACKETS] 替换为适当的值:

    {
      "name": "[YOUR-VERSION-NAME]",
      "deploymentUri": "gs://your_bucket_name/",
      "runtimeVersion": "2.11",
      "framework": "[YOUR_FRAMEWORK_NAME]",
      "pythonVersion": "3.7",
      "machineType": "[YOUR_MACHINE_TYPE]"
    }
    
  2. 针对以下路径进行 REST API 调用,将 [VALUES_IN_BRACKETS] 替换为适当的值:

    POST https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions
    

    REGION 替换为您在其上创建了模型区域端点的区域。如果您是在全球端点上创建的模型,请使用 ml.googleapis.com

    例如,您可以使用 curl 命令发出以下请求:

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name/", "runtimeVersion": "2.11", "framework": "[YOUR_FRAMEWORK_NAME]", "pythonVersion": "3.7", "machineType": "[YOUR_MACHINE_TYPE]"}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions"
    

    创建版本需要几分钟时间。完成后,您应该会看到类似如下所示的输出:

    {
      "name": "projects/[YOUR-PROJECT-ID]/operations/create_[YOUR-MODEL-NAME]_[YOUR-VERSION-NAME]-[TIMESTAMP]",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.ml.v1.OperationMetadata",
        "createTime": "2018-07-07T02:51:50Z",
        "operationType": "CREATE_VERSION",
        "modelName": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]",
        "version": {
          "name": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]",
          "deploymentUri": "gs://your_bucket_name",
          "createTime": "2018-07-07T02:51:49Z",
          "runtimeVersion": "2.11",
          "framework": "[YOUR_FRAMEWORK_NAME]",
          "machineType": "[YOUR_MACHINE_TYPE]",
          "pythonVersion": "3.7"
        }
      }
    }
    

发送在线预测请求

成功创建版本后,AI Platform Prediction 将启动一个可处理预测请求的新服务器。

本部分演示以下内容:

  1. 如何使用 gcloud 发送测试较小数据集的请求,以测试模型。
  2. 如何使用 Python 客户端库发送测试完整测试数据集的大型请求,并查看前十个结果。

gcloud

本部分介绍如何使用您在上一步中创建的 input.json 文件发送预测请求。

  1. 为模型名称、版本名称和输入文件的名称设置环境变量。将 [VALUES_IN_BRACKETS] 替换为适当的值:

    MODEL_NAME="[YOUR-MODEL-NAME]"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    INPUT_FILE="input.json"
    
  2. 发送预测请求:

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

    如果预测某人的年收入超过 $50000,则预测结果返回 True,否则返回 False。例如,您的前十个结果可能如下所示:

    [False, False, False, True, False, False, False, False, False, False]
    

REST API

本部分介绍如何使用您在上一步中创建的 input.json 文件发送预测请求。

发送预测请求:

curl -X POST -H "Content-Type: application/json" -d @input.json \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
"https://ml.googleapis.com/v1/projects/${PROJECT_ID}/models/${MODEL_NAME}/versions/${VERSION_NAME}:predict"

如果预测某人的年收入超过 $50000,则预测结果返回 True,否则返回 False。预测结果以布尔值列表的形式显示在控制台中。例如,您的前十个结果可能如下所示:

{"predictions": [false, false, false, true, false, false, false, false, false, false]}

Python

此示例使用 Python 客户端库针对整个人口普查数据集发送预测请求,并输出前十个结果。如需了解详情,请参阅如何使用 Python 客户端库

[VALUES_IN_BRACKETS] 替换为适当的值:

import googleapiclient.discovery

# Fill in your PROJECT_ID, VERSION_NAME and MODEL_NAME before running
# this code.

PROJECT_ID = [YOUR PROJECT_ID HERE]
VERSION_NAME = [YOUR VERSION_NAME HERE]
MODEL_NAME = [YOUR MODEL_NAME HERE]

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}'.format(PROJECT_ID, MODEL_NAME)
name += '/versions/{}'.format(VERSION_NAME)

# Due to the size of the data, it needs to be split in 2
first_half = test_features[:int(len(test_features)/2)]
second_half = test_features[int(len(test_features)/2):]

complete_results = []
for data in [first_half, second_half]:
    responses = service.projects().predict(
        name=name,
        body={'instances': data}
    ).execute()

    if 'error' in responses:
        print(response['error'])
    else:
        complete_results.extend(responses['predictions'])

# Print the first 10 responses
for i, response in enumerate(complete_results[:10]):
    print('Prediction: {}\tLabel: {}'.format(response, test_labels[i]))

如果预测某人的年收入超过 $50000,则预测结果返回 True,否则返回 False。例如,您的前十个结果可能如下所示:

Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False

如需详细了解每个输入参数,请参阅 AI Platform Prediction API 预测请求详细信息

关于数据

本示例中用于训练的人口普查收入数据集UC Irvine 机器学习存储库托管。

人口普查数据由 Lichman, M. (2013) 提供。UCI 机器学习存储库 http://archive.ics.uci.edu/ml。加利福尼亚州欧文市:加州大学信息与计算机科学学院。此数据集公开提供给所有人使用,但使用者必须遵守数据集来源规定的以下条款:http://archive.ics.uci.edu/ml。Google“按原样”提供此数据集,不作任何明示或暗示的保证。 对于因使用数据集而导致的任何直接或间接损害,Google 不承担任何责任。

后续步骤