4.6 训练稳定性:数月长跑不翻车
凌晨三点的报警
训练进行到第 37 天,凌晨三点,值班工程师的手机响了:监控大屏上,本来稳稳下降的 loss 曲线突然从 2.1 竖直飙到 7.4。
背后是几千张 GPU 在烧钱——每小时几十万元。摆在面前的选择:回滚到昨晚的存档重来(白烧十几个小时),还是赌它自己能恢复(可能把整个模型练废)?
这个场景是根据公开训练日志合成的,但它每天都在真实发生。Meta 公开的 OPT-175B 训练日志(2022)像一本「事故大全」:一百多页里记满了几十次硬件故障、loss 飙升和深夜决策。训练大模型的下半场,拼的不是算法,是工程韧性——本节讲值班室里最重要的四件套。
四件套
① 混合精度:草稿用铅笔,账本用钢笔。 前几章的计算默认用 32 位小数(fp32),又准又稳但又慢又占地方。混合精度训练改用 16 位的 bf16 做大部分计算——速度翻倍、显存减半;同时给每个参数保留一份 fp32 的「主副本」,每次更新都记在这本高精度账上,避免小数点后的微小更新被 16 位精度「四舍五入」丢掉。就像打草稿用铅笔快写,最终账目用钢笔誊清。上一节显存账本里那 4 字节的 fp32 主参数,就是这支「钢笔」的成本。
② 梯度裁剪:给更新装限速器。 偶尔某一批数据会算出异常巨大的梯度——按 0.4 节的直觉,一步迈太大就直接飞出山谷。梯度裁剪的规则简单粗暴:梯度的总长度超过阈值,就整体等比例缩小到阈值以内。方向不变、步子限速,一脚急刹避免车毁人亡。
③ loss spike 处置:回滚 + 跳过。 就算装了限速器,损失尖峰仍会不期而至——一批没洗干净的脏数据、一次数值上的巧合,都可能让曲线突然飙升。轻微的尖峰常能自愈;狠的会把参数带进「坏区域」再也回不来。标准处置和游戏存档一个思路:回滚到上一个 checkpoint,跳过肇事的那批数据,继续训。OPT 团队一度每隔几天就要做一次这样的「读档重来」。
④ checkpoint 容灾:定期存档是生命线。 几千张卡连跑几个月,硬件故障不是「会不会」而是「多久一次」:Llama-3 405B 的训练报告(2024)记录了 54 天里 400 多次意外中断——平均每 3 小时一次,掉卡、网络抖动、静默数据损坏轮番上阵。对策只有一条:高频保存检查点,故障后自动剔除坏节点、从最近存档恢复。存档太频繁拖慢训练、太稀疏一崩就损失几小时——存档间隔本身也是一门权衡的手艺。
所谓「炼丹师」的日常,就是盯着 loss 曲线、梯度大小、GPU 利用率这些「生命体征」,在报警响起时快速判断:自愈、回滚,还是停下来查——每个决定都标着几十万元的价签。
「铅笔与钢笔」的类比有个坑:bf16 不是「低质量」,而是量程和 fp32 一样宽、只是刻度更粗(细节见深入层)——它牺牲的是精细度,不是表示范围,这正是它比 fp16 稳的原因。另外,本节内容是 OPT、BLOOM、Llama 等公开论文与日志的共性总结;每家团队的具体阈值、监控指标和处置预案属于核心机密,实际配方远比这四件套细。
小结
- 混合精度:bf16 干活(快、省)+ fp32 主副本记账(稳),显存账本里那 4 字节就是它。
- 梯度裁剪 = 限速器:方向不变,步长封顶。
- loss spike 处置 = 游戏读档:回滚 checkpoint + 跳过脏数据。
- 万卡数月长跑中硬件故障平均几小时一次,高频 checkpoint 是生命线。
延伸阅读
- OPT-175B 训练日志(Meta,2022)——百页真实事故记录,大模型训练最生动的「纪录片」。
- BLOOM 训练笔记(2022)——另一份公开的百亿级训练流水账。
- 本章收官:小结与自测。