在当前大模型训练场景中,混合精度训练已成为标准实践,其中涉及计算权重与状态权重的持续存储。然而,这两类权重的生命周期并不重叠,这意味着它们可以共享内存空间,而非各自独立占用。通过数值变换技巧,我们能消除这一冗余,实现资源的有效利用。
鉴于在大规模模型混合精度训练中,BF16(Brain Floating Point Format)计算参数(用于前向和后向计算)与FP32参数副本(用于参数更新)无需同时存在于内存中,且两者之间存在明确的数值对应关系,我们设计了一种内存共用算法,以优化内存使用效率。
此特性特别适用于采用BF16数据格式进行训练的场景。
启用序列并行,需在训练脚本中加入以下参数配置:
--reuse-fp32-param
对于Float16OptimizerWithFloat16Params类型的优化器,整体可节省 sizeof(bfloat16) * 模型参数量 的静态内存空间,且在多个模型上的测试表明,性能损耗低于1%。对于启用了分布式优化器的训练任务,总体节省的静态内存空间为 sizeof(bfloat16) * 模型参数量 / DP,同样地,性能损耗在测试中也控制在1%以内。