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 Datasets 中的迁移学习,基于 DeepWeeds 数据集训练图片分类模型。您将使用TensorFlow Hub尝试从不同模型架构中提取的特征向量,例如ResNet50启动,以及MobileNet上,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

启用后,点击 MANAGED NOTES(代管式笔记本):

Notebooks_UI

然后选择新建笔记本

新笔记本

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

create_notebook

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

idle_timeout

其他所有高级设置无需更改即可。

接下来,点击创建

创建实例后,选择打开 JupyterLab

open_jupyterlab

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

身份验证

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

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

tf_kernel

5. 编写训练代码

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

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

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

首先,导入必要的库:

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

从 TensorFlow Datasets 中下载数据,并提取类和数据集的大小。

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(将 TensorFlow SavedModel 封装为 Keras 层)封装预训练模型,以创建特征提取器。然后,您需要添加一个分类层,并使用 Keras Sequential API 创建一个模型。

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

feature_extractor_model = "inception_v3"

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

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

属性检查器

标记是一种向笔记本添加元数据的简单方法。在“Add Tag”(添加代码)框中输入“parameters”(参数),然后按 Enter 键。稍后在配置执行时,您将传入不同的值,在本例中为要测试的 TensorFlow Hub 模型。请注意,您必须输入“parameters”(而不是任何其他字词)一词,因为笔记本执行程序正是这样才能知道哪些参数需要参数化。

添加标记

只需再次点击双精度齿轮图标,即可关闭属性检查器。

创建一个新的单元格,然后定义 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=20)

6.执行笔记本

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

执行程序

第 1 步:配置训练作业

为执行任务命名并在项目中提供存储分区。

执行工具配置

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

并添加 1 个 NVIDIA GPU

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

选择“一次性执行”。

第 2 步:配置参数

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

高级选项

您可以选中使用默认服务帐号复选框。

然后点击提交

第 3 步:检查结果

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

executions_UI

点击执行名称后,您将进入运行笔记本的 Vertex AI Training 作业。

顶点训练

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

查看结果

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

param_cells

🎉? 恭喜!🎉

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

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

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

7. 清理

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

删除

如需删除存储分区,请使用 Cloud Console 中的“导航”菜单,转到“存储”,选择您的存储分区,然后点击“删除”:

删除存储空间