内置图片分类算法使用入门

借助 AI Platform Training 中的内置算法,您可以提交训练数据、选择算法,以及让 AI Platform Training 为您处理预处理和训练作业,而无需为训练应用编写任何代码。利用内置图片算法,您只需进行极少的配置即可在 TPU 上进行训练。 生成的 TensorFlow SavedModel 可在 CPU 和 GPU 上运行。

概览

在本教程中,您无需编写任何代码即可训练图片分类模型。您可以将花卉数据集提交给 AI Platform Training 进行训练,然后在 AI Platform Training 上部署该模型以获取预测结果。生成的模型会根据物种(雏菊、郁金香、玫瑰、向日葵或蒲公英)对花卉图片进行分类。

准备工作

如需通过命令行完成本教程的学习,请使用 Cloud Shell 或已安装 Google Cloud CLI 的任何环境。

完成以下步骤以设置 GCP 账号,启用所需的 API,以及安装和激活 Google Cloud CLI。

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

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

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    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. 确保您的 Google Cloud 项目已启用结算功能

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

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init

授权 Cloud TPU 访问项目

请按照以下步骤为 Google Cloud 项目所关联的 Cloud TPU 服务账号名称授权:

  1. 通过调用 projects.getConfig 获取 Cloud TPU 服务账号名称。示例:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. 保存 API 返回的 serviceAccountProjecttpuServiceAccount 字段的值。

  3. 初始化 Cloud TPU 服务账号:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

现在,将该 Cloud TPU 服务账号添加为项目的成员,并为其授予 Cloud ML Service Agent 角色。在 Google Cloud 控制台中或使用 gcloud 命令完成以下步骤:

控制台

  1. 登录 Google Cloud 控制台,然后选择您正在使用 TPU 的项目。
  2. 选择 IAM 和管理 > IAM
  3. 点击添加按钮向项目添加成员。
  4. 成员文本框中输入 TPU 服务账号。
  5. 点击角色下拉列表。
  6. 启用 Cloud ML Service Agent 角色 (Service Agent > Cloud ML Service Agent)。

gcloud

  1. 设置包含项目 ID 和 Cloud TPU 服务账号的环境变量:

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. ml.serviceAgent 角色授予 Cloud TPU 服务账号:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

如需详细了解如何为服务账号授予角色,请参阅 IAM 文档

设置

我们已针对本教程中的操作修改了 TensorFlow Flowers 数据集,并将该数据集托管在公开的 Cloud Storage 存储桶 (gs://cloud-samples-data/ai-platform/built-in/image/flowers/) 中。

控制台

选择算法

  1. 转到 Google Cloud Console 中的 AI Platform Training“作业”页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练创建新的训练作业页面随即显示。

  3. 训练作业的创建分为四个步骤。第一步是训练算法。选择图片分类,然后点击下一步

训练数据

  1. 训练数据部分,选择示例数据集的训练数据,该数据集托管在我们的公开 Cloud Storage 存储桶中:

    1. 选择使用存储在一个 Cloud Storage 目录中的多个文件

    2. 目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/flowers/”

    3. 通配符名称部分,填入“flowers_train*”以选择该目录中的所有训练文件。

    4. 完整 GCS 路径 (Complete GCS path) 部分显如下:“gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_train*”

  2. 验证数据部分,选择示例数据集的验证数据,该数据集托管在我们的公开 Cloud Storage 存储桶中:

    1. 选择使用存储在一个 Cloud Storage 目录中的多个文件

    2. 目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/flowers/”

    3. 通配符名称部分,填入“flowers_validation*”以选择该目录中的所有验证文件。

    4. 完整 GCS 路径 (Complete GCS path) 部分显示如下:“gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_validation*”

  3. 指定您的 Cloud Storage 存储桶中的所需输出目录,以供 AI Platform Training 用来存储经过训练的模型、检查点和其他训练作业输出。您可以填写存储桶中的确切路径,或使用浏览按钮来选择路径。

gcloud

为您的项目 ID、Cloud Storage 存储桶、指向训练数据的 Cloud Storage 路径以及算法选择设置环境变量。

AI Platform Training 内置算法位于 Container Registry 中托管的 Docker 容器中。

PROJECT_ID="YOUR_PROJECT_ID"
BUCKET_NAME="YOUR_BUCKET_NAME"
REGION="us-central1"

gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION

# Set paths to the training and validation data.
TRAINING_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_train*"
VALIDATION_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_validation*"

# Specify the Docker container for your built-in algorithm selection.
IMAGE_URI="gcr.io/cloud-ml-algos/image_classification:latest"

提交训练作业

如需提交作业,您必须指定一些基本训练参数,以及一些与图片分类算法相关的基本参数。

训练作业的常规参数:

训练作业参数
参数 说明
job-id 训练作业的唯一 ID。提交训练作业后,您可以使用此参数查找训练作业状态的日志。
job-dir AI Platform Training 在训练作业成功完成后用来保存训练文件的 Cloud Storage 路径。
scale-tier 指定用于训练的机器类型。使用 BASIC 选择仅使用一台机器的配置。
master-image-uri Container Registry URI,用于指定训练作业要使用的 Docker 容器。将此容器用于先前定义为 IMAGE_URI 的内置图片分类算法。
region 指定用于运行训练作业的可用区域。在本教程中,您可以使用区域 us-central1

内置图片分类算法专用参数:

算法参数
参数 说明
training_data_path 用于训练的 TFRecord 路径模式的路径。
validation_data_path 用于验证的 TFRecord 路径模式的路径。
pretrained_checkpoint_path 预训练的检查点的路径。您可以使用一些已发布的检查点。
num_classes 训练/验证数据中的类别数。
max_steps 训练作业将运行的步数。
train_batch_size 每个训练步要使用的图片数。
num_eval_images 用于评估的图片总数。
如果为 0,则 validation_data_path 中的所有图片都将用于评估。
learning_rate_decay_type 训练期间使用的学习速率衰减方法。
warmup_learning_rate 预热阶段开始时的学习速率。
warmup_steps 需要在预热阶段运行的步数,或预热阶段的长度(以步为单位)。 训练作业在预热阶段使用 warmup_learning_rate。当预热阶段结束时,训练作业使用 initial_learning_rate
initial_learning_rate 预热阶段完成后的初始学习速率。
stepwise_learning_rate_steps 学习速率衰减类型为阶梯式时学习速率的衰减/变化步。
例如,100,200 表示学习速率将在第 100 步和第 200 步发生变化(相对于 stepwise_learning_rate_levels)。请注意,只有在将 learning_rate_decay_type 设置为“阶梯式”时,才会遵循此参数的设置。
stepwise_learning_rate_levels 学习速率衰减类型为阶梯式时每步的学习速率值。请注意,只有在将 learning_rate_decay_type 设置为“阶梯式”时,才会遵循此参数的设置。
image_size 用于训练的图片大小(宽度和高度)。
optimizer_type 用于训练的优化器。应为以下项之一:
{momentum, adam, rmsprop}
optimizer_arguments 优化器的参数。这是以英文逗号分隔的“名称=值”对列表。该参数必须与 optimizer_type 兼容。示例:
  • 对于 Momentum 优化器,该参数接受 momentum=0.9。如需了解详情,请参阅 tf.train.MomentumOptimizer
  • 对于 Adam 优化器,该参数可以是 beta1=0.9,beta2=0.999。 如需了解详情,请参阅 tf.train.AdamOptimizer
  • 对于 RMSProp 优化器,该参数可以是 decay=0.9,momentum=0.1,epsilon=1e-10。 如需了解详情,请参阅 RMSPropOptimizer
model_type 用于训练模型的模型架构类型。该参数可为以下项之一:
  • resnet-(18|34|50|101|152|200)
  • efficientnet-(b0|b1|b2|b3|b4|b5|b6|b7)
label_smoothing softmax_cross_entropy 中使用的标签平滑参数。
weight_decay 用于 L2 正则化的权重衰减系数。 loss = cross_entropy + params['weight_decay'] * l2_loss

如需所有其他图片分类算法标志的详细列表,请参阅内置图片分类参考文档

控制台

算法参数

算法参数标签页的第一部分中,按如下所示填入值:

  • 类别数 (Number of classes):5
  • 步数上限 (Max steps):15000
  • 训练批次大小 (Train batch size):128
  • 评估图片数 (Number of evaluation images):1

算法参数标签页的模型部分 (Model Section) 中,执行以下操作:

  1. 模型类型部分,选择 Efficientnet-b4
  2. 预训练的检查点路径 (Pretrained checkpoint path) 留空。
  3. 标签平滑 (Label smoothing) 和权重衰减 (Weight Decay) 保留为默认值。

作业设置

作业设置标签页上,执行以下操作:

  1. 作业 ID 部分,输入唯一的 ID(例如“image_classification_example”)。
  2. 输入可用区域(例如“us-central1”)。
  3. 如需选择机器类型,请在规模层级部分选择“CUSTOM”。 此时,系统会显示一个提供自定义集群规范的部分。
    1. 主机器类型部分,选择 complex_model_m
    2. 工作器类型部分,选择 cloud_tpu“工作器计数”默认为 1。

点击完成,提交训练作业。

gcloud

  1. 使用 gcloud 提交训练作业之前,请先设置训练作业和算法的所有参数:

    DATASET_NAME="flowers"
    ALGORITHM="image_classification"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_model"
    
    # Give a unique name to your training job.
    DATE="$(date '+%Y%m%d_%H%M%S')"
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Make sure you have access to this Cloud Storage bucket.
    JOB_DIR="gs://${BUCKET_NAME}/algorithms_training/${MODEL_NAME}/${DATE}"
    
  2. 提交作业:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --master-image-uri=$IMAGE_URI \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --job-dir=$JOB_DIR \
      --max_steps=30000 \
      --train_batch_size=128 \
      --num_classes=5 \
      --num_eval_images=100 \
      --initial_learning_rate=0.128 \
      --warmup_steps=1000 \
      --model_type='efficientnet-b4'
    

  3. 成功提交作业后,您可以使用以下 gcloud 命令查看日志:

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

了解作业目录

训练作业成功完成后,AI Platform Training 会在您的 Cloud Storage 存储桶中创建经过训练的模型,以及其他一些工件。您可以在 JOB_DIR 中找到以下目录结构:

  • model/(亦包含 deployment_config.yaml 文件的 TensorFlow SavedModel 目录
    • saved_model.pb
    • deployment_config.yaml
  • eval/
    • events.out.tfevents.[timestamp].cmle-training-[timestamp]
    • events.out.tfevents...
    • ...
  • variables/
    • variables.data-00000-of-00001
    • variables.index

作业目录还包含各种模型检查点文件。

确认您的 JOB_DIR 中的目录结构与上述结构相同:

gsutil ls -a $JOB_DIR/*

部署经过训练的模型

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

如需部署模型,请在 AI Platform Training 中创建模型资源,创建该模型的版本,然后使用所创建的模型和版本请求在线预测。

如需详细了解如何将模型部署到 AI Platform Training,请参阅如何部署 TensorFlow 模型

控制台

  1. 作业页面上,您可以找到包含所有训练作业的列表。点击您刚刚提交的训练作业的名称(“image_classification”或您使用的作业名称)。

  2. 作业详情页面上,您可以查看作业的整体进度,也可以点击查看日志,更详细地查看进度。

  3. 如果作业成功,顶部会显示部署模型按钮。点击部署模型

  4. 选择部署为新模型,并输入模型名称,如“algorithms_image_classification_model”。然后,点击确认

  5. 创建版本页面上,输入版本名称(如“v1”),并将所有其他字段保留为默认设置。点击保存

gcloud

使用内置图片分类算法的训练过程会生成一个 deployment_config.yaml 文件,这让您可以更轻松地在 AI Platform Training 上部署模型进行预测。

  1. 将该文件复制到本地目录并查看其内容:

    gsutil cp $JOB_DIR/model/deployment_config.yaml .
    cat deployment_config.yaml
    

    您的 deployment_config.yaml 文件应类似于以下内容:

    deploymentUri: gs://BUCKET_NAME/algorithms_training/flowers_image_classification/model
    framework: TENSORFLOW
    labels:
      global_step: '1000'
      job_id: flowers_image_classification_20190227060114
    runtimeVersion: '1.14'
    
  2. 在 AI Platform Training 中创建模型和版本:

    gcloud ai-platform models create $MODEL_NAME --regions $REGION
    
    # Create a model and a version using the file above.
    VERSION_NAME="v_${DATE}"
    
    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --config deployment_config.yaml
    

    版本创建过程需要几分钟时间才能完成。

获取在线预测结果

请求预测时,您需要确保输入数据为 JSON 格式。

  1. 下载训练工件文件:

    gsutil cp $JOB_DIR/artifacts/* .
    
  2. 为一张图片准备预测输入。

    要使用 Google Cloud CLI 发送在线预测请求,请将每个实例写入以换行符分隔的 JSON 文件中的一行,如以下示例所示。

    在终端运行以下命令,为您可以发送到 AI Platform Prediction 的单个实例创建输入:

    以下 Python 脚本使用 base64 对单张图片进行编码,设置其格式以用于预测,添加实例键,并将结果写入名为 prediction_instances.json 的文件:

    import json
    import base64
    import tensorflow as tf
    
    IMAGE_URI='gs://cloud-samples-data/ai-platform/built-in/image/tutorial_examples/daisy.jpg'
    
    with tf.gfile.Open(IMAGE_URI, 'rb') as image_file:
      encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    
    image_bytes = {'b64': str(encoded_string)}
    instances = {'image_bytes': image_bytes, 'key': '1'}
    with open("prediction_instances.json","w") as f:
      f.write(json.dumps(instances))
    
  3. 发送预测请求:

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

预测输出最有可能包含 daisy 类别,表示已部署的模型已将输入图片归类为雏菊(由于训练具有不确定性,因此您的模型可能会有所不同)。

关于数据

本示例中使用的 Flowers 训练数据集由 TensorFlow 团队提供。

后续步骤