分布式训练流水线并行与显存卸载落地

日期:2026-08-12

一、项目背景

客户想自己训一个百亿参数的行业模型,不想完全依赖外部大模型。但他们手里的卡不多,单卡显存塞不下整个模型,直接上数据并行又慢得离谱,半个月没训出第一个能用的 checkpoint,团队开始怀疑这事能不能成。我们被拉进来做训练架构设计,目标很明确:在有限的卡上,把这么大的模型训得动、训得稳。

这个项目对我们也是个提醒,大模型训练最忌讳的是没算清楚能不能切,就一头扎进去调参数。

二、落地场景

我们把模型按层切分到多卡做流水线并行,每张卡只存一部分参数、梯度和优化器状态,微批次在流水线里逐级流动。优化器状态和部分梯度卸载到 CPU 内存,前向需要时再搬回显存,用空间换显存。梯度累积把多个微批的梯度攒起来再更新,配合通信和计算重叠,尽量 hide 掉卡间传输。训练过程接了断点续训,定时存 checkpoint,崩了能从最近的点恢复。

我们把这套配置封装成模板,客户后续换模型规模只要改切分参数,不用重搭。

三、关键技术挑战与解决思路

流水线气泡是并行效率的头号杀手。切分太细,卡之间互相等;切分太粗,单卡显存又爆。我们用了一个经验公式先估气泡比,再结合实际跑几轮调微批大小和流水线深度,把气泡压到可接受范围。

卸载带宽瓶颈在 CPU 和 GPU 之间。我们没把所有状态都卸载,只卸优化器状态这种大块头,梯度留在显存里走通信,平衡了带宽和显存。

通信计算重叠靠把 all-reduce 拆到反向传播的间隙异步执行,但异步太激进会导致正确性问题,我们加了同步屏障在关键节点,牺牲一点重叠换稳定。

大规模稳定性靠 checkpoint 和监控。除了定时存盘,我们还监控每卡的 loss 曲线,发现某卡梯度异常能及时停训排查,避免训了三天发现早就跑偏。

四、效果数据

文中数据为项目复盘口径,已脱敏。流水线加卸载方案落地后,单步训练时长从约 4.2 秒降到约 1.9 秒,吞吐翻了一倍多。显存峰值从单卡约 78G 降到约 32G,原来塞不下的模型现在能跑。可达模型规模从原来的十几B提升到约百亿参数。收敛稳定性方面,连续多轮训练 loss 曲线平滑,没再出现中途跑偏白训的情况。

案例片段(已脱敏):切分参数调试时,流水线深度从 8 改到 4,气泡比明显下降:[parallel] pipe_stages=4, micro_batch=8, offload=optimizer, bubble_ratio=11%(was 27%@stages=8)step_time=1.9s, peak_mem=32G/card, stable=True

五、可复用经验总结

大模型训练这事,顺序是先算清楚切得动再追求训得快,我们见过太多团队反过来,结果卡在显存上反复重来。流水线气泡和卸载带宽这两个坑,谁先踩谁知道疼。

我现在的习惯是,先把切分方案的 bubble ratio 和峰值显存用公式估一遍,再动手跑,比盲调省太多时间。还有,checkpoint 别舍不得存,训练三天崩一次找回最近点的代价,远低于不存盘从头来的代价,这点钱不能省。

附:规模化落地与工程细节

这套并行方案最折腾的是切分参数。我们一开始流水线深度设 8,气泡比高得离谱,显存是省了但慢;改到 4 才找到平衡。教训是切分不能只看显存,气泡和通信开销要一起算。卸载我们也只卸优化器状态,梯度留显存,因为梯度通信频繁,卸了反而被带宽拖死。

稳定性上,我们最初 checkpoint 存得太稀,有一次训了两天崩了,只能从两天前恢复,白白烧了两天卡时。后来改成每半小时存一次增量,加上每卡 loss 曲线监控,异常能及时发现。单步训练时长从四点二秒降到一点九秒,这个收益前提是把气泡压下去。

给资源紧张的团队一句实话,checkpoint 频率和监控的钱不能省,比起重训的卡时,那点存储和计算开销可以忽略。大模型训练先算清楚切得动再训得快,顺序别反。我们还把这套配置封装成模板,客户换模型规模只改切分参数,不用重搭,复用省了不少事。

客户后来想加模型规模到两百亿,我们按同一套模板改了切分,半天就跑通,验证了这个方案的可复制性。算力紧张时我们也试过把不常用的模型卸载到更便宜的卡,用的时候再搬回来,虽然冷启动慢几秒,但平时省下的钱可观。我们还把训练任务做了优先级排队,研发调试的小任务插队跑,正式训练的大任务让路,既不让大任务饿死,也不让工程师干等,资源争抢的扯皮少了一大半。

顺便说,训练数据的版本管理也得跟上。我们最初没管数据集版本,同样配置两次训出来指标差一截,排查半天才发现是清洗脚本悄悄改了。后来每次训练都锁数据集快照和随机种子,结果才可复现。给做训练的团队一句经验,可复现比快更重要,宁可多花半天固定环境,也别让实验结果变成玄学,那会浪费你后面无数个调试日。

说到这里,其实大模型训练最怕的不是技术难,而是没人愿意先算清楚账,我们这种先估后跑的习惯,值得每个训练团队养成。