组件设计最佳实践
旧版本
此页面关于 Kubeflow Pipelines V1,请参阅 V2 文档获取最新信息。
注意,虽然 V2 后端能够运行由 V1 SDK 提交的流水线,但我们强烈建议迁移到 V2 SDK。作为参考,V1 SDK 的最终版本是 kfp==1.8.22
,其参考文档可在此处获取。
本页面介绍了一些组件设计的推荐实践。有关这些最佳实践的应用,请参阅组件开发指南。如果您不熟悉流水线,请参阅流水线和组件的概念指南。
通用组件设计规则
- 设计您的组件时要考虑可组合性。考虑上游和下游组件。输入数据采用上游组件输入的何种格式。输出数据采用何种格式,以便下游组件能够使用它。
- 组件代码必须使用本地文件进行输入/输出数据(除非不可能,
- 例如,Cloud ML Engine 和 BigQuery 需要 Cloud Storage 暂存路径)。
- 组件必须是*纯粹的* - 它们不得使用任何外部数据,除非数据通过输入进入(除非不可能)。一切都应在容器内或来自输入。强烈不鼓励网络访问,除非这是组件的明确目的(例如,上传/下载)。
编写组件代码
程序必须可以在本地和 Docker 容器内部运行。
编程语言
- 通常,使用最合理的语言。如果组件封装了 Java 库,则使用 Java 暴露该库可能是有意义的。
- 对于大多数新的组件,当性能不是主要考虑因素时,首选 Python 语言(尽可能使用版本 3)。
- 如果组件封装了现有程序,最好直接在组件命令行中暴露该程序。
- 如果需要在程序周围有一些包装器(小的预处理或后处理,如文件重命名),可以使用 shell 脚本完成。
- 遵循所选语言的最佳实践。
每个输出数据片段都应写入单独的文件(见下一行)。
输入和输出文件路径必须通过命令行传递,而不是硬编码。
典型命令行
program.py --input-data <input path> --output-data <output path> --param 42
不要在程序中硬编码路径。
open("/output.txt", "w")
对于临时数据,您应该使用创建临时文件的库函数。例如,对于 Python,请使用 https://docs.pythonlang.cn/3/library/tempfile.html。不要直接写入根目录,否则测试会很困难。
设计代码使其可测试。
编写测试
遵循通用规则部分,这样编写测试会更容易。
使用您正在使用的语言的标准单元测试库。
尝试设计组件代码,使其可以使用单元测试进行测试。除非必要,否则不要使用网络。
准备小的输入数据文件,以便可以在隔离环境中测试组件代码。例如,对于 ML 预测组件,准备一个小模型和评估数据集。
使用测试最佳实践。
测试代码的预期行为。不要仅仅验证“没有任何变化”。
- 对于训练,您可以查看最终迭代的损失。
- 对于预测,您可以查看结果指标。
- 对于数据增强,您可以检查一些期望的后置不变量。
如果组件无法在本地或隔离环境中测试,则创建测试该组件的小型概念验证流水线。您可以使用条件来验证特定任务的输出值,并且仅在结果符合预期时才启用“成功”任务。
编写 Dockerfile
组织 Dockerfile,以便首先安装必需的软件包,最后添加主要组件脚本/二进制文件。理想情况下,将 Dockerfile 分为两部分(基础镜像和组件代码),这样主要组件镜像构建速度更快,也更可靠(不需要网络访问)。
编写组件规范 YAML 文件
有关 Kubeflow Pipelines 组件的完整定义,请参阅组件规范。创建您的 component.yaml
文件时,您可以查看一些现有组件的定义。
- 对于应直接插入命令行的少量值,使用
{inputValue: Input name}
命令行占位符。 - 对于输入文件位置,使用
{inputPath: Input name}
命令行占位符。 - 对于输出文件位置,使用
{outputPath: Output name}
命令行占位符。 - 在 'command:' 中指定完整的命令行,而不仅仅是入口点的参数。