
GPU 网络基础:训练中的通信、横向扩展、纵向扩展、网络架构、交换机等 原创
大家好,我是玄姐。
我们会用非常浅显的方式聊聊 “网络” 和 “GPU” 这两个话题。它很重要,但听起来可能又无聊又晦涩。别急,跟着我一起看就好!
1. 为什么要关注 GPU 网络?
训练一个大语言模型(LLM)需要海量的浮点运算(FLOPs):
那训练这些模型要花多久呢?假设单块 GPU 的运算能力约为 2 拍浮点运算 / 秒(2×10¹⁵次浮点运算 / 秒),一天有 86400 秒,单块 GPU 一天能完成约 1.7×10²⁰次浮点运算。在最理想的情况下,想用单块 GPU 完成 10²⁴次浮点运算的训练任务,大概需要16 年。
16 年啊!谁有这时间等?
那要怎么把 LLM 的训练时间缩短到几个月甚至几周?答案是:让大量 GPU 同时工作。
但这些 GPU 得 “互相说话”—— 毕竟它们要协同工作,得分享各自的进度和结果。这种 “互相说话” 靠什么实现?靠网络!
(别想歪了,不是这种 “人脉社交” 的 networking)
(对,是这种 “计算机网络” 的 networking!😅)
其实,把众多 GPU 连起来是个挺有意思的问题。比如 xAI(埃隆・马斯克旗下公司)要协调 20 万块 GPU 之间的通信,想想就复杂!你可以听听埃隆的这段 4 分钟视频,里面就提到了这个问题 —— 这绝对是个超有挑战性的系统工程难题!
2. 网络交换机:连接 GPU 的 “中间人”
我们就以 xAI 的 20 万块 GPU 集群为例,怎么把它们连起来呢?
理想状态下,每块 GPU 都能以最快速度和其他任何一块 GPU 通信。那第一个想法可能是:直接把每块 GPU 都跟其他 GPU 连起来行不行?
这样就不用通过交换机或其他设备 “中转”,速度肯定特别快!这种连接方式叫 “全互联网络”(full mesh network)。
但实际上,全互联网络在 “大规模场景” 下根本行不通,原因有很多。比如,要让 20 万块 GPU 两两直接相连,每块 GPU 得有 199999 个接口,而且总共需要约 200 亿根连接线!这显然不现实,想想都觉得离谱。
那怎么办?可以引入 “网络交换机”(network switch)。交换机是一种专用硬件,能高效地在多个设备(这里就是 GPU)之间转发数据。现在不用让 GPU 两两直接连了,而是把所有 GPU 都连到交换机上,由交换机来管理它们之间的通信。
(交换机连接这些 GPU 后,任意两块 GPU 都能互相通信)
如果用一台交换机连接 20 万块 GPU,连接线数量会从 200 亿根骤减到 20 万根(每块 GPU 一根线),确实简化了不少。但问题是,这台交换机得有 20 万个接口 —— 这同样不现实。
(大概就像这台交换机,但得比它大 8000 倍😂)
显然,单靠一台巨型交换机解决不了问题,所以我们需要 “分层交换机”(hierarchical switching)。
3. 叶脊拓扑:分层连接 GPU
既然不能用一台巨型交换机连接所有 GPU,那我们可以把网络分成好几层交换机,用 “分层” 的方式组织:
(分层结构示意图)
每一层的交换机都可以做得小一些,只连接一部分 GPU—— 这样不管是尺寸还是成本,都更容易控制。有了这个方案,GPU 不用再带几千个接口,交换机也不用了。
但凡事都有取舍:如果两块 GPU 不在同一个 “分支”(比如连在不同的下层交换机上),它们通信时数据就得经过多层交换机中转,这会增加 “延迟”(latency)。
举个例子:如果两块 GPU 没连在同一台交换机上,它们的通信数据得先传到上层交换机,再从上层交换机传到目标 GPU 所在的下层交换机 —— 多了好几步 “中转”。
(中转次数越多,数据到达目的地的时间就越长)
这种两层结构通常叫 “叶脊拓扑”(leaf-spine topology),也叫 “两层 Clos 网络”(two-tier Clos network)。其中,“叶交换机”(leaf switches)直接连计算设备(也就是 GPU),“脊交换机”(spine switches)则负责连接所有叶交换机:
(叶脊拓扑结构示意图)
4. 横向扩展(Scale Out):增加设备数量
怎么实现几千块 GPU 的集群?
“横向扩展”(也叫 “水平扩展”)就是通过增加更多 GPU 和交换机来扩大集群规模。这样能把训练任务分摊到更多硬件上,缩短 LLM 的训练时间。
(原理很简单:把现有的网络结构 “复制粘贴”,不断增加节点 —— 这就是横向扩展!)
那这些新增的 GPU 和交换机怎么互相通信?横向扩展通常用两种技术:以太网(Ethernet)或无限带宽(InfiniBand),两者都能提供 GPU 间通信所需的高速网络。
其中,InfiniBand 是英伟达的专有技术(通过收购 Mellanox 获得),过去在大规模 AI 集群里很常用 —— 因为比起 RoCE(融合以太网 RDMA)这类高性能以太网,它的延迟更低、带宽更高。
(你要是觉得这不是以太网 cable,那你说对了!来源:1.5 米(5 英尺)英伟达 / 迈络思 MCP4Y10-N01A 兼容款 800G OSFP 带鳍顶无限带宽 NDR 被动直连铜双轴电缆,适用于 Quantum-2 交换机)
不过现在新建的训练集群,越来越多人倾向用以太网。比如英伟达 CEO 黄仁勋在本周的 GTC 大会主题演讲里提到,埃隆的 xAI 就是用英伟达的 Spectrum X 以太网,搭建了目前最大的训练集群(Colossus)。
5. 纵向扩展(Scale Up):提升单节点能力
横向扩展能解决一段时间的问题,但 eventually 会遇到物理和成本的瓶颈:设备和交换机越多,中转带来的延迟就越高,耗电量和成本也会跟着涨。到了某个节点,单靠横向扩展就不是最佳方案了。
这时候就要用到另一种思路:“纵向扩展”(也叫 “垂直扩展”)。
纵向扩展的核心是 “提升单个节点的计算能力”,而不是增加节点数量。比如,不让叶交换机直接连单块 GPU,而是让它连 “服务器”—— 每台服务器里装多块 GPU(比如 8 块)。这样一来,需要的交换机和连接线数量就会减少:
(每台服务器节点包含 8 块 GPU;一台交换机就能连接更多 GPU)
可以用一个类比理解:早期网站扩容时,快速发展的公司会先给单台服务器加更多 CPU 核心和内存 —— 这就是纵向扩展。等单台服务器不够用了,再增加更多服务器,用负载均衡器分摊流量 —— 这就是横向扩展。
可能有人会问:纵向扩展的 GPU,不还是得通过交换机连接吗?那跟横向扩展有啥区别?
这个问题问得好!关键在 “节点内通信” 和 “节点间通信” 的差异。
6. 节点内通信(Intra-node)vs 节点间通信(Inter-node)
- 同一台服务器内部的通信,叫 “节点内通信”(intra-node communication)。
- 不同服务器上的 GPU 之间的通信,叫 “节点间通信”(inter-node communication)。
事实是:同一节点内的相邻 GPU,通信速度比用 InfiniBand 或以太网进行节点间通信要快得多,带宽也更高。
为什么?主要原因有两个:一是 GPU 在物理上离得近,二是用了专门的互联技术。这些技术会用直接、短小且经过优化的 “信号线路”(通常集成在同一块电路板或同一个封装里),既能缩短信号传输距离,又能减少延迟。
比如,AMD 的 “Infinity Fabric”(无限结构)就是这样的技术 ——2018 年 IEEE 国际固态电路会议(ISSCC)的论文里就展示过它的线路设计:
(图中亮色的连接线就是计算单元之间的金属线路,相当于封装基板里的 “电线”)
因为服务器内的 GPU 是直接连接的,所以能避开节点间通信的很多额外开销。封装内的线路设计让信号传输距离短,能减少 “传播延迟”,还能降低信号衰减。
而像 InfiniBand、以太网这类外部连接,为了保证长距离传输的可靠性,往往需要额外的 “信号完整性组件”(比如中继器、重定时器、纠错机制)—— 这些组件会增加延迟,还会消耗更多电力。
我喜欢把节点内通信(比如 NVLink、Infinity Fabric)比作 “德国 Autobahn(高速公路)”:设计初衷就是高速无间断。而节点间通信就像 “双向两车道公路”:速度慢、能容纳的 “流量” 少,还可能遇到 “堵车”(比如春耕或秋收时要给拖拉机让行,对应网络拥堵)。
(小心!前面好像有交警!)
7. 训练中的通信:GPU 如何协同工作?
要理解 GPU 通信的难点,先得回忆一下神经网络的训练过程。
在每个训练周期里,网络会先做 “前向传播”(forward pass):输入数据流过网络的每一层,最终生成一个预测结果。然后用 “损失函数”(loss function)把这个预测结果和正确答案对比,算出预测的误差有多大。
而学习的核心发生在 “反向传播”(backward pass):通过 “反向传播算法” 计算出网络中每个权重对误差的 “贡献度”,再用 “梯度下降”(gradient descent)调整所有权重 —— 相当于拧动几十亿个 “旋钮”,让误差逐渐减小。每迭代一次,这些微小的调整都会让神经网络在新数据上的预测更准确。
训练时,每块 GPU 会根据前向传播的误差,计算出权重更新所需的 “梯度”。但因为每块 GPU 处理的是不同的数据子集,所以这些梯度只是 “局部梯度”。为了让所有 GPU 都应用相同的权重更新、保持同步,必须把所有 GPU 的梯度 “汇总平均”。
这个过程叫 “全归约通信”(all-reduce communication):GPU 之间交换梯度数据,算出最终的平均梯度,再用这个梯度更新各自的本地模型。通过这种方式保证 “全局一致性”,能避免模型 “跑偏”(model drift),让分布式训练有效进行。
这种全归约通信的延迟,会直接影响训练效率。
除了全归约,还有其他 “集合通信操作”(collective operations)。比如英伟达的 NCCL 软件库就支持这些操作:AllReduce(全归约)、Broadcast(广播)、Reduce(归约)、AllGather(全收集)、ReduceScatter(归约散射)。
所以,训练集群理想的状态是:用带宽最高、延迟最低的通信方式。而且,就像 DeepSeek V3 展示的那样,也可以用软件手段让 “通信” 和 “计算” 并行进行 —— 这样能减少 GPU 的 “空闲时间”,降低通信瓶颈的影响。
8. 总结
以上就是第一部分的全部内容了 —— 我说过会很浅显吧!
关于 GPU 网络,还有很多内容可以聊。比如实际的大型集群不会用全互联结构,比我们说的要复杂得多:
之后我们还会覆盖这些话题:推理(inference)时的通信需求(和训练有啥不一样)、前端网络 vs 后端网络、光通信等等。
希望通过这篇文章,你再看到相关的示意图或文档时,能多一点底气。比如看到英伟达 SuperPOD 计算架构图时,能大概看明白,还能提出问题补充细节:
从这张图里,我们能看到脊交换机和叶交换机在支持 “横向扩展”,而 B200 服务器在实现 “纵向扩展”。从表格里能算出,每个 “可扩展单元”(SU)有 32 个节点,每个节点有 8 块 GPU—— 这就是 “横向扩展”(32 个节点)和 “纵向扩展”(每个节点 8 块 GPU)的结合。不用纠结 “移除一台 DGX 以适配 UFM 连接” 这种细节,关键是你现在能看懂这些核心信息了!
好了,这就是我今天想分享的内容。
本文转载自玄姐聊AGI 作者:玄姐
