借助 AI Platform Training 中的内置算法,您可以提交训练数据、选择算法,以及让 AI Platform Training 为您处理预处理和训练作业,而无需为训练应用编写任何代码。利用内置图片算法,您只需进行极少的配置即可在 TPU 上进行训练。 生成的 TensorFlow SavedModel 可在 CPU 和 GPU 上运行。
概览
在本教程中,您无需编写任何代码即可训练图片对象检测模型。您可以将 COCO 数据集提交给 AI Platform Training 进行训练,然后在 AI Platform Training 上部署该模型以获取预测结果。生成的模型对复杂日常场景图片中的常见对象进行分类。
准备工作
如需通过命令行完成本教程的学习,请使用 Cloud Shell 或已安装 Google Cloud CLI 的任何环境。
完成以下步骤以设置 GCP 账号,启用所需的 API,以及安装和激活 Google Cloud CLI。
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
授权 Cloud TPU 访问项目
请按照以下步骤为 Google Cloud 项目所关联的 Cloud TPU 服务账号名称授权:
通过调用
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
保存 API 返回的
serviceAccountProject
和tpuServiceAccount
字段的值。初始化 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
命令完成以下步骤:
控制台
- 登录 Google Cloud 控制台,然后选择您要使用 TPU 的项目。
- 选择 IAM 和管理 > IAM。
- 点击添加按钮向项目添加成员。
- 在成员文本框中输入 TPU 服务账号。
- 点击角色下拉列表。
- 启用 Cloud ML Service Agent 角色 (Service Agent > Cloud ML Service Agent)。
gcloud
设置包含项目 ID 和 Cloud TPU 服务账号的环境变量:
PROJECT_ID=PROJECT_ID SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
将
ml.serviceAgent
角色授予 Cloud TPU 服务账号:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
如需详细了解如何为服务账号授予角色,请参阅 IAM 文档。
设置
我们修改了 COCO 数据集,以便在本教程中使用,并将其托管在公开 Cloud Storage 存储分区 (gs://cloud-samples-data/ai-platform/built-in/image/coco/
) 中。
控制台
选择算法
转到 Google Cloud Console 中的 AI Platform Training“作业”页面:
点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练。创建新的训练作业页面随即显示。
训练作业的创建分为四个步骤。第一步是训练算法。选择图片对象检测 (image object detection),然后点击下一步。
训练数据
在训练数据部分,选择示例数据集的训练数据,该数据集托管在我们的公开 Cloud Storage 存储分区中:
选择使用存储在一个 Cloud Storage 目录中的多个文件。
在目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/coco/”
在通配符名称部分,填入“train*”以选择该目录中的所有训练文件。
完整的 GCS 路径 (Complete GCS path) 部分显示如下:“gs://cloud-samples-data/ai-platform/built-in/image/coco/train*”
在验证数据部分,选择示例数据集的验证数据,该数据集托管在我们的公开 Cloud Storage 存储分区中:
选择使用存储在一个 Cloud Storage 目录中的多个文件。
在目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/coco/”
在通配符名称部分,填入“val*”以选择该目录中的所有验证文件。
完整的 GCS 路径 (Complete GCS path) 部分显示如下:“gs://cloud-samples-data/ai-platform/built-in/image/coco/val*”
指定您的 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/coco/train*"
VALIDATION_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/coco/val*"
# Specify the Docker container for your built-in algorithm selection.
IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection: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, adadelta, adagrad, rmsprop}
|
optimizer_arguments |
优化器的参数。这是以英文逗号分隔的“名称=值”对列表。该参数必须与 optimizer_type 兼容。示例:
|
fpn_type |
多级特征金字塔网络 (FPN) 类型。
必须为 {fpn, nasfpn} 之一。
|
resnet_depth |
ResNet 骨干的深度。
必须为 {18,34,50,101,152,200} 之一。
|
max_num_bboxes_in_training |
用于训练的建议边界框数量上限。 |
max_num_bboxes_in_prediction |
在预测输出中使用的建议边界框数量上限。 |
bbox_aspect_ratios |
表示在每个级别添加的宽高比锚点的基本锚点的大小缩放。数字表示宽高比。例如,“1.0,2.0,0.5”在每个缩放级别添加三个锚点。 |
nms_iou_threshold |
关于非最大抑制的 IOU,决定边界框是否重叠的阈值。 |
nms_score_threshold |
用于决定何时根据分数移除边界框的阈值。 |
focal_loss_alpha |
焦点损失 alpha(平衡参数)值。 |
focal_loss_gamma |
焦点损失 gamma(聚焦参数)值。 |
aug_scale_min |
图片增强过程中应用的最小缩放。其值介于 [0, 1.0] 之间。 |
aug_scale_max |
图片增强过程中应用的最大缩放。其值介于 [1.0, inf] 之间。 |
aug_rand_hflip |
布尔值。如果设置为 True,该设置使用随机水平翻转增强训练。 |
如需所有其他图片对象检测算法标志的详细列表,请参阅内置图片对象检测参考文档。
控制台
算法参数
在算法参数标签页的第一部分中,按如下所示填入值:
- 类别数 (Number of classes):91
- 步数上限 (Max steps):15000
- 训练批次大小 (Train batch size):64
- 评估图片数 (Number of evaluation images):5000
在算法参数标签页的模型部分 (Model Section) 中,执行以下操作:
在预训练的检查点路径 (Pretrained checkpoint path) 部分,填入
gs://cloud-samples-data/ai-platform/built-in/image/pretrained_checkpoints/detection/
。将所有其他字段保留为默认设置,然后点击下一步。
作业设置
在作业设置标签页上,执行以下操作:
- 输入唯一的作业 ID(例如“object_detection_example”)。
- 输入可用区域(例如“us-central1”)。
- 如需选择机器类型,请在容量层级部分选择“CUSTOM”。
此时,系统会显示一个提供自定义集群规范的部分。
- 在主机器类型部分,选择 complex_model_m。
- 在工作器类型部分,选择 cloud_tpu。“工作器计数”默认为 1。
点击完成,提交训练作业。
gcloud
使用
gcloud
提交训练作业之前,请先设置训练作业和算法的所有参数:DATASET_NAME="coco" ALGORITHM="object_detection" 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}"
提交作业:
gcloud ai-platform jobs submit training $JOB_ID \ --region=$REGION \ --config=config.yaml \ --job-dir=$JOB_DIR \ -- \ --training_data_path=$TRAINING_DATA_PATH \ --validation_data_path=$VALIDATION_DATA_PATH \ --train_batch_size=64 \ --num_eval_images=500 \ --train_steps_per_eval=2000 \ --max_steps=15000 \ --num_classes=90 \ --warmup_steps=500 \ --initial_learning_rate=0.08 \ --fpn_type="nasfpn" \ --aug_scale_min=0.8 \ --aug_scale_max=1.2
成功提交作业后,您可以使用以下
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
中的目录结构与上述结构相同:
gcloud storage ls $JOB_DIR/* --all-versions
部署经过训练的模型
AI Platform Training 使用模型和版本资源来组织经过训练的模型。AI Platform Training 模型是存放机器学习模型版本的容器。
如需部署模型,请在 AI Platform Training 中创建模型资源,创建该模型的版本,然后使用所创建的模型和版本请求在线预测。
如需详细了解如何将模型部署到 AI Platform Training,请参阅如何部署 TensorFlow 模型。
控制台
在作业页面上,您可以找到包含所有训练作业的列表。点击您刚刚提交的训练作业的名称(“object_detection”或您使用的作业名称)。
在作业详情页面上,您可以查看作业的整体进度,也可以点击查看日志,更详细地查看进度。
如果作业成功,顶部会显示部署模型按钮。点击部署模型。
选择部署为新模型,然后输入模型名称,如“algorithms_object_detection_model”。然后,点击确认。
在创建版本页面上,输入版本名称(如“v1”),并将所有其他字段保留为默认设置。点击保存。
gcloud
使用内置图片对象检测算法的训练过程会生成一个 deployment_config.yaml
文件,这让您可以更轻松地在 AI Platform Training 上部署模型进行预测。
将该文件复制到本地目录并查看其内容:
gcloud storage cp $JOB_DIR/model/deployment_config.yaml . cat deployment_config.yaml
您的
deployment_config.yaml
文件应类似于以下内容:deploymentUri: gs://BUCKET_NAME/algorithms_training/coco_object_detection/model framework: TENSORFLOW labels: global_step: '1000' job_id: coco_object_detection_20190227060114 runtimeVersion: '1.14'
在 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 格式。
下载训练工件文件:
gcloud storage cp $JOB_DIR/artifacts/* .
为一张图片准备预测输入。
要使用 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/coco_sample.jpeg' 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))
发送预测请求:
gcloud ai-platform predict --model $MODEL_NAME \ --version $VERSION_NAME \ --json-instances prediction_instances.json
对于在图片中检测到的每个对象,预测输出包括类别、分数和边界框的位置。
关于数据
Microsoft Common Objects in Context (COCO) 数据集是一种大规模的对象检测、细分和字幕数据集。
后续步骤
- 详细了解如何使用内置图片对象检测算法。