1. 背景与价值
1.1 AI大模型训练的网络挑战
在AI大模型训练场景中,特别是采用模型并行(Model Parallelism)策略时,模型被分割到多个节点上进行训练。训练过程中,这些节点需要频繁进行大量的数据交互,包括:
- 梯度同步:分布式训练中各节点间需要频繁交换梯度信息
- 参数更新:模型参数需要在多个节点间同步
- 中间结果传输:模型并行场景下,不同层的计算结果需要在节点间传递
此时,节点间的网络传输性能往往成为训练的瓶颈,显著影响训练效率。
1.2 数据中心网络的复杂性
现代数据中心的网络环境具有以下特点:
-
网络类型多样:
InfiniBand (IB):提供超低延迟和高带宽,常用于HPC和AI训练RoCE (RDMA over Converged Ethernet):在以太网上实现RDMA功能NVSwitch/NVLINK:NVIDIA GPU间的高速互连技术- 传统以太网:通用网络连接
-
网络拓扑复杂:
- 多层交换机架构(
Spine-Leaf、Fat-Tree等) - 不同层级的交换机性能差异显著
- 跨交换机通信会增加延迟、降低吞吐量
- 多层交换机架构(
-
性能差异明显:
- 同一交换机下的节点通信:延迟最低、带宽最高
- 跨一层交换机通信:性能有所下降
- 跨多层交换机通信:性能显著降低
1.3 网络拓扑感知调度的价值
核心价值:将工作负载调度到具有最高吞吐量和最低延迟的最佳性能域,尽可能减少跨交换机的通信,从而:
- 提升训练效率:减少网络通信开销,加速数据交换
- 降低延迟:优先选择网络拓扑距离近的节点
- 提高吞吐量:充分利用高速网络互连(如
IB、NVLINK) - 优化资源利用:将任务调度到最合适的网络性能域
典型收益:
- 在大规模模型训练中,网络优化可将训练时间缩短
40-60% GPU利用率可提升20-30%- 支持更大规模的分布式训练任务
2. Volcano网络拓扑感知调度实现原理
2.1 核心设计理念
Volcano的网络拓扑感知调度基于以下核心设计:
- 统一的网络拓扑API:通过
HyperNode CRD标准化描述网络拓扑 - 拓扑感知调度策略:基于网络拓扑信息进行智能调度决策
- 灵活的约束模式:支持
Hard和Soft两种调度约束模式
2.2 HyperNode CRD
2.2.1 HyperNode概念
HyperNode 是一个性能域(Performance Domain),表示一组具有相同网络带宽和延迟特性的节点或子性能域。通常映射到一个交换机或Tor(Top of Rack)。
Tier(层级) 用于区分不同的性能域:
Tier值越小,网络带宽越高、延迟越低- 同一
Tier内的节点具有相同的网络性能特征 - 不同
Tier代表不同层级的交换机
2.2.2 HyperNode的优势
相比传统的通过节点标签(Label)表示网络拓扑的方式,HyperNode具有以下优势:
| 特性 | 节点标签方式 | HyperNode方式 |
|---|---|---|
| 语义统一 | 标签命名不统一,语义模糊 | 标准化的API,语义清晰 |
| 层级结构 | 难以表达多层级关系 | 支持树状层级结构 |
| 管理便捷 | 需要手动维护大量标签 | 支持自动发现和集中管理 |
| 扩展性 | 扩展困难 | 易于扩展和定制 |
2.2.3 HyperNode关键字段
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: s0
spec:
# Tier层级,层级越低,网络性能越好
tier: 1
# 成员列表,可以是Node或HyperNode
members:
- type: Node # 成员类型:Node或HyperNode
selector:
# 支持三种选择器:exactMatch、regexMatch、labelMatch
exactMatch:
name: node0
关键字段说明:
spec.tier:HyperNode的层级,层级越低,节点间通信效率越高spec.members:HyperNode的子节点列表spec.members[i].type:子节点类型Node:真实的Kubernetes节点(叶子HyperNode)HyperNode:其他HyperNode(非叶子HyperNode)
spec.members[i].selector:子节点选择器,支持三种方式:exactMatch:精确匹配节点名称regexMatch:正则表达式匹配节点名称labelMatch:基于标签匹配节点
注意事项:
regexMatch和labelMatch只能用在叶子HyperNode中- 三种
selector不能同时配置,通常只配置一种选择器 - 非叶子
HyperNode只支持exactMatch
2.3 网络拓扑树状结构
多个HyperNode通过层级连接,形成树状结构。例如:
tier2 s4 s5
/ \ / \
tier1 s0 s1 s2 s3
/ \ / \ / \ / \
node0 node1 node2 node3 node4 node5 node6 node7
通信效率分析:
node0和node1:同属于s0(tier1),通信效率最高node0和node2:需跨s0→s4→s1,通信效率较低node0和node4:需跨s0→s4→s5→s2,通信效率最低
2.4 调度策略:Hard/Soft模式
Volcano Job和PodGroup可以通过networkTopology字段设置拓扑约束:
spec:
networkTopology:
mode: hard # 或 soft
highestTierAllowed: 2
2.4.1 Hard模式(硬约束)
特点:
- 作业中的所有任务必须被调度到
highestTierAllowed定义的单个HyperNode层级(或更低层级)内 - 如果找不到满足约束的
HyperNode,作业将保持Pending状态 - 适用于对网络拓扑有严格要求的场景
适用场景:
- 大规模分布式训练,对网络延迟极其敏感
- 需要保证所有节点在同一高速网络域内
- 模型并行训练,节点间通信频繁
2.4.2 Soft模式(软约束)
特点:
- 调度器会尽最大努力将任务调度到同一个
HyperNode内 - 如果无法满足,允许任务被调度到不同的
HyperNode上 - 确保作业能够尽快运行,提供调度灵活性
适用场景:
- 希望优化网络性能,但可接受一定的调度灵活性
- 集群资源紧张,需要平衡性能和资源利用率
- 数据并行训练,网络通信相对较少
2.5 调度打分逻辑
network-topology-aware插件在调度时采用以下打分策略:
2.5.1 基于Tier的打分
目标:HyperNode的Tier越低,得分越高
计算公式:
tierScore = (maxTier - currentTier) / (maxTier - minTier) * 100
示例:
- 假设集群中
Tier范围为1-3 Tier=1的HyperNode得分:(3-1)/(3-1) * 100 = 100分Tier=2的HyperNode得分:(3-2)/(3-1) * 100 = 50分Tier=3的HyperNode得分:(3-3)/(3-1) * 100 = 0分
2.5.2 基于任务分布的打分
目标:作业在该HyperNode内已成功调度的Pod数量越多,得分越高
计算公式:
taskNumScore = (hyperNodeTaskNum / totalTaskNum) * 100
作用:鼓励将同一作业的任务调度到同一HyperNode,减少跨HyperNode通信
2.5.3 综合打分流程
- 首次调度:所有候选
HyperNode得分为0,调度成功后记录JobAllocatedHyperNode - 后续调度:
- 计算候选
HyperNode与JobAllocatedHyperNode的LCA(最低公共祖先)HyperNode - 基于
LCA的Tier计算tierScore - 如果有多个
HyperNode得分相同,进一步基于任务分布计算taskNumScore
- 计算候选
- 最终得分:
finalScore = tierScore + taskNumScore
3. 配置方式
3.1 配置Volcano调度器
要启用网络拓扑感知调度功能,需要修改Volcano调度器的ConfigMap:
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: predicates
- name: proportion
- name: nodeorder
# 启用网络拓扑感知插件
- name: network-topology-aware
arguments:
weight: 10 # 设置插件权重,默认为1
3.2 HyperNode管理方式
3.2.1 自动发现机制(推荐)
Volcano通过集成可插拔的网络拓扑发现工具(Discoverer)实现HyperNode的自动发现与管理。
工作原理:
Discoverer定期从外部系统收集网络拓扑信息- 将信息转换为标准的
HyperNode表示 HyperNode Controller自动创建、更新或删除HyperNode CRs
支持的发现源:
- UFM(Unified Fabric Manager):
InfiniBand网络管理 - RoCE:
RDMA over Converged Ethernet - Label:基于节点标签
配置示例
Step 1:创建UFM凭据Secret(如果使用UFM)
kubectl create secret generic ufm-credentials \
--from-literal=username='your-ufm-username' \
--from-literal=password='your-ufm-password' \
-n volcano-system
Step 2:配置Discoverer
注意这里修改的是volcano controller的配置,由于volcano controller对ConfigMap有异步监听和热更新机制,因此修改该配置后无需手动重启volcano controller,理论上等待数秒后即可生效。
networkTopologyDiscovery:
# UFM发现源配置(适用于InfiniBand网络)
- source: ufm
enabled: true
interval: 10m
credentials:
secretRef:
name: ufm-credentials
namespace: volcano-system
config:
endpoint: https://ufm-server:8080
insecureSkipVerify: true
# RoCE发现源配置
- source: roce
enabled: false
interval: 15m
config:
endpoint: https://roce-server:9090
# 基于标签的发现源配置
- source: label
enabled: true
config:
networkTopologyTypes:
# 定义拓扑类型A2:2层网络拓扑
topologyA2:
- nodeLabel: "volcano.sh/tor" # 交换机标签
- nodeLabel: "kubernetes.io/hostname" # 节点主机名
# 定义拓扑类型A3:3层网络拓扑
topologyA3:
- nodeLabel: "volcano.sh/hypercluster" # 超集群标签
- nodeLabel: "volcano.sh/hypernode" # 超节点标签
- nodeLabel: "kubernetes.io/hostname" # 节点主机名
配置说明:
interval:发现工具的执行间隔enabled:是否启用该发现源- 基于标签的发现需要预先在节点上打好相应的标签
3.2.2 手动配置HyperNode(基于标签)
如果不使用自动发现,可以手动创建HyperNode资源。
示例1:基于精确匹配
# 叶子HyperNode - 使用exactMatch精确匹配节点
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: ib-network-0
spec:
tier: 1
members:
- type: Node
selector:
exactMatch:
name: node0
- type: Node
selector:
exactMatch:
name: node1
---
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: ib-network-1
spec:
tier: 1
members:
- type: Node
selector:
exactMatch:
name: node2
- type: Node
selector:
exactMatch:
name: node3
---
# 非叶子HyperNode - 组合多个叶子HyperNode
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: ib-spine-0
spec:
tier: 2
members:
- type: HyperNode
selector:
exactMatch:
name: ib-network-0
- type: HyperNode
selector:
exactMatch:
name: ib-network-1
示例2:基于正则匹配
# 使用regexMatch匹配一组节点
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: nvlink-group-0
spec:
tier: 1
members:
- type: Node
selector:
regexMatch:
pattern: "^gpu-node-[0-7]$" # 匹配gpu-node-0到gpu-node-7
示例3:基于标签匹配
# 使用labelMatch基于标签匹配节点
apiVersion: topology.volcano.sh/v1alpha1
kind: HyperNode
metadata:
name: rack-1-nodes
spec:
tier: 1
members:
- type: Node
selector:
labelMatch:
matchLabels:
topology-rack: rack-1
network-type: infiniband
4. 使用示例
4.1 网络拓扑感知配置参数说明
Volcano Job和PodGroup通过networkTopology字段配置网络拓扑约束,该字段包含以下参数:
4.1.1 参数详解
networkTopology:
mode: <string> # 调度模式:hard 或 soft
highestTierAllowed: <int> # 允许的最高Tier层级
参数说明:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
mode | string | 是 | 调度模式,可选值: - hard:硬约束,所有任务必须在指定Tier内- soft:软约束,尽力而为,允许降级 |
highestTierAllowed | int | 是 | 允许的最高Tier层级值- 所有任务必须调度到 Tier ≤ highestTierAllowed的同一HyperNode内- 值越小,网络性能要求越高 |
4.1.2 Deployment工作负载支持
网络拓扑感知调度特性不直接支持Deployment类型的工作负载,因为:
设计限制:
- 网络拓扑感知调度依赖于
Volcano的Gang调度机制 - 需要知道作业的所有
Pod数量才能进行拓扑优化 Deployment是滚动更新模式,不符合Gang调度的原子性要求
替代方案:
为Deployment创建对应的PodGroup资源:
apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: inference-service-pg
namespace: default
spec:
minMember: 4 # 最小Pod数量
queue: default
networkTopology:
mode: soft
highestTierAllowed: 2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: inference-service
namespace: default
spec:
replicas: 4
selector:
matchLabels:
app: inference
template:
metadata:
labels:
app: inference
annotations:
# 关联PodGroup
scheduling.volcano.sh/group-name: inference-service-pg
spec:
schedulerName: volcano
containers:
- name: inference
image: inference:latest
resources:
limits:
nvidia.com/gpu: "1"
说明:
- 通过
annotations中的scheduling.volcano.sh/group-name将Deployment的Pod关联到PodGroup PodGroup的minMember应该等于Deployment的replicasPod会继承PodGroup的网络拓扑约束
4.2 Volcano Job配置示例
4.2.1 Hard模式调度
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: distributed-training
spec:
minAvailable: 8
schedulerName: volcano
queue: default
# 网络拓扑约束配置
networkTopology:
mode: hard # 硬约束模式
highestTierAllowed: 2 # 最高允许跨越Tier 2
tasks:
- replicas: 8
name: worker
template:
spec:
containers:
- name: pytorch-worker
image: pytorch/pytorch:latest
command: ["python", "/workspace/train.py"]
resources:
limits:
nvidia.com/gpu: "1"
requests:
nvidia.com/gpu: "1"
restartPolicy: OnFailure
说明:
8个任务必须调度到Tier≤2的同一个HyperNode内- 如果没有满足条件的
HyperNode,Job将保持Pending状态 - 适用于对网络性能要求极高的训练任务
4.2.2 Soft模式示例
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: flexible-training
spec:
minAvailable: 16
schedulerName: volcano
queue: default
networkTopology:
mode: soft # 软约束模式
highestTierAllowed: 1
tasks:
- replicas: 16
name: worker
template:
spec:
containers:
- name: tensorflow-worker
image: tensorflow/tensorflow:latest-gpu
resources:
limits:
nvidia.com/gpu: "1"
restartPolicy: OnFailure
说明:
- 调度器会尽量将
16个任务调度到Tier 1的同一HyperNode - 如果资源不足,允许跨
HyperNode调度 - 保证作业能够尽快启动