3、核心概念:Pipeline、Experiment、Run、Recurring Run、Artifact
好,咱们直接进入正题。Kubeflow 里这几个概念,说白了就是一套实验管理的骨架。我刚接触的时候也晕过,什么 Pipeline、Run、Experiment…… 感觉名字都差不多。但用熟了你会发现,它们的分工其实非常清晰。
我个人习惯把 Kubeflow 的实验管理想象成一个「实验室」:
- Pipeline 是你的实验方案 —— 步骤怎么走、用哪些工具
- Experiment 是你的实验项目 —— 比如「超参调优项目」
- Run 是单次实验执行 —— 今天跑一次,明天改参数再跑一次
- Recurring Run 是定时实验 —— 每天凌晨自动跑一遍
- Artifact 是实验产出的数据 —— 模型文件、图表、日志
嗯,这样是不是好理解多了?下面我一个一个拆开讲。
Pipeline:你的实验流水线
Pipeline 是 Kubeflow 的核心。它定义了一连串的步骤,每个步骤是一个容器,步骤之间有数据传递。
举个例子,一个典型的 ML Pipeline 可能是:
- 数据加载
- 数据预处理
- 模型训练
- 模型评估
- 模型部署
每个步骤的输出可以成为下一步的输入。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。
这套设计其实很优雅。你想想看,如果没有这些概念分层,你只能看到一堆零散的运行记录,根本没法追溯「这个模型是哪个实验、哪次 Run 产出的」。有了 Experiment 和 Artifact 的关联,你随时可以回溯到源头。
一句话总结:Pipeline 定义怎么做,Experiment 组织为什么做,Run 记录做了什么,Recurring Run 自动化做,Artifact 保存做出来的东西。
嗯,这几个概念先讲到这。后面我们会用实际代码来演示怎么创建 Pipeline、怎么跑 Run、怎么看 Artifact。到时候你会有更直观的感受。