组件
管道组件是 ML 工程师构建 Kubeflow Pipelines 管道的基本构建块。组件结构旨在将功能代码单元及其依赖项打包在一起,以便在 Kubernetes 环境中作为工作流的一部分运行。组件可以在创建可重复工作流的管道中组合,各个组件通过参数和制品等输入和输出来协调。
组件类似于编程函数。实际上,它最常使用 KFP Python SDK 作为 Python 函数的包装器来实现。然而,KFP 组件比简单的函数更进一步,支持代码依赖、运行时环境和分布式执行要求。
KFP 组件旨在简化在 Kubernetes 环境中构建和运行 ML 工作流。通过使用 KFP 组件,工程师可以更快地迭代,减少维护开销,并将更多精力集中在 ML 工作上。
KFP 组件的设计理念
在 Kubernetes 集群中运行 ML 代码面临许多挑战。一些主要挑战包括:
- 管理代码依赖(Python 库和版本)
- 处理系统依赖(操作系统级包、GPU 驱动、运行时环境)
- 构建和维护容器镜像,以及与之相关的所有内容,从容器注册表支持到 CVE(常见漏洞和暴露)修复
- 部署支持资源,如 PersistentVolumeClaims 和 ConfigMaps
- 处理输入和输出,包括元数据、参数、日志和制品
- 确保兼容性跨集群、镜像和依赖项
KFP 组件通过使 ML 工程师能够做到以下几点来简化这些挑战:
- 保持在 Python 层面 - 这是大多数现代 ML 工作发生的地方
- 快速迭代 – 无需在每个步骤中创建或重新构建容器即可修改代码
- 专注于 ML 任务 - 而不是平台和基础设施问题
- 与 Python IDE 工具无缝协作 – 支持调试、语法高亮、类型检查和 docstring 使用
- 在环境之间移动 – 从本地开发到分布式执行的转换,只需进行最小的更改
组件包含哪些部分?
KFP 组件包含以下关键元素:
1. 代码
- 通常是 Python 函数,但也可以是其他代码,例如 Bash 命令。
2. 依赖支持
- Python 库 - 在运行时安装
- 环境变量 - 在运行时环境中可用
- Python 包索引 - (例如,私有 PyPi 服务器) 如果需要支持安装
- 集群资源 - 用于支持使用 ConfigMaps、Secrets、PersistentVolumeClaims 等
- 运行时依赖 - 支持 CPU、内存和 GPU 请求和限制
3. 基础镜像
- 定义基础容器运行时环境(默认为通用 Python 基础镜像)
- 可能包括系统依赖和预安装的 Python 库
4. 输入/输出 (I/O) 规范
- 单个组件之间不能共享内存中的数据,因此它们使用以下概念来支持信息交换和结果发布:
- 参数 – 用于小值
- 制品 - 用于较大的数据,如模型文件、处理后的数据集和元数据
构建组件
1. 基于 Python 的组件
定义组件的推荐方法是使用 KFP Python SDK 中的 @dsl.component
装饰器。下面是两个基本的组件定义示例:
from kfp.dsl import component, Output, Dataset
# hello world component
@component()
def hello_world(name: str = "World") -> str:
print(f"Hello {name}!")
return name
# process data component
@component(
base_image="python:3.12-slim-bookworm",
packages_to_install=["pandas>=2.2.3"],
)
def process_data(output_data: Output[Dataset]):
'''Get max from an array'''
import pandas as pd
# create dataset to write to output
data = pd.DataFrame(data=[[1,2,3],[4,5,6]], columns=["a","b","c"])
data.to_csv(output_data.path)
请注意,这些是包装的 Python 函数。@component
包装器帮助 KFP Python SDK 提供在容器中作为 KFP 管道一部分运行这些函数所需的上下文。
hello_world
组件仅使用默认行为,即在默认基础镜像 (kfp.dsl.component_factory._DEFAULT_BASE_IMAGE
) 上运行 Python 函数。
process_data
组件通过提供特定 base_image
的名称和 packages_to_install
来添加自定义层。请注意函数内部包含 import pandas as pd
语句;由于函数将在容器内部运行(并且不会有脚本上下文),因此所有 Python 库依赖都需要在组件函数内部导入。该组件还使用 KFP 的 Output[Dataset]
类,该类负责创建 KFP 制品类型的输出。
请注意,输入和输出被定义为 Python 函数参数。此外,依赖项通常可以在运行时安装,避免了对自定义基础容器的需求。基于 Python 的组件可以方便地访问 ML 实验人员依赖的 Python 工具,例如模块和导入、用法信息、类型提示和调试工具。
运行组件的 Python 函数
如果您的环境中满足依赖项,将基于 Python 的组件作为简单的 Python 函数运行也很容易,这对于本地工作很有用。例如,要将 process_data
作为 Python 函数运行,请尝试:
# Provide path as dataset type (as the function expects)
dataset = Dataset(uri="data.csv")
# execute the function
# (writes data to data.csv locally)
process_data.execute(output_data=dataset)
# access the underlying function docstring
print(process_data.python_func.__doc__)
组件的使用可能变得更加复杂,因为 AI/ML 用例通常对代码和环境依赖有很高要求。有关创建基于 Python 组件的更多信息,请参阅 组件 SDK 文档。
2. 基于 YAML 的组件
KFP 后端使用基于 YAML 的定义来指定组件。虽然 KFP Python SDK 可以在提交基于 Python 的 管道时自动执行此转换,但某些用例可以从直接使用基于 YAML 的组件方法中获益。
基于 YAML 的组件定义包含以下部分:
- 元数据:名称、描述等
- 接口:输入/输出规范(名称、类型、描述、默认值等)。
- 实现:指定如何在给定组件输入的一组参数值的情况下运行组件。实现部分还描述了组件运行完成后如何获取组件的输出值。
基于 YAML 的组件直接支持系统命令。实际上,可以在基础镜像上运行任何命令(或二进制文件)。这是一个简单的基于 YAML 的组件示例:
# my_component.yaml file
name: my-component
description: "Component that outputs \"<string prefix>...<num>\""
inputs:
- {name: string prefix, type: String}
- {name: num, type: Integer}
outputs: []
implementation:
container:
image: python:3.12-slim-bookworm
args:
- echo
- {inputValue: string prefix}
- ...
- {inputValue: num}
有关基于 YAML 组件的完整定义,请参阅组件规范。
基于 YAML 的组件可以在 Python SDK 中与基于 Python 的组件一起加载使用
from kfp.components import load_component_from_file
my_comp = load_component_from_file("my_component.yaml")
请注意,从基于 YAML 的组件加载的组件将不会具有与基于 Python 的组件相同级别的 Python 支持(例如在本地执行函数)。
“容器化”组件
KFP 命令行工具包含一个 build 命令,用于帮助用户“容器化”组件。这可用于创建 Dockerfile
、runtime-dependencies.txt
和其他支持文件,甚至构建自定义镜像并将其推送到注册表。为了使用此实用程序,必须在基于 Python 的组件定义中设置 target_image
参数,该定义本身保存在文件中。
# build Dockerfile and runtime-dependencies.txt
kfp component build --component-filepattern the_component.py --no-build-image --platform linux/amd64 .
请注意,创建和维护自定义容器会带来显著的维护负担。一般来说,组件和容器之间不需要或不建议建立一对一的关系,因为 AI/ML 工作通常具有高度迭代性。最佳实践是使用少量能够支持多个组件的基础镜像。如果您需要比 kfp
CLI 提供的更多控制容器构建,请考虑使用 docker 或 podman 等容器 CLI。
下一步
- 阅读 创建组件 的用户指南
- 阅读 Kubeflow Pipelines 概述。
- 按照管道快速入门指南部署 Kubeflow,并直接从 Kubeflow Pipelines UI 运行示例管道。
- 构建您自己的组件和管道。
- 构建可在多个管道中共享的可重用组件。