大模型精度收敛分析和调优

当做完精度对齐后,发现模型精度还是有很大差距或者loss不收敛,此时大概率不是框架或者算子的问题,需要针对训练相关的配置做进一步查验。

校验超参

​重点检查项:

卡数:对标训练是否使用多卡,使用了几张?

学习率:基础学习率的值,学习率衰减策略,是否使用分组等,一般可以直接打印对比。

batchsize:单卡的batchsize,多卡的总batchsize一般都需要对齐

epoch/step:训练的总epoch或者step

​其他检查项:

是否启用synBN,是否有参数冻结,是否有多个训练阶段,是否在训练过程中更改模型结构等。

此部分注意查看原始论文实验部分,会有训练细节的描述。

校验初始化参数方法

  1. 检查每个参数的初始化方法,然后按照[MindSpore设置初始化参数的方法] 配置初始化方法:
  2. a. 对标脚本中有明确初始化方式的对标实现
  3. b. 对标脚本中无明确初始化方式的查看对标框架API找到默认方式对标实现
  4. 多卡参数同步
  5. 为保持多卡初始化参数一致,需要设置全局seed或者设置参数广播:
  6. b. [并行设置参数广播]
  7. 预训练模型部分的参数,检查参数是否被覆盖
  8. a. 检查在加载预训练权重后是否有做全局的参数初始化
  9. b. 在训练前打印参数的值,看是否和原始预训练权重的值一致

校验优化器参数

  1. 检查基本参数
  2. 优化器类型,学习率,weight_decay,momentum等优化器参数,建议对照优化器API逐一查看
  3. 检查参数分组策略
  4. 对于有有优化器参数分组的情况,检查每个分组的参数是否一致
  5. 检查训练参数个数
  6. 对于有参数冻结的场景,检查传入优化器的参数是否一致,检查方法

校验混合精度

  1. 判断是否使用混合精度
  2. a. 检查对标脚本是否使用混合精度,torch.cuda.amp
  3. b. 查看MindSpore是否有float16的算子,可以在ir文件中搜索是否有float16执行的算子,一般选取hwopt_d_end_graph_*.ir
  4. 如何添加混合精度
  5. 添加混合精度方法
  6. 溢出检测方法
  7. 当使用混合精度时,算子有可能会有溢出,那如何判断是否会出现溢出呢:溢出检测

当出现溢出时可以怎么做?

  1. loss_scale设置
  2. 算子高精度模式:

1 ms.set_context(ascend_config={“precision_mode”: “force_fp16”) ​

  1. 溢出算子dump