在 Google Cloud 上实现机器学习的最佳做法

Last reviewed 2022-12-15 UTC

本文档介绍了在 Google Cloud 上实现机器学习 (ML) 的最佳做法,重点关注了基于数据和代码的自定义训练模型。我们提供了一些有关如何在整个机器学习工作流中训练自定义模型的建议,其中包括关键操作和一些深入内容的链接。

下图提供了本文档中涉及的机器学习工作流中各个阶段的高级概述,其中包括:

  1. 机器学习开发
  2. 数据处理
  3. 实现训练
  4. 模型部署和投放
  5. 机器学习工作流编排
  6. 工件组织
  7. 模型监控

Google Cloud 上的机器学习工作流

本文档并未详尽列出所有建议;其目标是帮助数据科学家和机器学习架构师了解在 Google Cloud 上使用机器学习所涉及的活动范围,并进行相应的规划。虽然使用推荐的工具和产品中提到了 AutoML 等机器学习开发替代方案,但本文档重点介绍自定义训练模型。

在按照本文档中的最佳做法操作之前,我们建议您先阅读 Vertex AI 简介

就本文档而言,假设:

  • 您主要使用 Google Cloud 服务;本文档未介绍混合和本地方法。

  • 您计划收集训练数据并将其存储在 Google Cloud 中。

  • 您具备机器学习、大数据工具和数据预处理方面的中级知识,并且熟悉Cloud StorageBigQueryGoogle Cloud 基础知识。

如果您刚开始接触机器学习,请参阅 Google 的机器学习速成课程

下表列出了本文档所述的机器学习工作流的每个阶段的推荐工具和产品:

机器学习工作流步骤 推荐的工具和产品
机器学习环境设置
机器学习开发
数据处理
实现训练
模型部署和投放
机器学习工作流编排
工件组织
模型监控

Google 提供 AutoMLVertex AI ForecastingBigQuery ML 作为 Vertex AI 自定义训练模型解决方案的预构建训练例程替代方案。下表提供了有关何时将这些选项用于 Vertex AI 的建议。

机器学习环境 说明 在以下情况下选择此环境...
BigQuery ML BigQuery ML 将数据、基础架构和预定义的模型类型整合到一个系统中。
AutoML(在 Vertex AI 上下文中) AutoML 为图片分类和表格回归等常见问题提供训练例程。几乎会为您处理训练和投放模型的所有方面,如选择架构、超参数调节和预配机器。
Vertex AI 自定义训练的模型 利用 Vertex,您可以运行自己的自定义训练例程,并在无服务器架构上部署任何类型的模型。Vertex AI 通过提供超参数调节和监控等其他服务,让您更轻松地开发模型。请参阅选择自定义训练方法
  • 您的问题与此表中列出的有关 BigQuery ML 或 AutoML 条件不符。
  • 您已在本地或其他云平台上运行训练,并且需要跨平台保持一致。

机器学习环境设置

使用 Vertex AI Workbench 实例进行实验和开发

无论您使用何种工具,我们都建议您使用 Vertex AI Workbench 实例进行实验和开发,包括编写代码、启动作业、运行查询和检查状态。Vertex AI Workbench 实例可让您以简单、可重现的方式访问 Google Cloud 的所有数据和人工智能 (AI) 服务。

Vertex AI Workbench 实例还提供开箱即用的安全软件和访问模式。常见做法是自定义 Google Cloud 属性(例如网络和 Identity and Access Management)以及与 Vertex AI Workbench 实例关联的软件(通过容器)。如需了解详情,请参阅 Vertex AI 简介Vertex AI Workbench 实例简介

为每个团队成员创建一个 Vertex AI Workbench 实例

为您的数据科学团队的每个成员创建 Vertex AI Workbench 实例。如果某位团队成员参与多个项目(尤其是具有不同依赖项的项目),我们建议您使用多个实例,将每个实例视为一个虚拟工作区。请注意,您可以在 Vertex AI Workbench 实例未使用时将其停止。

根据您的公司政策存储机器学习资源和工件

最简单的访问权限控制是将原始和 Vertex AI 资源和工件(如数据集和模型)存储在同一 Google Cloud 项目中。更常见的情况是,您的公司部署有控制访问权限的政策。如果资源和工件存储在不同项目中,您可以使用 Identity and Access Management (IAM) 配置公司跨项目访问权限控制。

使用 Python 版 Vertex AI SDK

使用 Python 版 Vertex AI SDK,这是一种将 Vertex AI 用于端到端模型构建工作流的 Python 方法,可与您偏好的机器学习框架(包括 PyTorch、TensorFlow、XGBoost 和 scikit-learn)无缝搭配使用。

或者,您也可以使用 Google Cloud 控制台,它支持通过浏览器以界面方式使用 Vertex AI 的功能。

机器学习开发

机器学习开发涉及准备数据、实验和评估模型。解决机器学习问题时,通常需要构建和比较许多不同的模型,以找出最合适的模型。

通常,数据科学家使用不同的架构、输入数据集、超参数和硬件来训练模型。数据科学家通过查看聚合性能指标(如测试数据集的准确性、精确率和召回率)来评估生成的模型。最后,数据科学家会根据特定的数据子集、不同的模型版本和不同的模型架构来评估模型的性能。

准备训练数据

用于训练模型的数据可以源自任意数量的系统,例如,来自在线服务系统的日志、来自本地设备的映像或从 Web 抓取的文档。

无论数据的来源如何,都可以从源系统提取数据并转换为针对机器学习训练进行优化的格式和存储(不同于正在运行的来源)。如需详细了解如何准备用于 Vertex AI 的训练数据,请参阅准备训练数据以用于 Vertex AI

在 BigQuery 中存储结构化和半结构化数据

如果您要处理结构化或半结构化数据,我们建议您根据针对项目结构的 BigQuery 建议,将所有数据都存储在 BigQuery 中。在大多数情况下,您也可以将已处理的中间数据存储在 BigQuery 中。为了实现最大速度,最好存储具体化数据,而不是使用视图或子查询来训练数据。

使用 BigQuery Storage API 从 BigQuery 读取数据。对于工件跟踪,请考虑使用代管式表格数据集。下表列出了可让您更轻松地使用 API 的 Google Cloud 工具:

如果您使用的是... 使用以下 Google Cloud 工具
TensorFlow 或 Keras 适用于 BigQuery 的 tf.data.dataset reader
TFX BigQuery 客户端
Dataflow BigQuery I/O 连接器
任何其他框架(例如 PyTorch、XGBoost 或 scilearn-kit) BigQuery Python 客户端库

在 Cloud Storage 上存储图片、视频、音频和非结构化数据

将这些数据以大型容器格式存储在 Cloud Storage 上。这适用于分片式 TFRecord 文件(如果您使用的是 TensorFlow)或 Avro 文件(如果您使用的是任何其他框架)。

将许多单独的图片、视频或音频剪辑组合成大型文件,因为这可以提高 Cloud Storage 的读写吞吐量。目标文件大小至少为 100mb,且分片数量在 100 到 10000 个之间。

如需启用数据管理,请使用 Cloud Storage 存储桶和目录对分片进行分组。如需了解详情,请参阅什么是 Cloud Storage?

对非结构化数据使用 Vertex AI Data Labeling

您可能需要人工为您的数据添加标签,尤其是在涉及非结构化数据时。您可以使用 Vertex AI Data Labeling 来完成这项工作。您可以租用自己的标签添加者,使用 Google Cloud 的软件来管理其工作,也可以使用 Google 的内部标签添加者执行任务。如需了解详情,请参阅请求为数据加标签

将 Vertex AI Feature Store 与结构化数据结合使用

在使用结构化数据训练模型时,无论您在何处训练该模型,都请按照以下步骤操作:

  1. 搜索 Vertex AI Feature Store 以确定现有特征是否满足您的要求。

    1. 打开 Vertex AI Feature Store,然后进行搜索,看看是否已存在与您的用例相关的特征,或是否涵盖您希望传递给模型的信号。

    2. 如果 Vertex AI Feature Store 中包含您想要使用的特征,请使用 Vertex AI Feature Store 的批量投放功能为您的训练标签提取这些特征。

  2. 创建新特征。如果 Vertex AI Feature Store 中不包含您所需的特征,请使用数据湖中的数据创建新特征。

    1. 从数据湖中提取原始数据并编写脚本,以执行必要的特征处理和工程。

    2. 联接从 Vertex AI Feature Store 提取的特征值和您在数据湖创建的新特征值。合并这些特征值会生成训练数据集。

    3. 设置定期作业以计算新特征的更新值。确定某项特征非常有用并且您希望将其投入生产后,设置一个按所需频率定期计划的作业,以计算该特征的更新值并将其提取到 Vertex AI Feature Store。通过向 Vertex AI Feature Store 中添加新特征,您将自动获得一种在线投放特征的解决方案(针对在线预测用例),并且能够与组织中可针对其各自机器学习模型从特征中获取价值的其他人共享该特征。

如需了解详情,请参阅 Vertex AI Feature Store

避免将数据存储在块存储中

避免将数据存储在块存储中,例如网络文件系统或虚拟机 (VM) 硬盘。这些工具比 Cloud Storage 或 BigQuery 更难管理,并且往往在调整性能时会面临挑战。同样,请避免直接从 Cloud SQL 等数据库中读取数据。而是将数据存储在 BigQuery 和 Cloud Storage 中。如需了解详情,请参阅 BigQuery 的 Cloud Storage 文档加载数据简介

使用 Vertex AI TensorBoard 和 Vertex AI Experiments 分析实验

开发模型时,您可以使用 Vertex AI TensorBoard 对特定实验进行可视化和比较,例如根据超参数。Vertex AI TensorBoard 是一项企业就绪的代管式 Vertex AI TensorBoard 服务,可提供经济实惠的安全解决方案,使数据科学家和机器学习研究人员能够无缝跟踪、比较和共享他们的实验,从而实现轻松协作。Vertex AI TensorBoard 支持跟踪一段时间内的实验指标(例如损失和准确率)、直观呈现模型图以及将嵌入内容投影到较低维度空间,等等。

使用 Vertex AI Experiments 与 Vertex ML Metadata 集成,记录和构建参数、指标以及数据集和模型工件之间的关联。

在 Vertex AI Workbench 实例中针对小型数据集训练模型

对于小型数据集或较大数据集的子集,在 Vertex AI Workbench 实例中训练模型可能已足够。将训练服务用于较大数据集或分布式训练可能会有所帮助。此外,如果训练是按时间表执行或是为了处理更多输入的数据而执行,我们还建议使用 Vertex AI 训练服务来实施训练,即使在较小数据集上也是如此。

使用超参数调节最大限度提高模型的预测准确率

为了最大限度地提高模型的预测准确率,请使用超参数调节,这是 Vertex AI 训练提供的一种自动模型增强功能,它利用 Google Cloud 的处理基础架构和 Vertex AI Vizier 在训练模型时测试不同的超参数配置。超参数调节无需在多次训练运行过程中手动调整超参数,即可达到最优值。

如需详细了解超参数调节,请参阅超参数调节概览使用超参数调节

使用 Vertex AI Workbench 实例来理解模型

使用 Vertex AI Workbench 实例来评估和理解您的模型。除了 scikit-learn 等内置常见库之外,Vertex AI Workbench 实例还包括 What-If 工具 (WIT)语言可解释性工具 LIT)。WIT 可让您使用多种技术以交互方式分析模型是否存在偏差,而 LIT 则可帮助您通过可视化、交互式和可扩展工具了解自然语言处理模型行为。

使用特征归因来深入了解模型预测

Vertex Explainable AI 是机器学习实现流程不可或缺的一部分,可提供特征归因以深入了解模型生成预测的原因。通过详细说明模型将其用作输入进行预测的每个特征的重要性,Vertex Explainable AI 可帮助您更好地了解模型的行为并在模型中建立信任。

Vertex Explainable AI 支持基于表格和图片数据的自定义训练模型。

如需详细了解 Vertex Explainable AI,请参阅:

数据处理

处理数据的推荐方法取决于您使用的框架和数据类型。本部分提供常见场景的高级建议。

使用 BigQuery 处理结构化和半结构化数据

使用 BigQuery 存储未处理的结构化或半结构化数据。如果您使用 BigQuery ML 构建模型,请使用 BigQuery 内置的转换来预处理数据。如果您使用 AutoML,请使用 AutoML 内置的转换来预处理数据。如果您要构建自定义模型,使用 BigQuery 转换可能是最经济实惠的方法。

使用 Dataflow 处理数据

如果有大量数据,请考虑使用 Dataflow,它使用 Apache Beam 编程模型。您可以使用 Dataflow 将非结构化数据转换为 TFRecord 等二进制数据格式,从而提高训练过程中数据提取的性能。

使用 Dataproc 进行无服务器 Spark 数据处理

或者,如果您的组织投资 Apache Spark 代码库和技能,请考虑使用 Dataproc。对于适合内存的较小数据集,请使用一次性 Python 脚本。

如果您需要执行无法在 Cloud SQL 中表示或要进行流处理的转换,您可以结合使用 Dataflow 和 pandas 库。

将代管式数据集与机器学习元数据搭配使用

预处理数据进行机器学习后,建议您考虑在 Vertex AI 中使用代管式数据集。使用代管式数据集,您可以在数据和自定义训练模型之间创建明确的关联,提供描述性统计信息,以及自动或手动拆分为训练集、测试集和验证集。

代管式数据集不是必需的;如果您希望更好地控制在训练代码中拆分数据,或者如果数据和模型之间的沿袭对于您的应用并不重要,则您可以选择不使用代管式数据集。

如需了解详情,请参阅数据集在自定义训练应用中使用代管式数据集

实现训练

实现训练是指使模型训练可重复、跟踪重复以及管理性能的过程。虽然 Vertex AI Workbench 实例便于在小型数据集上进行迭代开发,但我们建议您将代码付诸应用,以便使其可重现并扩容到大型数据集。在本部分中,我们将讨论实现训练例程的工具和最佳做法。

在代管式服务中运行代码

我们建议您在 Vertex AI 训练服务Vertex AI Pipelines 中运行代码。

或者,您可以直接在深度学习虚拟机容器或 Compute Engine 中运行代码;但我们不推荐使用这种方法,因为 Vertex AI 代管式服务提供自动扩缩和爆发功能,因而更经济高效。

使用训练流水线实现作业执行

创建训练流水线,以便在 Vertex AI 上执行训练作业。训练流水线与常规机器学习流水线不同,它封装了训练作业。如需详细了解训练流水线,请参阅创建训练流水线REST 资源:projects.locations.trainingPipelines

使用训练检查点保存实验的当前状态

本文档中的机器学习工作流假定您没有以交互方式进行训练。如果您的模型失败并且没有检查点,则训练作业或流水线将会完成,并且数据会丢失,因为模型不在内存中。为防止出现这种情况,请尽量始终使用训练检查点,以确保您不会丢失状态。

我们建议您将训练检查点保存在 Cloud Storage 中。为每个实验或训练运行创建不同的文件夹。

如需详细了解检查点,请参阅 TensorFlow Core 的训练检查点在 PyTorch 中保存和加载一般检查点以及机器学习设计模式

准备模型工件以在 Cloud Storage 中提供服务

对于自定义训练模型或自定义容器,请将您的模型工件存储在 Cloud Storage 存储桶中,该存储桶的区域应与您用于生产的区域端点相匹配。如需了解详情,请参阅存储桶区域

将 Cloud Storage 存储桶存储在同一个 Google Cloud 项目中。如果您的 Cloud Storage 存储桶位于其他 Google Cloud 项目中,您需要授予 Vertex AI 访问权限以读取模型工件。

如果您使用的是 Vertex AI 预构建容器,请确保模型工件的文件名与以下示例完全匹配:

  • TensorFlow SavedModel:saved_model.pb

  • Scikit-learn:model.joblibmodel.pkl

  • XGBoost:model.bst

  • PyTorch:model.pth

如需了解如何以一个或多个模型工件的形式保存模型,请参阅导出模型工件以进行预测

定期计算新特征值

通常,模型会使用一部分源自 Vertex AI Feature Store 的特征。Vertex AI Feature Store 中的特征已经做好在线传送的准备。对于数据科学家通过从数据湖中搜寻数据来创建的任何新特征,我们建议安排相应的数据处理和特征工程作业(或者最好是 Dataflow)以按所需的频率定期计算新特征值(具体取决于特征的新鲜度需求),并将其注入到 Vertex AI Feature Store 以进行在线或批量传送。

模型部署和投放

模型部署和投放是指将模型投入生产。训练作业的输出是存储在 Cloud Storage 中的一个或多个模型工件,您可以将其上传到 Vertex AI Model Registry,以便该文件可用于预测服务。有两种类型的预测服务:批量预测用于定期对批量数据进行评分,在线预测用于对实时应用的数据进行近乎实时的评分。这两个方法都使您可以将输入数据传递给云端托管的机器学习模型并获取每个数据实例的推断,从而从经过训练的模型获取预测结果。如需了解详情,请参阅获取批量预测结果从自定义训练模型获取在线预测结果

如需缩短客户端和模型服务器之间的点对点请求的延迟时间,请使用 Vertex AI 专用端点。如果发出预测请求的应用与服务二进制文件位于同一本地网络内,那么这些端点非常好用。您可以避免互联网路由的开销,并使用 Virtual Private Cloud 建立点对点连接。

指定所需的机器数量和类型

如需部署模型以进行预测,请选择适合您的模型的硬件,例如不同的中央处理单元 (CPU) 虚拟机类型或图形处理单元 (GPU) 类型。如需了解详情,请参阅指定机器类型或容量层级

计划模型的输入

除了部署模型外,您还需要确定将输入传递给模型的方式。如果您使用批量预测,则可以从数据湖或 Vertex AI Feature Store 批量传送 API 中获取数据。如果您使用的是在线预测,则可以将输入实例发送到服务,并在响应中返回您的预测。如需了解详情,请参阅响应正文详细信息

如果要部署模型以进行在线预测,则需要以低延迟、可扩缩的方式来投放需要传递给模型的端点的输入或特征。为此,您可以使用 Google Cloud 上的多个数据库服务之一,也可以使用 Vertex AI Feature Store 的在线服务 API。调用在线预测端点的客户端可以首先调用特征投放解决方案来提取特征输入,然后使用这些输入调用预测端点。

流式注入使您可以对特征值进行实时更新。如果获取最新可用数据以进行在线传送具有高优先级,则此方法非常有用。例如,您可以注入流式事件数据,Vertex AI Feature Store 流式注入会在几秒钟内提供这些数据以用于在线传送场景。

此外,您还可以使用自定义预测例程自定义模型服务器输入(请求)和输出(响应)处理和格式。

启用自动扩缩

如果您使用在线预测服务,在大多数情况下,我们建议您通过设置节点数下限和上限来启用自动扩缩功能。如需了解详情,请参阅从自定义训练模型获取预测结果。为确保高可用性服务等级协议 (SLA),请设置至少两个节点的自动扩缩。

如需详细了解扩缩选项,请参阅扩缩机器学习预测

机器学习工作流编排

Vertex AI 提供机器学习工作流编排功能,可使用 Vertex AI Pipelines 自动处理机器学习工作流,这是一项全代管式服务,让您能够根据需要随时重新训练模型。虽然重新训练可让您的模型适应变化并随着时间的推移保持性能,但在选择最优模型重新训练频率时,请考虑您的数据的变化程度。

机器学习编排工作流最适合已设计和构建模型的客户,并希望将其投入生产环境,并且想要确定机器学习模型中有哪些有效应用和哪些无效应用。您在实验中使用的代码在机器学习工作流程的剩余部分中进行一些修改后,可能会很实用。要使用自动化机器学习工作流,您需要精通 Python,了解容器等基本基础架构,并且具备机器学习和数据科学知识。

使用 Vertex AI Pipelines 编排机器学习工作流

虽然您可以手动启动每个数据处理流程、训练、评估、测试和部署,但我们建议您使用 Vertex AI Pipelines 来编排工作流。如需了解详情,请参阅 MLOps 级别 1:机器学习流水线自动化

Vertex AI Pipelines 支持运行由 KubeFlow、TensorFlow Extended (TFX) 和 Airflow 生成的 DAG。

使用 Kubeflow Pipelines 实现灵活的流水线构建

对于想要编写代管式流水线的大多数用户而言,建议使用 Kubeflow Pipelines SDK。Kubeflow Pipelines 非常灵活,允许您使用简单代码构建流水线;还提供了 Google Cloud 流水线组件,让您可以在流水线中添加 Vertex AI 功能(如 AutoML)。如需详细了解 Kubeflow Pipelines,请参阅 Kubeflow PipelinesVertex AI Pipelines

工件组织

工件是机器学习工作流中的每个步骤生成的输出。最佳做法是以标准化的方式组织工件。

组织机器学习模型工件

将工件存储在以下位置:

存储位置 工件
源代码控制代码库
  • Vertex AI Workbench 实例
  • 流水线源代码
  • 预处理函数
  • 模型源代码
  • 模型训练软件包
  • 传送函数
实验和机器学习元数据
  • 实验
  • 参数
    • 超参数
    • 元参数
  • 指标
  • 数据集工件
  • 模型工件
  • 流水线元数据
Vertex AI Model Registry
  • 经过训练的模型
Artifact Registry
  • 流水线容器
  • 自定义训练环境
  • 自定义预测环境
Vertex AI Prediction
  • 部署的模型数

将源代码控制代码库用于流水线定义和训练代码

您可以使用源代码控制对机器学习流水线以及您为这些流水线构建的自定义组件进行版本控制。使用 Artifact Registry 存储、管理和保护您的 Docker 容器映像,而无需公开这些映像。

模型监控

将模型部署到生产环境中后,您需要监控性能以确保模型按预期运行。Vertex AI 提供两种监控机器学习模型的方法:

  • 偏差检测:此方法会查找模型训练与生产数据之间的失真程度

  • 偏移检测:在此类监控中,您将在生产数据中查找偏移。当模型尝试预测的输入和目标的统计属性以无法预见的方式随时间发生变化时,就会发生偏移。这会导致问题,因为随着时间的推移,预测结果可能不够准确。

模型监控适用于结构化数据(例如数值特征和分类特征),但不适用于非结构化数据(例如图片)。如需了解详情,请参阅监控特征偏差或偏移的模型

使用偏差和偏移检测

请尽可能使用偏差检测,因为我们知道您的生产数据与训练数据偏离之后,是一个非常有用的指标,可以表明您的模型在生产环境中的表现达不到预期。对于偏差检测,请通过提供用于训练模型的训练数据的指针来设置模型监控作业。

如果您无权访问训练数据,请开启偏移检测,以便了解输入随时间的变化。

使用偏移检测来监控生产数据是否随着时间的推移而偏离。对于偏移检测,请启用要监控的特征和相应的阈值以触发提醒。

微调提醒阈值

调整用于提醒的阈值,以便了解数据何时会出现偏差或偏移。提醒阈值取决于使用场景、用户专业知识以及初始模型监控指标。如需了解如何使用监控功能创建信息中心,或根据指标配置提醒。,请参阅 Cloud Monitoring 指标

使用特征归因来检测数据偏移或偏差

您可以使用 Vertex Explainable AI 中的特征归因来检测数据偏移或偏差,以尽早表明模型性能可能下降。例如,如果您的模型最初依赖于五个特征对训练数据和测试数据进行预测,但在该模型投入生产时开始依赖于完全不同的特征,则特征归因将有助于您检测到模型性能这种下降情况。

这对于复杂的特征类型(例如嵌入和时间序列)特别有用,这些特征类型使用传统偏差和偏移方法很难进行比较。使用 Vertex Explainable AI 时,特征归因可以指示模型性能下降的时间。

后续步骤