Self-developed switch + network optimization + large model platform
在 AIDC(智算中心)领域,大模型训练的瓶颈往往不在于单张 GPU 的算力,而在于“成千上万张 GPU 如何高效通信”,这就是大厂们疯狂内卷自研网络和交换机的原因。
大厂的核心技术都围绕着“自研白盒交换机 + 极致网络优化(低延迟/无损) + 大模型平台”展开。以下为你详细梳理阿里云、腾讯、字节跳动的核心网络自研技术及平台内容:
一、 腾讯:星脉高性能计算网络(StarNetwork)
⭐️
以太网硬件 + 软件智能流量管控 达到 IB 水平
1. 分布式训练 星脉调度流程:扫描 Network topology 感知,判断出哪些流量走哪条路。输出流量调度表,下发给网卡们
2. 做 AllReduce 时,数据到达网卡缓冲区,星脉 intervention,在队列拥塞前,选择空闲的路径。AllReduce,心跳包优先级
不同,差异化调度。AllReduce 优先级高。
3. 数据经过交换机,交换机在 packet 的包头标上交换机的队列深度和延迟。接收端最后将这些信息反馈给发送方。
4. 用时间间隔来判定走不同的路径,而不是哈希【多路径负载均衡(ECMP++)】
"瞬间涌入大量数据导致交换机队列溢出"的现象就叫 micro-burst(微突发)。
用流量整形 traffic shaping 应对
原始:GPU A 一次性发送 1GB(16384 个 64KB 的包)
↓
[======== 1GB burst ========] → 交换机队列瞬间爆满 ❌
整形后:GPU A 分批发送,每批 64KB,批次间隔 10 微秒
↓
[64KB] --10μs-- [64KB] --10μs-- [64KB] ... → 交换机队列平稳 ✅
二、多路径负载均衡(ECMP++)
星脉解决的是 跨机器的网络通信,而不是机内 NVLink。
具体场景:GPU A(机器 1)→ GPU B(机器 2)
假设这两台机器的网络拓扑如下:
机器 1(GPU A) 机器 2(GPU B)
| |
[网卡] [网卡]
| |
+---[叶交换机 Leaf1]---[脊交换机 Spine1]---+
| × |
+---[叶交换机 Leaf2] [脊交换机 Spine2]---+
×
四条等价路径:
- 网卡 → Leaf1 → Spine1 → Leaf2 → 网卡
- 网卡 → Leaf1 → Spine2 → Leaf2 → 网卡
- 网卡 → Leaf1 → Spine1 → Leaf3 → 网卡(如果对端有多个上联)
- 网卡 → Leaf1 → Spine2 → Leaf3 → 网卡
这是典型的 Spine-Leaf 架构(也叫 Clos 网络),任意两台机器之间都有多条等价路径。
传统 ECMP 的问题
ECMP(等价多路径)的工作原理:
交换机根据数据包的"五元组"(源 IP、目的 IP、源端口、目的端口、协议)做哈希,决定走哪条路径。
举例说明问题:
假设 GPU A 到 GPU B 要发 4 条流(Flow 1 ~ Flow 4),每条流 1GB:
传统 ECMP 哈希结果:
Flow 1 → 哈希到路径 1
Flow 2 → 哈希到路径 1(碰撞!)
Flow 3 → 哈希到路径 3
Flow 4 → 哈希到路径 4
结果:路径 1 传 2GB(拥塞),路径 2 空闲(浪费)
为什么会碰撞?
因为五元组中,源 IP 和目的 IP 都固定,只有端口号在变。端口号范围有限(几千个),容易哈希到同一条路径。
星脉的 ECMP++ 解决方案
核心改进:Flowlet 调度
不再以"整条流"为单位选路,而是以 flowlet(微流) 为单位:
- 定义:如果两个数据包的时间间隔 > 阈值(如 100 微秒),就认为是不同的 flowlet
- 每个 flowlet 独立做路径选择
举例:
Flow 1 发送过程(拆成 3 个 flowlet):
Flowlet 1.1(前 300MB)→ 路径 1
--- 间隔 150μs ---
Flowlet 1.2(中 400MB)→ 路径 2(动态切换!)
--- 间隔 120μs ---
Flowlet 1.3(后 300MB)→ 路径 3
Flow 2 同理拆成多个 flowlet,分散到不同路径
选路依据:不再是固定哈希,而是实时查询每条路径的拥塞状态(通过 INT 反馈),选最空闲的路径。
对比效果
| 指标 | 传统 ECMP | 星脉 ECMP++ |
|---|---|---|
| 路径 1 负载 | 2GB(拥塞) | 1GB |
| 路径 2 负载 | 0GB(浪费) | 0.9GB |
| 路径 3 负载 | 1GB | 1GB |
| 路径 4 负载 | 1GB | 1.1GB |
| 完成时间 | 180ms | 105ms(↓ 42%) |
价值举例:
在 1024 张 GPU 的集群中,AllReduce 会产生数千条并发流。传统 ECMP 容易让某些链路过载(丢包、重传),星脉通过动态分流把带宽利用率从 60% 提升到 95%。
三、DPU(Data Processing Unit)是什么?
定义
DPU 是一颗 专门处理网络/存储/安全任务的协处理器,卸载 CPU 的负担。
类比:
- CPU:大脑,负责通用计算
- GPU:专业画师,负责并行计算(AI 训练)
- DPU:秘书,负责收发邮件、整理文件(网络/存储)
硬件形态
DPU 通常是一张 PCIe 网卡,内部集成:
- 网络处理器(如 ARM 核):运行 TCP/IP 协议栈
- 可编程加速引擎:做加解密、压缩、正则匹配
- 高速接口:连接到 CPU/GPU 和网络
代表产品:
- NVIDIA BlueField-3:集成 16 个 ARM 核 + 400Gbps 以太网接口
- Intel IPU(Infrastructure Processing Unit)
- AMD Pensando
DPU 在星脉中的角色
| 任务 | 传统方案(CPU 做) | 有 DPU(DPU 做) |
|---|---|---|
| 网络协议处理 | CPU 跑 Linux 内核协议栈 | DPU 硬件卸载 RDMA/RoCE |
| 流量调度 | CPU 查路由表、做负载均衡 | DPU 执行星脉的调度策略 |
| 拥塞检测 | CPU 分析 INT 数据 | DPU 实时解析并调整发送速率 |
| 安全隔离 | CPU 跑防火墙 | DPU 硬件过滤 |
举例说明价值:
假设一台 AI 训练服务器有 8 张 A100,AllReduce 时网络吞吐达到 3.2Tbps(每张卡 400Gbps):
- 无 DPU:CPU 的 16 个核要花 30% 的时间处理网络中断和协议栈,只剩 70% 给训练任务
- 有 DPU:网络处理完全卸载,CPU 100% 专注训练,训练吞吐提升 15%
同时,DPU 可以实时执行星脉的流量调度算法(每微秒级别的决策),CPU 根本做不到这么快。
四、星脉功能全景 + 运行位置 + 价值举例
把星脉的所有功能按"运行位置"分类,每个都给出具体例子。
功能地图
| 功能模块 | 运行位置 | 具体作用 | 价值举例 |
|---|---|---|---|
| 全局调度器 | 独立控制节点 | 收集集群拓扑、任务信息,计算流量调度方案 | 1024 张 GPU 训练时,提前规划好哪些流量走哪条路径,避免 80% 的拥塞冲突 |
| 拓扑发现 | 控制节点 + 每个交换机 | 通过 LLDP/BGP 探测网络结构 | 发现某条链路故障,10ms 内通知所有节点绕行 |
| 流量整形(Pacing) | 网卡/DPU | 控制数据包发送间隔 | 把 1GB 突发流量拆成 100 微秒间隔的小批,交换机队列占用从 90% 降到 40% |
| Flowlet 路径选择 | 网卡/DPU | 每个微流动态选最优路径 | 4 条路径的带宽利用率从 [95%, 30%, 20%, 10%] 均衡到 [70%, 65%, 68%, 72%] |
| INT 数据采集 | 交换机 | 在数据包头插入队列深度、时延等信息 | 发送端提前 50 微秒感知拥塞,切换路径避免丢包 |
| 拥塞反馈处理 | 网卡/DPU | 解析 INT 数据,调整发送速率 | 检测到某路径队列 > 阈值,立即降速 20%,避免触发 PFC 暂停 |
| 快速重路由 | 网卡/DPU + 交换机 | 故障时秒级切换路径 | 某交换机掉电,100ms 内所有流量切到备用路径,训练无感知 |
| 优先级队列管理 | 交换机 | 给不同流量分配不同优先级 | AllReduce 高优先级,心跳包低优先级,确保训练数据优先转发 |
| RDMA QP 管理 | 网卡/DPU | 管理 RoCE 的队列对,防止死锁 | 8 张卡同时通信时,动态分配 64 个 QP,避免传统静态分配导致的资源浪费 |
| 网内聚合(可选) | 可编程交换机 | 在交换机内做部分 AllReduce 计算 | 8 张卡的梯度在交换机汇聚时直接求和,减少 30% 的网络流量 |
一、关键区别:两种"拓扑"根本不是一回事
| 维度 | NCCL 的拓扑感知 | 星脉的拓扑感知 |
|---|---|---|
| 看的是什么 | 逻辑通信拓扑:GPU 之间该怎么组队通信 | 物理网络拓扑:数据包在交换机之间怎么走线 |
| 关心的问题 | “谁和谁通信,按什么顺序”(Ring/Tree) | “这个包从网卡出去走哪条物理链路” |
| 感知范围 | 主要是机内(GPU-NVLink-PCIe-网卡的关系) | 主要是机间(网卡-交换机-交换机的拓扑) |
| 到哪里为止 | 到网卡就停了,网卡之外是黑盒 | 从网卡开始,管整个交换网络 |
| 时间特性 | 静态(初始化时探测一次) | 动态(实时监控拥塞、故障) |
腾讯在 AIDC 网络技术上的代表作是星脉网络(现已升级至 2.0 版本),它是专门为了解决 10 万卡级别超大规模 AI 集群训练而设计的软硬协同高性能网络。
1. 硬件自研:自研交换机与算力网卡
- 自研交换机升级: 腾讯自研交换机交换容量提升到了 51.2T(单台交换机支持多路 400G/800G 端口)。
- 自研光模块: 采用自研硅光模块,速率提升至 400G/800G,大幅降低光通信带来的功耗。
- 自研算力网卡: 2.0 最大的升级是搭载了全自研的 AI 算力网卡,负责端到端的流量调度。
2. 核心网络技术:TiTa 协议与 TCCL 通信库
- TiTa 协议(自研拥塞控制算法): 传统以太网容易丢包。腾讯自研的 TiTa 协议内嵌于网卡中,能够实时感知网络拥塞,做到零丢包与高吞吐,将尾部延迟(Tail Latency)降到最低。
- TCCL(腾讯集体通信库): 对标英伟达的 NCCL。它能根据腾讯自研网络的拓扑结构,自动选择最优的通信算法(如 Ring、Tree 拓扑),让多卡并行的结果同步变得更快。
运维/建设看点: 软硬一体化。通过自研全栈运营系统,将超大集群的网络故障定位从“天级”缩短到“分钟级”。
二、 字节跳动:分布式解耦机箱(DDC)与全自研智算网络
字节跳动的抖音、TikTok 背后有大量的推荐算法和大模型需求。他们在网络架构上走得非常前沿,是全球首个在生产环境大规模部署以太网 DDC 架构的公司。
1. 核心网络架构:DDC(Distributed Disaggregated Chassis)
传统的 AI 集群网络使用多层 Spine-Leaf(叶脊)交换机架构,层级多、流控复杂。字节跳动打破了传统,采用 DDC(分布式解耦机箱)方案:
- 把整个智算网络变成一台“大交换机”: DDC 将传统大型框式交换机的内部组件(线卡、交换网板)拆散,变成一个个独立的白盒(NCP 和 NCF)。
- 信元级别转发(Cell-based Fabric): 传统的以太网是按“数据包(Packet)”转发的,容易因为某条路径堵塞导致丢包。DDC 架构把数据打碎成平等的“信元(Cell)”,均匀地分发到所有路径上,在出口再组装。从而实现绝对平等的负载均衡、零丢包、几乎零抖动。
2. 自研芯片:定海智算网卡与自研交换芯片
- “定海”智算网卡: 字节自研的高性能可编程网卡,支持灵活自定义 RoCE(RDMA over Converged Ethernet)拥塞算法。
- 自研交换芯片: 配合 Broadcom 等巨头深度定制自研交换机,具备高可编程性,支持算网联动。
字节跳动自研智算基础设施全景
字节的思路和腾讯星脉有个根本差异,先点出来你就有框架了:星脉是"保留标准交换机,用软件智能(flowlet 选路)去平衡负载";而字节的 DDC 是"干脆把交换机的物理架构重新设计,用硬件机制(信元喷洒)从根上消灭负载不均"。 一个偏软件,一个偏硬件架构革新。
把交换机"拆开"来看:线卡、网板到底是什么
你觉得抽象,是因为缺了最底层那块拼图——交换机内部长什么样。咱们从一台交换机的物理结构讲起,全程用"邮局/快递分拣中心"来类比,看完 DDC 你会觉得特别自然。
一、先搞懂:一台交换机内部是什么样
交换机干的事极其简单:数据从一个口进来,要从另一个口出去。比如 32 个网口,1 号口进来的数据要转发到 28 号口出去。
问题是:口和口之间,数据怎么"穿过"交换机内部? 这就引出了两种物理形态。
盒式交换机(Box / 白盒交换机)
最常见的形态,就是一个 1U/2U 的"披萨盒",固定端口,比如 32 个 400G 口。
盒式交换机(一个披萨盒)
┌─────────────────────────────────┐
│ [口1][口2][口3] ... [口31][口32] │ ← 32 个网口,固定死的
│ │
│ ┌──────────────────┐ │
│ │ 一颗交换芯片 │ │ ← 所有口的数据都在这一颗芯片里转发
│ └──────────────────┘ │
└─────────────────────────────────┘
特点:所有端口 + 转发逻辑都集成在一颗芯片里。买回来插上线就能用,便宜、灵活。但端口数固定,32 口就是 32 口,不够用就得再买一台。
框式交换机(Chassis / 机箱式)—— 重点理解这里
它不是一个盒子,而是一个 大铁柜(机箱),里面有很多插槽,你往里面插"卡"。这就是线卡和网板登场的地方。
框式交换机(一个大机箱)
┌──────────────────────────────────────────┐
│ 前面板(朝向服务器/外部网络) │
│ ┌────────┐ ← 线卡1:[口][口][口]...(36个口)│
│ ┌────────┐ ← 线卡2:[口][口][口]...(36个口)│
│ ┌────────┐ ← 线卡3:[口][口][口]... │
│ ┌────────┐ ← 线卡4 ... │
│ ...(可插 8~16 张线卡) │
│ ═══════════ 背板 (Backplane) ═══════════ │ ← 中间的"高速公路"
│ ┌────────┐ ← 网板1(在机箱后部) │
│ ┌────────┐ ← 网板2 │
│ ┌────────┐ ← 网板3 │
└──────────────────────────────────────────┘
现在两个关键概念就清楚了:
线卡(Line Card)= 朝外的"收发窗口"
- 它是一块插在机箱前面的电路板,上面有物理网口(你插网线/光纤的那些口),比如每张线卡 36 个 400G 口。
- 它负责:从网线收数据包、做查表(这个包要去哪)、把数据包发出去。
- 类比:邮局朝街的收发柜台,包裹从这里进,也从这里出。
网板(Fabric Card / 交换网板)= 内部的"传送带系统"
- 它插在机箱后部,没有对外的网口,它只对内。
- 它负责:把各张线卡连起来。当 1 号线卡收到的包要从 5 号线卡发出去时,包必须穿过网板才能从线卡1 到达线卡5。
- 类比:邮局内部连接所有柜台的传送带/分拣矩阵。包裹在柜台间流转,全靠它。
背板(Backplane)= 插槽和内部连线
- 就是机箱里那些插槽和电路,线卡和网板都插在上面,提供它们之间的物理高速连接。
关键问题来了:框式交换机为什么"负载完美均衡"?
这是理解 DDC 的核心钥匙,请重点看这里。
框式交换机内部,线卡到网板之间的数据传输,早就不是"整包走一条路"了,而是用了两个机制:
- 信元化(Cell):线卡收到一个完整数据包后,把它切成很多固定大小的小片(信元,cell),比如每片几百字节。
- 均匀喷洒(Spray):这些信元被平均撒到所有网板上。假设有 6 张网板,那这个包的信元就 1/6、1/6 地均匀分到 6 张网板上传输。出口线卡再把信元收齐、按序重组成完整的包。
线卡1 收到一个 1500 字节的包,目标是线卡5
↓ 切成 6 个信元
信元1 → 网板1 ┐
信元2 → 网板2 �│
信元3 → 网板3 ├→ 所有网板同时出力,负载完全均等 → 线卡5 收齐重组
信元4 → 网板4 │
信元5 → 网板5 │
信元6 → 网板6 ┘
因为是逐信元均匀撒,所以每张网板、每条内部链路的负载几乎一模一样——这就是"负载完美均衡"的来源。这是硬件机制天然保证的,不需要任何软件去算。
记住这一点:框式交换机内部,本来就在用"信元喷洒"。 DDC 的全部精髓,就是把这个"机箱内部的机制"搬到机箱外面来。后面你就懂了。
那框式交换机的缺点呢?
- 单点故障影响大:整个机箱是一个整体,机箱级故障(比如供电),插在上面的所有线卡(几百个口)全挂。
- 扩展受槽位限制:机箱就 16 个槽,插满了(比如 576 个口)就到顶了,想再大?没办法,得换更大的机箱(而机箱大小有物理极限)。
- 功耗集中难散热:几百个口的功耗(可能 20-30kW)全挤在一个柜子里,散热是噩梦。
二、盒式 + Spine-Leaf:灵活了,但负载均衡退化了
既然框式交换机扩展受限,那大规模数据中心怎么办?答案是:用一堆便宜的盒式交换机,堆成 Spine-Leaf(脊-叶)架构,也叫 Clos 网络。
Spine 层(脊交换机,负责盒子之间互联)
[Spine1] [Spine2] [Spine3] [Spine4]
│ ╲ ╳ ╱ │ ╲ ╳ ╱ │ ← 每个 Leaf 都连到每个 Spine
┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
│Leaf1│ │Leaf2│ │Leaf3│ │Leaf4│ Leaf 层(叶交换机,连服务器)
└─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘
服务器 服务器 服务器 服务器
好处很明显:想扩容?再加盒子就行,理论上能堆到几万个口,灵活、便宜、单个盒子坏了影响小。
但是! 这里出现了框式交换机没有的新问题。
在框式交换机里,线卡到网板是信元喷洒(完美均衡)。但在 Spine-Leaf 里,盒子和盒子之间走的是标准以太网,用 ECMP 选路——这是按"整条流"走一条路,不是信元喷洒!
回顾一下 ECMP 的毛病(前面讲星脉时说过):
- Leaf1 到 Leaf3 有 4 条路(经过 Spine1/2/3/4)。
- ECMP 用数据流的"五元组"做哈希,一整条流固定走一条路。
- 多条大象流可能哈希到同一个 Spine → 某条路挤爆,其他路空着。
ECMP 选路(按整条流哈希,会撞车):
流A(10GB)→ 哈希 → 走 Spine1 ┐
流B(10GB)→ 哈希 → 走 Spine1 ├ 都挤到 Spine1!拥塞 ❌
流C(10GB)→ 哈希 → 走 Spine3
流D(10GB)→ 哈希 → 走 Spine3
结果:Spine1 扛 20GB(堵死),Spine2、Spine4 完全空闲(浪费)
这就是矛盾的本质:
- 框式交换机:负载均衡完美(信元喷洒),但不能扩展、单点故障大。
- 盒式 + Spine-Leaf:能无限扩展、故障域小,但负载均衡退化成了 ECMP(哈希碰撞)。
鱼和熊掌不可兼得。 腾讯星脉的思路是"在 Spine-Leaf 上用软件 flowlet 选路,把 ECMP 修好"。而字节 DDC 的思路是——那我能不能两个都要?
三、DDC 的核心思想:把机箱"拆开摆"
字节 DDC 的灵感非常巧妙,一句话:
把框式交换机的线卡和网板,从机箱里拆出来,变成一个个独立的盒子,用线缆连接,但让它们内部继续跑"信元喷洒"。
这样就同时拿到了两边的好处:
- 信元喷洒 → 完美负载均衡(继承框式的优点)
- 拆成独立盒子 + 线缆连接 → 灵活扩展、故障域小(继承盒式的优点)
对应关系:
| 框式交换机内部 | DDC 拆出来后 | 角色 |
|---|---|---|
| 线卡(朝外的口) | NCP(独立盒子,连服务器/GPU) | 接入 |
| 网板(内部交换) | NCF(独立盒子,连各 NCP) | 中间交换 |
| 背板(内部高速公路) | 盒子之间的线缆 | 互联 |
传统框式交换机 DDC(拆开摆)
┌──────────────────┐
│ 线卡 线卡 线卡 线卡│ [NCP] [NCP] [NCP] [NCP] ← 原来的线卡,变成独立盒子
│ ══════背板══════ │ 拆开→ │ ╲ ╳ ╱ │ ← 原来的背板,变成线缆
│ 网板 网板 网板 │ [NCF] [NCF] [NCF] ← 原来的网板,变成独立盒子
└──────────────────┘
(一个铁柜,扩展受限) (独立盒子,想加就加,但内部还是信元喷洒)
注意区别:Spine-Leaf 里的盒子之间是 ECMP(整流哈希);DDC 里的 NCP-NCF 之间是 信元喷洒(cell spraying)。物理拓扑长得像,但内部转发机制完全不同——这就是 DDC 比普通 Spine-Leaf 强的根本原因。
四、DDC 完整工作流程(跟着一个数据包走一遍)
背景:GPU 服务器 A 连在 NCP-1 上,要发数据给 GPU 服务器 B(连在 NCP-9 上)。中间有 4 个 NCF 盒子。
[服务器A]──[NCP-1]──┬──[NCF-1]──┬──[NCP-9]──[服务器B]
├──[NCF-2]──┤
├──[NCF-3]──┤
└──[NCF-4]──┘
入口NCP 4个中间NCF 出口NCP
第 1 步:入口 NCP 收包
NCP-1 从服务器 A 收到一个完整的数据包(比如 9000 字节的巨型帧),查表得知:目的地是 NCP-9。
第 2 步:信用检查(VOQ + Credit)—— 发之前先问"有空吗"
这是 DDC 无损、不堵车的关键。NCP-1 不会莽撞地直接发,而是先确认出口有没有空间:
- NCP-1 内部为每一个出口(NCP-9)单独维护一个队列,这叫 VOQ(虚拟输出队列)。
- 发数据前,先通过 信用(credit)机制向 NCP-9 申请:“我有数据要给你,你那边缓冲区有空位吗?”
- NCP-9 回复"有空位"(发放 credit)后,NCP-1 才开始发。
作用:从根上避免"数据涌过去把出口挤爆",所以 DDC 能做到零丢包。这就像高速收费站,先确认前方有车位才放行,而不是一股脑全放进去堵死。
第 3 步:切信元(Cell)
NCP-1 把这个 9000 字节的大包,切成 N 个固定大小的小信元(比如每个 256 字节,切成约 36 个信元)。
第 4 步:均匀喷洒(Spray)—— 核心中的核心
NCP-1 把这 36 个信元,平均撒到 4 个 NCF 上:
信元1 → NCF-1
信元2 → NCF-2
信元3 → NCF-3
信元4 → NCF-4
信元5 → NCF-1
信元6 → NCF-2
... 逐个轮流,绝对均匀
结果:4 条上联链路、4 个 NCF 的负载几乎完全相等(各扛 1/4)。根本不存在"哈希碰撞导致某条路堵死"的可能,因为根本就不哈希、不选路,而是雨露均沾全都用上。
第 5 步:NCF 转发
每个 NCF 收到分给自己的信元,转发给出口 NCP-9。NCF 只干"转发信元"这一件事,简单纯粹。
第 6 步:出口 NCP 重排序 + 重组
信元们走了 4 条不同的路,到达 NCP-9 的时间有先有后(乱序到达)。NCP-9 负责:
- 把所有信元按原始顺序重新排好(每个信元有序号)。
- 重组成完整的 9000 字节数据包。
- 发给服务器 B。
你之前问的"重排序会不会拖慢速度"——不会。重排序是交换芯片硬件做的,纳秒级,且 NCP 有专门的重组缓冲区,速度跟得上线速。这是 DDC 芯片(如博通 Jericho/Ramon)设计时就解决好的硬件能力。
五、案例对比:万卡 AllReduce,DDC vs 传统 Spine-Leaf
场景:8000 张 GPU 的集群,正在训练大模型。某一刻所有 GPU 同时做 AllReduce,瞬间在网络里产生了 2000 条大象流,每条流要传 5GB 梯度。每对 Leaf/NCP 之间都有 4 条上行路径。
用传统 Spine-Leaf + ECMP
2000 条流,靠哈希分到 4 条路径上
理想情况应该每条路 500 条流,但哈希会碰撞:
路径1(Spine1):实际分到 780 条流 → 严重拥塞,队列溢出 → 丢包
路径2(Spine2):实际分到 310 条流 → 空闲
路径3(Spine3):实际分到 620 条流 → 拥塞
路径4(Spine4):实际分到 290 条流 → 空闲
后果链条:
- 路径1、3 拥塞 → 队列满 → 触发 PFC 暂停帧 / 丢包 → 重传
- 拥塞甚至向上游扩散(PFC 风暴),波及其他流量
- AllReduce 必须等最慢的那条流完成才算结束(木桶效应)
- 实测有效带宽利用率 ~60%,AllReduce 完成时间 150ms,且抖动剧烈(每次都不一样,因为哈希结果随机)
- 8000 张 GPU 全在等这一下,整体训练吞吐被拖累
用 DDC(信元喷洒)
2000 条流,每条流都被切成信元,均匀喷洒到 4 条路径
路径1:恰好 25.0% 负载
路径2:恰好 25.0% 负载
路径3:恰好 25.0% 负载
路径4:恰好 25.0% 负载
(硬件保证,没有碰撞的可能)
后果链条:
- 4 条路完美均衡,没有任何一条拥塞 → 零丢包,零 PFC 暂停
- 配合 VOQ + credit,出口不会被挤爆
- AllReduce 完成时间 ~95ms,而且极其稳定(每次都一样,可预测)
- 有效带宽利用率逼近 95%+
价值量化
| 指标 | 传统 Spine-Leaf + ECMP | 字节 DDC | 价值 |
|---|---|---|---|
| 链路负载均衡 | 290~780 条流不等 | 各 25%,完全均匀 | 消灭哈希碰撞 |
| 带宽利用率 | ~60% | ~95% | 同样的网卡多跑 50% 有效流量 |
| 丢包/PFC | 频繁,会扩散 | 零丢包 | 无重传,无拥塞风暴 |
| AllReduce 时延 | 150ms 且抖动大 | 95ms 且稳定 | 时延降 ~37%,且可预测 |
| 对训练的意义 | 长尾拖慢整个集群 | 无长尾,吞吐稳定 | 万卡训练 MFU 更高、更省钱 |
为什么"可预测"比"快"更值钱
这是 AIDC 里特别反直觉、但极其重要的一点,单独强调:
万卡 AllReduce 是同步操作——所有 GPU 必须等最慢的那条通信完成,才能进入下一轮计算。ECMP 的哈希是随机的,意味着每一轮 AllReduce 的最慢链路都不一样、时延都在跳,整个集群被这种抖动持续拖累,且无法优化(你不知道下次哪条路会堵)。
DDC 的信元喷洒让每条链路恒定 25% 负载,每一轮 AllReduce 的耗时几乎完全一致。对于一个要跑几周、做几百万次 AllReduce 的训练任务来说,"稳定无长尾"带来的累积收益,远比"峰值快一点"重要。这就是字节愿意为 DDC 重新设计网络硬件的根本动因。
一、网络技术
1. DDC(分布式解耦机箱)——核心招牌
先理解传统方案的问题:
数据中心要做大规模无阻塞网络,传统有两条路:
- 框式交换机(机箱式):一个大铁柜里插满"线卡(处理端口)“和"网板(内部交换)”,背板带宽超高、负载完美均衡,但单点故障影响大、扩展受机箱槽位限制、功耗集中难散热。
- 盒式交换机 + Spine-Leaf:用很多小盒子堆 Clos 网络,灵活可扩展,但依赖 ECMP 哈希选路——这就是星脉要解决的那个"哈希碰撞导致负载不均"的老毛病。
DDC 的做法:把框式交换机"拆开摆"
DDC(Distributed Disaggregated Chassis)把一台大机箱交换机物理上拆成多个独立的小盒子,用线缆连起来,但逻辑上仍像一台大交换机一样工作:
| 组件 | 全称 | 角色 | 对应机箱里的 |
|---|---|---|---|
| NCP | Network Cloud Packet processing | 接入盒子,连服务器/网卡 | 线卡 |
| NCF | Network Cloud Fabric | 中间交换盒子,连 NCP | 网板 |
关键技术:信元喷洒(Cell Spraying)+ VOQ
这是 DDC 和普通以太网最本质的区别,也是它的杀手锏:
传统以太网(包级转发 + ECMP):
一个数据包 → 哈希 → 固定走某一条链路
问题:哈希碰撞,4 条链路可能只用 1 条 ❌
DDC(信元级转发 + 喷洒):
一个数据包 → 切成很多小信元(cell,固定大小如几百字节)
→ 均匀喷洒到所有 NCF 的所有上联链路上
→ 出口 NCP 重新排序、重组成完整包
结果:每条链路负载几乎完全相等 ✅
为什么这更强?
- 星脉的 flowlet 是"以微流为单位"调度,粒度还是比较粗,遇到极端流量仍可能不均;
- DDC 把包切成信元后逐信元均匀喷洒,相当于把负载均衡做到了硬件转发的最细粒度,理论上能做到接近 100% 的链路利用率,而且是交换芯片硬件自动完成,不依赖软件实时决策。
配套机制:
- VOQ(Virtual Output Queue,虚拟输出队列):每个入口为每个出口单独排队,配合信用(credit)机制,发送前先确认对端有空间才发,从根本上避免内部拥塞和丢包,实现真正的无损。
- 端到端调度:整个 DDC 内部像一台机箱一样有统一的调度,而不是各交换机各自为政。
运行位置:
- 信元喷洒、VOQ、重排序 → 跑在 NCP/NCF 的交换芯片里(业界 DDC 多基于博通 Jericho/Ramon 这类 DNX 系列芯片,字节是该路线的重要推动者和大规模落地方)
- 整体编排 → 网络管控系统
价值举例:
场景:万卡 GPU 集群做 AllReduce,瞬间产生数千条大象流。
- 传统 Spine-Leaf + ECMP:哈希碰撞导致部分链路 95% 拥塞、部分链路 30% 空闲,整体有效带宽只有 ~60%,且拥塞链路触发丢包重传,AllReduce 尾时延飙升。
- DDC 信元喷洒:所有链路负载均匀分布在 90%+,无哈希碰撞,零丢包,有效带宽逼近线速,AllReduce 完成时间稳定可预测。
对训练而言,"可预测、无长尾"比"峰值快"更重要——因为整个集群要等最慢的那张卡。
2. 全自研智算网络的其他能力
在 DDC 架构之上,字节还自研了一整套 AI 网络优化能力(很多在其 MegaScale 等论文里有披露):
| 功能 | 运行位置 | 作用 | 价值举例 |
|---|---|---|---|
| 多轨道网络(Rail-optimized) | 网络拓扑设计 | 每台服务器的 N 张网卡分别接入 N 个独立的网络平面(轨道),同号 GPU 走同一轨道 | 8 卡服务器的 GPU0 都连"轨道0",跨机通信路径更短、冲突更少,AllReduce 效率提升 |
| 自研拥塞控制 / 流控 | 网卡 + 交换机 | 替代标准 DCQCN,针对 AI 流量调参 | RoCE 场景下减少 PFC 暂停帧,避免拥塞扩散和死锁 |
| 网络监控与诊断系统 | 全网 + 控制节点 | 实时采集链路状态、快速定位故障网卡/链路 | 万卡训练中某张网卡静默丢包,系统秒级定位,而非靠人工排查几小时 |
| 故障自愈 | 控制平面 + 交换机 | 检测到链路/盒子故障自动绕行 | 某个 NCF 盒子故障,流量自动重新喷洒到其他盒子,训练不中断 |
二、硬件技术
字节的硬件自研,核心是围绕"降本"和"为自家 AI 负载定制"。需要说明:芯片层面的具体进展字节官方披露有限,以下区分"已较明确的"和"行业报道层面的"。
| 硬件 | 类型 | 功能/作用 | 价值举例 |
|---|---|---|---|
| NCP / NCF 盒子 | DDC 网络硬件 | 解耦的接入/交换盒子,承载信元喷洒 | 用通用商用交换芯片堆出超大规模无阻塞网络,比买框式交换机便宜很多,且单盒故障影响小 |
| 自研服务器 / 整机 | 计算硬件 | 针对 GPU 训练优化的整机设计(供电、散热、网卡布局) | 优化 GPU-网卡的 PCIe 亲和性,提升机内到机间的通信效率 |
| 自研网卡 / 高性能 RDMA 网卡 | 网络硬件 | 卸载 RoCE、执行自研拥塞控制 | 把网络协议处理从 CPU 卸载,CPU 更专注喂数据给 GPU |
| 自研 AI 加速芯片(行业报道层面) | 计算芯片 | 据多方报道字节在推进自研推理/训练芯片,用于降低对外部 GPU 的依赖 | 若落地,可在推理等场景替代部分通用 GPU,降低单位算力成本——但具体规格、是否量产请以官方为准,我无法核实最新进展 |
这里要诚实说明:字节的自研芯片处于持续演进中,且涉及供应链和出口管制等敏感因素,公开信息少且变化快。
三、模型相关平台
这块分两层:底层训练系统(自用为主) 和 上层对外平台(火山引擎商业化)。
1. MegaScale —— 大规模训练系统
这是字节最有代表性的 AI 系统工作(有公开论文,主题就是"把 LLM 训练扩展到一万张以上 GPU")。它是全栈协同的系统,不是单点优化。
| 功能模块 | 运行位置 | 作用 | 价值举例 |
|---|---|---|---|
| 算法-系统协同设计 | 训练框架层 | 并行策略(数据/张量/流水线/序列并行)与通信、显存协同优化 | 万卡训练 GPT 类模型,MFU(算力有效利用率)做到 50%+,远高于朴素实现的 30% 左右 |
| 通信优化 | 框架 + NCCL/自研通信库 | 重叠计算与通信、优化集合通信 | 梯度通信和反向计算并行进行,“通信时间被算力掩盖”,几乎不额外占用墙钟时间 |
| 故障容错(关键) | 训练框架 + 监控系统 | 自动 checkpoint、故障检测、快速恢复 | 万卡训练平均几小时就会有硬件故障,系统自动检测掉队/故障节点、剔除并从最近 checkpoint 快速恢复,把"故障停机损失"从几小时压到几分钟 |
| 诊断工具链 | 独立监控平台 | 性能剖析、慢节点定位、网络/计算瓶颈分析 | 某次训练吞吐莫名下降 10%,工具定位到是某几张网卡降速,而非靠人肉猜 |
| 数据流水线 | 数据预处理集群 | 高吞吐喂数据,避免 GPU 等数据 | 保证上万张 GPU 不会因为数据加载慢而"饿着"空转 |
MegaScale 的核心价值一句话:在万卡规模下,真正的敌人不是"算得快不快",而是"稳不稳、利用率高不高、故障恢复快不快"。MegaScale 解决的就是这个"规模化"难题。
2. BytePS —— 通信框架(早期代表作)
字节较早开源的分布式训练通信框架,融合了 Parameter Server 和 AllReduce 两种范式的优点,在异构带宽环境下比纯 AllReduce 更高效。运行在训练节点上,作用是优化梯度同步通信。现在大模型时代更多用 MegaScale 体系,但 BytePS 是它的技术积累来源之一。
3. 火山引擎机器学习平台(veMLP)—— 对外商业化
把上面这套自用能力包装成云服务卖给外部客户。
| 功能 | 运行位置 | 作用 | 价值举例 |
|---|---|---|---|
| veMLP(机器学习平台) | 火山引擎云 | 提供训练/推理/微调的全流程托管 | 外部客户不用自建万卡集群,直接在平台上拉起分布式训练任务 |
| GPU 资源池 + 弹性调度 | 云调度层 | 多租户共享 GPU、潮汐调度 | 白天推理、夜间训练,错峰复用 GPU,提升整体利用率 |
| veRL / 强化学习框架 | 平台框架层 | 支持大模型 RLHF 等训练 | 客户做模型对齐时直接调用,无需自己搭 RL 基础设施 |
| 推理加速引擎 | 推理服务层 | KV Cache 优化、量化、批处理 | 大模型推理吞吐提升、单 token 成本下降 |
4. 豆包(Doubao)模型
字节自研的大模型系列,对外通过火山引擎提供 API,对内支撑各类产品。它是上述所有基础设施(DDC 网络 + 自研硬件 + MegaScale 训练系统)最终要服务的"目标负载"——所有底层优化都是为了又快又省地训练和推理这类模型。
四、整体串起来:一次训练任务怎么用到这些
[模型层] 要训练豆包大模型
↓
[平台层] MegaScale 制定并行策略、编排万卡任务、负责容错和监控
↓
[通信层] 集合通信库决定 AllReduce 怎么传(逻辑编排,类似 NCCL 的角色)
↓
[网络层] DDC 用信元喷洒把通信流量均匀打散到全网链路(物理传输)
↓
[硬件层] 自研网卡卸载 RoCE,NCP/NCF 盒子硬件转发,(潜在的)自研芯片提供算力
五、星脉 vs DDC:两条技术路线的取舍
| 维度 | 腾讯星脉(端侧软件智能) | 字节 DDC(网络架构革新) |
|---|---|---|
| 核心思路 | 标准盒式交换机 + 软件/网卡侧 flowlet 自适应选路 | 解耦机箱 + 硬件信元喷洒 |
| 负载均衡粒度 | flowlet(微流级) | cell(信元级,更细) |
| 均衡效果 | 很好,极端情况仍可能不均 | 接近完美,硬件保证 |
| 对交换机要求 | 需可编程/支持 INT 的交换机 | 需 DNX 系列(如博通 Jericho/Ramon)芯片 |
| 改造成本 | 兼容现有以太网,改造小 | 需要专门的 DDC 盒子和布线 |
| 灵活性/扩展 | 高,软件可迭代 | 单个 DDC 域规模有上限,但域内表现极稳 |
| 故障域 | 标准 | 解耦后单盒故障影响小 |
两者没有绝对优劣,是"软件定义"和"硬件定义"两种哲学,业界大厂也都在两条路上各有探索(包括直接上 InfiniBand 的第三条路)。
三、 阿里云:可编程网络与“百炼”大模型平台
阿里云(百炼背后的磐久网络): 走的是“高性能无损以太网(RoCE V2)”路线。利用自研白盒交换机和可编程芯片,优化网络拥塞。
这种架构相对通用,对各种主流的 AI 服务器(如标准 8 卡 HGX 平台)兼容性极好。
阿里云在智算中心的布局是“左手抓底层高性能网络,右手抓上层 AI 应用平台”。
1. 底层网络技术:磐久(HPN)与可编程交换机
- 磐久智算网络架构(HPN 7.0): 阿里云利用自研的白盒交换机,构建了超大规模的无损以太网驱动智算中心。
- 自研高性能网卡(Solar-RDMA): 阿里云自研的端高性能网络协议,降低主机 CPU 的网络开销,支持超大规模的 GPU 集群低延迟并行计算。
2. 上层平台:阿里云“百炼”平台(Bailian Platform)
这是领导特别点名让你看的平台。作为运维和建设方,你要明白“百炼”是智算中心能力的“出口”。
- 定位: 一站式大模型应用开发平台(MaaS,Model as a Service)。
- 核心内容:
- 多模型托管: 平台不仅集成了阿里自研的通义千问(Tongyi Qianwen)系列大模型,还托管了大量主流的开源大模型(如 Llama、Mistral、智谱 GLM 等)。
- 企业级工具链: 提供了 RAG(检索增强生成/知识库对接)、微调(Fine-tuning)、Prompt 工程、Agent(智能体)编排等全套工具。
- NL2SQL 能力(如 XiYan GBI): 百炼平台深度优化了自然语言转数据查询的能力,让企业用户可以通过大模型直接用大白话查询复杂的数据库。
运维/建设看点: 为什么建 AIDC?就是为了支撑像“百炼”这样的平台稳定运行。百炼平台上的海量微调和推理任务,会直接转化为智算中心底层的网络流量与算力负载。
⭐️
阿里云百炼:帮你快速地将 AI 能力组装到自己的业务中。
1. 提供阿里的各种模型接口和开源大模型,还支持用户上传自己的模型
2. 大模型瞎猜幻觉,平台提供 RAG 功能,用户能上传自己的文件,存入阿里的向量数据库
3. 提供大模型微调,用户只需要上传“输入-输出”的 prompt 对齐数据集,即可一键启动微调训练。
4. 支持开发agent,不仅能聊天还能行动,大模型调用外部工具 API 来扩展能力。(自动看天气,定行程,回邮件等)
5. Monitoring, 能看到 token 消耗和延迟(看清性能与钱的去向)。带有内容安全过滤网(黄、恐、政等,),服务不被封
百炼平台: 绝对核心是阿里自研的 通义千问(Qwen)。通义千问在开源届名气极大(Qwen-Max/72B 等在全球开源榜单名列前茅),
国内大量开发者是冲着 Qwen 的高质量开源和打磨去用百炼的。主要 ToB
火山引擎: 绝对核心是 豆包大模型(Doubao)。豆包的核心优势不是“开源生态”,而是“极致的性价比”和“字节内部超大规模场景
的验证”(抖音、剪映、飞书内部全在用)。 ToC
你这几个问题问得很到位,尤其是最后两个——我前面确实把阿里 HPN 的优势讲偏了,它的强项根本不是负载均衡和无限扩展,这点我先认下来,后面专门纠正。咱们逐个拆。
一、阿里"比 RoCE v2 高明"——先纠正一个概念错位
这里有个关键误解要先理清:HPN 和 RoCE v2 不是同一层的东西,不能直接比"谁高明"。
- RoCE v2 是一个传输协议——它规定"RDMA 数据怎么封装进以太网包传输"(RDMA over UDP/IP/Ethernet)。它管的是单条连接怎么收发。
- HPN 是一个网络架构——它规定"整个数据中心的交换机怎么连、怎么布、怎么保证可靠"。它管的是几万台机器怎么组网。
HPN 本身就是跑在 RoCE(或类 RoCE 的 RDMA)之上的。所以正确的问法是两个:
- HPN 这套架构,比"随便拿 RoCE v2 裸部署一个集群"高明在哪?
- 阿里的 eRDMA 这个传输协议,比标准 RoCE v2 高明在哪?
先说 RoCE v2 裸用的几个致命毛病
标准 RoCE v2 要正常工作,有个硬性前提:网络必须无损(不能丢包)。因为它原始的重传机制很笨(Go-back-N,丢一个包要从头重传一大串)。为了不丢包,就得开 PFC(Priority Flow Control,优先级流控)——下游快满了就发"暂停帧"让上游别发了。
PFC 这东西在小规模能用,一上大规模就出三个大问题:
第一,队头阻塞(HoL blocking):PFC 是按端口暂停的,一暂停,这个端口上所有流量(包括没拥塞的)全被卡住,殃及无辜。
第二,PFC 风暴 / 死锁:暂停帧会一级一级往上游传播,A 暂停 B、B 暂停 C……在有环路的拓扑里甚至会形成死锁,整片网络僵住。这是 RoCE 大规模部署最头疼的事。
第三,ECMP 哈希碰撞:就是前面反复讲的,大模型流少流大,哈希一撞就堵。
HPN 架构对这些的应对:用双平面 + 单芯片 + 减少跳数 + 控制路径数量的架构设计,从源头减少拥塞发生的概率和故障的影响范围,让 PFC 尽量少触发、触发了影响也小。这是"架构层面"的改善。
再说 eRDMA 比 RoCE v2 高明在哪(这是协议层面的真改进)
eRDMA 最核心的突破,一句话:
它不再强依赖"无损网络",能在会丢包的普通网络上跑 RDMA。
标准 RoCE v2 离不开 PFC(怕丢包),eRDMA 自己实现了一套更聪明的可靠传输和拥塞控制(类似选择性重传,丢哪个补哪个,而不是从头来),所以它容忍丢包。这带来三个实打实的好处:
- 摆脱 PFC 的枷锁:不靠 PFC 也能跑,自然就没有 PFC 风暴和死锁的风险,大规模部署稳得多。
- 能跑在普通 VPC 云网络上:标准 RoCE 要专门的无损物理网络,娇贵又难弹性扩缩;eRDMA 在普通云网络上就能用,弹性(这就是 e = Elastic 的含义)。
- 应用几乎不用改:兼容标准 RDMA 编程接口,原来用 RDMA 的程序拿过来就能用。
所以"高明"分两层:eRDMA 在协议层把 RoCE v2 "怕丢包、靠 PFC、难弹性"的命门解决了;HPN 在架构层让大规模组网更可靠。
二、eRDMA 到底是什么——从最基础讲
你觉得抽象,是因为还没有 RDMA 的底子。咱们从"普通网络传输"和"RDMA"的区别讲起。
普通网络传输(TCP)怎么走
A 机器要把一块数据发给 B 机器:
A 的应用 → 拷贝到 A 的内核缓冲区 → A 的 CPU 跑 TCP/IP 协议栈打包
→ 网卡发出 → B 网卡收到 → B 的 CPU 跑协议栈解包
→ 拷贝到 B 的内核缓冲区 → 再拷贝到 B 的应用
问题:全程要 CPU 参与,还要多次内存拷贝。数据量小没事,传 400Gbps 的训练梯度,CPU 直接被协议处理累死,时延也高。
RDMA 怎么走(Remote Direct Memory Access,远程直接内存访问)
RDMA 的精髓就在名字里——直接访问远程内存,绕过 CPU 和内核:
A 的网卡 直接从 A 的应用内存读数据 → 网络 → B 的网卡 直接写进 B 的应用内存
(CPU 全程不参与,零拷贝)
好处:超低时延、超高带宽、几乎不占用 CPU。这就是为什么 AI 训练必须用 RDMA——GPU 间海量梯度交换,承受不起 CPU 处理的开销。
RoCE v2 就是"在以太网上实现 RDMA"的一种方式(另一种是 InfiniBand)。
那 eRDMA 是什么
eRDMA 就是阿里自研的一套 RDMA 实现,它保留了 RDMA"绕过 CPU、零拷贝、低时延"的全部好处,又解决了标准 RoCE v2"怕丢包、靠 PFC、难弹性"的毛病(上一节讲的)。它本质是一个跑在网卡/CIPU 硬件里的传输引擎。
用一句类比:RDMA 是"两栋楼之间架了条直达传送带,绕过所有前台";标准 RoCE v2 这条传送带很怕震动(丢包),得给整栋楼装减震(PFC),代价大;eRDMA 这条传送带自带智能纠错,地面普通点也能稳定跑,还能随时加长(弹性)。
三、eRDMA、CIPU、网卡是什么关系?"卸载"是什么意思?
这三者是"技能、执行者、身体部位"的关系,理清就不抽象了。
三者关系
CIPU(一张插在服务器上的硬件卡 = 阿里的 DPU)
┌─────────────────────────────────────────┐
│ 内置 ARM 处理核心 + 各种硬件加速引擎 │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ 网卡功能 │ │ eRDMA 传输引擎 │ │
│ │ (收发数据包) │ │ (跑 RDMA 协议) │ │
│ └──────────────┘ └──────────────────┘ │
│ 还能做:存储IO、加解密、虚拟化卸载... │
└─────────────────────────────────────────┘
- 网卡:是 CIPU 里的一个功能模块——负责物理收发数据包。在阿里这套里,传统"独立网卡"的活被 CIPU 吸收了。
- CIPU:是那张物理硬件卡(DPU),是"执行者"。网卡功能、eRDMA、存储加速等都集成在它身上。
- eRDMA:是跑在 CIPU 硬件里的一套传输协议/技能。它不是一个独立硬件,而是 CIPU 实现的一种能力。
打个比方:CIPU 是一个全能助理(人),网卡是他"收发邮件"这项基本职责,eRDMA 是他掌握的一门"高速速记法"技能。 技能(eRDMA)靠人(CIPU)来施展,收发邮件(网卡)是他众多工作中的一项。
"卸载(offload)"是什么意思——这是 DPU/CIPU 存在的全部理由
"卸载"就是:把本来该 CPU 干的杂活,搬给专门的硬件(CIPU)去干,把 CPU 解放出来专心干正事。
具体看一个场景,你立刻就懂价值:
场景:一台 AI 服务器,8 张 GPU,网络吞吐 3.2Tbps。
不卸载(CPU 自己处理网络):CPU 要跑 TCP/IP 协议栈、处理网络中断、做虚拟网络转发、加解密……这些活极其吃 CPU。实测下来,光处理网络可能就吃掉 十几个 CPU 核、30%~50% 的 CPU 算力。结果 CPU 忙着搬网络包,没精力及时给 GPU 喂数据,GPU 经常空转等数据,几十万一张的 GPU 利用率上不去。
卸载到 CIPU:网络协议、虚拟网络、存储、加解密这些全交给 CIPU 硬件干。CPU 100% 解放出来,专心给 GPU 准备和投喂数据。 GPU 不再饿肚子,训练吞吐直接提升。
所以"卸载网络"的本质价值就是:别让昂贵的 CPU/GPU 算力浪费在搬数据这种杂活上。 CIPU 就是那个专门搬数据的"苦力专用芯片",而且它搬得比 CPU 又快又省电。
四、双平面:不是"主备一冷一热",而是"两条都在跑"
你这个质疑非常关键,而且暴露了我前面没讲清楚的地方。纠正三个点:
误区一:“主备”——错,是 active-active(双活)
它不是"一条主用、一条闲着备用"。正常情况下,两个平面同时在传数据,都在干活,没有谁闲着。
具体到 HPN 的设计:每张 GPU 配一个网卡,网卡有两个端口(比如 2×200G),分别接到两台不同的 ToR 交换机(平面1、平面2)。正常时两个端口都在用,合起来 400G 全程在跑。所以不存在"花一倍钱买个闲置备份"。
误区二:“加一倍的钱”——多花钱是真,但不是白花,且没翻倍
诚实说:双平面确实比单平面多用了交换机和线缆(多一套 ToR、多一倍上联线),成本是上去了。但要看清楚两点:
- 这些钱没浪费——两个平面平时都在传数据,不是冷备。
- 换来的是故障容错。在万卡训练里,这个钱花得值,下面这条算给你看。
误区三:“一条断了,另一条扛双倍压力会崩”——错,是"降速不停机"
这是最妙的地方,跟你直觉相反。假设平面1的 ToR 挂了:
正常时:GPU → 200G 走 ToR-A(平面1)
→ 200G 走 ToR-B(平面2) 合计 400G
ToR-A 挂掉后:
GPU → ✗ 平面1 断了
→ 200G 走 ToR-B(平面2) 只剩 200G
注意看:ToR-B 并没有被迫扛双倍流量。这张 GPU 原来给 ToR-B 就是 200G,现在还是 200G——ToR-B 的负担没变。变的是这张 GPU 自己从 400G 掉到了 200G,也就是带宽减半、速度变慢,但训练继续跑,不中断。
为什么 ToR-B 不会被打爆?因为 GPU 到 ToR-B 的物理链路本来就只有 200G,它塞不进去原本走 ToR-A 的那 200G,所以那部分流量就是暂时损失掉了(表现为这张卡变慢),而不是全压给 ToR-B。
对比单平面的灾难性后果,价值就出来了:
| 单 ToR(传统) | 双 ToR(HPN) | |
|---|---|---|
| ToR 故障时 | 整机架 GPU 全部失联 | 受影响 GPU 降速到一半,继续跑 |
| 对训练的影响 | 任务崩溃,回滚到 checkpoint,损失几十分钟~几小时 | 任务不中断,只是慢一点 |
| 维修 | 紧急抢修,业务停摆 | 从容下线维修,业务无感 |
万卡集群每隔几小时就有硬件故障,"降速不停机"和"直接崩溃回滚"之间的累积差距是巨大的——这就是双平面那笔钱买到的东西。它买的不是带宽,是可靠性。
五、“千卡接入一个交换机?”——是我表述不清,纠正
不是一个交换机。 一台 51.2T 单芯片交换机就算端口再多(比如 128 个 400G 口),也插不下 1000 张 GPU。
我说的"单段容纳约 1K GPU",这个"段(segment)"指的是一层网络里的一组交换机(多台 ToR + 多台汇聚交换机组成的一个小 Clos),而不是单台设备。准确的图是这样:
一个"段"内部(连接约 1024 张 GPU)
汇聚层: [Agg1] [Agg2] [Agg3] [Agg4] ...
╱ │ ╲ ╱ │ ╲ ← 每个 ToR 都连到每个 Agg
接入层: [ToR1] [ToR2] [ToR3] ... [ToRn]
╱││╲
GPU GPU GPU ...(合计约 1024 张)
"单芯片 + 高端口数(high radix)"的意义在于:因为每台交换机端口多,所以用很少的交换机层级、很少的跳数,就能把 1024 张 GPU 兜在一个段里,段内任意两张卡通信只需经过 1~2 跳。跳数少 = 时延低 = 故障点少。
再往上用两层架构把多个"段"连起来,一个 Pod 能到约 15K(一万五千)张 GPU 规模。所以是"多台交换机组成的一个低跳数的段",不是一台交换机。这点我前面没说清楚,抱歉。
六、你的核心质疑:阿里没体现出可扩展和负载均衡的优势
你说得对,我前面的表述误导了你。这里我必须诚实纠正:负载均衡和无限扩展,恰恰不是 HPN 的卖点,甚至是它主动做的取舍。
让我把话挑明:
负载均衡:HPN 不如字节 DDC,这是它主动放弃的
字节 DDC 用信元喷洒,能做到接近完美的负载均衡。阿里明知道这条路,但故意没选,因为信元喷洒需要多芯片机箱式设备,而阿里认为多芯片设备可靠性差。
所以 HPN 在负载均衡上的态度是:“我不追求完美均衡,我用架构手段把问题控制在可接受范围就行”——具体靠减少路径数量、双平面分流、把流量按类型(TP/DP)合理安排到不同层级,来降低哈希碰撞的概率和影响,而不是像 DDC 那样从根上消灭它。
所以如果纯比负载均衡,DDC 赢,HPN 不是这条赛道的选手。 我前面把它列在负载均衡那栏是误导,向你道歉。
可扩展性:15K 一个 Pod,够用但不是"无限"
HPN 一个 Pod 约 15K GPU,对当前主流训练任务够用,但它没有把"无限扩展"当作首要目标。InfiniBand 或某些方案在超大规模上可能走得更远。HPN 的规模设计是"满足大模型训练的实际需求即可",不是炫耀扩展极限。
那 HPN 到底强在哪?——是这两个,前面我没突出
HPN 真正的、被同行(SIGCOMM 论文)认可的优势是另外两个:
第一,可靠性(这是它的灵魂)。双平面双 ToR + 坚持单芯片交换机,目标就是"万卡训练几周不因网络故障中断"。它赌的是:在大模型训练里,一次中断的代价 >> 一点点性能损失。所以它宁可牺牲一点负载均衡的极致,也要换可靠性。
第二,低时延 + 可运维。高端口单芯片让跳数最少、时延最低;单芯片结构简单让排障和运维更省心。
所以正确的画像是这样:
| 这家方案 | 最强的是 | 主动牺牲的是 |
|---|---|---|
| 字节 DDC | 负载均衡(信元喷洒做到极致) | 用了多芯片解耦设备,结构更复杂 |
| 阿里 HPN | 可靠性 + 低时延(双平面 + 单芯片) | 放弃了极致负载均衡,规模也只求够用 |
你的直觉完全正确——HPN 拿出来的根本不是负载均衡和扩展性的肌肉,而是可靠性的肌肉。这两家恰好在"可靠性"和"负载均衡"这对矛盾上,赌了相反的方向。这才是这个对比真正有价值的地方,也是我前面没讲透、让你产生困惑的地方。
一、先把 ECN、DCQCN、PFC 三者的分工讲清
它们不是互相替代,而是两道防线,一快一慢,配合工作。
DCQCN(基于 ECN 的拥塞控制)= 慢车道的"主动降速"
DCQCN = ECN + 速率控制,工作流程是这样的:
1. 交换机队列开始堆积 → 交换机给经过的包打上 ECN 标记
2. 这个被标记的包继续走到接收端
3. 接收端发现标记 → 回送一个 CNP(拥塞通知包)给发送端
4. 发送端收到 CNP → 主动降低发送速率
PFC = 快车道的"紧急刹车"
PFC 是链路级、逐跳的:下游交换机缓冲快满了,立刻向直接相连的上游发"暂停帧",让上游马上停发。它不管端到端,就管相邻两跳之间别把缓冲撑爆。
二、核心矛盾:为什么有了 DCQCN,还是甩不掉 PFC?
答案就一句话:DCQCN 太慢,它有一个"反应时间窗口",在这个窗口里它来不及救场,缓冲就已经溢出丢包了。
我们把 DCQCN 的反应链条拆开看,它要走完这么一圈才能降速:
队列堆积 → 打 ECN 标记 → 包走到接收端 → 接收端发 CNP
→ CNP 走回发送端 → 发送端才开始降速
└────────── 这一整圈 = 一个 RTT(往返时延)──────────┘
问题来了:大模型训练有个要命的流量模式叫 incast(多打一)+ micro-burst(微突发):
AllReduce 那一刻,几十甚至上百张 GPU 同时向同一个出口猛灌 400G 的数据。
这种瞬时突发,在一个 RTT 之内就能把交换机缓冲塞爆。而 DCQCN 还在"打标记→回 CNP→降速"的路上磨蹭,等它把速度降下来,包早就丢了。
时间轴:
T0: 100 张 GPU 同时开始猛发 → 缓冲瞬间暴涨
T0+几微秒: 缓冲溢出 → 开始丢包 ← DCQCN 还没反应过来!
T0+1个RTT: 发送端才收到 CNP,开始降速 ← 晚了,已经丢了一堆
这就是为什么需要 PFC:在 DCQCN 还没来得及反应的那个窗口里,PFC 作为本地的、零延迟的紧急刹车,立刻喊停上游,保住缓冲不溢出、不丢包。
所以正确的图景是:DCQCN 管常态、管大局(主防线),PFC 管瞬时、管兜底(最后一道保险)。两者缺一不可,DCQCN 替代不了 PFC。
三、那为什么 RoCE "非要"零丢包?根子在传输层
到这里你可能会问:丢几个包补回来不就行了,至于为了零丢包搞得这么复杂吗?
至于。因为标准 RoCE 的"补包机制"烂得离谱。 这才是 RoCE 死磕无损网络的真正根源。
标准 RoCE(沿用 InfiniBand 的传输语义)用的是 Go-back-N(回退 N) 重传:
发送:包1 包2 包3 包4 包5 包6 ...
↑ 假设 包3 丢了
后果:接收端从包3 开始后面全部丢弃不要
发送端必须从 包3 开始,把 包3、4、5、6... 全部重发一遍
丢一个包,要把它后面已经成功到达的一大串全部作废重传。 在 400G 的速率下,一个 RTT 里"在途"的数据量巨大,丢一个包触发的重传量是灾难性的,性能直接雪崩。
所以对标准 RoCE 来说,丢包的代价大到不可接受,于是它的策略就是:不惜一切代价别丢包——靠 DCQCN 防持续拥塞 + PFC 兜底瞬时突发,硬生生把网络维持成"无损"。这就是"RoCE 必须依赖无损网络"的真正原因:不是 ECN 没用,而是它的传输层太脆弱,丢不起包,所以必须用 PFC 把零丢包这条底线焊死。
而 PFC 一旦大规模用起来,又带来队头阻塞、PFC 风暴、死锁这些新麻烦(前面讲过)。这就是标准 RoCE 大规模部署的死结:传输层脆 → 必须零丢包 → 必须靠 PFC → PFC 引入新灾难。
四、eRDMA 为什么就能"允许丢包"?因为它把传输层换了
eRDMA 的破局点,不在拥塞控制(ECN 那一层),而在最底下的传输层——它把"补包机制"彻底改好了。
eRDMA 实现了选择性重传(Selective Repeat / 类似 TCP SACK)+ 乱序接收:
发送:包1 包2 包3 包4 包5 包6
↑ 包3 丢了
eRDMA 的处理:
- 包4 5 6 照常接收、缓存好,不作废(接受乱序到达)
- 只把丢掉的 包3 单独补发一次
- 包3 补到后,和 4 5 6 一起按序交付
因果链彻底反转了:
因为 eRDMA 丢包代价小(只补一个)→ 所以它丢得起包 → 所以它不需要靠 PFC 死保零丢包 → 所以它摆脱了 PFC 的枷锁(没有队头阻塞、没有 PFC 风暴、没有死锁)→ 所以它能在普通的、会丢包的 VPC 云网络上大规模、弹性地跑。
这就是 e(Elastic,弹性)的由来——正是因为它不挑网络、丢得起包,才能在普通云网络上弹性扩缩,而不用专门铺一张娇贵的无损物理网络。
eRDMA 当然也有自己的拥塞控制(而且可以做得比标准 DCQCN 更聪明),但它和标准 RoCE 最本质的分野是:标准 RoCE 把宝全押在"绝不丢包"上,eRDMA 把宝押在"丢了也能高效补回来"上。
一、为什么 InfiniBand/RoCE 当年宁可用"笨"的 Go-back-N?
不是设计者想不到选择性重传——这个机制 TCP 早就在用了,原理人尽皆知。真正的原因是:在当年的硬件条件和设计目标下,选择性重传的"代价"承受不起,而 Go-back-N 的"代价"恰好可以靠另一个手段抹掉。 拆成几个具体原因:
原因一:选择性重传要"记账",而记账要内存——网卡当年最缺的就是内存
这是最核心的原因。对比一下两种机制对硬件的要求:
Go-back-N 的接收端有多省:
接收端只需要记住一个数字:我按顺序收到哪了?(一个期望序号)
收到的包:序号对 → 收下;序号不对 → 直接扔掉,啥也不记
接收端几乎是无状态的,只维护一个"下一个该收的序号"。逻辑极简,几乎不耗内存。
选择性重传的接收端有多贵:
接收端必须维护一张"记账表"(bitmap/scoreboard):
包1 ✓ 包2 ✓ 包3 ✗(没到) 包4 ✓ 包5 ✓ 包6 ✗ ...
而且要把乱序到达的 包4、包5 先缓存住(重排序缓冲区),等 包3 补到再一起交付
接收端要有状态:得记住"哪些到了、哪些没到",还得有一块重排序缓冲区把乱序的包暂存起来。
关键来了——RDMA 的全部卖点就是"绕过 CPU、绕过主机内存、全在网卡硬件里处理"。这意味着这张记账表和重排序缓冲区必须放在网卡自己的片上内存(SRAM)里。而片上 SRAM 是芯片里最贵、最稀缺的资源(按平方毫米算钱)。
在 2000 年前后 InfiniBand 诞生的年代,网卡芯片的片上内存以 KB/MB 计,根本没有余量去给成千上万条连接每条都维护一张记账表和重排序缓冲区。而 Go-back-N 几乎不占内存——这个省,在当年是决定性的。
一句话:Go-back-N 是"用重传带宽换内存",而当年带宽相对便宜、片上内存极其昂贵,所以这笔交换很划算。
原因二:当年的设计场景是"小规模、低延迟、近乎无损"的超算
InfiniBand 最初是为高性能计算(HPC)超算集群设计的——机器就在一个机房、规模不大、链路极短极干净、本来就几乎不丢包。
在"几乎不丢包"的前提下,Go-back-N 那个"丢一个要重传一片"的缺点根本暴露不出来——因为压根就很少丢包,偶尔丢一次、重传一小片,无所谓。设计者完全有理由说:既然丢包是极小概率事件,何必为了这个小概率去背上"昂贵的记账硬件"这个大成本?针对当时的场景,Go-back-N 是理性最优解,不是技术不行。
原因三:硬件状态机要简单——可靠性和可验证性
RDMA 的传输逻辑是固化在网卡 ASIC 硬件里的状态机,不是软件。硬件状态机越简单,越不容易出 bug、越容易验证、越可靠。 Go-back-N 的状态机简单到极致;选择性重传的状态机(管理记账表、处理乱序、判断该补哪个)复杂得多。在硬件实现时代,"简单可靠"本身就是巨大的价值。
原因四:早期规模小,PFC 的副作用还没暴露
前面讲过,Go-back-N 怕丢包,所以要靠 PFC 保无损。而 PFC 的那些毛病(队头阻塞、风暴、死锁)只在大规模、多跳、复杂拓扑下才会爆发。在当年的小规模超算里,PFC 工作得好好的,没人觉得它是问题。于是"Go-back-N + PFC 保无损"这套组合,在当年是完全自洽、没有痛点的。
二、那为什么"现在"必须改、也能改了?
三个条件全变了,于是当年的最优解变成了今天的瓶颈:
第一,场景变了:从"小规模干净超算"变成了"万卡、跨多机房、复杂拓扑、还可能跑在普通云网络上"。规模一上来,丢包不再是小概率,PFC 的死锁风暴全爆发了——Go-back-N + PFC 这套组合的痛点被彻底放大。
第二,硬件够了:二十年摩尔定律下来,网卡/DPU 芯片的片上内存、处理能力翻了无数倍。当年"养不起"的那张记账表和重排序缓冲区,今天的 DPU(如 CIPU、BlueField)轻松就能容纳。当年那笔"内存换带宽"的交易,现在不划算了——内存有的是,反而是重传浪费的带宽和 PFC 的副作用更要命。
第三,钱够了、量够大:云厂商有动力、也有规模效应去自研网卡/DPU。为几百万张 GPU 的集群定制一套传输引擎,研发成本摊薄到每张卡上完全划算。
所以选择性重传不是"新发明",而是"等到硬件便宜了、场景逼急了,终于值得做进硬件了"。 eRDMA、以及新一代 ConnectX 的改进重传,都是这个大背景下的产物。
一句话总结这段历史:Go-back-N 不是错误,是当年硬件约束下的正确选择;选择性重传不是新东西,是硬件成熟后被重新捡起来的更优解。 技术选型永远是"在当时的约束下做最优解",约束变了,最优解就变了。
三、eRDMA"更聪明的拥塞控制"具体指什么?
先说清楚:标准 DCQCN 的"笨",主要体现在它是个靠单一信号、被动、慢半拍、参数难调的机制。eRDMA(以及同代的先进拥塞控制如 HPCC、Swift、Timely 这一类思路)的"聪明",就是针对 DCQCN 这几个毛病逐个改进。具体在这几个方向:
1. 从"二值信号"到"精确测量"——知道堵了多少,而不只是堵没堵
DCQCN 的笨:它依赖 ECN,而 ECN 只是一个开关式的二值信号——交换机队列超过阈值就打个标记,发送端只知道"前面堵了",但不知道堵得多严重、该降多少速。结果只能"先猛降,再慢慢试探着加回来",反应粗糙,像开车只有"踩刹车/松刹车"两个动作,没有油门刻度。
更聪明的做法(如 HPCC 思路,借助 INT 网内遥测):让交换机在包里带上精确的链路信息——当前队列有多长、链路利用率多少、还剩多少带宽。发送端拿到这些精确数据,就能算出"我应该把速率精确调到多少",一步到位,而不是反复试探。
DCQCN: "前面堵了"(就这一个 bit 信息)→ 盲目猛降 → 再慢慢加 → 震荡
聪明版: "队列 80%、还剩 50G 带宽"(精确数值)→ 直接精确调到该速率 → 平稳
这是最大的一个进步:从"凭感觉"变成"凭精确测量"。
2. 从"被动等反馈"到"更快感知"——缩短反应延迟
DCQCN 的笨:它的反应链路长(队列堆积→打标记→到接收端→回 CNP→发送端降速,要一个完整 RTT),慢。
更聪明的做法:通过网内遥测,拥塞信息能更及时地反馈;有些方案让交换机或更近的节点更早地把信号送回来,缩短"从发现拥塞到开始降速"的时间窗口。反应越快,越能在缓冲溢出前把速度压下来,就越不需要 PFC 去兜底。这正好和前面"摆脱 PFC"的目标呼应上了。
3. 从"反应式"到"主动/预测式"——不等堵了才动
DCQCN 的笨:它是反应式(reactive)——必须等队列真的堆积、真的拥塞了,才开始降速。本质是"亡羊补牢"。
更聪明的做法:结合对流量模式的了解做主动调节。比如大模型训练的 AllReduce 是周期性、可预测的——什么时候会有一波 incast 突发,其实是有规律的。聪明的拥塞控制可以预判这波突发,提前为它平滑安排速率(配合前面讲过的 pacing 流量整形),让突发还没撞上缓冲就已经被削平了,从"事后救火"变成"事前防火"。
4. 针对 incast(多打一)专门优化
大模型 AllReduce 最典型的就是 incast:N 张卡同时打向一个出口。DCQCN 对这种"多对一瞬时突发"反应尤其吃力(因为每条流各自独立降速,但 N 条加起来的瞬时量还是能撑爆缓冲)。eRDMA 这类方案会针对 incast 做专门处理——比如更激进的初始限速、感知到 incast 模式时多条流协同降速,而不是各降各的。
5. 参数自适应——不用人肉调参
DCQCN 的笨:它有一堆参数(什么时候降、降多少、多久加回来),这些参数极难调,不同规模、不同流量模式下最优参数都不一样,运维起来很痛苦,调不好性能就崩。
更聪明的做法:因为用的是精确测量信号(而不是模糊的 ECN 开关),算法可以自适应算出该用多大的速率,大幅减少需要人肉拍脑袋调的魔法参数。这对运维(也就是你将来的工作)是实打实的减负。
HPCC、精确速率控制、突发预判与 incast 协同的具体机制
这几个问题串起来正好是一条完整的逻辑链:先搞懂"速率到底是怎么被控制的"(物理机制),再看"HPCC 怎么用精确测量算出该控多少"(算法),最后看"怎么把这套用到 AllReduce 的预判和 incast 协同上"(应用)。一层一层来。
一、前置:发送速率到底是"怎么"被控制的?
要讲精确控速,得先知道发送端手里到底有哪两个"旋钮"。所有拥塞控制,本质都是在拧这两个旋钮:
旋钮一:窗口(Window)—— 控制"在途数据量"
窗口 = 允许同时在网络里"飞着"、还没被确认的数据量。
窗口 = 4 个包,意思是:
发出 包1 包2 包3 包4 后,必须停下来等确认
收到 包1 的确认 → 窗口腾出一格 → 才能发 包5
窗口越大,网络里同时塞的数据越多,吞吐越高,但越容易把缓冲撑爆。
旋钮二:速率(Rate / Pacing)—— 控制"发送的节奏"
速率 = 单位时间发多少,靠 pacing(前面讲过的流量整形)实现——把包按固定时间间隔均匀发出,而不是一股脑全发。
速率 100Gbps,pacing 后:
每隔 X 纳秒发一个包,均匀铺开,而不是瞬间全灌出去
两个旋钮的关系:BDP(带宽时延积)
这两个旋钮通过一个核心公式联系起来:
窗口 = 速率 × RTT
(这就是 BDP,Bandwidth-Delay Product,带宽时延积)
含义:要想以速率 R 持续传输,且不浪费、不溢出,网络里应该恰好有 R×RTT 这么多数据在飞。这个量就是"网络管道的容积"——管道粗细(带宽)乘以管道长度(时延)。
一个直观比喻:管道容积 = 水流速度 × 管道长度。要让水流稳定不溢出,管道里的水量应该刚好等于这个容积。多了溢出(拥塞丢包),少了浪费(带宽没跑满)。
精确速率控制的终极目标,就是让"在途数据量"精确地等于这个管道容积——既不多(不堵)也不少(不浪费)。 难点在于:管道容积是动态变化的(别人也在用这条路,可用带宽随时在变),而且你看不到管道内部……除非有 INT。
二、HPCC:用 INT 把管道内部"看透",一步算到位
HPCC(High Precision Congestion Control,高精度拥塞控制,阿里 + 斯坦福等,SIGCOMM 2019)的核心思想一句话:
让每个数据包经过每一台交换机时,都把这台交换机的精确状态"盖章"记在包里。接收端把这些信息回传给发送端,发送端就拿到了整条路径每一跳的精确拥塞情况,从而能一次性算出精确的发送速率,不用试探。
第一步:INT 在包里"盖章"记录什么
数据包经过路径上每一台交换机时,交换机用 INT 在包里追加三个精确数值:
包经过交换机 i 时,盖章记下:
txBytes :这个端口累计发出了多少字节(用来算实际带宽利用率)
qlen :这个端口当前队列堆积了多少(用来看堵了多少)
ts / B :时间戳 和 端口带宽
注意:这些是精确数值,不是 ECN 那种"堵了/没堵"的一个 bit。这是 HPCC 和 DCQCN 最本质的区别。
第二步:计算每一跳的"链路负载率" U
发送端拿到回传的 INT 信息后,对路径上每一跳算一个关键指标——inflight 占管道容积的比例 U:
对每一跳 i:
qlen(i) txRate(i)
U(i) = ─────────── + ───────────
B(i)×T B(i)
└─排队部分─┘ └─链路利用率─┘
其中:
qlen(i) = 这一跳的队列长度(在途数据中"堵着"的部分)
txRate(i) = 这一跳实测的发送速率(两次INT的txBytes之差/时间差)
B(i) = 这一跳的链路带宽
T = 基准RTT
直观理解 U 的含义:U 衡量"这一跳的在途数据量,相对于它理想管道容积的比例"。
- U = 1:刚刚好,管道填满、队列为零,完美状态
- U > 1:在途数据超过管道容积了 → 多出来的部分在排队 → 正在拥塞
- U < 1:管道没填满 → 带宽有浪费 → 可以提速
第三步:取"最堵的那一跳"作为瓶颈
一条路径上每跳的 U 都算出来后,取最大值:
U_max = max( U(1), U(2), ... U(n) )
为什么取最大?因为整条路径的吞吐由最堵的那一跳(瓶颈)决定,木桶效应。只要把瓶颈这一跳控制好,整条路就好了。
第四步:一步调整窗口到精确值
HPCC 的目标是让 U_max 稳定在一个目标值 η(比如 95%,留一点余量)。调整公式:
W_current
W_new = ─────────────── + W_AI
U_max / η
└──── 乘性调整 ────┘ └─加性微调─┘
拆开看这个公式的精妙:
- 如果
U_max = 1.5(严重超载 50%),目标 η=0.95,那么W_new ≈ W_current / 1.58,窗口直接砍到约 63%——一步降到位,不用反复试。 - 如果
U_max = 0.8(带宽没用满),W_new ≈ W_current / 0.84,窗口直接放大到约 119%——一步提上去。 W_AI是个很小的加性增量,用于在稳定时温和地探测是否还有空闲带宽。
这就是"一步到位"的含义:因为 U_max 是精确算出来的"超载/空闲了百分之多少",所以窗口该乘以多少、除以多少是直接算出来的,而不是 DCQCN 那样"先砍一半试试,不行再砍,好了慢慢加回来"的反复震荡。
第五步:把窗口换算成 pacing 速率去发
算出目标窗口 W_new 后,用前面的 BDP 公式反推出 pacing 速率:
发送速率 R = W_new / T
然后用 pacing:每隔 (包大小 / R) 的时间,发一个包,均匀铺开
DCQCN vs HPCC 直观对比
DCQCN(凭感觉,震荡):
速率
│ ╱╲ ╱╲ 猛降→慢升→又猛降,锯齿状震荡
│ ╱ ╲ ╱ ╲ 始终在"过冲"和"不足"之间摇摆
│ ╱ ╲ ╱ ╲ 收敛慢,且稳定后还在抖
└────────────────── 时间
HPCC(凭精确测量,一步到位):
速率
│ ┌────────── 几步就精确收敛到目标
│ ┌─┘ 之后稳定贴着95%利用率
│ ┌─┘ 几乎不震荡
└────────────────── 时间
HPCC 论文里报告的效果:相比 DCQCN,它能让队列长度极短(接近零排队)、收敛快得多、几乎不丢包。代价是需要交换机支持 INT——这又回到那句话:硬件能力够了,先进算法才落地得了。
三、AllReduce 突发预判:从"事后救火"到"事前防火"的具体流程
现在把 HPCC 这种精确控速,用到大模型训练的具体场景。先讲清楚"为什么 AllReduce 是可预测的",再给出预判流程。
为什么 AllReduce 的突发有规律?
大模型训练是严格的循环,每一步(iteration)都长一个样:
每个训练 step 都是固定节奏:
┌─→ 前向计算(算 loss)──→ 反向计算(算梯度)──→ AllReduce(同步梯度)─┐
└──────────────────────────────────────────────────────────────────┘
计算阶段(网络几乎空闲) 通信阶段(网络瞬间爆炸)
关键特征:
- 计算阶段:GPU 埋头算,网络几乎没流量(安静期)
- 通信阶段(AllReduce):所有 GPU 同一时刻开始猛灌梯度 → incast 瞬时突发
- 这个节奏每一步都重复,而且每步的计算耗时、梯度大小、通信量几乎完全一样(因为模型结构和 batch 大小固定)
所以训练系统知道:“再过 X 毫秒,反向计算结束,一波几十张卡同时打向同一出口的 incast 突发就要来了”——这是有规律、可预测的。
预判式平滑的具体流程
─────────── 第 N 步训练,时间轴 ───────────
T0: 反向计算开始
↓
[系统已知] 历史数据显示:反向计算约耗时 50ms,
结束后会触发 8GB 梯度的 AllReduce,
涉及 64 张卡 incast 到同一聚合点
T0+10ms: 【提前布局】拥塞控制不等突发真的发生,
而是根据预判,提前为即将到来的 AllReduce 流
设置好初始 pacing 速率上限
—— 不让它们一上来就满速猛冲
T0+50ms: 反向计算结束,AllReduce 开始
↓
【对比两种情况】
❌ 无预判(反应式):
64 张卡瞬间全部满速猛灌 → 缓冲在几微秒内爆掉
→ 等 HPCC/DCQCN 反应过来(一个RTT后)→ 已经丢包了
→ 触发 PFC 或重传 → 这一步的通信被拖慢
✅ 有预判(预测式 + pacing):
64 张卡按"提前算好的、平滑的速率"起步
梯度数据被 pacing 均匀铺开发送,而不是脉冲式猛灌
→ 突发的"尖峰"被提前削成"平台"
→ 缓冲从一开始就没被撞爆 → 零丢包 → 通信顺畅完成
─────────────────────────────────────────
核心机制:把"脉冲"削成"平台"
用一张图说明预判的本质——在总数据量不变的前提下,把瞬间的尖峰摊平到稍长的时间窗口里:
发送速率
│
│ ❌ 无预判:脉冲式猛冲
│ █ 瞬间冲到远超链路容量
│ █ → 超出部分全堆进缓冲 → 溢出丢包
│ █
│ █___________
└──────────────────────── 时间
│ ✅ 有预判:pacing 削峰
│ ▒▒▒▒▒▒▒▒▒ 提前限速,铺成平台
│ ▒▒▒▒▒▒▒▒▒ 峰值不超过链路容量 → 缓冲不溢出
│ ▒▒▒▒▒▒▒▒▒ (面积相同 = 总数据量相同,只是时间拉长一点点)
└──────────────────────── 时间
关键洞察:AllReduce 之前有个"计算安静期",网络是空闲的。预判机制利用了这个规律——既然知道突发要来,就别等它撞上来再手忙脚乱降速,而是提前把闸门调到合适开度,让洪水平稳放出,而不是决堤式倾泻。这就是"事前防火"。
注意:这里的"预判"未必是 HPCC 算法本身做的,更多是训练框架(如前面讲的 MegaScale)+ 通信库 + 拥塞控制协同的结果——训练框架最清楚"下一波通信什么时候来、有多大",它把这个信息喂给底层,底层据此提前 pacing。这正是前面说的"NCCL 管逻辑编排、底层管物理传输"的协同在拥塞控制上的体现。
四、incast 协同降速:从"各降各的"到"集体协调"
这是最后一块,也是最反直觉的一块。先讲清楚"各降各的"为什么会失败,再给出"协同"的流程。
为什么"每条流独立降速"会失败?
incast = N 条流同时打向同一个出口。问题在于:每条流自己看,可能都觉得"我不算过分",但 N 条加起来就爆了。
场景:64 张卡同时向 1 个聚合点发数据,出口链路 400G
如果每条流独立做拥塞控制:
每条流心想:"我才发 400G/64 ≈ 6.25G,很温和啊,不用降"
但 64 条 × 6.25G = 400G,刚好顶满
问题:实际中各流启动有微小时间差、速率有抖动,
瞬间叠加很容易冲过 400G → 缓冲溢出
更糟的是"公平性收敛"问题:
独立降速时,每条流靠各自的反馈慢慢调,
64 条流要花很多个 RTT 才能各自收敛到 6.25G,
在收敛之前,一直在过冲和丢包之间震荡
根本矛盾:拥塞的成因是"集体行为"(64 条流叠加),但解药却是"个体反应"(每条流自己降)——头痛医脚,收敛慢且不稳。
协同降速的几种具体做法
做法一:感知到 incast 模式,立刻"激进初始限速"
普通流启动:从一个较高的初始速率开始,靠反馈慢慢调
incast 流启动:系统识别出"这是一波 N 对 1 的 incast"
→ 让每条流的初始速率直接设为 链路带宽 / N
→ 一上来就贴近公平份额,而不是高速冲进去再被打回来
例:识别出 64 条流打向同一出口
→ 每条流初始速率直接限定为 400G/64 = 6.25G
→ 跳过了"高速冲→丢包→猛降→慢升"的震荡过程,直接到位
为什么能这么做?因为系统知道 N(参与 AllReduce 的卡数是训练框架明确知道的),既然知道分母,直接算出每份该多大即可,不用让每条流自己摸索。
做法二:出口侧统一调度,反向"派发额度"
传统:每个发送端自己决定发多快(分布式、各自为政)
协同:让 incast 的汇聚点(出口)来统筹
流程:
1. 出口聚合点知道自己总带宽 400G
2. 它看到有 64 条流要进来
3. 它主动给每条流"派发额度"(credit):你发 6.25G,你也 6.25G ...
4. 各发送端按收到的额度发,不超额
→ 因为是出口统一分配,总和天然不会超过 400G,从源头杜绝叠加溢出
这有点像前面讲 DDC 时的 VOQ + credit 机制——与其让 N 个发送端各自猜,不如让唯一的出口统一发号施令,因为只有出口才掌握"总共有多少流要进来、总带宽多少"这个全局信息。
做法三:信息共享——让流之间"知道彼此存在"
独立降速的盲区:流 A 不知道还有另外 63 条流在和它抢同一个出口
协同的改进:通过 INT 或聚合点反馈,让每条流知道
"此刻有 64 条流共享这个瓶颈"
→ 每条流据此把自己的目标速率直接算成 总带宽/64
→ 大家同时、一致地收敛到公平份额,几乎不震荡
协同 vs 独立:效果对比
─── 独立降速(各降各的)───
速率(单条流)
│ ╱╲ ╱╲
│ ╱ ╲ ╱ ╲ ╱╲ 64条流各自震荡,要很多RTT才勉强收敛
│╱ ╲╱ ╲ ╱ ╲ 收敛前持续过冲、丢包、PFC
└──────────────────── 时间
总和经常瞬间冲过400G → 溢出
─── 协同降速(知道N,统一分配)───
速率(单条流)
│ ┌──────────────
│ │ 一步到位锁定在 6.25G(400G/64)
│ ┌─┘ 64条流同步收敛,总和稳定贴着400G
└──────────────────── 时间
总和始终≈400G → 不溢出,零丢包
核心洞察一句话:incast 是"集体造成的拥塞",所以解药必须也是"集体协调的降速"——要么让出口统一派发额度,要么让每条流都知道分母 N 直接算出公平份额。靠每条流各自盲目反应,永远慢半拍且会震荡。而大模型训练恰好明确知道这个 N(就是参与通信的 GPU 数),这个先验信息让协同降速变得可行且精确。
五、三块串起来:一次 AllReduce 的完整拥塞控制
把前面所有东西拼成一个完整流程,你就看到这套机制是怎么协同工作的:
[训练框架层] 第 N 步反向计算进行中
→ 框架已知:再过 ~40ms 会有 64 卡、8GB 的 AllReduce incast
[预判/事前防火]
→ 提前为这波流设置初始 pacing 速率 = 400G/64 = 6.25G/条
→ 把脉冲尖峰预先削成平台
[incast 协同/出口统筹]
→ 聚合点按 credit 给 64 条流派发额度,总和不超 400G
[AllReduce 真正开始]
→ 64 条流按 6.25G 平滑起步,缓冲不溢出
[HPCC 精确微调/运行中]
→ 每个包带 INT 信息回传
→ 发送端算出每跳的 U,取 U_max
→ 若某跳 U_max=1.1(轻微超载)→ 窗口一步精确收到约 91%
→ 若 U_max=0.9(略有余量)→ 一步精确放大
→ 全程贴着 95% 利用率跑,队列接近零,零丢包
[结果]
→ AllReduce 高效完成,时延低且稳定可预测
→ 全程没触发 PFC,没丢包重传
→ 这一步的通信时间被压到最短,且每一步都一样稳
你看,这就回到了最开始那个主题:这一切的目标,都是为了让那几千上万张昂贵的 GPU 不要因为网络问题而空等。 拥塞控制做得好不好,最终体现在 MFU(算力有效利用率)这个钱袋子指标上。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)