你有没有在奶茶店排队等过一杯“整批制作”的奶茶?老式门店的规矩是:先接满 10 张订单,然后所有人一起去泡茶,泡完 10 杯,再一起加料,加完料再一起封口。每一道工序都在等“大部队”,中间有大把时间闲着玩手机。今天要讲的 PipeDream,是一位精明的店长——它把奶茶店改成了“接一杯、做一杯、传一杯”的接力模式:泡茶师傅做好一杯立刻传给加料师傅,自己马上接下一杯。整条流水线像上了润滑油一样不停转,效率自然高出一大截。 这套思路在 AI 大模型训练里叫异步流水线并行。模型太大放不进一张显卡,就把模型切成好几段,每张显卡负责一段,像一条工厂流水线。传统的 GPipe 是“整批同步”:所有批次做完前向传播,才能集体开始反向传播,导致大量 GPU 干等(这就是著名的“流水线气泡”)。而 PipeDream 让每张显卡各干各的、做完就往后传,配合权重版本管理保证训练正确性,并提出 1F1B 调度控制显存用量,真正把流水线变成了“永不停歇的传送带”。

岗位关联

对 AI 从业者而言,PipeDream 是分布式训练进阶的必修课。掌握异步流水线、权重版本与 1F1B 调度,你就能在 GPU 集群上大幅提升大模型训练吞吐,为方案选型和性能调优打下坚实基础。

目录
  1. 可视化演示
  2. 同步之痛
  3. 异步执行
  4. 权重版本
  5. 1F1B调度
  6. 工程实现
  7. 方案选型
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示PipeDream异步流水线的三大核心:异步执行消除气泡、1F1B调度策略的Gantt图,以及权重版本管理保证异步训练正确性。

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

异步流水线执行 前向(F)和反向(B)在不同阶段异步流动,消除流水线气泡 相比GPipe同步方式,异步执行显著提升GPU利用率 Async(F_i) ≠ Sync(F_all → B_all) 异步执行使流水线持续满载

同步之痛

想象那家老式奶茶店的“整批制作”规矩:店员必须集齐 10 张订单,才把 10 杯一锅端地泡茶。于是泡茶师傅忙的时候手忙脚乱,加料师傅却靠在柜台上刷手机。等 10 杯茶都泡好了,加料师傅才开始忙,泡茶师傅又闲下来。所有人都有一半时间在干等。GPipe 同步流水线就是这个德行。

GPipe 把一个大 batch 切成 m 个 micro-batch,让它们像小杯子一样依次穿过所有阶段的“前向工序”,等全部穿完,再集体开始“反向工序”。问题是:前向阶段,后面的流水线工位在等;反向阶段,前面的工位在等。这段等的时间,就是分布式训练圈大名鼎鼎的流水线气泡(bubble)。

气泡有多大?有一个简洁公式可以描述:

所以 GPipe 陷入两难:想减少气泡就得把 batch 切得很碎,但切得越碎显存越紧张。回到奶茶店,老式规矩也不是完全没用——它简单、不会出错,只要订单够多、店员够闲,偶尔等一等也能接受。可在大模型训练里,GPU 每一秒的闲置都是真金白银,这就给 PipeDream 的异步革命留下了舞台。

Bubble=p−1m+p−1\displaystyle \text{Bubble} = \frac{p-1}{m+p-1}
流水线阶段数越多、micro-batch 数量越少,气泡占比越高,GPU 闲置越严重。
  1. 分子 p-1$p$ 是流水线阶段数。启动时只有第一个阶段在干活,后面 $p-1$ 个阶段全部空闲,相当于第一杯奶茶还没传到下个工位时,后面都在干等。
  2. 分母 m+p-1$m$ 是 micro-batch 数量,$p-1$ 是流水线从启动到排空额外花费的“空转步数”,两者相加是完成全部任务的总时间步。
  3. 整体计算用总空闲除以总时间,得到气泡占比。当 $m$ 很大时,公式趋向于 0,气泡被“淹没”;但 $m$ 太大,所有 micro-batch 的中间结果都要占着显存,又会压垮显卡。

异步执行

新店长来了,她拍板改规矩:“来一杯做一杯,做完立刻往后传!”接单员接一杯,泡茶师傅做一杯,传给加料师傅,自己马上接下一单。不再有“集齐 10 杯”的等待,整家店像上了发条的传送带。PipeDream 的核心正是这种异步执行:每个流水线阶段拿到上一个阶段传来的 micro-batch,做完自己的前向就立刻往后传,同时开始下一个批次,全程不设全局同步屏障。

在稳态下,流水线彻底“流动”起来。每个 micro-batch 像一杯奶茶在不同工位间传递:S0 做批次 0 的前向,S1 同时做批次 0 的下一步和批次 1 的上一步……所有 GPU 都在忙,气泡被压缩到只剩启动和排空阶段。当然,异步不是凭空变快,它有理论上限:

不过异步也有代价——每个 micro-batch 的端到端延迟略微变长(因为批次间不再全体对齐),但对于“吞吐优先”的大模型训练,延迟换吞吐是笔划算买卖。新店长用“不停手”换来了整条流水线的繁忙,PipeDream 用“不同步”换来了 GPU 利用率的飞跃。可一放松同步,新的麻烦出现了:万一前面工位用的配方,和后面工位用的配方不是同一版呢?

Throughputmax⁡=1max⁡iTi\displaystyle \text{Throughput}_{\max} = \frac{1}{\max_i T_i}
整条流水线的吞吐由最慢的那个阶段决定,其他阶段再快也得排队等它。
  1. 分母 maxᵢ Tᵢ$T_i$ 是第 $i$ 个阶段处理一个 micro-batch 的耗时,取所有阶段的最大值,即“最慢工位”的用时。
  2. 求倒数单位时间能完成的 micro-batch 数,由最慢工位决定。奶茶店泡茶要 30 秒、封口只要 5 秒,那整条线一小时最多出 120 杯,瓶颈在泡茶。
  3. 工程启示想提速,先找最慢的阶段。把它的计算拆分、优化,比优化快工位有效得多。

权重版本

店长为了提升口味,偷偷改了配方:泡茶师傅从第 5 杯开始用新配方,但加料师傅还按旧配方加糖。结果第 5 杯奶茶用新茶汤配了旧糖浆,味道不伦不类。在异步流水线里,这种“配方错乱”就是陈旧权重问题:前面的阶段用旧权重算了梯度,传到后面的阶段时,参数已经被新权重更新过,梯度与权重对不上号。

PipeDream 的解法很朴素——给每一次前向传播发一个“配方版本号”。每个阶段在计算前向时,记录当前用的是哪个版本的权重;反向传播时,梯度必须回到它对应的那个版本去更新,而不是随便覆盖到最新权重上。这就是权重版本管理(Weight Versioning)。梯度按版本聚合的更新公式如下:

这相当于店长在每张配方上盖了版本章,加料师傅看到“v1“的茶汤就按 v1 加糖,看到”v2“就按 v2 加,口味终于统一了。权重版本管理是 PipeDream 的”定海神针”——没有它,异步流水线跑得再快,也只是在错误的道路上狂奔。

W(t+1)=W(t)−η∑v∈V1Bv∑b∈BvΔWb,v(t)\displaystyle W^{(t+1)} = W^{(t)} - \eta \sum_{v \in V} \frac{1}{B_v} \sum_{b \in B_v} \Delta W_{b,v}^{(t)}
每个版本 $v$ 的梯度只在它自己的“配方版本”内求平均再更新,避免新旧配方混用导致训练失控。
  1. 内层求和$\Delta W_{b,v}^{(t)}$ 是第 $b$ 个 micro-batch 在版本 $v$ 下算出的梯度,先把同一版本的梯度累加起来。这就像把用旧配方做的 3 杯奶茶归为一组,用新配方做的归为另一组,绝不混放。
  2. 除以 Bv$B_v$ 是该版本下的 micro-batch 数量,求平均后得到一个稳定的平均梯度,避免某个批次噪声过大。
  3. 外层遍历 V把所有版本的梯度都按各自规模加权求和,再统一更新权重。PipeDream 用这个机制保证:虽然各处参数版本不一致,但整体更新方向依然可信,训练能够稳定收敛。

1F1B调度

有了异步执行和权重版本,奶茶店效率起飞了,可新问题又来了:桌面堆不下了!以前按“整批”做,最多同时堆 10 杯;现在虽然一杯杯接力,但如果每杯做完前向就摆在桌上等着做反向,几十杯奶茶能把操作台占满。对应到 GPU,就是显存被中间激活值(activation)塞爆。PipeDream 的答案是 1F1B 调度:每个阶段按“一次前向、一次反向”的节奏交错干活。

1F1B,全称 one-forward-one-backward,意思是每个 GPU 干完一个 micro-batch 的前向,紧接着就干一个 micro-batch 的反向,而不是攒一批前向再统一反向。这样桌面上“在途”的奶茶永远只有少数几杯,显存压力大幅下降。在途批次的数量可以这样估算:

你可能会问:这不又回到“等等再干”了吗?其实 1F1B 是“做一杯、清一杯”:前向做完立刻安排反向把它“清走”,腾出空间再接新单。桌上永远只有几杯,但没有人闲着。店长把“堆满桌”换成了“流水不断”,GPU 显存和利用率终于和谐共处。

Kin-flight≈p(1F1B 下)vsm(朴素异步下)\displaystyle K_{\text{in-flight}} \approx p \quad \text{(1F1B 下)} \quad \text{vs} \quad m \quad \text{(朴素异步下)}
1F1B 让同时驻留显存的 micro-batch 数从 $m$ 降到约 $p$,显存峰值按比例缩减。
  1. 左侧 K≈p$p$ 是阶段数。1F1B 下每个阶段同时最多处理 1 个前向和 1 个反向,在途批次数约等于阶段数。4 个工位,桌上最多 4 杯。
  2. 右侧 m$m$ 是 micro-batch 总数。朴素异步下所有批次的前向结果都可能积压着等反向,在途批次数接近 $m$,相当于 8 个批次全堆在桌上。
  3. 对比结论$m$ 通常远大于 $p$(比如 32 vs 4),所以 1F1B 的显存优势是数量级的。代价只是少量调度空隙,吞吐损失通常在几个百分点以内。

工程实现

理论说得再好,落地才是真功夫。1F1B 的店长要操心三件事:怎么把杯子递得快、怎么让每个工位工作量均衡、怎么防止节奏乱套。PipeDream 的工程实现同样围绕这三点展开。

首先是通信。同步模式常用全局广播(all-gather),所有人都要等最慢的那个;异步模式改用点对点通信(P2P send/recv),每个阶段只给相邻阶段传数据,像递杯子一样只传给下一工位,谁也不等谁。其次是负载均衡。异步吞吐由最慢阶段决定,如果某个阶段计算量特别大,整条线就被它卡住。PipeDream 在切分模型时会做层间耗时 profiling,把计算量大的层放在 GPU 快的设备上,或者把一段层拆得更细,尽量让每个阶段的耗时接近。第三是稳定性。异步更新天然带一点“震荡”,训练曲线可能不如同步平滑,工程上往往配合梯度裁剪、动态学习率和更谨慎的 warmup 策略来压制波动。

调参方面,有两条流传较广的经验:micro-batch 太小,通信占比上升、收益下降;太大,显存承压且气泡变大。实践中通常从 $m = 4p$ 起步,配合吞吐监控做二分搜索。另外,关键层(如 embedding、输出层)尽量不跨阶段,把通信热点限制在可预测的边界上。如同奶茶店要按客流高峰排班、把重活分给手快的店员,PipeDream 的工程调优本质上就是“让每个工位匀速转动”的排班艺术。

方案选型

所以,到底该不该上 PipeDream?店长们各有算盘。老店长说:“我规矩简单,不会出错。”新店长说:“我吞吐高,账面上省电费。”实际上,两者各有主场。GPipe 的同步模式适合追求实现简单、训练稳定、团队调参经验不足的场景;PipeDream 的异步模式适合模型极大、GPU 集群规模大、吞吐优先的生产环境。选型时可以参考它们的用时对比:

现实中的大模型训练很少只用一种并行。主流做法是混合并行:数据并行(DP)切 batch,流水线并行(PP)切层,张量并行(TP)切单层。PipeDream 的异步思想已经融入了 Megatron-DeepSpeed 等框架的流水线调度器,比如 DeepSpeed 就提供了 pipeDream 风格的 schedule 选项。选型还要算成本账:异步流水线的调度器、权重版本管理、通信拓扑都要额外实现和维护,团队人力是否消化得了,也是决策的一部分。说到底,没有银弹——同步是省心的旧规矩,异步是高效的接力赛,真正的高手懂得在合适的时候切换节奏。

Speedup=TsyncTasync=m⋅pp+m−1\displaystyle \text{Speedup} = \frac{T_{\text{sync}}}{T_{\text{async}}} = \frac{m \cdot p}{p + m - 1}
当阶段数 $p$ 或 micro-batch 数 $m$ 较大时,异步流水线的加速比接近 $p$ 倍,优势非常明显。
  1. 分子 m·p同步模式的总时间,正比于 micro-batch 数乘以流水线阶段数,因为每个批次都要走完全部阶段的前向和反向。
  2. 分母 p+m-1异步模式的总时间,只与“阶段数 + 批次数”线性相关,远远小于 $m \times p$。
  3. 比值含义整体加速比。$m=8, p=4$ 时约为 $32/11 \approx 2.9$ 倍;$m$ 和 $p$ 越大,加速比越接近 $p$。

AI 应用场景

场景一:大模型预训练平台

阶段:分布式训练调度

解决的问题:GPT 这类千亿参数模型单卡根本放不下,传统 GPipe 同步流水线让大量 GPU 在气泡中空转,训练数十天,电费和机时费居高不下。PipeDream 的异步执行让各阶段独立推进,配合 1F1B 调度把显存峰值压到约 $p$ 份在途批次,平台吞吐可提升 2-3 倍,尤其适合动辄上千卡的预训练集群。

具体案例:某大模型公司训练 1750 亿参数模型,使用 512 张 A100,将模型切成 16 个流水线阶段;采用 PipeDream 风格调度后,GPU 利用率从 58% 提升到 82%,单次训练周期缩短约三分之一。工程上同时启用了权重版本管理和梯度裁剪,保证收敛曲线与同步基线接近。

场景二:企业 LLM 微调任务调度

阶段:模型微调与资源调度

解决的问题:微调大模型(如 70B Llama 系)时,若多团队共享 GPU 集群,同步流水线会因某一个慢任务拖累整批作业;异步流水线允许每个 stage 独立推进、按需抢占,配合弹性调度器让集群整体吞吐更平滑。

具体案例:某企业的 GPU 集群同时跑 20 个微调任务,统一改用 pipeDream 风格流水线后,任务排队时间缩短 40%,碎片化 GPU 资源得到更好利用。调度器利用 pipeline stage 的 P2P 通信特性,支持任务动态扩缩容,避免了“一个慢节点拖垮全队”的窘境。

场景三:长序列模型的显存优化训练

阶段:单模型训练策略

解决的问题:长上下文模型(如 128K 上下文)的中间激活极占显存,朴素异步流水线下多个 micro-batch 的激活同时驻留,极易 OOM。1F1B 调度让前向与反向交错进行,在途激活数量从批量数降到阶段数,显存峰值可降低数倍。

具体案例:某团队训练 8K 上下文的法律文档模型,在 8 卡集群上用 GPipe 只能塞下 batch size 16,改用 1F1B 调度后 batch size 提升到 48,同时吞吐提高 2.1 倍,显存峰值反而下降了 30%。

Python 演示

python25 行
def pipeline_time(n_stages, n_batches, fwd, bwd, sync=True):    """估算完成时间:同步模式全部前向后再全部反向;异步模式稳态交替推进"""    if sync:        return n_batches * n_stages * (fwd + bwd)    return (n_stages + n_batches - 1) * (fwd + bwd)  def peak_memory(n_stages, n_batches, sync=True):    """估算显存压力:同步时全部 micro-batch 激活驻留;1F1B 时只在途约 n_stages 份"""    if sync:        return n_batches * n_stages    return n_stages  if __name__ == "__main__":    P, M = 4, 8    t_sync = pipeline_time(P, M, 2, 2, sync=True)    t_async = pipeline_time(P, M, 2, 2, sync=False)    m_sync = peak_memory(P, M, sync=True)    m_async = peak_memory(P, M, sync=False)     print(f"同步 GPipe    : 时间步 {t_sync:3d}, 峰值激活 {m_sync:2d} 份")    print(f"异步 PipeDream: 时间步 {t_async:3d}, 峰值激活 {m_async:2d} 份")    print(f"用时缩短 {(1 - t_async / t_sync) * 100:.1f}%, "          f"显存降至 {m_async / m_sync * 100:.0f}%")
目的:用理想化的数学模型模拟 4 阶段、8 个 micro-batch 时同步与异步流水线的性能差异,帮助你建立直觉。
  1. def pipeline_time(...)核心函数:同步返回 $m \times p \times (fwd+bwd)$,异步返回 $(p+m-1) \times (fwd+bwd)$,对应上文公式。
  2. def peak_memory(...)同步时所有 micro-batch 的中间激活都驻留显存,异步 1F1B 下只有约 $p$ 份在途。
  3. if __name__ == "__main__":程序入口,便于在命令行直接跑出对比结果。
  4. t_sync = pipeline_time(P, M, 2, 2, sync=True)计算同步总耗时,前向反向各占 2 个时间步。
  5. print(f"用时缩短 ...")用 f-string 输出提速百分比,一眼看清异步的优势量级。

常见误区

误区PipeDream 去掉了同步等待,训练速度更快,所以收敛也更快、效果一定更好。

正解异步提升的是“单位时间吞吐”,不等于“收敛步数更少”。由于陈旧梯度的影响,异步训练每一步的更新质量略逊于同步,可能需要更多步数才能达到同等精度。它的优势在于同样墙钟时间内能跑更多步,最终“综合下来更快”。就像奶茶店接力虽快,但偶尔有一杯口味略飘,需要多试几杯才稳定。

为何常见:人们容易把“吞吐高”直接等同于“收敛快”,忽略了异步更新本身引入的噪声和延迟。

误区既然是异步流水线,那每个 GPU 各跑各的,连权重版本都不用管,反正最终会收敛。

正解PipeDream 的“异步”指的是流水线调度不设全局屏障,但权重更新仍然需要版本管理机制来对齐梯度与参数。如果不记录版本,梯度可能基于旧权重计算却直接覆盖到新权重上,训练极易发散。它只是把“全局同步”换成了“按版本对齐”,并非放弃正确性约束。

为何常见:“异步”这个词容易让人联想到“完全无协调”,忽略了分布式系统里正确性保障的必要性。

误区前向做完立刻做反向,打断了连续前向的批量处理,吞吐肯定大幅下降。

正解1F1B 的吞吐损失通常只有几个百分点,因为它只是重新安排了任务的执行顺序,并没有引入真正的空闲。反而它把在途 micro-batch 数从 $m$ 压到约 $p$,显存大幅释放后还能增大 batch size,实际吞吐常常更高。这就像店里“做一杯清一杯”并没能让店员闲下来,只是桌面更整洁了。

为何常见:直觉上“交错执行”比“集中批量”慢,但忽略了流水线调度的时间重叠效应。

误区模型切成更多阶段,每张卡负担更小,并行度更高,训练自然更快。

正解阶段数增加会放大两个问题:一是通信延迟随阶段边界增多而累积;二是负载不均的风险变大,任何一个慢阶段都会拖垮整体吞吐。而且气泡公式中 $p$ 在分子上,阶段越多气泡占比越高。实践中阶段数要根据模型大小和 GPU 数量仔细权衡。

为何常见:受“并行度越高越快”的直觉影响,忽略了流水线中通信与负载均衡的边际成本。

误区把 micro-batch 调大,减少通信次数,流水线效率自然更高。

正解micro-batch 过大会让显存峰值飙升,尤其在没有 1F1B 保护时容易 OOM;同时每步更新粒度变粗,收敛稳定性下降。它是一个平衡旋钮:太小则通信占比高,太大则显存和稳定性承压。经验上从 $m \approx 4p$ 起步调试比较稳妥。

为何常见:把“减少通信次数”简单等同于“提升效率”,忽略了显存约束和收敛质量这两条边界。

面试题

Q1. GPipe 同步流水线的主要瓶颈是什么?

单选题 · easy

  • A.反向传播阶段无法使用 GPU
  • B.流水线气泡导致大量算力闲置← 正确答案
  • C.梯度下降过程完全无法收敛
  • D.通信带宽始终被彻底占满

答案:B。GPipe 要求所有 micro-batch 完成前向后再统一反向,前后阶段交替等待,形成流水线气泡(Bubble),大量 GPU 算力在等待中闲置。A 不对,反向传播本身当然用 GPU;C 是夸大,GPipe 能收敛只是效率低;D 不是同步模式的主要矛盾。

Q2. PipeDream 与 GPipe 最核心的区别是什么?

单选题 · easy

  • A.前者完全不进行反向传播
  • B.前者取消全局同步屏障← 正确答案
  • C.前者使用更多的 GPU 设备
  • D.前者只支持单机多卡训练

答案:B。PipeDream 最大的变革是去掉“全体前向做完再集体反向”的全局同步屏障,让每个阶段独立推进,像接力赛一样不停手。A 错,反向传播仍是训练必需;C 只是规模问题;D 错,它面向多机多卡集群设计。

Q3. 权重版本管理主要解决什么问题?

单选题 · easy

  • A.解决模型参数初始化不稳定
  • B.解决异步下梯度与权重陈旧← 正确答案
  • C.解决显存占用率过高问题
  • D.解决数据加载速度太慢

答案:B。异步执行时,上游阶段用旧权重算出的梯度,传到下游时参数已被更新,梯度与权重“版本错位”。权重版本管理给每次前向盖版本章,让梯度回到对应版本更新。A 与初始化无关;C 是 1F1B 的职责;D 与数据加载无关。

Q4. 1F1B 调度指的是什么执行节奏?

单选题 · mid

  • A.一次前向紧接着一次后向← 正确答案
  • B.一个批次只做一次前向
  • C.一个梯度只做一次广播
  • D.一次前向配两次后向

答案:A。1F1B 全称 one-forward-one-backward,每个阶段按“前向→反向→前向→反向”交错执行,及时清走在途批次、降低显存峰值。B 是基本定义而非调度;C 是通信语义;D 方向相反。

Q5. 朴素异步流水线显存峰值高的根本原因是什么?

单选题 · mid

  • A.多批次前向激活同时驻留← 正确答案
  • B.每个阶段权重都要双份备份
  • C.通信消息队列占用显存
  • D.学习率过大导致参数溢出

答案:A。朴素异步下,多个 micro-batch 的前向中间激活(activation)都要保存在显存里等待各自的反向,在途批次数接近 $m$,显存被大量激活占满。B 的权重双备份不是主因;C 的队列开销很小;D 与显存峰值无直接关系。

Q6. 下面哪一项是 1F1B 调度带来的直接收益?

单选题 · mid

  • A.模型精度一定大幅提升
  • B.显存峰值显著降低← 正确答案
  • C.通信总量直接减半
  • D.不再需要权重版本管理

答案:B。1F1B 让在途 micro-batch 数从约 $m$ 降到约 $p$,同时驻留的中间激活大幅减少,显存峰值下降。A 错,精度由训练配置决定;C 通信量基本不变;D 错,权重版本管理是另一条独立机制。

Q7. 流水线气泡占比与哪些因素直接相关?

单选题 · mid

  • A.阶段数越多气泡占比越大← 正确答案
  • B.学习率越大气泡占比越小
  • C.GPU 主频越高气泡占比越少
  • D.数据维度越高气泡占比越少

答案:A。气泡公式 $(p-1)/(m+p-1)$ 显示,阶段数 $p$ 在分子上,$p$ 越大气泡越大;micro-batch 数 $m$ 在分母上,$m$ 越大气泡越小。学习率、主频、数据维度都不直接进入该公式,所以 B、C、D 均错。

Q8. 下列哪些是 PipeDream 引入的关键机制?

多选题 · mid

  • A.权重版本管理机制← 正确答案
  • B.1F1B 流水线调度← 正确答案
  • C.全局同步梯度平均
  • D.点对点流水通信← 正确答案

答案:ABD。PipeDream 的三大支柱是异步执行、权重版本管理和 1F1B 调度,配套使用 P2P 通信替代全局广播。C 是同步训练(如 Data Parallel)的做法,与 PipeDream 的异步理念相反,故不选。

Q9. 采用异步流水线训练时,需要关注哪些风险?

多选题 · hard

  • A.陈旧梯度可能导致收敛波动← 正确答案
  • B.阶段负载不均会拖慢整体← 正确答案
  • C.训练完全不需要任何同步
  • D.显存占用一定低于同步模式

答案:AB。异步带来陈旧梯度,收敛曲线会有波动,需要梯度裁剪等手段压制;吞吐由最慢阶段决定,负载不均是关键风险。C 错,仍需要权重版本等对齐机制;D 错,若不用 1F1B,朴素异步的显存可能比同步更高。

Q10. 关于 1F1B 调度的显存优势,下列说法正确的有?

多选题 · extreme

  • A.每个阶段在途批次数量更少← 正确答案
  • B.相比朴素异步显存峰值更低← 正确答案
  • C.相比 GPipe 显存额外占用更高
  • D.完全不需要保存中间激活

答案:AB。1F1B 每个阶段同时只保留约 1 个前向和 1 个反向的在途批次,$K \approx p$,远小于朴素异步的 $m$,所以 A、B 正确。C 错,1F1B 相对 GPipe 通常能降低或持平显存(因为及时清走激活);D 错,反向传播仍需激活,只是数量受控。