

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 步骤 3：定义管道
<a name="step3"></a>

![定义机器学习管道。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/ml-production-ready-pipelines/images/step3.png)


 在此步骤中，定义了管道将执行的操作顺序和逻辑。这包括离散步骤及其逻辑输入和输出。例如，管道开始时的数据处于什么状态？ 它是来自不同精细程度的多个文件还是来自单个平面文件？ 如果数据来自多个文件，则需要对所有文件执行一个步骤还是需要对每个文件执行单独的步骤来定义预处理逻辑？ 决定取决于数据源的复杂性及其预处理程度。

在我们的参考实施方案中，我们使用 [AWS Step Functions](https://aws.amazon.com/step-functions/)（无服务器函数编排工具）来定义工作流步骤。但是，[ML Max 框架](https://github.com/awslabs/mlmax)还支持其他管道或状态机系统，例如 Apache AirFlow （参见[管道编排的不同引擎](step6.md#engines)部分），以推动机器学习管道的开发和部署。

## 使用 Step Functions SDK
<a name="sfn-using"></a>

为了定义机器学习管道，我们首先使用 [AWS Step Functions 数据科学 SDK](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-python-sdk.html)（Step Functions SDK）提供的高级 Python API 来定义管道的两个关键组件：*步骤*和*数据*。如果您将管道视为有向无环图 (DAG)，则步骤表示图形上的节点，数据显示为连接一个节点（步骤）和下一个节点（步骤）的有向边。机器学习步骤的典型示例包括预处理、训练和评估。Step Functions SDK 提供了许多你可以使用的内置步骤（例如 [TrainingStep](https://aws-step-functions-data-science-sdk.readthedocs.io/en/stable/sagemaker.html#stepfunctions.steps.sagemaker.TrainingStep)）。数据示例包括输入、输出以及管道中某些步骤生成的许多中间数据集。在设计机器学习管道时，您不知道数据项的具体值。您可以定义用作模板（类似于函数参数）且仅包含数据项名称和原始数据类型的*数据占位符*。通过这种方式，您可以设计完整的管道蓝图，而无需事先知道图表上传输的数据的具体值。为此，您可以使用 Step Functions SDK 中的占位符类对这些数据模板明确建模。

机器学习管道还需要配置参数来对每个机器学习步骤的行为进行精细控制。这些特殊的数据占位符被称为*参数占位符*。在定义管道时，它们的许多值都是未知的。参数占位符的示例包括您在流水线设计期间定义的与基础设施相关的参数（例如， AWS 区域 或容器镜像 URL），以及您在运行管道时定义的与机器学习建模相关的参数（例如超参数）。

## 扩展 Step Functions SDK
<a name="sfn-extending"></a>

在我们的参考实施方案中，一项要求是使用特定的参数设置将机器学习管道定义与具体的机器学习管道创建和部署分开。但是，Step Functions SDK 中的一些内置步骤不允许我们传入所有这些占位符参数。相反，参数值应在管道设计期间通过 SageMaker AI 配置 API 调用直接获得。如果 SageMaker AI 设计时环境与 A SageMaker I 运行时环境相同，则可以正常工作，但在现实环境中这种情况很少见。管道设计时间和运行时间之间的紧密耦合，以及机器学习平台基础设施将保持不变的假设，严重阻碍了设计管道的适用性。实际上，即使是底层部署平台发生最轻微的变化，机器学习管道也会立即中断。

为了克服这一挑战并生成强大的机器学习管道（我们想设计一次然后在任何地方运行），我们通过扩展一些内置步骤来实现自己的自定义步骤，包括**TrainingStep**ModelStep****、和**TransformerStep**。这些扩展功能在 [ML Max 项目](https://github.com/awslabs/mlmax)中提供。这些自定义步骤的接口支持更多的参数占位符，可以在创建管道或管道运行时使用具体值填充这些参数占位符。