想象你是一座超级城市的交通局长。这座城市里坐落着几千个“计算仓库”(GPU),它们要联手训练一个 AI 大模型——每隔几毫秒,每个仓库都要把自己算出的梯度结果打成“快递包裹”,送给其他仓库,再收回别人的包裹,最终所有人拿到一模一样的“总账”。包裹运得够快够稳,全城才能高效运转;任何一个路口堵死,所有仓库都要干等,GPU 利用率直接崩盘。 这批仓库之间的“道路系统”,就是 GPU 集群网络架构。本教程会把这条“城市交通网”拆开讲清楚:为什么必须修路(网络基础)、道路怎么规划(拓扑结构)、快递怎么调度(通信库)、堵车如何疏导(拥塞控制)、路线怎样优化(性能优化),直到交警如何处置事故(故障排障)。全程不用公式吓唬你——我们先用生活常识建立直觉,再逐步落到工程细节。

岗位关联

学完本主题,你将能从“网络视角”看穿分布式训练的性能瓶颈,既能规划算力集群,又能诊断通信故障——这是大模型时代 AI 工程岗位最稀缺的硬技能之一。

目录
  1. 可视化演示
  2. 网络基础概述:为什么仓库之间要修路
  3. 网络拓扑结构:立交桥怎么搭
  4. 通信库原理:快递调度中心
  5. 拥塞控制机制:堵车了怎么办
  6. 性能优化策略:让城市跑得更快
  7. 故障排障实践:交警出警
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示AI集群网络三维度:拓扑对比(Fat-Tree三层Clos全二分带宽1:1收敛比 vs Spine-Leaf两层扁平3:1收敛比)、GPU互连(节点内NVLink/NVSwitch全互连600GB/s + 节点间RDMA/RoCEv2零拷贝微秒级延迟)、Ring AllReduce集合通信(Reduce-Scatter梯度分片归约→AllGather结果广播、环形拓扑带宽最优利用),三模式切换理解千卡万卡集群网络核心架构。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+C1+'

网络基础概述:为什么仓库之间要修路

一座仓库装不下整个大模型。一个 700 亿参数的模型,光参数就要占几百 GB 显存,单张 GPU 根本放不下;就算放得下,单卡算力也要跑上几十年。于是城市里建起几千座“计算仓库”,每座仓库负责模型的一小块,大家必须频繁交换中间结果,才能像一个人那样协同思考。仓库之间的“路”修得好不好,直接决定整座城市的效率。

这段“路”就是我们说的集群网络。描述一条路有两个核心指标:带宽和时延。带宽好比高速公路的车道数——车道越多,同一时间能并排跑多少辆快递车;时延好比每个路口的红绿灯等待时间——不管路多宽,每辆车过路口都得花这固定的一小段时间。训练大模型时,GPU 每算完一步就要把梯度同步给所有人,通信时间几乎和计算时间同等重要。这也是为什么做大模型的人常说“GPU 集群的性能瓶颈,一半在网线上”。

从工程上看,集群网络通常分为三层:接入层(每台服务器直接连的交换机,相当于小区出入口)、汇聚层(把多个小区接到一起的主干道)、核心层(城市之间的环线高速)。梯度数据从一张卡出发,要经过这些层级才能到达另一张卡,每一层都是潜在的瓶颈。一次通信的总耗时可以写成:

理解了带宽与时延,你就掌握了交通局长的第一课:车道要宽,红灯要少。下一节我们来看,这些道路究竟该怎么规划。

T通信=DB+L\displaystyle T_{\text{通信}} = \frac{D}{B} + L
$D$ 是要传的数据量(包裹总量),$B$ 是带宽(车道数),$L$ 是时延(固定路口耗时)。传大文件时第一项占主导,传小消息时第二项占主导。
  1. 通信数据量 $D$梯度或参数数据的大小,比如一次 AllReduce 要传 8GB,相当于这一批要搬运的包裹总重量。
    D=8×109 ByteD = 8 \times 10^9 \text{ Byte}
  2. 网络带宽 $B$单位时间内能传输的比特数,比如 400Gb/s,相当于高速公路的车道总数。
    B=400×109 bit/sB = 400 \times 10^9 \text{ bit/s}
  3. 链路时延 $L$数据从发出到抵达的固定耗时,包括交换机转发和线路传播时间,相当于每个路口的红灯等待。
    L=2×10−6 sL = 2 \times 10^{-6} \text{ s}
  4. 总通信时间 $T$搬运总耗时等于“传输时间加时延”,两者都可能成为瓶颈。
    T通信=DB+LT_{\text{通信}} = \frac{D}{B} + L

网络拓扑结构:立交桥怎么搭

修路不能随性而为,得有结构。最常见的结构叫胖树(Fat-Tree):名字很形象——树越往上越“胖”。底层交换机连接 GPU,上层交换机逐级汇聚,每一级都有足够多的并行链路,保证从任意一片叶子出发,都能找到多条通往其他叶子的路。这就像城市交通从小区道路汇入主干道、再上环线,层层变宽,任何一个方向都不会被“窄喉咙”卡死。

与之配套的常见组网叫叶脊架构(Spine-Leaf):所有 GPU 都接在“叶交换机”上,而每一个叶交换机都同时连接所有“脊交换机”。好处是任意两台服务器之间的跳数完全一致,谁也不会比谁多绕路,公平性极好,延迟也可预期。超大规模集群还会用到 3D 环网(如 Dragonfly 拓扑),像地铁环线一样把多个机柜连成环,减少长距离绕行。

衡量路网是否“头重脚轻”的关键指标叫收敛比。它对比的是下行带宽(交换机连 GPU 的总带宽)与上行带宽(交换机连上层交换机的总带宽):

路网图纸画得再好,车流控制不当照样堵车。光有立交桥还不够,还得有一套聪明的“快递调度系统”——这就是通信库的用武之地。

R收敛=B下行B上行\displaystyle R_{\text{收敛}} = \frac{B_{\text{下行}}}{B_{\text{上行}}}
收敛比等于 1 表示上下行一样宽,是理想的无收敛网络;大于 1 说明上行“僧多粥少”,多个 GPU 抢一条窄路,拥堵风险高。
  1. 下行带宽 $B_{\text{下行}}$交换机面向 GPU 一侧所有端口速率之和,相当于小区所有入口车道加起来多宽。
    B下行=N下×RB_{\text{下行}} = N_{\text{下}} \times R
  2. 上行带宽 $B_{\text{上行}}$交换机面向核心层一侧所有端口速率之和,相当于小区通往环线的主干道总宽度。
    B上行=N上×RB_{\text{上行}} = N_{\text{上}} \times R
  3. 收敛比 $R$两者相除。等于 1 无收敛,大于 1 表示上行是瓶颈。
    R收敛=B下行B上行R_{\text{收敛}} = \frac{B_{\text{下行}}}{B_{\text{上行}}}

通信库原理:快递调度中心

路修通了,谁来安排每一趟运输?GPU 之间的通信分两种:点对点通信像两个仓库直接互发专车,一对一说好就行;集合通信则是一群 GPU 协同完成一个集体动作,必须有人统一调度。训练大模型时最常用的集体动作叫 AllReduce——每个 GPU 都算出了一份梯度(好比每个分店都统计出了自己的营业额),最终要求每一家店都拿到全城的总营业额。

怎么做最高效?最经典的方案是环形 AllReduce。调度中心把数据切成 $N$ 片($N$ 是 GPU 数量),让所有 GPU 排成一个环,每轮只和左右邻居通信。整个过程分两个阶段:第一阶段 scatter-reduce,数据沿环转圈并逐站累加,转完 $N-1$ 步后,每个 GPU 手里各攥着一片“完整总和”;第二阶段 all-gather,把这片完整总和继续沿环转圈复制,再转 $N-1$ 步后,所有人都拿到全部结果。

NCCL(NVIDIA 的通信库)和 RCCL(AMD 对应物)就是英伟达和 AMD 提供的“快递调度中心”。它们会自动探测拓扑、选择最优的通信算法和路径,工程师不用手写底层协议,但必须理解它的原理才能排查问题。环形 AllReduce 的总耗时可以这样估算:

有了调度中心,高峰期的包裹还是可能把路口堵死。接下来我们看看城市是怎么对付堵车的。

TAllReduce=2(N−1)(α+DN×B)\displaystyle T_{\text{AllReduce}} = 2(N-1)\left(\alpha + \frac{D}{N \times B}\right)
$N$ 是 GPU 数,$\alpha$ 是单步固定时延,$D$ 是总数据量,$B$ 是带宽。总数括乘以 2 是因为两个阶段各走 $N-1$ 步。
  1. GPU 数量 $N$环上的站点数,数据被均匀切成 $N$ 片,每片只在一个站点间传递。
    N=8N = 8
  2. 单片数据量 $\frac{D}{N}$每个 GPU 每步只需搬运总数据的 $1/N$,这是环形算法高效的关键。
    DN=D8\frac{D}{N} = \frac{D}{8}
  3. 单步固定开销 $\alpha$每一次发送的启动时延,包括协议处理和缓存等待,相当于每趟车出库的固定手续时间。
    α=1×10−6 s\alpha = 1 \times 10^{-6} \text{ s}
  4. 总步数 $2(N-1)$两个阶段各 $N-1$ 步,包着数据在整个环上恰好转完一圈半。
    2(N−1)=142(N-1) = 14

拥塞控制机制:堵车了怎么办

即使路网合理、调度聪明,AI 训练还是有一个天生的“堵车场景”:Incast——多个 GPU 同时把数据发给同一个目标。想象几十辆快递车在同一秒钟涌向同一个仓库卸货口,仓库门口只有一条通道,车流瞬间堆积成山。在交换机里,这个“卸货口”就是出端口,堆积的车就是队列里的数据包。

队列一旦堆积,交换机被迫丢包,而丢包会导致上层协议重传,重传又增加更多流量,恶性循环。城市交通靠什么治堵?第一招是 ECN(显式拥塞通知):当交换机发现队列超过阈值,它不直接丢包,而是在数据包的“额头”上贴一个标记;接收方看到标记后,回头告诉发送方“你慢一点”。这就像交警发现路口要堵,不是拦下每辆车,而是给调度中心打电话,让后续车辆错峰出发。第二招是 PFC(优先级流控):交换机在队列快满时,直接向上一跳发送“暂停帧”,让上游先别发。这好比路口红了灯,强制车流停下等待。

把 PFC 用到极致,就得到了无损网络——理论上一个包都不丢,延迟非常稳定。但 PFC 也有副作用,就像红灯停了整条街,可能把拥堵传染给无关方向,造成“队头阻塞”。拥塞的产生可以用队列长度的变化来刻画:

治堵是“防守”,真正的高手还会“进攻”——主动优化整个城市的运行效率。

Q(t)=Q(t−1)+∑i=1kRi(t)−C(t)\displaystyle Q(t) = Q(t-1) + \sum_{i=1}^{k}R_i(t) - C(t)
$Q(t)$ 是当前队列长度,$R_i(t)$ 是每个上游 GPU 的发送速率,$C(t)$ 是出口服务速率。进入的比出去的多,队列就增长。
  1. 队列长度 $Q(t)$交换机缓冲区里积压的数据量,相当于收费站当前排队的车辆数。
    Q(t)=Q(t−1)+ΔQQ(t) = Q(t-1) + \Delta Q
  2. 入向速率总和 $\sum R_i(t)$多个 GPU 同时灌入的速率之和,$k$ 越大堆积越快,这是 Incast 的根源。
    ∑i=1kRi(t)=k×R\sum_{i=1}^{k}R_i(t) = k \times R
  3. 出向服务速率 $C(t)$交换机转发能力,相当于收费站的放行速度。
    C(t)=400×109 bit/sC(t) = 400 \times 10^9 \text{ bit/s}

性能优化策略:让城市跑得更快

如果把训练一轮的时间看成“做一顿饭”,很多新手是“先炖汤再切菜”——先让 GPU 算完,再干等通信结束。而优化高手会计算与通信重叠:这一层还在算梯度的时候,上一层的梯度已经在路上跑了。就像炖汤的同时切菜、热锅,所有工序流水线化,总时间不再是一堆环节相加,而是最长的那个环节。

除了重叠,还有三招常用。梯度压缩:把梯度做量化或稀疏化,传送的数据量 $D$ 直接砍半甚至砍到 1/8,相当于把包裹压缩打包再上车,车次不变但每车装得更多。拓扑感知调度:调度系统先看清哪些 GPU 在同一个叶交换机下,把通信最频繁的作业放在“同一个小区”里,减少跨主干道的长途运输。混合并行:数据并行、张量并行、流水并行混合使用,让每条链路的流量相对均衡,避免某条路闲着、某条路堵死。

当计算与通信完全重叠时,理想的总时间可以写成:

路网再完善、优化再极致,事故总难免。城市能不能快速恢复秩序,考验的是交警的排障功夫。

T重叠≈max⁡(T计算,T通信)\displaystyle T_{\text{重叠}} \approx \max(T_{\text{计算}}, T_{\text{通信}})
通信时间被“藏”进了计算时间里。只要通信比计算快,训练就不额外等待——这是所有并行训练框架追求的理想状态。
  1. 计算时间 $T_{\text{计算}}$GPU 真正执行矩阵乘法等算子的耗时,比如 50 毫秒。
    T计算=50 msT_{\text{计算}} = 50 \text{ ms}
  2. 通信时间 $T_{\text{通信}}$梯度传输与同步的耗时,比如 30 毫秒。
    T通信=30 msT_{\text{通信}} = 30 \text{ ms}
  3. 重叠后的总时间流水线并行后,两个环节同时进行,总时间取两者较大值,而不是简单相加。
    T重叠=max⁡(50,30)=50 msT_{\text{重叠}} = \max(50, 30) = 50 \text{ ms}

故障排障实践:交警出警

集群网络的故障千奇百怪:光纤头脏了导致 CRC 错误(数据在传输中被“涂改”)、光模块老化导致速率降级、交换机固件 bug 导致偶发丢包、某块网卡的缓冲区异常导致慢节点。其中最难缠的是长尾效应——AllReduce 是集体操作,所有人必须等最慢的那个人到齐才能进入下一步。一个龟速节点就像高速上的一辆慢车,整条车队的通行效率都被它拉低。

排障的思路和交警处理事故一样:先看整体再查局部,采用二分排除法。第一步确认是不是网络问题(对比同集群其他作业的运行速度);第二步定位是哪个区(按机柜、交换机分段测试);第三步锁定是物理层还是协议层(查链路 CRC、光功率、收发包统计)。常用的工具链包括:iperf 做两节点间的带宽测试,nvidia-smi 确认 GPU 状态,交换机命令行查端口丢弃计数,以及 NCCL 自带的通信测试程序。

判断集群是否被“慢车”拖累,可以计算节点间的速度均衡度:

会排障,才算真正读懂了这座算力城市的交通网。从修路、调度、治堵到排障,一条完整的知识链就此打通。

E=T最慢节点T平均节点\displaystyle E = \frac{T_{\text{最慢节点}}}{T_{\text{平均节点}}}
$E$ 越接近 1,说明所有节点速度均匀;$E$ 明显大于 1,说明存在长尾节点,需要重点排查。
  1. 单节点耗时 $T_i$每个 GPU 完成一轮迭代的总时间,包含计算与等待。
    Ti=T计算+T通信T_i = T_{\text{计算}} + T_{\text{通信}}
  2. 平均耗时 $T_{\text{平均}}$全体节点耗时的算术平均,代表集群的普遍节奏。
    T平均=1N∑i=1NTiT_{\text{平均}} = \frac{1}{N}\sum_{i=1}^{N}T_i
  3. 长尾系数 $E$最慢者与平均值的比值。当某个节点明显偏慢时,$E$ 会显著偏离 1。
    E=max⁡(Ti)T平均E = \frac{\max(T_i)}{T_{\text{平均}}}

AI 应用场景

千卡大模型训练集群的网络规划

阶段:算力集群规划与建设

解决的问题:传统做法按机房经验随意选型,经常出现上行带宽不足,导致 AllReduce 成为训练瓶颈、GPU 利用率长期低于 30%。按胖树拓扑规划并以收敛比 1:1 组网,从源头保证“路网不堵”。

具体案例:某公司要训练 700 亿参数模型,规划 512 张 H800。网络架构师按叶脊架构设计:GPU 接入叶交换机,叶交换机全连脊交换机,采用 400G RoCE 网络,收敛比严格 1:1,并在调度层做拓扑感知放置,把通信密集的作业放在同一叶下。

大模型训练的通信瓶颈调优

阶段:训练性能调优

解决的问题:训练时 GPU 利用率只有 45%,profiling 发现 AllReduce 耗时占每轮迭代的 40%。通过计算与通信重叠、梯度压缩等手段,把通信时间藏进计算时间里。

具体案例:PyTorch 训练中开启梯度桶合并与异步通信,配合 FSDP 的参数预取,并使用 NCCL 的拓扑探测结果确认环形算法路径;再对 FP16 梯度做 8 倍压缩,GPU 利用率从 45% 提升到 78%。

集群网络故障应急排查

阶段:集群运维与监控

解决的问题:训练 loss 曲线异常波动,用户怀疑代码有 bug。运维按“先应用后网络、先本机后对端、先物理后逻辑”的二分流程,快速定位到一根劣化光纤导致的偶发丢包。

具体案例:SRE 收到告警后,先用 iperf 对可疑节点逐段测速,发现跨机柜带宽只有正常值的 60%;再查交换机端口统计,CRC 错误计数持续增长,确认是物理链路问题,更换光模块后带宽恢复,训练收敛恢复正常。

Python 演示

python64 行
"""环形 AllReduce 模拟: 4 个 GPU 组成环, 在集群网络上求梯度之和. """  class RingAllReduce:    """模拟环形拓扑上的集合通信.     chunks[gpu] 是 GPU 本地保存的分片列表, 每个分片是一个数字列表.    每一轮每个 GPU 只和相邻 GPU 通信一次, 总计 2*(N-1) 步.    """     def __init__(self, num_gpus, chunk_size):        self.n = num_gpus        self.size = chunk_size        stride = num_gpus * chunk_size        self.chunks = [            [[g * stride + c * chunk_size + j for j in range(chunk_size)]             for c in range(num_gpus)]            for g in range(num_gpus)        ]        self.comm_count = 0     def _next(self, gpu):        return (gpu + 1) % self.n     def _send_add(self, sender, chunk_id):        """sender 把分片发给下一个 GPU, 对方做逐元素累加."""        self.comm_count += 1        nxt = self._next(sender)        src = self.chunks[sender][chunk_id]        dst = self.chunks[nxt][chunk_id]        self.chunks[nxt][chunk_id] = [a + b for a, b in zip(dst, src)]     def _send_copy(self, sender, chunk_id):        """sender 把完整分片复制给下一个 GPU."""        self.comm_count += 1        nxt = self._next(sender)        self.chunks[nxt][chunk_id] = self.chunks[sender][chunk_id][:]     def run(self):        n = self.n        # 阶段一: scatter-reduce, 分片沿环累积, 每人得到一个完整和        for r in range(n - 1):            for gpu in range(n):                self._send_add(gpu, (gpu - r) % n)        # 阶段二: all-gather, 完整分片沿环广播给所有 GPU        for r in range(n - 1):            for gpu in range(n):                self._send_copy(gpu, (gpu + 1 - r) % n)        return self.chunks  def main():    cluster = RingAllReduce(num_gpus=4, chunk_size=3)    chunks = cluster.run()    print("总通信跳数:", cluster.comm_count)    for gpu in range(cluster.n):        flat = []        for chunk in chunks[gpu]:            flat.extend(chunk)        print("GPU%d: %s" % (gpu, flat))  if __name__ == "__main__":    main()
目的:在纯 Python 里模拟环形 AllReduce,验证“每个 GPU 只和邻居通信、最终所有人都拿到相同梯度总和”的通信原理。
  1. self.chunks每个 GPU 本地保存的分片列表,模拟显存中的梯度数据。
  2. [[g * stride + c * chunk_size + j for j in range(chunk_size)] ...]初始化时让不同 GPU、不同分片的值互不相同,便于最后验证结果正确。
  3. self._send_add(gpu, (gpu - r) % n)第 r 轮,GPU gpu 把自己的第 (gpu-r)%n 个分片传给下游并累加,模拟一跳网络传输。
  4. self.chunks[nxt][chunk_id] = [a + b for a, b in zip(dst, src)]接收方把收到的分片逐元素累加进自己的对应分片。
  5. self._send_copy(gpu, (gpu + 1 - r) % n)all-gather 阶段把完整分片沿环复制,让每个人最终都拿到全部结果。
  6. if __name__ == "__main__":提供可执行入口,直接运行即可看到 4 个 GPU 收敛到相同结果。

常见误区

误区“把网卡从 200G 升级到 400G,通信时间应该减半,训练速度自然翻倍。”

正解通信时间 = 数据量/带宽 + 时延 × 次数。传输大块梯度时带宽确实主导,但小消息密集的集合通信中,时延和启动开销占比很高。这时加带宽就像把高速公路修得更宽,可快递员每 1 公里就要过一个红绿灯,省下的时间微乎其微。要先用 profiling 确认瓶颈在带宽还是时延,再对症下药。

为何常见:直觉把“带宽”当成唯一指标,忽略了通信次数和固定时延开销。

误区“胖树有那么多并行路径,流量会自动均匀分散,所以永远不会堵。”

正解胖树只提供“容量”,不保证“均衡”。哈希分流可能把多条大象流(大流量连接)打进同一条链路,形成局部热点;AllReduce 本身就是多对一的同步流量,天然容易撞车。好比立交桥修得再宽,早晚高峰所有车都挤向同一个出口,照样堵死。

为何常见:把“容量充足”误当成“永不拥堵”,忽略了流量分布的随机性。

误区“做 AI 集群必须上 InfiniBand,以太网技术落后,跑不动大模型。”

正解RoCE(以太网上的 RDMA)在 400G 时代性能已接近 IB,而且设备兼容性好、运维成本低;小规模集群或对成本敏感的场景,以太网完全够用。好比高铁虽快,但短途通勤骑电动车更灵活实惠——选型要看规模、预算和团队维护能力。

为何常见:看到头部厂商的案例多用 IB,把“特定场景最优”推广成了“永远最优”。

误区“只要交换机开了 PFC 和 ECN,应用层就不用管,训练自然不会卡。”

正解拥塞控制需要多层协同:NCCL 会根据 ECN 反馈调整发送节奏,调度系统要避免流量热点,应用侧还要做梯度压缩和通信重叠。交换机只是“红绿灯”,真正让城市不堵的是交通规划、错峰出行和司机的配合。只依赖交换机,PFC 还可能引发队头阻塞,反而拖慢全集群。

为何常见:把网络设备当成万能开关,忽略了端到端的系统性协作。

误区“有一台 GPU 慢了,最多浪费它自己的算力,其他 GPU 照常跑。”

正解AllReduce 是同步集体操作,必须等最慢的节点到齐才能进入下一步。一个龟速节点会把整个集群拖到同样的慢速,GPU 利用率集体下滑,这就是长尾效应。好比一条单车道的路,前面一辆龟速车,后面所有车都只能跟着慢慢挪。

为何常见:用单机思维理解分布式系统,忽略了同步屏障的存在。

面试题

Q1. 训练大模型时,GPU 之间需要频繁交换的数据主要是?

单选题 · easy

  • A.训练样本的原图数据
  • B.梯度与模型参数← 正确答案
  • C.日志与监控信息
  • D.用户的提问文本

答案:B。分布式训练每轮迭代后要把各 GPU 算出的梯度做 AllReduce,得到的总梯度还要更新参数,因此梯度与模型参数是网络上的“主力包裹”。原始样本通常只在数据加载阶段传输一次,日志和提问文本更不是高频通信内容。

Q2. 集群网络中“带宽”最贴近的比喻是?

单选题 · easy

  • A.高速公路的车道数← 正确答案
  • B.红绿灯的等待时间
  • C.快递员的骑车速度
  • D.地图上的路线长度

答案:A。带宽决定单位时间内能传输多少数据,对应道路的车道数;红绿灯等待对应时延,骑车速度对应介质传播速率,路线长度则对应物理距离。四个选项里只有车道数描述了“容量”这一维度。

Q3. 胖树拓扑中“收敛比等于 1”表示什么?

单选题 · mid

  • A.上行带宽远大于下行带宽
  • B.下行带宽远大于上行带宽
  • C.上下行带宽完全相等← 正确答案
  • D.网络完全不会发生拥塞

答案:C。收敛比 = 下行带宽 / 上行带宽,等于 1 表示上下行一样宽,是无收敛网络。它只描述容量配比,不保证不拥塞——流量分布不均照样会堵。A、B 分别是收敛比远小于或大于 1 的情形,D 把容量与拥塞混为一谈。

Q4. 环形 AllReduce 的两个阶段依次是?

单选题 · mid

  • A.广播与归约
  • B.散射归约与全收集← 正确答案
  • C.全收集与散射归约
  • D.点对点与集合通信

答案:B。环形 AllReduce 先做 scatter-reduce(把数据切片沿环累加,每人得到一片完整和),再做 all-gather(把完整和沿环复制给所有人)。顺序不能颠倒,先有归约结果才谈得上收集。A 是另一类通信原语的组合,D 是通信方式的分类而非阶段。

Q5. 下列哪些属于集群网络的拥塞控制手段?

多选题 · mid

  • A.ECN 显式拥塞标记← 正确答案
  • B.PFC 优先级流控← 正确答案
  • C.提升 CPU 主频
  • D.多路径负载均衡← 正确答案

答案:ABD。ECN 通过交换机打标通知发送方降速,PFC 通过暂停帧强制上游停发,多路径负载均衡让流量分散到多条链路上,三者都是治堵手段。CPU 主频与网络拥塞没有直接关系,属于无关干扰项。

Q6. Incast 拥塞的典型触发场景是?

单选题 · mid

  • A.单 GPU 顺序读写本地磁盘
  • B.多 GPU 同时向一个目标发送数据← 正确答案
  • C.单个 GPU 长时间空闲等待
  • D.网络线缆被意外拔出

答案:B。Incast 指多对一的流量汇聚:多个 GPU 同时把梯度发给同一个交换机端口,出端口来不及转发,队列迅速堆积。单卡读写磁盘不经过网络,单卡空闲是计算等待而非拥塞,线缆断开属于物理故障。

Q7. 以下哪些方式能有效降低分布式训练的通信开销?

多选题 · hard

  • A.梯度压缩减少传输数据量← 正确答案
  • B.日志打印频率调低
  • C.计算通信重叠隐藏时延← 正确答案
  • D.拓扑感知的调度放置← 正确答案

答案:ACD。梯度压缩直接减小公式中的 D,计算通信重叠把通信藏进计算时间,拓扑感知调度把高频通信放在同一交换机下减少跨层绕行。日志打印与训练通信无关,降低频率只减少磁盘 IO 和文本输出。

Q8. 故障排查中“长尾效应”指的是?

单选题 · easy

  • A.网络线缆出现物理损坏
  • B.个别节点拖慢整体训练← 正确答案
  • C.交换机固件版本过低
  • D.训练数据分布不均衡

答案:B。长尾效应指个别慢节点成为同步屏障,把整个集群拖慢,是分布式训练最常见的性能杀手。线缆损坏是物理故障,固件过低是配置问题,数据不均衡是数据侧问题,都不直接构成“长尾”。

Q9. 排查集群网络性能下降时,常用的手段有哪些?

多选题 · mid

  • A.带宽测试工具 iperf← 正确答案
  • B.查看链路 CRC 错误计数← 正确答案
  • C.修改训练超参数
  • D.检查收包统计与丢包← 正确答案

答案:ABD。iperf 能测两节点间的实际带宽,CRC 错误计数反映物理链路质量,收包统计和丢包计数定位协议层问题,三者构成完整排障链。修改训练超参数与网络故障排查无关,属于调优手段而非诊断手段。

Q10. 小包密集的集合通信场景中,最主要的性能瓶颈通常是?

单选题 · extreme

  • A.网络带宽容量不足
  • B.通信时延与启动开销← 正确答案
  • C.磁盘读写速度过慢
  • D.GPU 显存容量太小

答案:B。当消息体很小(几 KB 甚至更小)时,传输时间 D/B 几乎可以忽略,而每次通信的固定时延 α 和协议启动开销占据主导。这就像包裹很小但每趟出车都要办 10 分钟手续,提升车道宽度毫无意义,减少出车次数或缩短手续时间才是关键。磁盘和显存与网络通信无关。