Skip to main content

1. Kubeflow项目简介

Kubeflow

1.1 项目背景

Kubeflow 是一个开源的机器学习平台,旨在使机器学习工作流在Kubernetes上的部署变得简单、可移植和可扩展。该项目于2017年由Google发起,现已成为CNCF(云原生计算基金会)的孵化项目。

Kubeflow的核心目标是:

  • 简化ML工作流:提供端到端的机器学习工作流管理能力
  • 云原生架构:充分利用Kubernetes的容器编排能力
  • 框架无关:支持TensorFlowPyTorchMXNet等主流ML框架
  • 可扩展性:支持从单机到大规模分布式训练的无缝扩展

1.2 核心组件

Kubeflow生态系统包含多个核心组件:

组件功能描述
Kubeflow Trainer分布式训练任务管理,支持PyTorchMPI等框架
Kubeflow PipelinesML工作流编排和自动化
Katib超参数调优和神经架构搜索
KServe模型推理服务部署
Notebooks基于Jupyter的交互式开发环境
Model Registry模型版本管理和元数据存储

1.3 使用者

Kubeflow已被众多知名企业使用,包括:

  • 云服务商:阿里云、AWS、华为云
  • 科技公司:腾讯、字节跳动、CiscoNVIDIA
  • 金融机构BloombergAnt Group
  • 其他企业Red HatPolyaxonTuSimple

2. Kubeflow Trainer详细介绍

2.1 项目演进

Kubeflow Trainer(原名Training Operator)代表了Kubeflow训练组件的下一代演进,建立在超过七年的Kubernetes ML工作负载运行经验之上。

发展历程:

  • 2017年Kubeflow项目引入TFJob,用于在Kubernetes上编排TensorFlow训练
  • 2018-2020年:扩展支持PyTorchMXNetMPIXGBoost等多个ML框架
  • 2021年:将各个独立的Operator整合为统一的Training Operator v1
  • 2025年7月:正式发布Kubeflow Trainer v2.0,采用全新架构

Kubeflow Trainer

2.2 Trainer v2核心特性

Kubeflow Trainer

Kubeflow Trainer v2是一个Kubernetes原生项目,专为大语言模型(LLM)微调和可扩展的分布式机器学习模型训练而设计。

主要目标:

  • 使AI/ML工作负载更易于大规模管理
  • 提供Pythonic接口进行模型训练
  • 提供最简单、最可扩展的PyTorch分布式训练方案
  • 内置支持大语言模型微调
  • AI从业者屏蔽Kubernetes复杂性
  • 整合Kubernetes Batch WGKubeflow社区的努力

2.3 核心API设计

Kubeflow Trainer v2引入了三个核心CRD

2.3.1 TrainJob

TrainJob是面向数据科学家的简化CRD,允许从预部署的训练运行时启动训练和微调任务。

apiVersion: trainer.kubeflow.org/v2alpha1
kind: TrainJob
metadata:
name: torch-ddp
namespace: tenant-alpha
spec:
runtimeRef:
name: torch-distributed-multi-node
trainer:
image: docker.io/custom-training
command:
- torchrun train.py
numNodes: 5
resourcesPerNode:
requests:
nvidia.com/gpu: 2

2.3.2 TrainingRuntime / ClusterTrainingRuntime

TrainingRuntimeClusterTrainingRuntime是由平台工程师管理的训练蓝图,定义了如何启动各种类型的训练或微调任务。

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-distributed-multi-node
spec:
mlPolicy:
numNodes: 2
torch:
numProcPerNode: 5
template:
spec:
replicatedJobs:
- name: node
template:
spec:
template:
metadata:
labels:
trainer.kubeflow.org/trainjob-ancestor-step: trainer
spec:
containers:
- name: trainer
image: docker.io/kubeflow/pytorch-mnist
env:
- name: MASTER_ADDR
value: "pytorch-node-0-0.pytorch"
- name: MASTER_PORT
value: "29400"
command:
- torchrun train.py

2.4 用户角色分离

Kubeflow Trainer v2采用了清晰的用户角色分离设计:

角色职责技能要求
DevOps工程师管理Kubernetes工作负载熟悉Kubernetes概念
MLOps工程师配置分布式训练参数(如PyTorch rendezvousMPI配置)熟悉ML框架
数据科学家/ML工程师创建模型架构和ML算法熟悉torch.nn API,使用Python

这种设计使得:

  • 数据科学家AI Practitioners):只需创建简单的TrainJob,无需理解复杂的Kubernetes API
  • 平台工程师Platform Admins):负责创建和维护TrainingRuntime,配置基础设施参数。

Kubeflow Trainer

3. HPC训练场景技术挑战与解决方案

3.1 常见技术挑战

HPC(高性能计算)训练场景中,存在以下常见技术挑战:

挑战描述影响
分布式协调复杂多节点、多GPU训练需要复杂的进程协调和通信配置配置错误导致训练失败
资源碎片化GPU资源分散在不同节点,大规模训练任务无法调度资源利用率低下
Gang调度缺失Kubernetes默认调度器不支持"全或无"调度部分Pod调度导致资源浪费
容错机制不足长时间训练任务缺乏检查点和恢复机制节点故障导致训练从头开始
数据加载瓶颈每个训练Pod独立下载大型模型和数据集网络拥塞,GPU空闲等待
环境配置复杂不同框架需要不同的环境变量和启动命令配置繁琐,易出错
多租户隔离多团队共享集群资源时缺乏有效隔离资源竞争,优先级混乱

3.2 Kubeflow Trainer解决方案

Kubeflow Trainer针对上述挑战提供了系统性的解决方案:

3.2.1 简化分布式训练配置

问题:配置torchrunMPI等分布式训练参数复杂且易出错。

解决方案

  • 自动注入MASTER_ADDRMASTER_PORT等环境变量
  • 自动计算--nnodes--nproc-per-node参数
  • 提供预配置的ClusterTrainingRuntime蓝图
# 用户只需指定简单参数
spec:
trainer:
numNodes: 5
resourcesPerNode:
requests:
nvidia.com/gpu: 2
# Trainer自动转换为:torchrun --nnodes=5 --nproc-per-node=2 train.py

3.2.2 Gang调度支持

问题:分布式训练需要所有Pod同时启动,否则会造成资源浪费。

解决方案

  • 内置PodGroupPolicy API支持Gang调度
  • 支持CoschedulingVolcanoKAI Scheduler等多种调度器
  • 自动创建PodGroup资源确保原子性调度
spec:
podGroupPolicy:
coscheduling:
scheduleTimeoutSeconds: 120
# 或使用Volcano
# volcano: {}

3.2.3 数据集和模型初始化器

问题:每个训练Pod独立下载数据会造成网络瓶颈和GPU空闲。

解决方案

  • 提供专用的Dataset InitializerModel Initializer
  • 数据下载一次,通过共享卷分发给所有训练节点
  • 将数据加载任务卸载到CPU节点,节省GPU资源
spec:
initializer:
dataset:
storageUri: hf://tatsu-lab/alpaca
model:
storageUri: hf://meta-llama/Llama-2-7b

3.2.4 容错与恢复

问题:长时间训练任务在节点故障时需要从头开始。

解决方案

  • 支持Kubernetes PodFailurePolicy
  • 定义不同类型故障的处理规则
  • 支持PyTorch Elastic弹性训练
spec:
mlPolicy:
torch:
elasticPolicy:
maxRestarts: 3
minNodes: 5
maxNodes: 10

3.2.5 LLM微调内置支持

问题:大语言模型微调需要复杂的配置和专业知识。

解决方案

  • 提供BuiltinTrainer内置训练器(如TorchTune
  • 预配置的LLM微调RuntimeLlamaGemma等)
  • 支持LoRAQLoRA等参数高效微调方法

4. 支持的框架

4.1 PyTorch

Kubeflow TrainerPyTorch提供最全面的支持,包括:

训练模式描述适用场景
单机单卡基础训练模式小规模模型开发调试
单机多卡单节点多GPU并行中等规模模型训练
多机多卡分布式数据并行(DDP大规模模型训练
弹性训练PyTorch Elastic动态扩缩容场景

PyTorch分布式训练示例:

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-distributed-multi-node
spec:
mlPolicy:
numNodes: 2
torch:
numProcPerNode: "auto" # 支持auto、cpu、gpu或具体数值
template:
spec:
replicatedJobs:
- name: node
template:
spec:
template:
spec:
containers:
- name: trainer
image: docker.io/kubeflow/pytorch-mnist
resources:
limits:
nvidia.com/gpu: 4
command:
- torchrun train.py

4.2 DeepSpeed

DeepSpeed是微软开发的深度学习优化库,Kubeflow Trainer通过MPI Runtime提供支持:

核心特性:

  • ZeRO优化器(ZeRO-1/2/3
  • 混合精度训练
  • 梯度累积
  • 模型并行

DeepSpeed训练示例:

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: deepspeed-training
spec:
mlPolicy:
numNodes: 2
mpi:
mpiImplementation: OpenMPI
numProcPerNode: 4
template:
spec:
replicatedJobs:
- name: launcher
template:
spec:
template:
spec:
containers:
- name: mpi-launcher
image: docker.io/deepspeed-launcher
command:
- deepspeed
- --num_nodes=2
- --num_gpus=4
- train.py
- name: node
template:
spec:
template:
spec:
containers:
- name: trainer
image: docker.io/deepspeed-trainer
resources:
limits:
nvidia.com/gpu: 4

4.3 MPI

MPIMessage Passing Interface)是HPC领域的标准通信协议,Kubeflow Trainer提供完整的MPI v2支持:

支持的MPI实现:

  • OpenMPI
  • Intel MPI
  • MPICH

MPI Runtime特性:

  • 自动生成SSH密钥用于节点间安全通信
  • 自动创建hostfile配置
  • 支持slot配置
apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: mpi-training
spec:
mlPolicy:
numNodes: 4
mpi:
mpiImplementation: OpenMPI
numProcPerNode: 8
sshAuthMountPath: /root/.ssh

4.4 其他框架支持

框架状态说明
JAX路线图中分布式JAX训练,已有KEP提案(#2442
MLX路线图中Apple Silicon优化的ML框架(#2047
TensorFlow待实现PyTorch实现完成后添加
XGBoost待实现PyTorch实现完成后添加
PaddlePaddle待实现PyTorch实现完成后添加

4.5 LLM微调框架

Kubeflow Trainer v2内置支持多种LLM微调框架:

框架描述状态
TorchTunePyTorch官方LLM微调库已支持
HuggingFace TRLTransformer强化学习库计划中
Unsloth高效LLM微调库计划中
LLaMA-Factory一站式LLM微调框架计划中

5. 训练任务创建流程

5.1 整体架构

5.2 详细创建流程

5.3 Pipeline Framework详解

Kubeflow Trainer v2引入了Pipeline Framework作为内部扩展机制,包含四个阶段:

阶段功能扩展点
Startup Phase控制器启动时初始化WatchExtension
PreExecution PhaseWebhook验证CustomValidation
Build Phase构建和部署资源EnforcePodGroupPolicy, EnforceMLPolicy, ComponentBuilder
PostExecution Phase状态更新TerminalCondition

6. Volcano调度器集成

6.1 为什么需要Volcano

Kubeflow Trainer v2默认使用Coscheduling插件提供Gang调度支持,但Coscheduling存在一些局限性:

特性CoschedulingVolcano
Gang调度
优先级调度
队列管理
资源配额
拓扑感知调度
抢占机制有限
生态成熟度一般成熟

6.2 集成配置

6.2.1 前置条件

首先需要在Kubernetes集群中安装Volcano

# 安装Volcano
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml

# 验证安装
kubectl get pods -n volcano-system

6.2.2 启用Volcano插件

TrainingRuntimeClusterTrainingRuntime中配置Volcano

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-distributed-volcano
spec:
mlPolicy:
numNodes: 4
torch:
numProcPerNode: 8
podGroupPolicy:
volcano: {} # 启用Volcano调度
template:
spec:
replicatedJobs:
- name: node
template:
spec:
template:
spec:
schedulerName: volcano # 指定Volcano调度器
priorityClassName: high-priority
containers:
- name: trainer
image: docker.io/kubeflow/pytorch-mnist
resources:
limits:
nvidia.com/gpu: 8
command:
- torchrun train.py

6.2.3 配置优先级队列

步骤1:创建Volcano Queue

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: high-priority-queue
spec:
weight: 10
reclaimable: false
capability:
cpu: "100"
memory: "500Gi"
nvidia.com/gpu: "32"

步骤2:在TrainingRuntime中引用Queue

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-high-priority
spec:
podGroupPolicy:
volcano: {}
template:
metadata:
annotations:
scheduling.volcano.sh/queue-name: "high-priority-queue"
spec:
replicatedJobs:
- name: node
template:
spec:
template:
spec:
schedulerName: volcano
containers:
- name: trainer
image: docker.io/kubeflow/pytorch-mnist

步骤3:在TrainJob中覆盖Queue(可选)

apiVersion: trainer.kubeflow.org/v2alpha1
kind: TrainJob
metadata:
name: urgent-training
spec:
runtimeRef:
name: torch-high-priority
annotations:
scheduling.volcano.sh/queue-name: "urgent-queue" # 覆盖Runtime中的队列
trainer:
numNodes: 8

6.2.4 拓扑感知调度

Volcano支持网络拓扑感知调度,可以将Pod调度到网络拓扑相近的节点,减少通信延迟:

apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-topology-aware
spec:
podGroupPolicy:
volcano:
networkTopology:
mode: hard # hard表示必须满足拓扑约束
highestTierAllowed: 1 # 最高允许的拓扑层级
template:
spec:
replicatedJobs:
- name: node
template:
spec:
template:
spec:
schedulerName: volcano
containers:
- name: trainer
image: docker.io/kubeflow/pytorch-mnist

6.3 Volcano调度器配置建议

为了与Kubeflow Trainer配合使用,建议配置Volcano调度器启用以下插件:

apiVersion: v1
kind: ConfigMap
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
data:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority # 基于PriorityClassName排序
- name: gang # Gang调度策略
- plugins:
- name: predicates # 预选过滤
- name: proportion # 队列资源比例
- name: binpack # 紧凑调度,减少碎片
- name: network-topology-aware # 拓扑感知调度

7. Volcano Job对比分析

7.1 两种方案比较

Kubernetes上运行HPC训练任务,有两种主要方案:

方案描述
Volcano Job直接使用Volcanovcjob CRD管理训练任务
Kubeflow Trainer + Volcano使用Kubeflow TrainerTrainJob CRD,集成Volcano调度

详细对比:

对比维度Volcano JobKubeflow Trainer
API复杂度需要手动配置所有参数通过Runtime抽象简化配置
用户角色分离不支持支持(平台工程师 vs 数据科学家)
分布式训练配置手动配置环境变量和启动命令自动注入,支持torchrun
框架支持通用,需手动适配内置PyTorchMPIDeepSpeed支持
LLM微调不支持内置BuiltinTrainer支持
数据/模型初始化不支持内置Initializer支持
Python SDK不支持支持,Pythonic接口
弹性训练有限支持原生支持PyTorch Elastic
Gang调度原生支持通过PodGroupPolicy集成
队列管理原生支持通过annotations集成
拓扑感知原生支持通过PodGroupPolicy集成
生态集成Volcano生态Kubeflow生态(PipelinesKatib等)
底层实现直接创建Pod基于JobSet API

7.2 Volcano Job示例

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: pytorch-distributed
spec:
minAvailable: 4
schedulerName: volcano
queue: default
plugins:
ssh: []
svc: []
policies:
- event: PodEvicted
action: RestartJob
tasks:
- replicas: 1
name: master
template:
spec:
containers:
- name: pytorch
image: docker.io/pytorch-training
command:
- /bin/bash
- -c
- |
python -m torch.distributed.launch \
--nproc_per_node=4 \
--nnodes=4 \
--node_rank=${VK_TASK_INDEX} \
--master_addr=${MASTER_ADDR} \
--master_port=29500 \
train.py
resources:
limits:
nvidia.com/gpu: 4
- replicas: 3
name: worker
template:
spec:
containers:
- name: pytorch
image: docker.io/pytorch-training
command:
- /bin/bash
- -c
- |
python -m torch.distributed.launch \
--nproc_per_node=4 \
--nnodes=4 \
--node_rank=${VK_TASK_INDEX} \
--master_addr=${MASTER_ADDR} \
--master_port=29500 \
train.py
resources:
limits:
nvidia.com/gpu: 4

7.3 Kubeflow Trainer示例

# ClusterTrainingRuntime(平台工程师配置一次)
apiVersion: trainer.kubeflow.org/v2alpha1
kind: ClusterTrainingRuntime
metadata:
name: torch-distributed-volcano
spec:
mlPolicy:
numNodes: 4
torch:
numProcPerNode: 4
podGroupPolicy:
volcano: {}
template:
spec:
replicatedJobs:
- name: node
template:
spec:
template:
spec:
schedulerName: volcano
containers:
- name: trainer
image: docker.io/pytorch-training
resources:
limits:
nvidia.com/gpu: 4
command:
- torchrun train.py
---
# TrainJob(数据科学家使用)
apiVersion: trainer.kubeflow.org/v2alpha1
kind: TrainJob
metadata:
name: my-training
spec:
runtimeRef:
name: torch-distributed-volcano
trainer:
image: docker.io/my-custom-training
args:
- --epochs=100

7.4 工作负载类型与PodGroup分析

7.4.1 Kubeflow Trainer生成的工作负载类型

Kubeflow TrainerVolcano集成时,生成的工作负载不是Volcano Job,而是JobSet + PodGroup

Kubeflow Trainer源码可以确认,Volcano插件直接引用了VolcanoPodGroup API

// 源码路径: pkg/runtime/framework/plugins/volcano/volcano.go
import (
volcanov1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
volcanov1beta1ac "volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1"
)

func (v *Volcano) Build(...) ([]apiruntime.ApplyConfiguration, error) {
// 创建Volcano PodGroup
pg := volcanov1beta1ac.PodGroup(trainJob.Name, trainJob.Namespace).
WithSpec(volcanov1beta1ac.PodGroupSpec().
WithMinMember(totalMembers).
WithMinResources(totalResources))
// ...
}

7.4.2 PodGroup是同一类型

Kubeflow Trainer创建的PodGroupVolcano原生的PodGroup是完全相同的CRD类型。

属性
API Groupscheduling.volcano.sh
API Versionv1beta1
KindPodGroup
CRD名称podgroups.scheduling.volcano.sh

这意味着Kubeflow Trainer创建的PodGroup可以被Volcano Scheduler完全识别和处理,支持以下调度特性:

特性支持情况说明
Gang调度通过minMember字段
队列管理通过queue字段
优先级调度通过priorityClassName字段
最小资源检查通过minResources字段
网络拓扑感知通过networkTopology字段

7.4.3 Volcano Job特有功能的缺失

由于Kubeflow Trainer使用JobSet而非Volcano Job作为工作负载,以下Volcano Job特有的功能无法使用

Volcano Job特性说明Kubeflow Trainer替代方案
任务级PoliciesPodEvicted → RestartJob依赖JobSetFailurePolicy
内置Pluginssshsvcenv需手动配置或使用Initializer
Task依赖任务间的DAG依赖不支持,需使用Kubeflow Pipelines
minAvailable动态调整运行时调整最小可用数不支持
Lifecycle管理Pending/Running/Completed等状态使用JobSet状态

7.4.4 架构对比图

7.4.5 选型建议

场景推荐方案原因
需要Volcano Job完整功能(PoliciesPluginsVolcano Job原生支持所有特性
需要PyTorch/MPI分布式训练简化配置Kubeflow Trainer自动注入环境变量,Runtime抽象
需要LLM微调能力Kubeflow Trainer内置BuiltinTrainer支持
需要与Kubeflow生态集成Kubeflow TrainerPipelinesKatib无缝集成
需要Python SDK提交任务Kubeflow Trainer提供Pythonic接口
HPC批处理场景Volcano Job更成熟的批处理生态

7.5 Volcano + Kubeflow Trainer

VolcanoKubeflow Trainer结合使用,可以充分发挥两者的优势,构建企业级HPC训练平台。

能力维度Volcano提供Kubeflow Trainer提供
调度能力Gang调度、优先级抢占、队列管理、拓扑感知分布式训练编排、框架适配
资源管理多租户隔离、资源配额、公平调度训练任务生命周期管理
用户体验-Runtime抽象、Python SDK、角色分离
生态集成批处理调度生态ML工作流生态(PipelinesKatib

8. 参考资料