Page 224 - 《软件学报》2026年第1期
P. 224
高彦杰 等: 大语言模型预训练系统关键技术综述 221
综上所述, 当前大语言模型执行的软硬件栈均存在许多缺陷, 导致作业失效或挂起. 因此, 迫切需要提供高效
的容错机制, 以保障大语言模型训练的顺利完成. 在接下来的两节中, 将介绍检查点和弹性训练技术, 以支持预训
练系统在平台上可靠地运行.
3.4.2 检查点
大语言模型通常使用检查点技术备份模型, 以实现容错并确保在故障时能够恢复. 在以往的深度学习系统设
计中, 容错往往被忽视, 没有进行充分的优化. 一般来说, 检查点操作采用同步方式执行, 随着大型语言模型规模的
不断增大, 这将是非常耗时的操作. 深度学习框架, 如 PyTorch、TensorFlow 等, 为用户提供了检查点接口, 使其能
够在训练期间创建备份. 然而, 这些框架通常让用户自行决定何时执行检查点、备份哪些模型分片以及触发检查
点的频率, 这可能导致效率低下的问题. Rojas 等人 [100] 研究了常见框架的检查点实现, 评估了检查点的计算成本、
文件格式和大小、规模的影响以及检查点非确定性问题. Wang 等人 [101] 提出了 Gemini, 这是一种面向大语言模型
的分布式检查点和故障恢复方案. 此方案以平均浪费时间为主要度量标准来评估检查点解决方案的性能, 因为故
障可能在任何时候发生, 导致浪费时间有所变化.
在最理想的情况下, 即在完成检查点后立即发生故障, 浪费的时间为 t ckpt +t rtvl , 其中 t ckpt 是检查点时间, t rtvl 是
1
恢复时间. 而在最糟糕的情况下, 即在完成检查点之前发生故障, 浪费的时间为 t ckpt + +t rtvl , 其中 f 是检查点频
f
率. 假设故障在两个连续检查点之间均匀分布, 平均浪费时间 ( T wasted ) 可以表示为下式 [101] .
1
T wasted = t ckpt + +t rtvl ,
2f
并且包含以下约束条件:
1 ( )
⩾ max t ckpt ,T iter ,
f
其中, T iter 表示迭代时间, 因为模型无需在迭代内进行检查点, 而且检查点不能在之前的检查点完成前启动. 为了
减少浪费时间并提高检查点频率 f , 降低检查点时间 t ckpt 至关重要. 尽可能使用主存检查点可以降低检查点时间
t ckpt 和恢复时间 t rtvl . 同时, 通过检查点流量调度算法减少检查点时间 t ckpt 和最小化对训练作业使用网络的干扰, 从
而降低 T iter 迭代时间. 从约束公式来看, 这也就是检查点频率有机会进一步提高的机会. MegaScale 通过将检查点
分为两个阶段进行加速. 第 1 个阶段将数据由 GPU 显存写入到主存, 通过优化 PyTorch 序列化方法并使用固定内
存 (pinned memory), 然后继续训练, 最终使用高带宽 PCIe 只需要几秒钟完成备份. 第 2 个阶段使用一个后台进程
异步将主存数据拷贝到分布式文件系统 HDFS 中.
对于深度学习和推荐模型的检查点工作, 仍有许多基本技术可以供大语言模型借鉴应用. DeepFreeze [102] 通过
异步检查点方式进行深度学习备份, 但其检查点数据通过相对单一的策略存放在远端存储. DeepFreq [103] 提出了动
态调整检查点频率的方法. Check-N-Run [104] 提出了面向推荐系统深度学习模型的两种检查点优化策略. 首先, 它应
用差分检查点, 跟踪并备份模型的修改部分. 差分检查点在以下情况能够发挥效益: 当模型的一小部分 (通常存储
为嵌入表) 在每次迭代中更新时, 例如推荐模型场景中. 换句话说, 这种方法适用于模型更新非常稀疏的场景, 可以
有效减少检查点的尺寸. 其次, 利用量化技术可以显著减少检查点的大小, 同时不降低训练准确度. Oobleck [105] 采
用了规划-执行协同设计的方法, 先生成一组流水线模板, 并实例化至少 f+1 个逻辑上等效的流水线副本, 以容忍 f
个同时发生的故障. 在执行期间, 其依赖于跨副本复制的模型状态来提供快速恢复.
这些设计思路在大语言模型中同样适用, 尤其是在采用并行化模型切片技术的背景下, 带来了新的检查点挑
战和系统设计机会.
3.4.3 弹性训练
弹性训练的设计初衷有两个方面. 首先, 由于平台的不稳定性容易导致故障, 弹性训练可以实现故障恢复或容
错. 其次, 在大多数分布式训练系统中, 用户需要在提交作业之前手动配置资源, 如 GPU 卡数和内存等, 并且无法
在运行时调整资源配置, 静态的资源配置严重影响了作业的性能和利用率. 通过弹性训练, 可以充分利用闲置资
源, 提高资源利用率. 目前, 弹性训练的实现方式主要包括两种: 一类是部署层控制方式, 另一类是运行时插桩.

