TFX 用户指南

简介

TFX 是一种基于 TensorFlow 的 Google 生产级机器学习平台。 该平台提供了一个配置框架和众多共享库,用来集成定义、启动和监控机器学习系统所需的常见组件。

安装

Python PyPI

pip install tensorflow
pip install tfx

核心概念

TFX 流水线

TFX 流水线会定义流经若干组件的数据流,目标是实现特定的机器学习任务,例如,针对特定数据构建和部署回归模型。流水线组件是基于 TFX 库构建的。 流水线的结果是 TFX 部署目标和/或推断请求服务。

工件

在流水线中,工件是在各组件之间传递的数据单元。通常,组件至少有一个输入工件和一个输出工件。所有工件都必须具有关联的元数据,这些元数据定义了工件的类型属性。工件必须是强类型,具有在机器学习元数据存储区中注册的工件类型。工件工件类型的概念源自机器学习元数据定义的数据模型,如此文档中所述。TFX 可定义并实现其自身的工件类型本体,以实现更高级别的功能。自 TFX 0.15 起,我们定义了 11 种已知工件类型,并将其用到整个 TFX 系统中。

工件类型具有唯一名称及其实例的属性架构。TFX 利用工件类型来说明流水线中的组件会如何使用工件,但不一定能确定文件系统上实际有哪些工件内容。

例如,“样本”工件类型可能代表以 TFRecord 格式的 tensorflow::Example 协议缓冲区、CSV、JSON 或任何其他物理格式具体化的样本。然而,“样本”在流水线中的使用方式完全相同:进行分析以生成统计信息,根据预期的架构进行验证,在训练之前进行预处理,提供给 Trainer 以训练模型,等等。同样,“模型”工件类型可能代表以 TensorFlow SavedModel、ONNX、PMML 或 PKL 等各种物理格式导出的已训练模型对象,包含各种类型的 Python 模型对象。在任何情况下,都始终需要对模型进行评估、分析和部署,以便在流水线中提供服务。

注意:自 TFX 0.15 起,TFX 组件的实现会假定“样本”工件是采用 gzip 压缩 TFRecord 格式的 tensorflow::Example 协议缓冲区。同样,“模型”工件会被假定为 TensorFlow SavedModel。 TFX 的后续版本可能会扩展这些工件类型以支持更多变体。

为了区分同一工件类型的此类可能变体,机器学习元数据定义了一组工件属性例如,“样本”工件的其中一个工件属性可能是“格式”,该属性的值可能为 TFRecordJSONCSV 等。“样本”类型的工件始终都可以传递给将“样本”用作输入工件的组件(例如 Trainer)。但是,使用方组件的实际实现可能会根据“格式”属性的特定值调整其行为,如果该组件没有处理特定格式“样本”的实现,会直接引发运行时错误。

总而言之,工件类型为整个 TFX 流水线系统中的工件定义了本体,而工件属性定义了特定于工件类型的本体。通过定义和填充新的自定义属性,流水线系统的用户可选择将此类本体本地扩展到他们的流水线应用。通过引入新的工件类型和/或修改预定义的类型属性,用户还可以选择在全局范围内为整个系统扩展本体。在这种情况下,此类扩展将回馈给流水线系统的主代码库(TFX 代码库)。

TFX 流水线组件

TFX 流水线是实现机器学习流水线的一系列组件,专门用于可规模化的高性能机器学习任务。这包括针对在线、原生移动和 JavaScript 目标建模、训练、运行推断和管理部署。

TFX 流水线通常包含以下组件:

  • ExampleGen:提取和拆分(可选)输入数据集的流水线的初始输入组件。

  • StatisticsGen:计算数据集的统计信息。

  • SchemaGen:检查统计信息和创建数据架构。

  • ExampleValidator:查找数据集中的异常情况和缺失的值。

  • Transform:对数据集执行特征工程。

  • Trainer:训练模型。

  • Evaluator:对训练结果进行深入分析,并帮助您验证导出的模型,确保它们“效果足够好”,适合推送到生产环境。

  • Pusher:将模型部署到服务基础架构。

下图说明了这些组件之间的数据流:

组件流

组件剖析

TFX 组件包含三个主要部分:

  • Driver
  • Executor
  • Publisher

组件剖析

Driver 和 Publisher

Driver 会通过查询元数据存储区向 Executor 提供元数据,而 Publisher 会接受 Executor 的结果并将其存储在元数据中。作为开发者,您通常不需要直接与 Driver 和 Publisher 交互,但 Driver 和 Publisher 记录的消息在调试期间可能会有用。请参阅问题排查

Executor

Executor 是组件进行处理的位置。作为开发者,您可以根据实现所用组件类型的类的要求,编写在 Executor 中运行的代码。例如,如果您要创建 Transform 组件,需要开发 preprocessing_fn

TFX 库

TFX 同时包含库和流水线组件。下图说明了 TFX 库与流水线组件之间的关系:

库和组件

TFX 提供了几个 Python 软件包,它们是用于创建流水线组件的库。您可以使用这些库创建流水线组件,以便您的代码侧重于流水线的独特环节。

TFX 库包括:

  • TensorFlow Data Validation (TFDV) 是用于分析和验证机器学习数据的库。它具有很强的扩容能力,可与 TensorFlow 和 TFX 配合使用。TFDV 包括:

    • 对训练和测试数据的摘要统计信息进行可扩容计算。
    • 与数据分布和统计信息查看器集成,以及对数据集对进行分面比较 (Facet)。

    • 自动生成数据架构,以描述对所需值、范围和词汇表等数据的预期。

    • 架构查看器,可帮助您检查架构。

    • 异常检测,用于识别异常情况,例如缺少特征、值超出范围或特征类型有误,等等。

    • 异常查看器,便于您查看哪些特征存在异常,并了解详情以进行修正。

  • TensorFlow Transform (TFT) 是一种使用 TensorFlow 预处理数据的库。TensorFlow Transform 适用于需要全通的数据,例如:

    • 按均值和标准偏差对输入值进行归一化。
    • 通过生成所有输入值的词汇表,将字符串转换为整数。
    • 根据观察到的数据分布对浮点数进行分桶,将浮点数转换为整数。
  • TensorFlow 用于使用 TFX 训练模型。它会提取训练数据和建模代码,并创建 SavedModel 结果。它还集成了由 TensorFlow Transform 创建的特征工程流水线,该流水线用于预处理输入数据。

  • TensorFlow Model Analysis (TFMA) 是一个用于评估 TensorFlow 模型的库。它与 TensorFlow 一起用来创建 EvalSavedModel,后者将成为其分析依据。它允许用户使用其 Trainer 中定义的相同指标,以分布式方式针对大量数据评估模型。可以针对不同的数据切片计算这些指标,并在 Jupyter 笔记本中可视化它们。

  • TensorFlow Metadata (TFMD) 可提供元数据的标准表示法,在使用 TensorFlow 训练机器学习模型时,这些表示法非常有用。元数据可以在输入数据分析过程中手动生成或自动生成,并且可用于数据验证、探索和转换。元数据序列化格式包括:

    • 描述表式数据的架构(例如,tf.Examples)。
    • 此类数据集的摘要统计信息集合。
  • ML Metadata (MLMD) 是一个库,用于记录和检索与机器学习开发者和数据科学家工作流相关的元数据。元数据通常使用 TFMD 表示法。MLMD 使用 SQL-LiteMySQL 以及其他类似的数据存储区来管理持久性。

支持性技术

必需

  • Apache Beam 是一种统一的开源模型,用于定义批次数据和流式数据的并行处理流水线。TFX 使用 Apache Beam 实现数据并行流水线。然后,流水线将由 Beam 支持的某个分布式处理后端执行,这些后端包括 Apache Flink、Apache Spark、Google Cloud Dataflow 等。

可选

Apache Airflow 和 Kubeflow 等 Orchestrator 可以简化机器学习流水线的配置、操作、监控和维护。

  • Apache Airflow 是一个程序化地编写、安排和监控工作流的平台。TFX 使用 Airflow 将工作流编写为任务的有向无环图 (DAG)。Airflow 调度器会在跟踪指定依赖项的同时,在一组工作器上执行任务。借助丰富的命令行实用程序,对 DAG 进行复杂的更改变得轻而易举。丰富的界面让您很容易可视化在生产模式下运行的流水线,监控进度并根据需要排查问题。如果将工作流定义为代码,它们就会变得更易于维护、控制版本、测试和协同处理。

  • Kubeflow 旨在让您可以在 Kubernetes 上以可移植、可扩容的方式轻松部署机器学习工作流。Kubeflow 的目标并非重新造轮子,而是让大家能以一种简单直接的方法将机器学习领域的同类最佳开源系统部署到各种基础架构中。Kubeflow Pipelines 让您可以在 Kubeflow 上组合和执行可重现的工作流,并将基于实验和笔记本的体验融入其中。Kubernetes 上的 Kubeflow Pipelines 服务包括托管式元数据存储区、基于容器的编排引擎、笔记本服务器和界面,可帮助用户大规模开发、运行和管理复杂的机器学习流水线。Kubeflow Pipelines SDK 支持程序化地创建和共享流水线组件和组合。

可移植性和互操作性

TFX 可以移植到多种环境和编排框架,包括 Apache AirflowApache BeamKubeflow。它还可以移植到不同的计算平台(包括本地和云端平台),例如 Google Cloud Platform (GCP)。具体而言,TFX 可与多种托管式 GCP 服务互操作,例如使用 Cloud AI Platform 进行训练和预测,以及使用 Cloud Dataflow 进行分布式数据处理,进而实现机器学习生命周期的其他诸多方面。

模型与 SavedModel

模型

模型是训练过程的输出结果。它是训练过程中学到的权重的序列化记录。这些权重随后可用于计算新输入样本的预测值。对于 TFX 和 TensorFlow,“模型”是指包含在此之前学到的权重的检查点。

请注意,“模型”也可能是指对表示如何计算预测的 TensorFlow 计算图的定义(即 Python 文件)。这两种含义可以根据情境互换使用。

SavedModel

  • 什么是 SavedModel:一种通用、独立于语言、封闭且可恢复的 TensorFlow 模型序列化格式。
  • 为什么它如此重要:它可让较高级别的系统使用单一抽象层创建、变换和使用 TensorFlow 模型。

SavedModel 是在生产环境中应用 TensorFlow 模型或为原生移动应用或 JavaScript 应用导出经过训练的模型时推荐使用的序列化格式。例如,如需将模型转换为 REST 服务以进行预测,您可以将该模型序列化为 SavedModel,并使用 TensorFlow Serving 应用该模型。如需了解详情,请参阅应用 TensorFlow 模型

架构

一些 TFX 组件会使用输入数据的说明,这称为“架构”。架构是 schema.proto 的实例。架构是一种协议缓冲区,通常称为“protobuf”。架构可以指定特征值的数据类型、是否必须在所有样本中出现某种特征、允许的值范围以及其他属性。使用 TensorFlow Data Validation (TFDV) 的好处之一是,它会通过从训练数据中推断出类型、类别和范围来自动生成架构。

下面是来自架构 protobuf 的摘录:

...
feature {
  name: "age"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
feature {
  name: "capital-gain"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
...

以下组件使用了架构:

  • TensorFlow Data Validation
  • TensorFlow Transform

在典型的 TFX 流水线中,TensorFlow Data Validation 会生成供其他组件使用的架构。

使用 TFX 进行开发

从在本地机器上进行研究、实验和开发一直到部署,TFX 为机器学习项目的每个阶段都提供功能强大的平台。为了避免代码重复和消除潜在的训练/应用偏差,我们强烈建议您实现 TFX 流水线,以便训练模型和部署经过训练的模型,并使用 Transform 组件进行训练和推断,此类组件利用了 TensorFlow Transform 库。这样,您就可以始终如一地使用相同的预处理和分析代码,避免训练用到的数据与在生产环境中提供给经训练模型的数据之间存在差异,并且只需编写该代码一次。

数据探索、可视化和清理

数据探索、可视化和清理

TFX 流水线通常从 ExampleGen 组件开始,该组件会接受输入数据并将其格式化为 tf.Example。这通常是在将数据拆分成训练数据集和评估数据集之后进行的,因此实际上有两份 ExampleGen 组件,分别用于训练和评估。 StatisticsGen 组件和 SchemaGen 组件通常紧跟其后,这两个组件会检查您的数据并推断出数据架构和统计信息。架构和统计信息将供 ExampleValidator 组件使用,该组件会查找数据中的异常情况、缺失的值和不正确的数据类型。所有这些组件均会利用 TensorFlow Data Validation 库的功能。

TensorFlow Data Validation (TFDV) 是一种验证工具,在初步探索、可视化和清理数据集时很有用。TFDV 会检查您的数据并推断数据类型、类别和范围,然后自动帮助您识别异常情况和缺失的值。它还提供了可视化工具,可以帮助您检查和了解数据集。流水线完成后,您可以从 MLMD 中读取元数据,并在 Jupyter 笔记本中使用 TFDV 的可视化工具分析数据。

在初始模型训练和部署之后,TFDV 可用于监控从向已部署模型发送的推断请求获得的新数据,并查找异常和/或偏移情况。这对于因趋势或季节性因素而随时间变化的时间序列数据尤其有用,并且有助于判断数据是否有问题或是否需要针对新数据重新训练模型。

数据可视化

通过流水线中使用 TFDV 的部分(通常为 StatisticsGen、SchemaGen 和 ExampleValidator)完成首次数据运行之后,您可以在 Jupyter 笔记本中可视化结果。运行更多次之后,您可以在做出调整后比较这些结果,直到模型和应用获得最佳数据为止。

您首先需要查询 ML Metadata (MLMD),找到这些组件的执行结果,然后使用 TFDV 中的可视化支持 API 在笔记本中创建可视化效果。其中包括 tfdv.load_statistics()tfdv.visualize_statistics()。这种可视化效果可以让您更好地了解数据集的特性,并根据需要进行修改。

开发和训练模型

特征工程

典型的 TFX 流水线包含一个 Transform 组件,该组件将利用 TensorFlow Transform (TFT) 库的功能执行特征工程。Transform 组件会使用由 SchemaGen 组件创建的架构,并应用数据转换来创建、合并和转换将用于训练模型的特征。如果为推断请求发送的数据中也有可能存在缺失的值和类型转换,还应该在 Transform 组件中清除这些内容。在 TFX 中设计 TensorFlow 训练代码时,需要考虑一些重要事项

建模和训练

Transform 组件的结果是 SavedModel,SavedModel 将导入 Trainer 组件中,并应用于您在 TensorFlow 中的建模代码。SavedModel 包含已在 Transform 组件中创建的所有数据工程转换,这样就可以在训练和推断过程中使用完全相同的代码执行相同的转换。借助建模代码(包括 Transform 组件中的 SavedModel),您可以使用训练和评估数据训练模型。

在建模代码的最后一部分中,您应将模型同时另存为 SavedModel 和 EvalSavedModel。另存为 EvalSavedModel 时,您必须在 Trainer 组件中导入并应用 TensorFlow Model Analysis (TFMA) 库。

import tensorflow_model_analysis as tfma
...

tfma.export.export_eval_savedmodel(
        estimator=estimator,
        export_dir_base=eval_model_dir,
        eval_input_receiver_fn=receiver_fn)

分析和了解模型效果

模型分析

在进行初始模型开发和训练之后,分析并真正了解模型的效果非常重要。典型的 TFX 流水线包含一个 Evaluator 组件,该组件会利用 TensorFlow Model Analysis (TFMA) 库的功能,为这个开发阶段提供强大的工具包。Evaluator 组件会使用您在上面导出的 EvalSavedModel,并允许您指定可在可视化和分析模型效果时使用的 SliceSpecs 列表。每个 SliceSpec 都会定义您要检查的训练数据切片,例如分类特征的特定类别或数字特征的特定范围。

例如,如果您想了解模型对于不同客户群体的效果,请务必遵循上述做法;客户群体可以按年购买量、地理位置数据、年龄段或性别划分。这对于长尾数据集尤为重要,因为在这种数据集中,即使重要但规模较小的群组的表现不可接受,也可能会被主流群组的表现掩盖。例如,您的模型可能在普通员工中效果良好,但在主管人员中的效果却很差,那么您需要知道这一点。

模型分析和可视化

通过训练模型并针对训练结果运行 Evaluator 组件(该组件会利用 TFMA)完成首次数据运行之后,您可以在 Jupyter 笔记本中可视化结果。运行更多次之后,您可以在做出调整后比较这些结果,直到模型和应用获得最佳结果为止。

您首先需要查询 ML Metadata (MLMD),找到这些组件的执行结果,然后使用 TFMA 中的可视化支持 API 在笔记本中创建可视化效果。其中包括 tfma.load_eval_results()tfma.view.render_slicing_metrics()。这种可视化效果可以让您更好地了解数据集的特性,并根据需要进行修改。

部署目标

在开发并训练模型后,如果您对模型感到满意,可以将其部署到一个或多个部署目标,并在其中接收推断请求。TFX 支持部署到三类部署目标。以 SavedModel 格式导出的经训练模型可以部署到这些部署目标中的任意一个,也可以部署到所有这些部署目标。

组件流

推断:TensorFlow Serving

TensorFlow Serving (TFS) 是适用于机器学习模型的灵活、高效的服务系统,专为生产环境而设计。它会使用 SavedModel,并通过 REST 或 gRPC 接口接受推断请求。它作为一组进程在一个或多个网络服务器上运行,并使用一个高级架构处理同步和分布式计算。如需详细了解如何开发和部署 TFS 解决方案,请参阅 TFS 文档

在典型的流水线中,Pusher 组件将使用已在 Trainer 组件中训练过的 SavedModel,并将其部署到 TFS 基础架构。这包括处理多个版本和模型更新。

原生移动应用和 IoT 应用中的推断:TensorFlow Lite

TensorFlow Lite 是一套工具,旨在帮助开发者在原生移动应用和 IoT 应用中使用经过训练的 TensorFlow 模型。它与 TensorFlow Serving 使用一样的 SavedModel,并应用量化和剪枝等优化措施来优化生成的模型的大小和效果,以应对在移动设备和 IoT 设备上运行时面临的难题。如需详细了解如何使用 TensorFlow Lite,请参阅 TensorFlow Lite 文档。

JavaScript 推断:TensorFlow JS

TensorFlow JS 是一个 JavaScript 库,用于在浏览器和 Node.js 上训练和部署机器学习模型。它与 TensorFlow Serving 和 TensorFlow Lite 使用一样的 SavedModel,并将它们转换为 TensorFlow.js Web 格式。如需详细了解如何使用 TensorFlow JS,请参阅 TensorFlow JS 文档。

使用 Airflow 创建 TFX 流水线

如需了解详情,请查看 Airflow 研讨会

使用 Kubeflow 创建 TFX 流水线

设置

Kubeflow 需要使用 Kubernetes 集群大规模运行流水线。请参阅 Kubeflow 部署指南,了解部署 Kubeflow 集群的选项。

配置并运行 TFX 流水线

请按照 TFX on Cloud AI Platform Pipeline 教程中的说明在 Kubeflow 上运行 TFX 示例流水线。TFX 组件已经过容器化,可以编写 Kubeflow 流水线;此示例演示了配置流水线以读取大型公共数据集并在云端大规模执行训练和数据处理步骤的功能。

执行流水线操作的命令行界面

TFX 提供统一 CLI,可帮助您在 Apache Airflow、Apache Beam 和 Kubeflow 等各种 Orchestrator 上执行众多流水线操作,例如创建、更新、运行、列出和删除流水线。如需了解详情,请参阅这些说明