Skip to main content

1. 背景与价值

1.1 AI大模型训练的网络挑战

AI大模型训练场景中,特别是采用模型并行(Model Parallelism)策略时,模型被分割到多个节点上进行训练。训练过程中,这些节点需要频繁进行大量的数据交互,包括:

  • 梯度同步:分布式训练中各节点间需要频繁交换梯度信息
  • 参数更新:模型参数需要在多个节点间同步
  • 中间结果传输:模型并行场景下,不同层的计算结果需要在节点间传递

此时,节点间的网络传输性能往往成为训练的瓶颈,显著影响训练效率。

1.2 数据中心网络的复杂性

现代数据中心的网络环境具有以下特点:

  1. 网络类型多样

    • InfiniBand (IB):提供超低延迟和高带宽,常用于HPCAI训练
    • RoCE (RDMA over Converged Ethernet):在以太网上实现RDMA功能
    • NVSwitch/NVLINKNVIDIA GPU间的高速互连技术
    • 传统以太网:通用网络连接
  2. 网络拓扑复杂

    • 多层交换机架构(Spine-LeafFat-Tree等)
    • 不同层级的交换机性能差异显著
    • 跨交换机通信会增加延迟、降低吞吐量
  3. 性能差异明显

    • 同一交换机下的节点通信:延迟最低、带宽最高
    • 跨一层交换机通信:性能有所下降
    • 跨多层交换机通信:性能显著降低

1.3 网络拓扑感知调度的价值

核心价值:将工作负载调度到具有最高吞吐量和最低延迟的最佳性能域,尽可能减少跨交换机的通信,从而:

  • 提升训练效率:减少网络通信开销,加速数据交换
  • 降低延迟:优先选择网络拓扑距离近的节点
  • 提高吞吐量:充分利用高速网络互连(如IBNVLINK
  • 优化资源利用:将任务调度到最合适的网络性能域

典型收益

  • 在大规模模型训练中,网络优化可将训练时间缩短40-60%
  • GPU利用率可提升20-30%
  • 支持更大规模的分布式训练任务

2. Volcano网络拓扑感知调度实现原理

2.1 核心设计理念

Volcano的网络拓扑感知调度基于以下核心设计:

  1. 统一的网络拓扑API:通过HyperNode CRD标准化描述网络拓扑
  2. 拓扑感知调度策略:基于网络拓扑信息进行智能调度决策
  3. 灵活的约束模式:支持HardSoft两种调度约束模式

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.tierHyperNode的层级,层级越低,节点间通信效率越高
  • spec.membersHyperNode的子节点列表
  • spec.members[i].type:子节点类型
    • Node:真实的Kubernetes节点(叶子HyperNode
    • HyperNode:其他HyperNode(非叶子HyperNode
  • spec.members[i].selector:子节点选择器,支持三种方式:
    • exactMatch:精确匹配节点名称
    • regexMatch:正则表达式匹配节点名称
    • labelMatch:基于标签匹配节点

注意事项

  • regexMatchlabelMatch只能用在叶子HyperNode
  • 三种selector不能同时配置,通常只配置一种选择器
  • 非叶子HyperNode只支持exactMatch

2.3 网络拓扑树状结构

多个HyperNode通过层级连接,形成树状结构。例如:

  tier2                     s4                                 s5                         
/ \ / \
tier1 s0 s1 s2 s3
/ \ / \ / \ / \
node0 node1 node2 node3 node4 node5 node6 node7

通信效率分析

  • node0node1:同属于s0tier1),通信效率最高
  • node0node2:需跨s0→s4→s1,通信效率较低
  • node0node4:需跨s0→s4→s5→s2,通信效率最低

2.4 调度策略:Hard/Soft模式

Volcano JobPodGroup可以通过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的打分

目标HyperNodeTier越低,得分越高

计算公式

tierScore = (maxTier - currentTier) / (maxTier - minTier) * 100

示例

  • 假设集群中Tier范围为1-3
  • Tier=1HyperNode得分:(3-1)/(3-1) * 100 = 100分
  • Tier=2HyperNode得分:(3-2)/(3-1) * 100 = 50分
  • Tier=3HyperNode得分:(3-3)/(3-1) * 100 = 0分

2.5.2 基于任务分布的打分

目标:作业在该HyperNode内已成功调度的Pod数量越多,得分越高

计算公式

taskNumScore = (hyperNodeTaskNum / totalTaskNum) * 100

作用:鼓励将同一作业的任务调度到同一HyperNode,减少跨HyperNode通信

2.5.3 综合打分流程

  1. 首次调度:所有候选HyperNode得分为0,调度成功后记录JobAllocatedHyperNode
  2. 后续调度
    • 计算候选HyperNodeJobAllocatedHyperNodeLCA(最低公共祖先)HyperNode
    • 基于LCATier计算tierScore
    • 如果有多个HyperNode得分相同,进一步基于任务分布计算taskNumScore
  3. 最终得分finalScore = tierScore + taskNumScore

3. 配置方式

3.1 配置Volcano调度器

要启用网络拓扑感知调度功能,需要修改Volcano调度器的ConfigMap

volcano-scheduler.conf
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的自动发现与管理。

工作原理

  1. Discoverer定期从外部系统收集网络拓扑信息
  2. 将信息转换为标准的HyperNode表示
  3. HyperNode Controller自动创建、更新或删除HyperNode CRs

支持的发现源

  • UFM(Unified Fabric Manager)InfiniBand网络管理
  • RoCERDMA 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 controllerConfigMap有异步监听和热更新机制,因此修改该配置后无需手动重启volcano controller,理论上等待数秒后即可生效。

volcano-controller.conf
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 JobPodGroup通过networkTopology字段配置网络拓扑约束,该字段包含以下参数:

4.1.1 参数详解

networkTopology:
mode: <string> # 调度模式:hard 或 soft
highestTierAllowed: <int> # 允许的最高Tier层级

参数说明

参数类型必填说明
modestring调度模式,可选值:
- hard:硬约束,所有任务必须在指定Tier
- soft:软约束,尽力而为,允许降级
highestTierAllowedint允许的最高Tier层级值
- 所有任务必须调度到Tier ≤ highestTierAllowed的同一HyperNode
- 值越小,网络性能要求越高

4.1.2 Deployment工作负载支持

网络拓扑感知调度特性不直接支持Deployment类型的工作负载,因为:

设计限制

  • 网络拓扑感知调度依赖于VolcanoGang调度机制
  • 需要知道作业的所有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-nameDeploymentPod关联到PodGroup
  • PodGroupminMember应该等于Deploymentreplicas
  • Pod会继承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
  • 如果没有满足条件的HyperNodeJob将保持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调度
  • 保证作业能够尽快启动

5. 参考资料