组件

Kubeflow Pipelines 中组件的概念概述

管道组件是 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 命令,用于帮助用户“容器化”组件。这可用于创建 Dockerfileruntime-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 提供的更多控制容器构建,请考虑使用 dockerpodman 等容器 CLI。

下一步

反馈

本页是否有帮助?