Vertex AI Workbench:使用迁移学习和笔记本执行器构建图片分类模型

1. 概览

在本实验中,您将学习如何使用 Vertex AI Workbench 配置和启动笔记本执行作业。

学习内容

您将了解如何:

  • 在笔记本中使用参数
  • 通过 Vertex AI Workbench 界面配置和启动笔记本执行

在 Google Cloud 上运行此实验的总费用约为 2 美元

2. Vertex AI 简介

本实验使用的是 Google Cloud 上提供的最新 AI 产品。Vertex AI 将整个 Google Cloud 的机器学习产品集成到无缝的开发体验中。以前,使用 AutoML 训练的模型和自定义模型是通过不同的服务访问的。现在,该新产品与其他新产品一起将这两种模型合并到一个 API 中。您还可以将现有项目迁移到 Vertex AI。如果您有任何反馈,请参阅支持页面

Vertex AI 包含许多不同的产品,可支持端到端机器学习工作流。本实验将重点介绍 Vertex AI Workbench

Vertex AI Workbench 通过与数据服务(例如 Dataproc、Dataflow、BigQuery 和 Dataplex)和 Vertex AI 的深度集成,帮助用户快速构建基于笔记本的端到端工作流。它使数据科学家能够连接到 GCP 数据服务、分析数据集、试验不同的建模技术、将经过训练的模型部署到生产环境中,以及在整个模型生命周期内管理 MLOps。

3. 用例概览

在本实验中,您将使用迁移学习针对 TensorFlow 数据集中的 DeepWeeds 数据集训练图片分类模型。您将使用 TensorFlow Hub 对从 ResNet50InceptionMobileNet 等不同模型架构中提取的特征向量进行实验,这些内容均基于 ImageNet 基准数据集进行了预训练。通过 Vertex AI Workbench 界面利用笔记本执行器,您将在 Vertex AI Training 上启动使用这些预训练模型的作业,并重新训练最后一层以识别 DeepWeeds 数据集中的类。

4. 设置您的环境

您需要一个启用了结算功能的 Google Cloud Platform 项目才能运行此 Codelab。如需创建项目,请按照此处的说明操作。

第 1 步:启用 Compute Engine API

前往 Compute Engine,然后选择启用(如果尚未启用)。

第 2 步:启用 Vertex AI API

前往 Cloud Console 的 Vertex AI 部分,然后点击启用 Vertex AI API

Vertex AI 信息中心

第 3 步:创建 Vertex AI Workbench 实例

在 Cloud Console 的 Vertex AI 部分中,点击“Workbench”:

Vertex AI 菜单

启用 Notebooks API(如果尚未启用)。

Notebook_api

启用后,点击代管式笔记本

Notebooks_UI

然后选择新建笔记本

new_notebook

为您的笔记本命名,然后点击高级设置

create_notebook

在“高级设置”下,启用空闲关闭,并将分钟数设置为 60。这意味着,您的笔记本处于未使用状态时会自动关闭,以免产生不必要的费用。

idle_timeout

您可以保留所有其他高级设置。

接下来,点击创建

创建实例后,选择打开 JupyterLab

open_jupyterlab

首次使用新实例时,系统会要求您进行身份验证。

身份验证

Vertex AI Workbench 具有计算兼容性层,可让您通过单个笔记本实例启动 TensorFlow、PySpark、R 等的内核。进行身份验证后,您将能够从启动器中选择要使用的笔记本类型。

在本实验中,请选择 TensorFlow 2 内核。

tf_kernel

5. 编写训练代码

DeepWeeds 数据集包含 17509 张图像,拍摄了澳大利亚本土的 8 种不同杂草。在本部分中,您将编写代码来预处理 DeepWeeds 数据集,并使用从 TensorFlow Hub 下载的特征向量构建和训练图像分类模型。

您需要将以下代码段复制到笔记本的单元中。执行单元格是可选操作。

第 1 步:下载和预处理数据集

首先,安装每夜版 TensorFlow 数据集,以确保我们获取的是最新版本的 DeepWeeds 数据集。

!pip install tfds-nightly

然后,导入必要的库:

import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_hub as hub

从 TensorFlow 数据集下载数据并提取类别数量和数据集大小。

data, info = tfds.load(name='deep_weeds', as_supervised=True, with_info=True)
NUM_CLASSES = info.features['label'].num_classes
DATASET_SIZE = info.splits['train'].num_examples

定义一个预处理函数,以将图片数据按 255 缩放。

def preprocess_data(image, label):
  image = tf.image.resize(image, (300,300))
  return tf.cast(image, tf.float32) / 255., label

DeepWeeds 数据集不包含训练/验证拆分。它仅附带训练数据集。在下面的代码中,您要将 80% 的数据用于训练,其余 20% 用于验证。

# Create train/validation splits

# Shuffle dataset
dataset = data['train'].shuffle(1000)

train_split = 0.8
val_split = 0.2
train_size = int(train_split * DATASET_SIZE)
val_size = int(val_split * DATASET_SIZE)

train_data = dataset.take(train_size)
train_data  = train_data.map(preprocess_data)
train_data  = train_data.batch(64)

validation_data = dataset.skip(train_size)
validation_data  = validation_data.map(preprocess_data)
validation_data  = validation_data.batch(64)

第 2 步:创建模型

现在,您已经创建了训练和验证数据集,接下来可以构建模型了。TensorFlow Hub 提供特征向量,即没有顶级分类层的预训练模型。您将使用 hub.KerasLayer 封装预训练模型来创建特征提取器,hub.KerasLayer 会将 TensorFlow SavedModel 封装为 Keras 层。然后,您将添加一个分类层并使用 Keras Sequential API 创建一个模型。

首先,定义参数 feature_extractor_model,这是您将用作模型基础的 TensorFlow Hub 特征向量的名称。

feature_extractor_model = "inception_v3"

接下来,您要将此单元格设为参数单元格,以便在运行时传入 feature_extractor_model 的值。

首先,选择该单元格,然后点击右侧面板中的属性检查器。

property_inspector

标记是向笔记本添加元数据的一种简单方式。输入“parameters”,然后按 Enter 键。稍后在配置执行时,您将传入要测试的不同值(在本例中为 TensorFlow Hub 模型)。请注意,您必须输入“参数”一词(而不是任何其他字词),因为笔记本执行器就是通过此方式来确定要将哪些单元格设置为参数的。

add_tag

再次点击双齿轮图标即可关闭属性检查器。

创建一个新单元并定义 tf_hub_uri,您将使用字符串插值来替换要用作笔记本特定执行作业的基本模型的预训练模型的名称。默认情况下,您将 feature_extractor_model 设置为 "inception_v3",但其他有效值为 "resnet_v2_50""mobilenet_v1_100_224"。您可以在 TensorFlow Hub 目录中探索其他选项。

tf_hub_uri = f"https://tfhub.dev/google/imagenet/{feature_extractor_model}/feature_vector/5"

接下来,使用 hub.KerasLayer 创建特征提取器,并传入您在上文中定义的 tf_hub_uri。设置 trainable=False 参数以冻结变量,以便训练仅修改您将在其上添加的新分类器层。

feature_extractor_layer = hub.KerasLayer(
    tf_hub_uri,
    trainable=False)

如需完成模型,请将特征提取器层封装在 tf.keras.Sequential 模型中,并添加一个全连接层用于分类。此分类头中的单元数应与数据集中的类别数相等:

model = tf.keras.Sequential([
  feature_extractor_layer,
  tf.keras.layers.Dense(units=NUM_CLASSES)
])

最后,编译并拟合模型。

model.compile(
  optimizer=tf.keras.optimizers.Adam(),
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['acc'])

model.fit(train_data, validation_data=validation_data, epochs=3)

6. 执行笔记本

点击笔记本顶部的 Executor 图标。

Executor

第 1 步:配置训练作业

为您的执行作业命名,并在项目中提供存储桶。

executor_config

将机器类型设置为 4 个 CPU,15 GB RAM

并添加 1 个 NVIDIA GPU

将环境设置为 TensorFlow 企业版 2.6 (GPU)。

选择“一次性执行”。

第 2 步:配置参数

点击高级选项下拉菜单来设置参数。在框中输入 feature_extractor_model=resnet_v2_50。这会将您在记事本中为此参数设置的默认值 inception_v3 替换为 resnet_v2_50

advanced_options

您可以勾选使用默认服务账号复选框。

然后点击提交

第 3 步:查看结果

在控制台界面的“执行”标签页中,您可以查看笔记本的执行状态。

executions_UI

如果您点击执行名称,系统会将您转到笔记本正在运行的 Vertex AI 训练作业。

vertex_training

作业完成后,您可以通过点击查看结果来查看输出笔记本。

view_result

在输出记事中,您会看到 feature_extractor_model 的值已被您在运行时传入的值覆盖。

param_cells

🎉 恭喜!🎉

您学习了如何使用 Vertex AI Workbench 执行以下操作:

  • 在笔记本中使用参数
  • 通过 Vertex AI Workbench 界面配置和启动笔记本执行

如需详细了解 Vertex AI 的不同部分,请参阅相关文档

7. 清理

默认情况下,代管式笔记本会在非活动状态时间达到 180 分钟后自动关闭。如果您要手动关停实例,请点击控制台的 Vertex AI Workbench 部分中的“停止”按钮。如果您想完全删除该笔记本,请点击“删除”按钮。

删除

如需删除存储桶,请使用 Cloud Console 中的导航菜单,浏览到“存储空间”,选择您的存储桶,然后点击“删除”:

删除存储空间