Files
dpdk-blog/notes/sprint/week0-why-gpu-clusters-eat-networks.md
T

96 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Why GPU Clusters Eat Networks: Starting from AllReduce
> 作者: wxj | 背景: 2年交换机L3控制面开发 + DPDK数据面
> 项目: [GitHub Link —— 待填]
这是 AI 网络冲刺的第一篇,概念级。目标就一个:把一个网络工程师的已有知识,平移到一个新问题上——**为什么 GPU 集群把网络吃干抹净**。
## 为什么做这个
我做交换机 L3 控制面两年,日常打交道的是 ECMP、路由表、ARP 老化。数据面用 DPDK 写过,用户态 TCP 栈也在做。在这些体系里,网络的定位是"尽力而为":丢包了,协议栈重传;拥塞了,窗口退避。
但 AI 训练集群把这条假设整个推翻了。
千卡集群训练时,AllReduce 聚合通信阶段占用训练时间的 **30~50%**(来源:ROADMAP Week 0)。训练不是算完就结束——每个 step,所有 GPU 都要把梯度加起来再广播出去,然后才能进入下一轮计算。**网络慢一毫秒,几千块 GPU 就一起空转一毫秒。** 这就是"GPU 集群吃网络"的含义:网络不再是被容忍的开销,而是训练吞吐的直接瓶颈。
对网络工程师来说,这不是新领域,而是一次"改名练习"(re-naming exercise)。下面每一层,我都会标出它对应我已经会的东西。
## 架构设计
Week 0 的 Gate 产物——GPU 集群通信栈,自上而下四层:
![GPU 集群通信栈](/week0/gpu-cluster-comm-stack.png)
### L1 应用层:训练与集合通信
训练任务通过 NCCL 发起 AllReduce。AllReduce 的语义很简单:每个 GPU 持有一部分梯度,把所有人的梯度**加和**之后,让**每个人都拿到完整结果**。Ring / Tree 是它的两种经典算法形态。
关键洞察:**GPU 的时间就是钱**。AllReduce 期间 GPU 不计算,只等待。所以网络的每次抖动都会直接折算成 GPU 利用率损失。
### L2 传输层:RDMA over RoCEv2
传统 TCP 收包要经过内核协议栈:中断 → 拷贝到内核缓冲 → 拷贝到用户态。这条路径的延迟和 CPU 开销在 AI 场景不可接受。
RDMA 的答案是**零拷贝**:QP / Verbs 语义下,网卡(RNIC)直接把数据搬进应用事先注册的内存,CPU 完全不参与搬运。RoCEv2 把 RDMA 跑在以太网 + UDP 上,让无损以太网也能承载 RDMA 语义——这就是它和 InfiniBand 的根本区别:不用专用网络硬件。
这层对应我已会的东西:**TCP FSM → RoCEv2 QP/verbs**。都是"连接的建立、状态、可靠传输",只是状态机跑到了网卡硬件上。
### L3 网络层:无损以太网
RDMA 对丢包零容忍:一次丢包触发一次重传,性能立刻崩塌。所以承载 RDMA 的网络必须做到两件事:
1. **不丢包**:PFC(优先级流控)在链路层反压——下游缓冲快满时,直接让上游暂停发送
2. **提前疏导**:ECN 在丢包发生**之前**标记拥塞,DCQCN 在网卡侧做拥塞控制闭环
这里对应我已有的知识:**TCP 拥塞控制 → DCQCN**。TCP 把"丢包"当作拥塞信号;无损网络里"丢包 = 灾难",所以信号必须来自 ECN 标记而不是丢包。AIMD 曲线是一样的,信号源换了。
拓扑上,从 Spine-Leaf 到 Fat-Tree,再到 Rail-Optimized——这就是我日常的 **ECMP / 多路径问题**:东西向流量爆炸,要求网络提供全双工线速的多路径带宽(下文展开)。
### L4 硬件层:GPU 服务器与交换机
- **GPU ↔ NIC 直连**:PCIe / NVLink,数据搬进 GPU 内存的物理通道
- **800G 交换机**:单端口 800G,线速转发
- **DPU / SmartNIC**:把通信、拥塞处理从 CPU 卸载到网卡——这就是 DPDK 数据面思维("让 CPU 别碰数据路径")的硬件化版本
## 核心挑战
### 挑战一:东西向流量是压倒性的
GPU 集群的流量不是南北向(用户 ↔ 服务器),而是 GPU ↔ GPU 的东西向。每块 GPU 每个 step 都要和所有其他 GPU 通信。带宽需求 = GPU 数量 × 每块 GPU 的通信带宽,这比传统数据中心大一到两个数量级。
### 挑战二:丢包从"慢一点"变成"崩掉"
TCP 丢一个包,重传,吞吐降一点。RDMA 丢一个包,重传,整个集群的 step 时间被拖长——而且 PFC 自身还会引入新问题(风暴、死锁),这是 Week 1 的主菜。
### 挑战三:拓扑决定 NCCL 的心情
NCCL 是拓扑感知的:它根据 GPU 和交换机的位置决定 Ring / Tree 的排布。**乱序的拓扑会让 NCCL 的环形通信绕远路**,跨 spine 的流量比例直接决定瓶颈位置。这就是为什么大厂要 Rail-Optimized:让同一编号的 GPU(rail)尽量一跳可达,把流量钉在局部。
## 性能演进
| 演进项 | 数据 | 解决的问题 |
|------|-----|------|
| 拓扑:Spine-Leaf → Fat-Tree → Rail-Optimized | 训练流量约 60~80% 走 rail 内(一跳),20~40% 跨 rail;spine 交换机上到 128×800G | 东西向流量爆炸后的多路径与一跳化 |
| 机内互联:NVLink NVL5 | 单 B200 GPU 18 条 NVL5 链路,机内全互联 **1.8 TB/s** | GPU 间梯度交换不出机箱 |
| 跨机:InfiniBand NDR → 800G 以太网 | 计算网络 NDR 400Gbps;Spectrum-4 800G 以太网进入存储/管理面 | 跨 rack 的 AllReduce 流量 |
| 卸载:DPU / SmartNIC | BlueField-3 等 DPU 承担管理/存储面 200Gbps | CPU 从数据路径退场 |
(表格数据来源:NVIDIA DGX SuperPOD GB200 Reference Architecture;60~80% rail 内流量比例见参考 [3])
## 给读者的建议
如果你和我一样是传统网络工程师,进入 AI 网络最快的路径是:
1. **先吃透 AllReduce**:Ring AllReduce 每步传 (N−1)/N × data,推导一遍就知道网络为什么是瓶颈(Week 2 主菜)
2. **把每个新概念挂到旧概念上**:DCQCN = TCP 拥塞控制的表弟;Fat-Tree = 你的 ECMP 日常;PFC/ECN = 芯片流水线里的反压机制
3. **读代码而不是读百科**:verbs.h、ib_write_bw.c、rxe 内核模块,三层剥皮法每个 repo 一篇文章
4. **画图**:每个概念一张手绘图——我这张通信栈图讲给外行听过,才算真懂
## 参考
1. NVIDIA DGX SuperPOD: Next Generation Scalable Infrastructure Reference Architecture (DGX GB200) — https://docs.nvidia.com/dgx-superpod/reference-architecture-scalable-infrastructure-gb200/latest/
2. NVIDIA DGX SuperPOD Network Fabrics — https://docs.nvidia.com/dgx-superpod/reference-architecture-scalable-infrastructure-gb200/latest/network-fabrics.html
3. Rail-Optimized(DGX SuperPOD)的流量矩阵与 Spine 瓶颈分析 — https://blog.csdn.net/weixin_49199313/article/details/162331843
4. ROADMAP.md — AI-Networking Interview Sprint, Week 0 定义与 AllReduce 30~50% 数据
5. DCQCN (SIGCOMM'15) · Revisiting Network Support for RDMA (SIGCOMM'18) · Deadlocks in Datacenter Networks (HotNets'16) —— Week 1 精读预告