TFX 管道使您能够在编排器(例如 Apache Airflow、Apache Beam 和 Kubeflow Pipelines)上编排机器学习 (ML) 工作流程。管道将您的工作流程组织成一系列组件,每个组件在您的 ML 工作流程中执行一个步骤。TFX 标准组件提供经过验证的功能,可帮助您轻松开始构建 ML 工作流程。您也可以在工作流程中包含自定义组件。自定义组件使您可以通过以下方式扩展 ML 工作流程:
- 构建满足您需求的组件,例如从专有系统中提取数据。
- 应用数据增强、上采样或下采样。
- 根据置信区间或自动编码器重构误差执行异常检测。
- 与外部系统(例如用于警报和监控的帮助台)交互。
- 将标签应用于未标记的示例。
- 将使用除 Python 之外的其他语言构建的工具集成到您的 ML 工作流程中,例如使用 R 执行数据分析。
通过混合标准组件和自定义组件,您可以构建满足您需求的 ML 工作流程,同时利用 TFX 标准组件中内置的最佳实践。
本指南介绍了理解 TFX 自定义组件所需的知识,以及构建自定义组件的不同方法。
TFX 组件的结构
本节提供了对 TFX 组件组成的概述。如果您不熟悉 TFX 管道,请阅读了解 TFX 管道的指南,了解核心概念。
TFX 组件由组件规范和执行器类组成,这些类打包在组件接口类中。
组件规范定义了组件的输入和输出契约。此契约指定了组件的输入和输出工件,以及用于组件执行的参数。
组件的执行器类提供了组件执行的工作实现。
组件接口类将组件规范与执行器结合在一起,以便在 TFX 管道中用作组件。
运行时的 TFX 组件
当管道运行 TFX 组件时,组件将按三个阶段执行
- 首先,驱动程序使用组件规范从元数据存储中检索所需的工件,并将它们传递到组件中。
- 接下来,执行器执行组件的工作。
- 然后,发布者使用组件规范和执行器结果将组件的输出存储在元数据存储中。
大多数自定义组件实现不需要您自定义驱动程序或发布者。通常,只有在您想要更改管道组件与元数据存储之间的交互时,才需要修改驱动程序和发布者。如果您只想更改组件的输入、输出或参数,则只需要修改组件规范。
自定义组件类型
自定义组件有三种类型:基于 Python 函数的组件、基于容器的组件和完全自定义组件。以下部分描述了不同类型的组件以及何时应该使用每种方法。
基于 Python 函数的组件
基于 Python 函数的组件比基于容器的组件或完全自定义组件更容易构建。组件规范是在 Python 函数的参数中使用类型注释定义的,这些类型注释描述了参数是输入工件、输出工件还是参数。函数体定义了组件的执行器。组件接口是通过将@component
装饰器添加到您的函数来定义的。
通过使用@component
装饰器装饰您的函数并使用类型注释定义函数参数,您可以创建组件,而无需构建组件规范、执行器和组件接口的复杂性。
了解如何构建基于 Python 函数的组件。
基于容器的组件
基于容器的组件提供了将任何语言编写的代码集成到您的管道中的灵活性,只要您可以在 Docker 容器中执行该代码即可。要创建基于容器的组件,您必须构建一个包含组件可执行代码的 Docker 容器镜像。然后,您必须调用create_container_component
函数来定义
- 组件规范的输入、输出和参数。
- 组件执行器运行的容器镜像和命令。
此函数返回一个组件实例,您可以将其包含在管道定义中。
这种方法比构建基于 Python 函数的组件更复杂,因为它需要将您的代码打包为容器镜像。这种方法最适合在您的管道中包含非 Python 代码,或构建具有复杂运行时环境或依赖项的 Python 组件。
了解如何构建基于容器的组件。
完全自定义组件
完全自定义组件允许您通过定义组件规范、执行器和组件接口类来构建组件。这种方法允许您重用和扩展标准组件以满足您的需求。
如果现有组件的定义与您正在开发的自定义组件具有相同的输入和输出,则您只需覆盖现有组件的 Executor 类。这意味着您可以重用组件规范并实现一个从现有组件派生的新执行器。通过这种方式,您可以重用内置于现有组件中的功能,并且只实现所需的功能。
但是,如果您的新组件的输入和输出是唯一的,则可以定义一个全新的组件规范。
这种方法最适合重用现有组件规范和执行器。
了解如何构建完全自定义组件。