使用可复用的 Kubeflow Pipeline 组件

下一版 Alauda AI 将为 Kubeflow Pipelines 2.16.1 打包来自镜像 pipelines-components 项目的可复用组件。该 KFP 版本将由 Alauda kfp-operator v26.3.1 和 DSPO v2.15.2 提供。任一安装都会预加载两个 beta 版 AutoGluon pipeline:

Pipeline用途输入数据
autogluon-tabular-training-pipeline回归、二分类和多分类带有目标列的 CSV
autogluon-timeseries-training-pipeline预测一个或多个时间序列带有 ID、timestamp 和数值目标列的 CSV 或 Parquet

托管 pipeline 是完成训练运行的最短路径。你也可以克隆该镜像,并在需要自定义 pipeline DAG 时导入单独的组件。

NOTE

KFP 2.16.1 服务和可复用组件镜像支持 linux/amd64linux/arm64。在 arm64 上,DSPO 不需要额外设置,因为它不会部署可选的、仅限 amd64 的 metadata writer。对于 Alauda kfp-operator,请设置 kfpMetadataWriter.enabled: false。请参见 arm64 部署说明

前提条件

要求详细信息
Kubeflow Pipelines 2.16.1将在下一版 Alauda AI 中随 Alauda kfp-operator v26.3.1 或 DSPO v2.15.2 一起提供。集群上只能安装一个 pipeline operator。
支持的架构linux/amd64linux/arm64。在 arm64 上,请遵循上面链接的 operator 专用配置。
S3 兼容的输入存储数据加载器会直接从 S3 读取输入对象。
S3 凭据 Secret在执行 pipeline 运行的命名空间中创建它。
Workspace 存储托管 pipeline 会申请一个 12 GiB 的 ReadWriteOnce workspace PVC。安装时必须配置可用的默认存储类。
计算资源数据加载器申请 2 CPU 和 8 GiB。使用 preset=speed 训练时申请 4 CPU 和 16 GiB;使用 preset=balanced 时申请 8 CPU 和 32 GiB。

输入 bucket 可以不同于为 KFP artifact store 配置的对象存储。下面的 Secret 用于对数据加载器进行输入 bucket 身份验证;KFP 会单独为其 launcher 提供 artifact-store 凭据。

创建输入存储 Secret

在 pipeline 运行命名空间中创建该 Secret:

NS=my-pipeline-namespace

kubectl -n "$NS" create secret generic pipeline-input-s3 \
  --from-literal=AWS_ACCESS_KEY_ID='<access-key>' \
  --from-literal=AWS_SECRET_ACCESS_KEY='<secret-key>' \
  --from-literal=AWS_S3_ENDPOINT='https://s3.example.com' \
  --from-literal=AWS_DEFAULT_REGION='us-east-1'

请保留 AWS_S3_ENDPOINT 中的 URI scheme。该组件会将此值作为 endpoint URL 传递给 S3 client。

在开始运行之前,将训练文件上传到 bucket。例如,下面的 tabular 输入包含两个特征和一个回归标签:

feature_a,feature_b,price
1.0,2.0,10.5
2.0,3.0,20.5
3.0,4.0,30.5

在去除重复行、无效标签和其他不可用值之后,tabular 数据必须至少包含 100 行有效数据。

运行托管 tabular pipeline

  1. 打开 Kubeflow Pipelines,然后选择 Pipelines
  2. 搜索 autogluon-tabular-training-pipeline 并选择其最新版本。
  3. 选择 Create run,选择包含该 Secret 的命名空间,并设置以下输入:
输入示例说明
train_data_secret_namepipeline-input-s3S3 凭据 Secret
train_data_bucket_nametraining-data输入 bucket
train_data_file_keytabular/housing.csvCSV 对象 key
label_columnprice目标列
task_typeregressionregressionbinarymulticlass
top_n3保留的模型数量,范围为 1 到 10
positive_classempty二分类的可选正样本标签
eval_metricempty为空时,回归选择 r2,分类选择 accuracy
presetspeedspeed 或资源更高的 balanced 等级
  1. 启动运行,并在运行图中跟踪数据加载器和模型训练任务。

该 pipeline 会对源数据进行采样和拆分,训练并排序 AutoGluon 模型,然后重新拟合表现最好的 top_n 个模型。训练拆分数据会通过运行的 workspace PVC 共享。测试拆分、leaderboard、模型 predictor、指标以及生成的推理 notebook 都是持久化到已配置 artifact store 中的 KFP artifact。

运行托管 time-series pipeline

选择 autogluon-timeseries-training-pipeline,并提供上文所述的通用存储输入。其 time-series 专用输入如下:

输入示例说明
targetsales要预测的数值
id_columnproduct_id标识每个独立序列
timestamp_columndate可解析的观测时间戳
known_covariates_names["is_holiday", "promo"]预测区间内已知的可选列
prediction_length14要预测的时间步数
top_n3保留的模型数量
eval_metricmean_absolute_scaled_errorAutoGluon time-series 排名指标
presetspeedspeedbalanced

加载器会对 ID/timestamp 对进行去重,并为每个序列执行时间拆分。它会将工作中的训练拆分写入 workspace PVC,并将测试拆分和已训练模型写入 artifact store。

基于镜像组合自定义 pipeline

kfp-components 包未发布到 PyPI。请克隆 Alauda 镜像,并在 Python 3.11 或更高版本的虚拟环境中安装它。将 SDK 锁定到 Alauda AI 发布的版本。将 <pipelines-components-repo-url> 替换为 Alauda 为该环境提供的仓库地址:

git clone <pipelines-components-repo-url>
cd pipelines-components

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install 'kfp==2.16.1' 'kfp-kubernetes==2.16.1'
python -m pip install --no-deps -e .

此示例导入 tabular 数据加载器,并将其用于一个更小的自定义 pipeline。请将镜像替换为镜像到你集群中的 AutoML runtime:

from kfp import compiler, dsl, kubernetes
from kfp_components.components.data_processing.automl.tabular_data_loader import (
    automl_data_loader,
)

AUTOML_IMAGE = "<registry>/mlops/kubeflow/odh-automl:v1.11.0.post.1"


@dsl.pipeline(
    name="custom-tabular-loader",
    pipeline_config=dsl.PipelineConfig(
        workspace=dsl.WorkspaceConfig(
            size="12Gi",
            kubernetes=dsl.KubernetesWorkspaceConfig(
                pvcSpecPatch={"accessModes": ["ReadWriteOnce"]}
            ),
        )
    ),
)
def custom_tabular_loader(
    secret_name: str,
    bucket: str,
    object_key: str,
    label: str,
    task_type: str = "regression",
):
    loader = automl_data_loader(
        bucket_name=bucket,
        file_key=object_key,
        workspace_path=dsl.WORKSPACE_PATH_PLACEHOLDER,
        label_column=label,
        task_type=task_type,
    )
    loader.set_container_image(AUTOML_IMAGE)
    kubernetes.use_secret_as_env(
        loader,
        secret_name=secret_name,
        secret_key_to_env={
            "AWS_ACCESS_KEY_ID": "AWS_ACCESS_KEY_ID",
            "AWS_SECRET_ACCESS_KEY": "AWS_SECRET_ACCESS_KEY",
            "AWS_S3_ENDPOINT": "AWS_S3_ENDPOINT",
            "AWS_DEFAULT_REGION": "AWS_DEFAULT_REGION",
        },
    )


compiler.Compiler().compile(
    pipeline_func=custom_tabular_loader,
    package_path="custom-tabular-loader.yaml",
)

从 Kubeflow Pipelines UI 上传 custom-tabular-loader.yaml,或者使用 KFP SDK 提交它。在使用其他资产之前,请先查看镜像中的组件 README.mdmetadata.yaml 和测试;该仓库包含具有不同外部服务要求的 alpha 和 beta 资产。

故障排查

  • 找不到 Secret: Secret 是按命名空间作用域生效的。请在与运行相同的命名空间中创建输入 Secret。
  • Workspace PVC 一直处于 Pending: 配置一个支持 ReadWriteOnce 的默认存储类,或者请平台管理员配置 KFP workspace 存储类。
  • 运行一直处于 Pending: 将集群可用资源与 前提条件 中的 CPU 和内存请求进行比较。请从 preset=speed 开始。
  • 无法读取输入对象: 检查 endpoint scheme、bucket 和对象 key、凭据、region、网络策略以及 S3 server certificate。
  • Pod 完成后缺少 artifact: pipeline 输入 Secret 未配置 KFP 持久化。请与平台管理员一起检查 KFP 安装的 artifact-store endpoint 和凭据。