使用 TensorFlow Extended、Vertex AI Pipelines 和 Cloud Build 的 MLOps 的架构

Last reviewed 2023-01-20 UTC

本文档介绍了使用 TensorFlow Extended (TFX) 库的机器学习系统的整体架构,另外还介绍了如何为使用 Cloud BuildVertex AI 流水线的机器学习系统设置持续集成 (CI)、持续交付 (CD) 和持续训练 (CT)。

在本文档中,“机器学习系统”和“机器学习流水线”这两个术语指的是机器学习模型训练流水线,而不是模型评分或预测流水线。

本文档适用于想要调整 CI/CD 做法以将机器学习解决方案迁移到 Google Cloud 上的生产环境,并希望确保机器学习流水线的质量、可维护性和适应性的数据科学家和机器学习工程师。

本文档介绍了以下主题:

  • 了解机器学习中的 CI/CD 和自动化。
  • 设计使用 TFX 的集成式机器学习流水线。
  • 使用 Vertex AI Pipelines 编排和自动化机器学习流水线。
  • 为使用 Cloud Build 的机器学习流水线设置 CI/CD 系统。

MLOps

如需在生产环境中集成机器学习系统,
您需要编排机器学习流水线中的步骤。此外,您还需要自动执行该流水线,以持续训练模型。如需试验新的想法和功能,您需要在流水线的新实现中采用 CI/CD 做法。以下部分简要介绍了机器学习中的 CI/CD 和 CT。

机器学习流水线自动化

在某些用例中,以手动方式处理训练、验证和部署机器学习模型便已足够。如果您的团队只管理为数不多、不会经常重新训练或更改的机器学习模型,则此手动方式是没有问题的。但事实上,模型在部署到真实环境中后经常会出现故障,因为它们不能适应环境中的动态变化或描述此类动态变化的数据。

为了使机器学习系统适应这些变化,您需要应用以下 MLOps 技术:

您可以自动执行机器学习生产流水线,以使用新数据重新训练模型。您可以根据需要、计划、新数据的可用性、模型性能下降情况、数据统计属性的重大变动或其他条件来触发流水线。

CI/CD 流水线与 CT 流水线的比较

新数据的可用性是重新训练机器学习模型的一个触发因素。机器学习流水线的新实现(包括新模型架构、特征工程和超参数)的可用性是重新执行机器学习流水线的另一个重要触发因素。机器学习流水线的这种新实现作为新版模型预测服务,例如使用 REST API 提供在线服务的微服务。这两种情况的区别如下:

  • 如果使用新数据训练新机器学习模型,则执行之前部署的 CT 流水线。不会部署任何新的流水线或组件;只在流水线的最后提供一个新的预测服务或新训练的模型。
  • 如果使用新实现训练新机器学习模型,则通过 CI/CD 流水线部署新的流水线。

为了快速部署新的机器学习流水线,您需要设置 CI/CD 流水线。当有新实现可用并获准用于各种环境(例如开发、测试、模拟、预生产、canary 和生产环境)时,此流水线负责自动部署新的机器学习流水线和组件。

下图展示了 CI/CD 流水线与机器学习 CT 流水线之间的关系。

CI/CD 流水线的输出是 CT 流水线。

图 1. CI/CD 和机器学习 CT 流水线。

这些流水线的输出如下所示:

  • 如果提供新实现,则成功的 CI/CD 流水线将部署新的机器学习 CT 流水线。
  • 如果提供新数据,则成功的 CT 流水线将训练新模型并将其部署为预测服务。

设计基于 TFX 的机器学习系统

以下部分介绍如何设计使用 TensorFlow Extended (TFX) 的集成式机器学习系统,为机器学习系统设置 CI/CD 流水线。虽然有多个框架可用于构建机器学习模型,但 TFX 是一个集成式机器学习平台,可用于开发和部署生产环境中的机器学习系统。 TFX 流水线是用于实现机器学习系统的一系列组件。此 TFX 流水线专用于完成可扩缩的高性能机器学习任务。这些任务包括建模、训练、验证、提供推断和管理部署。TFX 的主要库如下所示:

TFX 机器学习系统概览

下图展示了如何集成各种 TFX 库以组成机器学习系统。

基于 TFX 的机器学习系统的步骤。

图 2. 一个典型的基于 TFX 的机器学习系统。

图 2 显示了一个典型的基于 TFX 的机器学习系统。您可以手动或通过自动流水线完成以下步骤:

  1. 数据提取:第一步是从数据源中提取新的训练数据。此步骤的输出是用于训练和评估模型的数据文件。
  2. 数据验证:TFDV 会根据预期(原始)数据架构验证数据。数据架构是在系统部署之前的开发阶段创建和确定的。数据验证步骤会检测与数据分布和架构偏差相关的异常值。此步骤的输出是异常值(如果有),以及关于是否执行下游步骤的决策。
  3. 数据转换:验证数据后,通过使用 TFT 执行数据转换和特征工程操作来拆分和准备用于机器学习任务的数据。此步骤的输出是用于训练和评估模型的数据文件,通常转换为 TFRecords 格式。此外,生成的转换工件有助于构建模型输入并在训练后将转换过程嵌入导出的已保存模型中。
  4. 模型训练和调节:如需实现和训练机器学习模型,请对前一步骤生成的转换后的数据使用 tf.estimatortf.Keras API。如需要选择能生成最佳模型的参数设置,您可以使用 Keras 调节器,它是 Keras 的超参数调节库。或者,您也可以使用其他服务,例如 KatibVertex AI VizierVertex AI 中的超参数调节器。此步骤的输出是一个用于评估的保存模型,以及另一个用于在线提供该模型预测的保存模型。
  5. 模型评估和验证:在训练步骤完成后导出模型时,将以测试数据集为基础使用 TFMA 评估该模型的质量。TFMA 会评估整体模型质量,并确定数据模型的哪些部分未执行。此评估有助于确保模型仅在符合质量标准的情况下才会推荐用于服务。这些标准可以加入面对各种数据子集(例如,受众特征和位置)性能表现尚可的评价,以及较以前的模型或基准模型性能有所提升的评价。此步骤的输出是一组性能指标,以及关于是否将该模型投入生产的决策。
  6. 提供模型进行预测:在新训练的模型经过验证后,将其部署为微服务,以使用 TensorFlow Serving 提供在线预测。此步骤的输出是经过训练的机器学习模型的预测服务部署。您可以通过在模型注册表中存储经过训练的模型来替换此步骤。随后,将启动一个单独的模型,服务 CI/CD 流程。

如需查看 TFX 库的使用示例,请参阅官方 TFX Keras 组件教程

Google Cloud 上的 TFX 机器学习系统

在生产环境中,系统的组件必须在可靠的平台上大规模运行。下图展示了 TFX 机器学习流水线的各个步骤如何使用托管服务在 Google Cloud 上运行,从而确保在巨大规模下的灵活性、可靠性和性能。

Google Cloud 上基于 TFX 的机器学习系统的步骤。

图 3. Google Cloud 上基于 TFX 的机器学习系统

下表介绍了图 3 所示的主要 Google Cloud 服务:

步骤 TFX 库 Google Cloud 服务
数据提取和验证 TensorFlow Data Validation Dataflow
数据转换 TensorFlow Transform Dataflow
模型训练和微调 TensorFlow Vertex AI Training
模型评估和验证 TensorFlow Model Analysis Dataflow
提供模型进行预测 TensorFlow Serving Vertex AI Prediction
模型存储 不适用 Vertex AI Model Registry
  • Dataflow 是一种全托管式无服务器的可靠服务,用于在 Google Cloud 上大规模运行 Apache Beam 流水线。Dataflow 用于调节以下流程:
    • 计算统计信息以验证传入的数据。
    • 执行数据准备和转换。
    • 针对大型数据集评估模型。
    • 计算评估数据集各个方面的指标。
  • Cloud Storage 是用于二进制大型对象的高可用性和持久性存储产品。Cloud Storage 托管在机器学习流水线执行过程中生成的工件,其中包括:
    • 数据异常值(如果有)
    • 转换后的数据和工件
    • 导出(训练)的模型
    • 模型评估指标
  • Vertex AI Training 是一项代管式服务,用于大规模训练机器学习模型。您可以使用 TensorFlow、scikit-learn、XGBoost 和 PyTorch 的预构建容器执行模型训练作业。您还可以使用自己的自定义容器运行任何框架。对于训练基础架构,您可以使用加速器和多个节点进行分布式训练。 此外,我们还提供可扩缩的基于贝叶斯优化的服务,该服务用于超参数调节
  • Vertex AI Prediction 是一项代管式服务,用于使用经过训练的模型运行批量预测,以及通过使用 REST API 将模型部署为微服务来运行在线预测。该服务还与 Vertex Explainable AIVertex AI Model Monitoring 集成,以了解您的模型并在以下情况下收到提醒:存在特征或特征归因偏差和偏移。
  • 通过 Vertex AI Model Registry,您可以管理机器学习模型的生命周期。您可以对导入的模型进行版本控制,并查看其性能指标。然后,您可以使用模型进行批量预测,或使用 Vertex AI Prediction 部署您的模型以进行在线传送。

使用 Vertex AI Pipelines 编排机器学习系统

本文档介绍了如何设计基于 TFX 的机器学习系统,以及如何在 Google Cloud 上大规模运行该系统的每个组件。不过,您需要一个编排器才能将该系统的各个组件连接在一起。编排器按顺序运行流水线,并根据定义的条件自动从一个步骤转移到另一个步骤。例如,如果评估指标达到预定义的阈值,则定义的条件可能是在模型评估步骤完成后执行模型提供步骤。步骤还可以并行运行以节省时间,例如验证部署基础架构和评估模型。编排机器学习流水线在开发和生产阶段都非常有用:

  • 在开发阶段,编排可帮助数据科学家运行机器学习实验,无需手动执行每个步骤。
  • 在生产阶段,编排可帮助根据计划或特定触发条件自动执行机器学习流水线。

使用 Vertex AI Pipelines 的机器学习

Vertex AI Pipelines 是一项 Google Cloud 代管式服务,可让您编排和自动化机器学习流水线,其中流水线的每个组件都可以在 Google Cloud 或其他云平台上运行容器化。 生成的流水线参数和工件会自动存储在 Vertex ML Metadata 中,从而允许沿袭和执行跟踪。Vertex AI Pipelines 服务包含以下内容:

  • 用于管理和跟踪实验、作业和运行的界面。
  • 用于安排多个步骤的机器学习工作流的引擎。
  • 用于定义和处理流水线和组件的 Python SDK
  • 与 [Vertex ML Metadata] 集成,以保存有关执行、模型、数据集和其他工件的信息。

以下是在 Vertex AI Pipelines 上执行的流水线:

  • 一组容器化机器学习任务或组件。流水线组件是打包为 Docker 映像的独立代码。 组件在流水线中执行一个步骤。它会接受输入参数并生成工件。
  • 通过 Python 网域特定的语言 (DSL) 定义的机器学习任务的序列规范。通过将上游步骤的输出连接到下游步骤的输入,隐式定义工作流的拓扑。流水线定义中的步骤调用流水线中的组件。在复杂的流水线中,组件可以循环执行多次,也可以根据条件执行。
  • 一组流水线输入参数,参数值传递给流水线组件,包括过滤数据的标准以及流水线生成的工件的存储位置。

下图显示 Vertex AI Pipelines 的示例图。

使用 Vertex AI Pipelines 的机器学习流水线图。

图 4:Vertex AI Pipelines 的示例图。

Kubeflow Pipelines SDK

借助 Kubeflow Pipelines SDK,您可以创建组件、定义其编排并将它们作为流水线运行。对于将在流水线中调用的组件,您需要创建一个组件操作。您可以使用以下方法创建组件操作:

  • 实现轻量级 Python 组件:此组件不需要您针对每次代码更改构建新的容器映像,目的是在笔记本环境中进行快速迭代。您可以使用 kfp.components.create_component_from_func 函数或使用 @component 修饰器从 Python 函数创建轻量级组件。

  • 创建可重复使用的组件:此功能需要您的组件包含 component.yaml 文件中的组件规范。组件规范根据参数、要执行的 Docker 容器映像网址和输出来描述 Kubeflow 流水线的组件。组件操作是在流水线编译期间使用 kfp.components.load_component 函数从 components.yaml 文件自动创建的。组件规范 YAML 文件可以在组织内共享,并在不同的流水线编排中重复使用。

  • 使用预定义的 Google Cloud 组件:Google Cloud Pipeline Components SDK 提供了预定义的组件,这些组件通过提供必需的参数在 Google Cloud 上执行各种代管式服务。这些组件可帮助您使用 BigQuery、Dataflow、Dataproc 和 Vertex AI 等服务执行任务。为便于使用,您可以使用 google_cloud_pipeline_components SDK 加载这些组件。其他预定义的组件可用于在其他平台和服务上执行作业。

您还可以使用 TFX 流水线 DSLTFX 组件。TFX 组件封装了元数据功能。驱动程序通过查询元数据存储空间为执行程序提供元数据。发布者接受执行程序的结果并将其存储在元数据中。您还可以实现与元数据具有相同集成的自定义组件。您可以使用 tfx.orchestration.experimental.KubeflowV2DagRunner 将 TFX 流水线编译到与 Vertex AI Pipelines 兼容的 YAML 中。然后,您可以将该文件提交到 Vertex AI Pipelines 以执行。

下图展示了容器化任务如何在 Vertex AI Pipelines 中调用 BigQuery 作业、Vertex AI(分布式)训练作业和 Dataflow 作业等其他服务。

Google Cloud 上的 Vertex AI Pipelines 架构。

图 5. 调用 Google Cloud 代管式服务的 Vertex AI Pipelines。

借助 Vertex AI Pipelines,您可以通过执行所需的 Google Cloud 服务来编排和自动化生产机器学习流水线。在图 5 中,Vertex ML Metadata 用作 Vertex AI Pipelines 的机器学习元数据存储区。

流水线组件不限于在 Google Cloud 上执行与 TFX 相关的服务。这些组件还可以执行任何与数据和计算相关的服务,包括适用于 SparkML 作业的 DataprocAutoML 和其他计算工作负载。

在 Vertex AI Pipelines 中将任务容器化具有以下优势:

  • 将执行环境与代码运行时分离开来。
  • 在开发环境和生产环境之间提供代码的可再现性,因为您在生产环境中测试的内容是相同的。
  • 隔离流水线中的每个组件;每个组件都可以拥有自己的运行时版本、不同的语言和不同的库。
  • 有助于构成复杂的流水线。
  • 与 Vertex ML Metadata 集成,以实现流水线执行和工件的可追溯性和可再现性。

如需全面了解 Vertex AI Pipelines,请参阅可用的笔记本示例列表。

触发和安排 Vertex AI Pipelines

将流水线部署到生产环境时,您需要根据机器学习流水线自动化部分中介绍的方案自动执行该操作。

Vertex AI SDK 可让您以编程方式操作流水线。google.cloud.aiplatform.PipelineJob 类包括用于创建实验以及部署和运行流水线的 API。因此,通过使用 SDK,您可以从其他服务调用 Vertex AI Pipelines 以实现调度器或基于事件的触发器。

Vertex AI Pipelines 触发器。

图 6. 演示使用 Pub/Sub 和 Cloud Functions 的多个 Vertex AI Pipelines 触发器的流程图

在图 6 中,您可以看到一个如何触发 Vertex AI Pipelines 服务来执行流水线的示例。流水线通过 Cloud Functions 中的 Vertex AI SDK 触发。Cloud Functions 本身是 Pub/Sub 的订阅者,它会根据新消息触发。任何想要触发流水线执行的服务都可以在相应的 Pub/Sub 主题上发布。在上面的示例中,我们有 3 种发布服务:

  • Cloud Scheduler 按时间表发布消息并因此而触发流水线。
  • Cloud Composer 在较大的工作流(例如在 BigQuery 中注入新数据后触发训练流水线的数据注入工作流)中发布消息。
  • Cloud Logging 会根据符合某些过滤条件的日志发布消息。您可以设置过滤条件以检测新数据是否到达,甚至检测 Vertex AI Model Monitoring 服务生成的偏差和偏移提醒。

为 Google Cloud 上的机器学习设置 CI/CD

借助 Vertex AI Pipelines,您可以编排涉及多个步骤(包括数据预处理、模型训练和评估以及模型部署)的机器学习系统。在数据科学探索阶段,Vertex AI Pipelines 可帮助整个系统快速进行实验。在生产阶段,Vertex AI Pipelines 可让您根据新数据自动执行流水线,以训练或重新训练机器学习模型。

CI/CD 架构

下图简要介绍了使用 Vertex AI Pipelines 的机器学习的 CI/CD。

使用 Vertex AI Pipelines 的机器学习流水线的 CI/CD 架构。

图 7:使用 Vertex AI Pipelines 的 CI/CD 简要概览。

该架构的核心是 Cloud Build。Cloud Build 可以从 Cloud Source RepositoriesGitHubBitbucket 导入源代码,然后根据您的规范执行构建,并生成诸如 Docker 容器或 Python tar 文件等工件。

Cloud Build 按照构建配置文件 (cloudbuild.yaml) 中定义的一系列构建步骤执行构建。每个构建步骤都在 Docker 容器中运行。您可以使用 Cloud Build 提供的受支持的构建步骤,也可以编写自己的构建步骤

为您的机器学习系统执行所需 CI/CD 的 Cloud Build 过程可手动执行,也可通过自动构建触发器执行。每当有更改推送到构建作业的源代码时,触发器都会执行您配置的构建步骤。您可以将构建触发器设置为在更改源代码库时执行构建例程,或仅在更改符合特定标准时执行构建例程。

此外,您还可以设置为响应不同触发器而执行的构建例程(Cloud Build 配置文件)。例如,您可以设置为在提交到开发分支或提交到主分支时触发的构建例程。

您可以使用配置变量的替换变量在构建时定义环境变量。这些替代变量是从触发的构建中捕获的。这些变量包括 $COMMIT_SHA$REPO_NAME$BRANCH_NAME$TAG_NAME$REVISION_ID。其他非基于触发器的变量是 $PROJECT_ID$BUILD_ID。对于那些直到构建时才知道值的变量,或者使用不同的变量值重复使用现有构建请求的情况,替代变量很有用。

CI/CD 工作流用例

源代码库通常包含以下各项:

  • 定义了流水线工作流的 Python 流水线工作流源代码
  • Python 流水线组件源代码以及不同流水线组件(例如数据验证、数据转换、模型训练、模型评估和模型推出)的相应组件规范文件。
  • 创建 Docker 容器映像所需的 Dockerfile,每个流水线组件一个 Dockerfile。
  • Python 单元测试和集成测试,用于测试在组件和整体流水线中实现的方法。
  • 其他脚本,包括 cloudbuild.yaml 文件、测试触发器和流水线部署。
  • 配置文件(例如 settings.yaml 文件),包括流水线输入参数的配置。
  • 笔记本,用于对模型进行探索性数据分析、模型分析和交互式实验。

在以下示例中,当开发者将源代码从数据科学环境推送到开发分支时会触发构建例程。

构建步骤示例。

图 8. 由 Cloud Build 执行的构建步骤示例。

如图 7 所示,Cloud Build 会执行以下构建步骤:

  1. 将源代码库复制到 /workspace 目录下的 Cloud Build 运行时环境。
  2. 运行单元测试和集成测试。
  3. (可选)运行静态代码分析,例如 Pylint
  4. 如果测试通过,则为每个流水线组件构建一个 Docker 容器映像。这些映像使用 $COMMIT_SHA 参数进行标记。
  5. 将 Docker 容器映像上传到 Artifact Registry。
  6. 使用已创建且已标记的 Docker 容器映像更新每个 component.yaml 文件中的映像网址。
  7. 编译流水线工作流,以生成 pipeline.json 文件。
  8. pipeline.json 文件上传到 Artifact Registry。
  9. (可选)在集成测试或生产执行过程中,使用参数值运行流水线。执行的流水线会生成一个新模型,还可能将该模型部署为 Vertex AI Prediction 上的 API。

如需查看使用 Cloud Build 的 CI/CD 的生产就绪端到端 MLOps 示例,请参阅我们在 GitHub 上的官方指南

其他注意事项

当您在 Google Cloud 上设置机器学习 CI/CD 架构时,请考虑以下几点:

  • 对于数据科学环境,您可以使用本地机器,或 Vertex AI Workbench
  • 您可以将自动执行的 Cloud Build 流水线配置为仅在修改文档文件或实验笔记本等情况下跳过触发器
  • 您可以将用于集成和回归测试的流水线作为构建测试执行。在将流水线部署到目标环境之前,您可以使用 wait() 方法等待提交的流水线运行完成。
  • 除使用 Cloud Build 外,您还可以使用 Jenkins 等其他构建系统。Google Cloud Marketplace 上提供了现成的 Jenkins 部署。
  • 您可以将流水线配置为根据不同的触发条件自动部署到不同的环境(包括开发、测试和预演环境)。此外,您还可以手动部署到特定环境,例如预生产或生产环境(通常在获得发布批准后)。您可以针对不同的触发条件或目标环境设置多个构建例程。
  • 您可以将 Apache Airflow(一种常用的编排和调度框架)用于通用工作流,该工作流可以使用全托管式 Cloud Composer 服务运行。如需详细了解如何使用 Cloud Composer 和 Cloud Build 编排数据流水线,请参阅为数据处理工作流设置 CI/CD 流水线
  • 当您将新版模型部署到生产环境中时,请将其部署为 Canary 版本以了解它的性能(CPU、内存和磁盘使用情况)。在配置新模型以处理所有实时流量之前,您还可以执行 A/B 测试。配置新模型以处理 10% 到 20% 的实时流量。如果新模型的性能优于当前模型,您可以将新模型配置为处理所有流量。否则,服务系统会回滚到当前的模型。

后续步骤