大模型增量预训练经验总结(1)

1、训练数据类型选择

混合精度已经成为训练大型深度学习模型的必要条件,但也带来了许多挑战。目前在我的实践过程中增量预训练采用的都是 BF16

  • FP32/FP16 绝大多数硬件都支持,所以可以用混合精度训练提高吞吐;但 BF16/TF32只有新的硬件才支持,V100/昇腾910等不支持
  • BF16 具有和 FP32 相同的 range,但精度(也就是两个最小单位之间的间隔)降低
  • BF16/FP32 进行混合精度训练,可以减少溢出几率
  • 对于大型 transformer,BF16 损失的精度被证明不怎么影响收敛
  • TF32 是 A100 中引入的新格式,用于替代 fp32,也即可以全程 tf32 训练或 bf16/tf32 混合训练
  • 还有FP8类也依赖于显卡类型(比如H100、L40s支持),但是目前的实验发现FP8损失精度会影响收敛

1.1 混合精度训练的要点

BF6/FP32 混合训练因为两种格式在 range 对齐了,并且 BF16 比 FP16 range 更大,所以比 FP16/FP32 混合训练稳定性更高。但 FP16/FP32 混合训练 GPT-3 大模型也是完全可行的,只要解决可溢出问题,有以下几个要点:

  • fp32权重备份 + loss scaling 解决下溢出问题
  • 对 loss 进行 scale:见左图
  • 对 gradient 进行 scale:见右图。由于链式法则的存在,对梯度做直接做 scale,也是可以的,反而

你可能感兴趣的:(大模型,大模型)