1 Star 1 Fork 137

walker / AscendSpeed

forked from Ascend / MindSpeed 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
reuse-fp32-param.md 1.57 KB
一键复制 编辑 原始数据 按行查看 历史

参数副本复用

问题分析

当前所有大模型训练客户场景都采用混精训练,导致在训练过程中持续保存了计算权重与状态权重。实际上,两者所使用的生命周期并没有重叠,故可通过数值变换的方式等价去除冗余。

解决方案

基于大模型混合精度训练中BF16计算参数(负责前后向计算)及FP32参数副本(负责参数更新)不需同时存在的特点,和两者在数值上的对应关系,设计内存共用算法。

解决思路

具体算法步骤如下:

  1. FP32 = BF16 + Residual;
  2. 前向计算开始前将FP32转换为BF16并保存Residual;
  3. 优化器更新前基于BF16和Residual恢复FP32参数并进行更新;
  4. 使用int32加减法来等价模拟原始逻辑中FP32<->BF16的相互转换(IEEE745向偶数舍入)。

参数副本复用流程如下图所示:

数值变化的详细逻辑如下图所示:

使用场景

  1. 该特性主要用于使用BF16的训练场景。
  2. 该特性目前不支持分布式优化器场景(请确认脚本中未开启 --use-distributed-optimizer)。

使用方法

设置--reuse-fp32-param,即可调用该算法。

使用效果

对于Float16OptimizerWithFloat16Params,整体能够节省sizeof(bfloat16)*模型参数量的静态内存,性能劣化在多个模型上测试小于1%。

1
https://gitee.com/walker963/AscendSpeed.git
git@gitee.com:walker963/AscendSpeed.git
walker963
AscendSpeed
AscendSpeed
master

搜索帮助