编译流水线
概览
要提交流水线执行,必须使用 KFP SDK 编译器将其编译为 YAML。
在以下示例中,编译器创建了一个名为 pipeline.yaml
的文件,其中包含流水线的封闭式表示。输出被称为中间表示 (IR) YAML,它是序列化的PipelineSpec
协议缓冲区消息。
from kfp import compiler, dsl
@dsl.component
def comp(message: str) -> str:
print(message)
return message
@dsl.pipeline
def my_pipeline(message: str) -> str:
"""My ML pipeline."""
return comp(message=message).output
compiler.Compiler().compile(my_pipeline, package_path='pipeline.yaml')
因为组件实际上是流水线,所以您也可以将它们编译为 IR YAML
@dsl.component
def comp(message: str) -> str:
print(message)
return message
compiler.Compiler().compile(comp, package_path='component.yaml')
您可以在 GitHub 上查看一个IR YAML 示例。文件的内容并非旨在供人阅读,但文件顶部的注释提供了流水线的摘要。
# PIPELINE DEFINITION
# Name: my-pipeline
# Description: My ML pipeline.
# Inputs:
# message: str
# Outputs:
# Output: str
...
类型检查
默认情况下,DSL 编译器会对您的流水线进行静态类型检查,以确保组件之间传递数据时的类型一致性。静态类型检查有助于在不运行流水线的情况下识别组件 I/O 不一致问题,从而缩短开发迭代周期。
具体来说,类型检查器会检查组件输入期望的数据类型与提供的数据类型是否相等。有关 KFP 数据类型的更多信息,请参阅数据类型。
对于参数,列表输入只能传递给带有 typing.List
注解的参数。类似地,浮点数只能传递给带有 float
注解的参数。
Artifact 的输入数据类型和注解也必须匹配,有一个例外:Artifact
类型与所有其他 artifact 类型兼容。从这个意义上说,Artifact
类型既是默认的 artifact 类型,也是 artifact 的“任意”类型。
如以下部分所述,您可以禁用类型检查。
编译器参数
Compiler.compile
方法接受以下参数:
名称 | 类型 | 描述 |
---|---|---|
pipeline_func | 函数 | 必需 使用 @dsl.pipeline 装饰器构建的流水线函数,或使用 @dsl.component 装饰器构建的组件。 |
package_path | 字符串 | 必需 输出 YAML 文件路径。例如, ~/my_pipeline.yaml 或 ~/my_component.yaml 。 |
pipeline_name | 字符串 | 可选 如果指定,则在编译后的 IR YAML 输出的 pipelineInfo.name 字段中设置流水线模板的名称。覆盖 @dsl.pipeline 装饰器中由 name 参数指定的流水线或组件的名称。 |
pipeline_parameters | Dict[str, Any] | 可选 参数名称到参数值的映射。这允许您为流水线或组件参数提供默认值。在流水线提交期间,您可以覆盖这些默认值。 |
type_check | 布尔值 | 可选 指示编译期间是否启用静态类型检查。 |
IR YAML
IR YAML 是编译后的流水线或组件的中间表示。它是PipelineSpec
协议缓冲区消息类型的一个实例,该协议是平台无关的流水线表示协议。之所以将其视为中间表示,是因为 KFP 后端会将 PipelineSpec
编译为Argo Workflow YAML,作为最终的流水线执行定义。
与 v1 组件 YAML 不同,IR YAML 不旨在直接编写。虽然 IR YAML 不旨在易于人工阅读,但如果您对其内容有所了解,仍然可以检查它。
节 | 描述 | 示例 |
---|---|---|
components | 本节是将流水线中使用的所有组件名称映射到ComponentSpec 。ComponentSpec 定义了组件的接口,包括输入和输出。对于原始组件, ComponentSpec 包含对包含组件实现的执行器的引用。对于用作组件的流水线, ComponentSpec 包含一个DagSpec 实例,其中包括对底层原始组件的引用。 | 在 Github 上查看 |
deployment_spec | 本节包含执行器名称到ExecutorSpec 的映射。ExecutorSpec 包含原始组件的实现。 | 在 Github 上查看 |
root | 本节定义了最外层流水线定义的步骤,也称为流水线根定义。根定义是您提交 IR YAML 时执行的工作流。它是ComponentSpec 的一个实例。 | 在 Github 上查看 |
pipeline_info | 本节包含流水线元数据,包括 pipelineInfo.name 字段。此字段包含您的流水线模板名称。上传流水线时,会根据此模板名称创建一个流水线上下文名称。流水线上下文允许后端和仪表盘将使用同一流水线模板运行的流水线中的 artifact 和执行关联起来。您可以使用流水线上下文通过比较基于同一训练流水线的多次流水线运行的指标和 artifact 来确定最佳模型。 | 在 Github 上查看 |
sdk_version | 本节记录用于编译流水线的 KFP SDK 版本。 | 在 Github 上查看 |
schema_version | 本节记录用于 IR YAML 的 PipelineSpec 模式版本。 | 在 Github 上查看 |
default_pipeline_root | 本节记录远程存储根路径,例如 MinIO URI 或 Google Cloud Storage URI,用于写入流水线输出。 | 在 Github 上查看 |