如果把分布式训练比作一家开遍全城的连锁奶茶店:每个 GPU 分店都在用自己的顾客数据观察“哪款配方该调整”,得出成千上万条细小的调整建议——这就是梯度。为了让所有分店保持同一套配方,它们必须把这些建议汇报给总部,总部再统一更新标准配方。可问题来了:分店之间的“电话专线”只有那么粗,而模型越大,报告越厚。于是大家大量时间不是花在干活上,而是耗在“排队等电话”上——这就是分布式训练的通信瓶颈。 本文要讲的是两种让“汇报变轻”的武功:梯度稀疏化——只汇报最重要的几条改动;梯度量化——把 0.12345678 简写成 0.12。它们背后还有一本神奇的“旧账本”——误差反馈,保证被暂时压下的信息不会真正丢失。读完之后,你就会明白:在大模型训练里,如何把“电话占线”的等待时间砍掉一个数量级。

岗位关联

通信效率优化是训练框架工程师手里性价比最高的杠杆:模型越大、卡数越多,一倍的通信优化往往能换来数倍的训练提速。理解梯度压缩与稀疏化,是你从“会跑训练”进阶到“会调优训练”的关键一步。

目录
  1. 可视化演示
  2. 通信瓶颈成因
  3. 压缩核心思想
  4. 梯度稀疏化
  5. 误差反馈机制
  6. 梯度量化压缩
  7. 工程落地策略
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

通信瓶颈成因

分店越来越多,报告越来越厚。奶茶店开到了 64 家分店,每晚每家都要把“今日观测到的口味偏差”——整整几千条——一字不差地念给总部听。电话专线的粗细是固定的,念完一家就要 3 小时,轮完 64 家天都亮了。店里的活儿其实半小时就干完了,剩下的全在等电话。

分布式训练一模一样。每个 GPU 算完自己的梯度后,都要通过“互相广播汇总”的集合通信(AllReduce)或参数服务器把梯度同步给其他人。梯度的总量 = 模型参数量 × 每个参数占用的字节数。一个 1750 亿参数的大模型,FP32 梯度一轮就有约 700GB,而常见的跨机带宽只有 25~100 Gbps。算力每年翻一番,带宽的增速却慢得多——这就是“算力带宽剪刀差”。

一次迭代的总时间可以拆成“算”和“传”两块:计算时间由显卡算力决定,通信时间则由数据量和带宽决定。N 卡做 AllReduce 时,通信量约为 2×(N−1)/N×模型大小,接近 2 倍的模型大小。

当模型大到 700GB、一轮通信要 3 秒而计算只要 0.2 秒时,94% 的时间都耗在“等电话”上。想让训练快起来,最划算的办法不是换更粗的电话线——升级带宽太贵——而是让报告变薄。这就是下一节的压缩思想。

Titer≈Tcalc+2×SmodelBnetT_{\text{iter}} \approx T_{\text{calc}} + \frac{2 \times S_{\text{model}}}{B_{\text{net}}}
通俗说:一次迭代的时间 ≈ 干活时间 + 打电话时间;电话时间由模型大小和带宽决定。
  1. T_iter(迭代总耗时)完成一轮“前向 + 反向 + 梯度同步 + 参数更新”的总墙钟时间。
    TiterT_{\text{iter}}
  2. T_calc(计算耗时)本地前向与反向传播的时间,由显卡算力决定,通常很短。
    TcalcT_{\text{calc}}
  3. S_model(模型大小)等于参数量乘以每参数字节数,它决定了每轮要同步多少数据。
    Smodel=P×bS_{\text{model}} = P \times b
  4. B_net(网络带宽)单位字节/秒;系数 2 来自 AllReduce 两阶段(reduce 与 broadcast)的开销。
    2×SmodelBnet\frac{2 \times S_{\text{model}}}{B_{\text{net}}}

压缩核心思想

聪明的分店经理想通了:总部听报告不是为了逐字核对,而是为了抓住“大方向”。与其把几千条全念完,不如做一份“重点摘要”。只要摘要体现了所有改动里最重要的那部分,总部的配方更新就不会跑偏。

在训练里,这份“摘要”就叫梯度压缩。它不是无损 zip,而是有损压缩:牺牲一点梯度精度,换取通信时间的大幅下降。衡量它的核心指标是压缩率 R = 原始通信量 / 压缩后通信量。比如 1.6GB 压到 0.2GB,R = 8,通信时间直接除以 8。

所有压缩方法都遵循同一个权衡:压缩率越高,每轮传达的“有效信息”越少,收敛可能变慢;但只要配合巧妙的补偿机制,就能在大部分场景做到“几乎不损失收敛速度”。主流的通信压缩方法分两大类:稀疏化——只保留最重要的一部分分量;量化——用更少的比特表示每个分量。两者可以叠加使用。

压缩思想的精髓是“少而精”:报告薄了,电话时间短了,总部收到的核心信息却没少多少。接下来的三节,我们分别看两种主流压缩,以及那本关键的“旧账本”。

R=SfullScomp,Scomm=SfullRR = \frac{S_{\text{full}}}{S_{\text{comp}}}, \qquad S_{\text{comm}} = \frac{S_{\text{full}}}{R}
压缩率衡量传输变薄了多少倍;实际通信量 = 全量 ÷ 压缩率,两者互为倒数。
  1. S_full(全量通信量)不做任何优化时每轮要同步的梯度字节数。
    Sfull=P×bS_{\text{full}} = P \times b
  2. S_comp(压缩后通信量)经过量化或稀疏化后实际传输的字节数。
    ScompS_{\text{comp}}
  3. R(压缩率)两者之比,R = 8 表示用 1/8 的流量完成同样的同步。
    R=SfullScompR = \frac{S_{\text{full}}}{S_{\text{comp}}}
  4. S_comm(实际通信量)由全量除以压缩率得到,压缩率越大通信时间越短。
    Scomm=SfullRS_{\text{comm}} = \frac{S_{\text{full}}}{R}

梯度稀疏化

稀疏化就是“只念最重要的 K 条”。分店经理翻着几千条的清单,挑出偏差最大的 K 条改动念给总部:今天珍珠加量、糖度减半、茶底换新……其余几十条细微波动,暂且不报。

在梯度里,“偏差大”用绝对值衡量:把梯度的每个分量按 |g_i| 从大到小排序,保留最大的 K 个,其余强行置 0。这就是 Top-K 稀疏化,也是工业界 DGC(深度梯度压缩)方案的核心操作。稀疏度 s = K/N 表示保留比例,通信量从 N 个分量降到 K 个分量。

Top-K 的直觉依据是:大梯度贡献了绝大部分的更新方向和损失下降,小梯度合力虽大但单条价值低。实际中 K 往往取总量的 0.1%~10%,配合索引传输(告诉服务器保留的是哪几个位置),通信量可下降 10~100 倍。

只报大事自然省电话,但分店经理心里一直有个疙瘩:那些“小事”真的就不用管了吗?它们会不会在某天变成大事?——这个问题的答案,就是下一节的“旧账本”。

g~i={gi,i∈TopK⁡(∣g∣,K)0,其他\tilde{g}_i = \begin{cases} g_i, & i \in \operatorname{TopK}(|g|, K) \\ 0, & \text{其他} \end{cases}
Top-K 就是“只挑最大的 K 个梯度发出去”,其余一律置 0 不发,通信量立刻降为原来的 K/N。
  1. g_i(第 i 个梯度分量)模型第 i 个参数对应的梯度,代表这个参数该往哪个方向调多少。
    gi=∂L∂wig_i = \frac{\partial \mathcal{L}}{\partial w_i}
  2. |g|(绝对值序列)把每个分量的绝对值拿出来比较,衡量“这条改动有多重要”。
    ∣g∣=(∣g1∣,∣g2∣,…,∣gN∣)|g| = (|g_1|, |g_2|, \dots, |g_N|)
  3. TopK(|g|, K)(取前 K 大)返回绝对值最大的 K 个分量的下标集合。
    TopK⁡(∣g∣,K)=arg⁡max⁡∣S∣=K∑i∈S∣gi∣\operatorname{TopK}(|g|, K) = \arg\max_{|S|=K} \sum_{i \in S} |g_i|
  4. 条件分支(保留或清零)命中集合的梯度原样发送,未命中者置 0 不发,通信量降为原来的 K/N。
    g~i={gi,i∈S0,i∉S\tilde{g}_i = \begin{cases} g_i, & i \in S \\ 0, & i \notin S \end{cases}

误差反馈机制

分店经理的秘密武器是一本“旧账本”。每晚汇报完,他把没念出来的每一条改动都记在账上。第二天,他先翻开旧账:把上一天的“漏报”和今天的“新改动”加在一起,凑成一份新清单,再挑 Top-K 念出去。于是,一条小改动不是被遗忘,而是被“攒”到它足够大、够格进 Top-K 的那一天。

这就是误差反馈(Error Feedback)。标准做法是:第 t 轮先算真实梯度 g_t,把上一轮残留的误差 e_t 加进去得到“待压缩梯度”;压缩发送后,没发出去的部分成为新的误差,留在本地。

误差反馈为什么重要?没有它,Top-K 是“有偏压缩”,小梯度被系统性丢弃,训练可能停滞甚至震荡;有了它,压缩误差不会累积,理论上(Stich et al., 2018)Top-K 加误差反馈能达到与全量 SGD 相同阶的收敛速率。这相当于让“丢失的信息”以另一种形式回流到通信流中。

“旧账本”看似多此一举,却是稀疏化的灵魂。它让“只报大事”不再有信息损失:每一分梯度,或早或晚都会被送到总部。这也是为什么“稀疏化 + 误差反馈”成为工业界压缩方案的标准套餐。

et+1=et+gt−g~t,g^t=gt+ete_{t+1} = e_t + g_t - \tilde{g}_t, \qquad \hat{g}_t = g_t + e_t
旧账 = 想发的 − 实际发的;下一轮先补旧账再压缩,保证每条梯度迟早被发送。
  1. e_t(上轮旧账)上一轮想发而没发出去的梯度残差,存在本地。
    ete_t
  2. g_t(本轮真实梯度)由本地数据算出的完整梯度。
    gtg_t
  3. hat_g_t(补账后梯度)真实梯度加上旧账,作为本轮真正要压缩的对象。
    g^t=gt+et\hat{g}_t = g_t + e_t
  4. tilde_g_t(压缩发送量)对补账后梯度做 Top-K(或量化)后实际发出的部分。
    g~t=C(g^t)\tilde{g}_t = C(\hat{g}_t)
  5. e_{t+1}(新账)想发的减实际发的,差额记入下一轮。
    et+1=g^t−g~te_{t+1} = \hat{g}_t - \tilde{g}_t

梯度量化压缩

第一条路是“少报几条”,第二条路是“每条报短一点”。分店经理发现,报告里的数字都长得吓人:0.12345678、-0.00003421…… 总部根本不需要这么精确,于是约定:所有数字统一简化成整数上报。报告薄了一大半,电话时间也短了一大半。

梯度量化把 32 位浮点(FP32)梯度映射到低比特整数(如 INT8、INT4)。做法是“缩放 + 四舍五入 + 截断”:先看这一批梯度里绝对值最大的数,定一个缩放因子 s,让全部值映射到整数区间;传输时只传整数;收到后用同一个 s 放大还原。

量化是有损的,但误差上界清晰:每个分量的还原误差不超过半个量化格。配合误差反馈和逐层、逐张量动态缩放,量化可以和全精度收敛几乎持平——1-Bit Adam 甚至能把梯度压到每分量 1 bit,精度损失极小。压缩倍率方面,FP32 到 INT8 立省 4 倍,INT4 省 8 倍,且无需传输索引,比稀疏化更省事。

量化是“简写”,稀疏化是“摘要”——两者经常组合使用:先挑出最重要的 K 条,再把每条用低比特写。电话线上流动的消息,从此又短又少。不过,纸面上省下的流量,要真正变成墙钟时间,还得看工程的功夫。

g~=s⋅clip⁡ ⁣(⌊gs⌉, −2b−1+1, 2b−1−1),s=max⁡∣g∣2b−1−1\tilde{g} = s \cdot \operatorname{clip}\!\left(\left\lfloor \frac{g}{s} \right\rceil,\ -2^{b-1}+1,\ 2^{b-1}-1\right), \qquad s = \frac{\max |g|}{2^{b-1}-1}
量化把浮点梯度变成 b 位整数:缩放、取整、截断三步,误差上界约等于半个量化格。
  1. s(缩放因子)把浮点值域压到 b 比特整数可表示的范围内。
    s=max⁡∣g∣2b−1−1s = \frac{\max |g|}{2^{b-1}-1}
  2. g/s(归一化)把梯度除以缩放因子,变成“多少个量化格”。
    gs\frac{g}{s}
  3. round(四舍五入)取整到最近的整数,产生有界量化误差。
    ⌊gs⌉\left\lfloor \frac{g}{s} \right\rceil
  4. clip(截断)把越界的值限制在 b 比特整数上下界内,防止溢出。
    clip⁡(x, −2b−1+1, 2b−1−1)\operatorname{clip}(x,\ -2^{b-1}+1,\ 2^{b-1}-1)
  5. s 乘(反缩放)乘回缩放因子还原量纲,得到近似梯度,误差不超过 s/2。
    g~=s⋅q\tilde{g} = s \cdot q

工程落地策略

光把报告变薄还不够。分店经理还琢磨:电话占用期间,店里的活儿能不能照干?于是他定了个规矩:不等到晚上统一点名,而是每做完一项改动就立刻打电话报一项——活儿和电话穿插进行。账单上,等待电话的时间几乎隐形了。

这就是通信与计算重叠:把梯度按层次切成多个“桶”(bucket),反向传播算完一层就压缩一层、发送一层,等全部算完时通信也快结束了。主流框架(PyTorch DDP、DeepSpeed)正是这样实现 AllReduce 流水线化的。

还有两个工程细节容易被忽略。第一,稀疏化省了“值”却多了“索引”:需要告诉对方保留的是哪 K 个位置。若索引编码不当,K 很小时索引开销反而占大头,因此要用 1 字节短整型、块稀疏或相对偏移编码。第二,梯度累积(攒几轮发一次)可以进一步降低通信频率,适合带宽极低的场景。实际选型时,还要在压缩率、收敛速度、实现复杂度之间权衡,并用 A/B 测试验证端到端收益。

至此,奶茶店的汇报体系全面升级:只报重点(稀疏化)、数字简写(量化)、旧账本补漏(误差反馈)、边干边报(重叠)。这套组合拳,正是今天大模型训练框架里通信效率优化的标准姿势。

Ssparse=K×(bv+bi),bi≪bvS_{\text{sparse}} = K \times (b_v + b_i), \qquad b_i \ll b_v
稀疏通信的真实流量 = 保留个数 ×(值字节数 + 索引字节数),索引编码不能省。
  1. K(保留分量数)每轮发送的 Top-K 梯度个数,由稀疏度决定。
    K=s×NK = s \times N
  2. b_v(值的字节数)每个梯度值本身占用的字节;用低比特表示能进一步降低。
    bv=4 (FP32)或1 (INT8)b_v = 4 \ (\text{FP32}) \quad \text{或} \quad 1 \ (\text{INT8})
  3. b_i(索引的字节数)标识“这个梯度是第几个参数”的编号,必须用紧凑编码。
    bi=1∼4b_i = 1 \sim 4
  4. S_sparse(稀疏通信总量)实际流量等于 K 乘以(值字节数 + 索引字节数)。K 很小时,索引占比不可忽略。
    Ssparse=K×(bv+bi)S_{\text{sparse}} = K \times (b_v + b_i)

AI 应用场景

千亿参数大模型训练的机间通信压降

阶段:分布式训练框架 / 模型训练

解决的问题:传统方式下,每步迭代都要全量 AllReduce 同步数百 GB 梯度,哪怕 800Gbps 带宽也要数秒,训练墙钟时间大部分耗在等待上。AI 方案是在 AllReduce 前对梯度做 Top-K 稀疏化加误差反馈,或者 8-bit 量化,把通信量降一个数量级。

具体案例:某 1750 亿参数模型在 64 卡 A100 集群上训练,启用 DeepSpeed 的梯度压缩(稀疏度 10% + 误差反馈)后,机间通信量从每轮约 720GB 降到 75GB,单步墙钟时间从 4 秒缩到 1.2 秒,收敛曲线几乎不变。

云上低成本多机 CV 模型训练

阶段:数据并行训练调优 / MLOps

解决的问题:云厂商普通实例之间的带宽只有 25Gbps,ResNet 这类模型梯度虽然不大,但卡多时同步频繁,跨机通信成为短板;升级带宽则成本剧增。AI 方案只压缩跨机的那一部分流量。

具体案例:某公司用 4 机 16 卡训练检测模型,机间通信启用 INT8 量化加残差补偿,把跨机通信量压缩 4 倍,整体训练时间减少约 35%,云账单明显下降。

联邦学习跨设备上行流量压缩

阶段:联邦学习 / 边缘训练

解决的问题:联邦学习每轮都要把客户端本地梯度传到中心服务器,手机等移动设备上行带宽小、流量贵。AI 方案让客户端只上传 Top-K 稀疏梯度,并用误差反馈保证本地残差不会丢失。

具体案例:跨 1000 台手机做输入法个性化训练,每轮上行流量从 40MB 降到 4MB,最终模型精度与全量上传基本持平。

Python 演示

python42 行
import numpy as np  def topk_sparsify(grad, k, residual):    # 误差反馈: 旧账先加到本轮的梯度上    comp = grad + residual    flat = comp.reshape(-1)    # 找到绝对值第 k 大的数作为阈值    threshold = np.partition(np.abs(flat), -k)[-k]    mask = np.abs(flat) >= threshold    sparse = np.where(mask, flat, 0.0)    # 没发出去的部分记入新账    new_residual = comp - sparse    return sparse.reshape(grad.shape), new_residual  def run(epochs=60, n_params=1000, k=100, lr=0.1, seed=42):    np.random.seed(seed)    optimal = np.random.randn(n_params)    w_full = np.zeros(n_params)    w_sparse = np.zeros(n_params)    residual = np.zeros(n_params)    for _ in range(epochs):        # 全量梯度更新作为基准        g_full = w_full - optimal        w_full -= lr * g_full        # 稀疏压缩加误差反馈更新        g_sparse = w_sparse - optimal        compressed, residual = topk_sparsify(g_sparse, k, residual)        w_sparse -= lr * compressed    err_full = float(np.linalg.norm(w_full - optimal))    err_sparse = float(np.linalg.norm(w_sparse - optimal))    full_bytes = epochs * n_params * 4    sparse_bytes = epochs * k * 5   # 4 字节值 + 1 字节索引    return err_full, err_sparse, full_bytes / sparse_bytes  if __name__ == "__main__":    ef, es, ratio = run()    print("全量梯度误差:", ef)    print("稀疏加误差反馈误差:", es)    print("通信节省倍数:", ratio)
目的:用一个小型模拟演示“Top-K 稀疏化 + 误差反馈”如何在不明显损失收敛精度的前提下,把通信量压缩约 8 倍。
  1. comp = grad + residual旧账先补上:把上轮没发完的残差加到本轮梯度,再压缩。
  2. threshold = np.partition(np.abs(flat), -k)[-k]用 partition 找第 k 大的绝对值,等价于 Top-K 阈值,比全排序快。
  3. mask = np.abs(flat) >= threshold布尔掩码标出哪些分量“够大”要发。
  4. sparse = np.where(mask, flat, 0.0)保住大梯度、其余清零,成为压缩后的发送量。
  5. new_residual = comp - sparse想发的减实际发的,差额记入旧账,下一轮补发。
  6. compressed, residual = topk_sparsify(g_sparse, k, residual)训练循环里反复执行“压缩 + 记账”。
  7. full_bytes / sparse_bytes估算通信节省:1000 个分量 × 4 字节对比 100 个值 × 5 字节,约 8 倍。

常见误区

误区Top-K 把小数直接扔掉,训练肯定学不到那些方向了,模型会越训越歪。

正解配上误差反馈后,被丢弃的小梯度会累进“旧账本”,累积到足够大时必然被发送,没有信息真正丢失。理论上 Top-K 加误差反馈能保证与全量 SGD 同阶的收敛速率。就像分店经理把每笔琐事都记账,虽然当时没报,但后面总会找补。

为何常见:大家看到“丢弃”二字就本能觉得信息没了,忽略了压缩之后还有一个“补偿机制”。

误区1% 的稀疏度、1-bit 量化,通信省 99%,那一定更香。

正解压缩率过高会让每轮有效更新信息过少,小梯度被长期压制,更新方向偏差变大,需要更多迭代才能收敛,端到端吞吐未必提升。要结合收敛曲线和吞吐做联合评测,而不是只看压缩率。

为何常见:只盯着“通信省了多少”,没有看“训练多花了多少轮”。

误区每次四舍五入都有误差,几千轮算下来误差肯定爆炸。

正解配合误差反馈和逐张量动态缩放,量化误差是有界的;使用随机舍入时量化噪声还是无偏的,误差不会无限累积。0.123456 写成 0.12,差的 0.003456 记入下一次,总会找补。

为何常见:把“单次误差”和“累积误差”混为一谈,忽略了误差反馈的抵消作用。

误区我又不是训练千亿模型,梯度才几百 MB,不用压缩。

正解通信占比取决于“计算时间 / 通信时间”的比值。卡数一多,AllReduce 通信量乘上规模同样增长,小模型跨机训练时通信占比也能超过 50%。实际测试 8 卡小模型在普通云带宽下,压缩收益依然明显。

为何常见:直觉上把问题归因于“模型大”,忘了分布式规模本身也在放大通信量。

误区压了 8 倍,通信时间应该缩到 1/8,那整个训练肯定快 8 倍。

正解通信只是迭代时间的一部分,压缩还带来索引编码、打包、解压的额外开销;当压缩后通信时间短于计算时间时,收益就到顶了。要用 Amdahl 定律看:加速上限取决于通信占比,工程上先 profilng 再做 A/B 测试。

为何常见:把“单一环节压缩”等同于“端到端加速”,忽略了其他环节的开销。

面试题

Q1. 大规模分布式训练中,通信成为瓶颈的根本原因是?

单选题 · easy

  • A.理论带宽远低于算力← 正确答案
  • B.梯度体量随参数量爆炸
  • C.显卡显存容量不足
  • D.数据加载速度太慢

答案:A。带宽受物理和成本限制,增速远慢于算力;梯度同步量又随模型参数线性增长,两点叠加导致通信占比极高。“梯度体量爆炸”只是表象,根本原因是带宽供给跟不上需求。就像电话专线就那么粗,分店报告却越来越厚。

Q2. Top-K 稀疏化按什么标准挑选要发送的梯度分量?

单选题 · mid

  • A.按梯度正负符号
  • B.按参数初始值
  • C.按梯度绝对值大小← 正确答案
  • D.按梯度出现顺序

答案:C。Top-K 用绝对值衡量每条梯度“改动有多大”,绝对值越大说明该参数更新越关键,优先发送。符号只表示方向,初始值与出现顺序都与当前更新强度无关,选它们挑不出“最重要的梯度”。

Q3. 误差反馈(error feedback)的核心作用是什么?

单选题 · mid

  • A.增大训练时的学习率
  • B.直接跳过梯度计算
  • C.减少前向计算开销
  • D.回补丢弃梯度保障收敛← 正确答案

答案:D。误差反馈把没发出去的梯度残差存在本地,下一轮加进新梯度再压缩,使被丢弃的信息最终仍能传达,从而保证稀疏化的收敛性。它和学习的快慢、是否算梯度没有关系,本质是一本“补账本”。

Q4. 不使用误差反馈的 Top-K 稀疏化,在小梯度占比高时通常会出现什么现象?

单选题 · hard

  • A.收敛速度大幅加快
  • B.收敛变慢甚至震荡← 正确答案
  • C.模型精度大幅提升
  • D.训练显存明显下降

答案:B。没有误差反馈时 Top-K 是有偏压缩,大量小梯度被系统性丢弃,梯度方向被扭曲,常见后果是收敛变慢、损失震荡甚至发散。压缩本身也不直接省显存,B 是符合理论分析和实验现象的典型结论。

Q5. 均匀量化到 b 比特时,量化误差的量级主要取决于什么?

单选题 · hard

  • A.值域与量化档位之比← 正确答案
  • B.训练样本的规模
  • C.网络层数的多少
  • D.初始学习率设置值

答案:A。均匀量化的误差上界约为 s/2,s 等于动态范围除以量化档位数,即值域与量化档位之比。比特数越高、值域越小,误差越小;它与样本数量、层数、学习率都没有直接关系。

Q6. 单卡 AllReduce 全量梯度的通信量大约与什么成正比?

单选题 · easy

  • A.训练批次大小数值
  • B.网络层数的平方
  • C.模型参数总量与字节← 正确答案
  • D.训练集总体规模

答案:C。AllReduce 的通信量约等于两倍模型大小,模型大小 = 参数量 × 每参数字节数。批大小、层数平方、数据集规模都不会直接决定梯度同步的流量,只有参数总量和表示字节数是决定项。

Q7. 实现通信与计算重叠的常用做法是什么?

单选题 · mid

  • A.梯度分桶边算边传← 正确答案
  • B.增大每步训练批次
  • C.关掉梯度同步功能
  • D.提高显卡运行主频

答案:A。把梯度按层次切桶,反向传播算完一部分就压缩、发送一部分,让通信与后续计算并行,把等待时间“隐藏”起来。增大批次只是摊薄通信比例,关同步会破坏正确性,提高主频不解决带宽问题。

Q8. 关于 Top-K 稀疏化,下面哪些说法正确?

多选题 · mid

  • A.保留绝对值最大的K个← 正确答案
  • B.丢弃的小梯度直接消失
  • C.稀疏度s等于K除N← 正确答案
  • D.需额外发送位置索引← 正确答案

答案:ACD。Top-K 按绝对值保留最大的 K 个,稀疏度 s = K/N,稀疏传输必须附带索引告诉对方位置。B 错在:配合误差反馈时小梯度不会“消失”,而是记入旧账等待补发。

Q9. 关于误差反馈机制,下面哪些说法正确?

多选题 · extreme

  • A.残差梯度本地累积← 正确答案
  • B.补发后旧账清零← 正确答案
  • C.理论保证稳定收敛← 正确答案
  • D.通信量成倍上升

答案:ABC。误差反馈在本地存残差、被压缩项补发后对应残差清零、在温和假设下有收敛性理论保证。它不会增加通信量——发送的仍是压缩后的同量数据,只是多做了本地减法记账。

Q10. 提升分布式训练通信效率的手段有哪些?

多选题 · easy

  • A.梯度量化压缩← 正确答案
  • B.梯度累积降频← 正确答案
  • C.通信计算重叠← 正确答案
  • D.采用更强显卡

答案:ABC。量化降低每个值的字节数,梯度累积降低通信频率,通信计算重叠把等待时间隐藏,三者都能直接改善通信效率。换更强的显卡提高的是算力上限,并不解决带宽瓶颈。