组件规范
本规范描述了 Kubeflow Pipelines 的容器组件数据模型。该数据模型被序列化为 YAML 格式的文件用于共享。
以下是组件定义的主要部分
- 元数据:名称、描述及其他元数据。
- 接口(输入和输出):名称、类型、默认值。
- 实现:给定输入参数后如何运行组件。
组件规范示例
组件规范采用 YAML 文件形式,即 component.yaml
。以下是一个示例
name: xgboost4j - Train classifier
description: Trains a boosted tree ensemble classifier using xgboost4j
inputs:
- {name: Training data}
- {name: Rounds, type: Integer, default: '30', description: 'Number of training rounds'}
outputs:
- {name: Trained model, type: XGBoost model, description: 'Trained XGBoost model'}
implementation:
container:
image: gcr.io/ml-pipeline/xgboost-classifier-train@sha256:b3a64d57
command: [
/ml/train.py,
--train-set, {inputPath: Training data},
--rounds, {inputValue: Rounds},
--out-model, {outputPath: Trained model},
]
查看一些真实的组件规范示例。
详细规范 (ComponentSpec)
本节描述 ComponentSpec
。
元数据
name
:组件的人类可读名称。description
:组件的描述。metadata
:标准对象的元数据annotations
:用于添加组件信息的字符串键值映射。目前,在 Kubernetes 上执行组件任务时,注解会转换为 Kubernetes 注解。当前限制:键不能包含多个斜杠(“/”)。有关更多信息,请参阅 Kubernetes 用户指南。labels
:已弃用。请使用annotations
。
接口
inputs
和outputs
:指定输入/输出列表及其属性。每个输入或输出具有以下属性name
:输入/输出的人类可读名称。名称必须在输入或输出部分中唯一,但输出可以与输入具有相同的名称。description
:输入/输出的人类可读描述。default
:指定输入的默认值。仅对输入有效。type
:指定输入/输出的类型。类型用作管道作者的提示,可供管道系统/UI 用于验证参数以及组件之间的连接。基本类型为 String、Integer、Float 和 Bool。请参阅 Kubeflow Pipelines SDK 定义的完整类型列表。optional
:指定输入是否可选。类型为 Bool,默认为 False。仅对输入有效。
实现
implementation
:指定如何执行组件实例。有两种实现类型,container
和graph
。(后者不在本文档范围内。)将来我们可能会引入更多实现类型,例如daemon
或K8sResource
。container
:描述实现组件的 Docker 容器。Kubernetes Container v1 规范的可移植子集。image
:Docker 镜像的名称。command
:入口点数组。如果未提供此项,则使用 Docker 镜像的 ENTRYPOINT。每个项可以是字符串或占位符。最常见的占位符是{inputValue: 输入名称}
、{inputPath: 输入名称}
和{outputPath: 输出名称}
。args
:入口点参数。如果未提供此项,则使用 Docker 镜像的 CMD。每个项可以是字符串或占位符。最常见的占位符是{inputValue: 输入名称}
、{inputPath: 输入名称}
和{outputPath: 输出名称}
。env
:在容器中设置的环境变量映射。fileOutputs
:仅在容器始终将输出数据存储在硬编码的、不可配置的本地位置时才需要的旧属性。此属性指定某些输出与程序写入输出数据文件的本地文件路径之间的映射。仅对于具有硬编码输出路径的组件才需要此属性。此类容器需要通过修改程序或添加将输出复制到可配置位置的包装脚本来修复。否则,组件可能与未来的存储系统不兼容。
在管道中使用组件时,您可以设置所有其他 Kubernetes 容器属性。
在命令行参数中使用占位符
按值消费输入
{inputValue: <输入名称>}
占位符由输入参数的值替换
在
component.yaml
中command: [program.py, --rounds, {inputValue: Rounds}]
在管道代码中
task1 = component1(rounds=150)
生成的命令行代码(显示已替换占位符的输入参数的值)
program.py --rounds 150
按文件消费输入
{inputPath: <输入名称>}
占位符由系统存放传递给“输入名称”输入的参数数据的(自动生成)本地文件路径替换。
在
component.yaml
中command: [program.py, --train-set, {inputPath: training_data}]
在管道代码中
task2 = component1(training_data=some_task1.outputs['some_data'])
生成的命令行代码(占位符被生成的路径替换)
program.py --train-set /inputs/train_data/data
生成输出
{outputPath: <输出名称>}
占位符由组件程序应该写入输出数据的(生成)本地文件路径替换。该路径的父目录可能存在也可能不存在。您的程序必须在不出现错误的情况下处理这两种情况。
在
component.yaml
中command: [program.py, --out-model, {outputPath: trained_model}]
在管道代码中
task1 = component1() # You can now pass `task1.outputs['trained_model']` to other components as argument.
生成的命令行代码(占位符被生成的路径替换)
program.py --out-model /outputs/trained_model/data