3、核心概念:Pipeline、Experiment、Run、Recurring Run、Artifact

好,咱们直接进入正题。Kubeflow 里这几个概念,说白了就是一套实验管理的骨架。我刚接触的时候也晕过,什么 Pipeline、Run、Experiment…… 感觉名字都差不多。但用熟了你会发现,它们的分工其实非常清晰。

我个人习惯把 Kubeflow 的实验管理想象成一个「实验室」:

  • Pipeline 是你的实验方案 —— 步骤怎么走、用哪些工具
  • Experiment 是你的实验项目 —— 比如「超参调优项目」
  • Run 是单次实验执行 —— 今天跑一次,明天改参数再跑一次
  • Recurring Run 是定时实验 —— 每天凌晨自动跑一遍
  • Artifact 是实验产出的数据 —— 模型文件、图表、日志

嗯,这样是不是好理解多了?下面我一个一个拆开讲。

Pipeline:你的实验流水线

Pipeline 是 Kubeflow 的核心。它定义了一连串的步骤,每个步骤是一个容器,步骤之间有数据传递。

举个例子,一个典型的 ML Pipeline 可能是:

  1. 数据加载
  2. 数据预处理
  3. 模型训练
  4. 模型评估
  5. 模型部署

每个步骤的输出可以成为下一步的输入。Pipeline 用 YAML 或 Python SDK 定义,编译后生成一个静态描述文件。

关键点:Pipeline 是「蓝图」,不是「执行」。它描述了流程,但本身不运行。

我在项目中遇到过一个问题:团队里有人直接把 Pipeline 当 Run 来用,每次改参数都要重新编译。其实更好的做法是把参数抽出来,作为 Run 的输入变量。

Experiment:组织你的实验

Experiment 就是一个逻辑分组。你可以把相关的 Run 放在同一个 Experiment 下。

比如:

  • Experiment A:ResNet50 在 CIFAR-10 上的调优实验
  • Experiment B:ResNet50 在 ImageNet 上的调优实验

每个 Experiment 下可以有多个 Run。这样你查看历史记录时,不会把不同项目的 Run 混在一起。

我的建议:每个项目建一个 Experiment,命名规则用「项目名_日期」或「模型名_数据集」。别偷懒,后期查起来会感谢自己的。

Run:一次具体的执行

Run 就是 Pipeline 的一次实例化。你给 Pipeline 传入具体参数,然后 Kubeflow 调度它跑起来。

每次 Run 会生成:

  • 执行日志
  • 中间产物(Artifact)
  • 执行状态(成功/失败/运行中)
  • 资源使用情况

你可以通过 Kubeflow UI 查看每个 Run 的 DAG 图,哪个步骤失败了,点进去就能看到日志。

注意:Run 是幂等的吗?不一定。如果你的 Pipeline 里有随机操作(比如数据 shuffle),同样的参数跑两次,结果可能不同。设计时要注意可复现性。

Recurring Run:定时任务

Recurring Run 就是定时执行的 Run。适合以下场景:

  • 每天凌晨重新训练模型
  • 每小时跑一次数据质量检查
  • 每周生成一次报表

配置方式很简单:指定 Pipeline、参数、Cron 表达式。Kubeflow 会按时自动创建 Run。

我曾经踩过一个坑:Recurring Run 的参数写死了,结果模型训练数据路径变了,跑了一周才发现。所以建议把路径、版本号这类信息也参数化,别硬编码。

Artifact:实验的产出物

Artifact 是 Run 产出的所有文件。包括:

类型 示例 说明
模型文件 model.pkl, model.h5 训练好的模型
指标数据 accuracy.json, loss.csv 评估结果
可视化图表 confusion_matrix.png 分析用图
日志文件 train.log 运行日志
中间数据 processed_data.parquet 步骤间传递的数据

Kubeflow 会自动追踪 Artifact 的元数据:谁生成的、什么时候、用了什么参数。你可以在 UI 里直接预览或下载。

小技巧:在 Pipeline 代码里显式声明 Artifact 路径,Kubeflow 会自动建立索引。比如用 Output[Dataset]Output[Metrics] 注解,这样后续查询更方便。

它们之间的关系

我画了一张图,帮你理清这几个概念的关系:

Pipeline 实验方案(蓝图) 属于 Experiment 实验项目(分组) 包含多个 Run 单次执行 Recurring Run 定时执行 产出 Artifact 产出物 触发 核心关系图 一个 Pipeline 可以用于多个 Experiment 一个 Experiment 包含多个 Run Recurring Run 自动创建 Run 每个 Run 产出多个 Artifact

说白了,你写一个 Pipeline,把它挂到某个 Experiment 下,然后创建 Run 去执行。如果想定时跑,就用 Recurring Run。每次跑完,产出的模型、指标、日志都自动归档为 Artifact。

这套设计其实很优雅。你想想看,如果没有这些概念分层,你只能看到一堆零散的运行记录,根本没法追溯「这个模型是哪个实验、哪次 Run 产出的」。有了 Experiment 和 Artifact 的关联,你随时可以回溯到源头。

一句话总结:Pipeline 定义怎么做,Experiment 组织为什么做,Run 记录做了什么,Recurring Run 自动化做,Artifact 保存做出来的东西。

嗯,这几个概念先讲到这。后面我们会用实际代码来演示怎么创建 Pipeline、怎么跑 Run、怎么看 Artifact。到时候你会有更直观的感受。