当做完精度对齐后,发现模型精度还是有很大差距或者loss不收敛,此时大概率不是框架或者算子的问题,需要针对训练相关的配置做进一步查验。
校验超参
重点检查项:
卡数:对标训练是否使用多卡,使用了几张?
学习率:基础学习率的值,学习率衰减策略,是否使用分组等,一般可以直接打印对比。
batchsize:单卡的batchsize,多卡的总batchsize一般都需要对齐
epoch/step:训练的总epoch或者step
其他检查项:
是否启用synBN,是否有参数冻结,是否有多个训练阶段,是否在训练过程中更改模型结构等。
此部分注意查看原始论文实验部分,会有训练细节的描述。
校验初始化参数方法
- 检查每个参数的初始化方法,然后按照[MindSpore设置初始化参数的方法] 配置初始化方法:
- a. 对标脚本中有明确初始化方式的对标实现
- b. 对标脚本中无明确初始化方式的查看对标框架API找到默认方式对标实现
- 多卡参数同步
- 为保持多卡初始化参数一致,需要设置全局seed或者设置参数广播:
- b. [并行设置参数广播]
- 预训练模型部分的参数,检查参数是否被覆盖
- a. 检查在加载预训练权重后是否有做全局的参数初始化
- b. 在训练前打印参数的值,看是否和原始预训练权重的值一致
校验优化器参数
- 检查基本参数
- 优化器类型,学习率,weight_decay,momentum等优化器参数,建议对照优化器API逐一查看
- 检查参数分组策略
- 对于有有优化器参数分组的情况,检查每个分组的参数是否一致
- 检查训练参数个数
- 对于有参数冻结的场景,检查传入优化器的参数是否一致,检查方法
校验混合精度
- 判断是否使用混合精度
- a. 检查对标脚本是否使用混合精度,torch.cuda.amp
- b. 查看MindSpore是否有float16的算子,可以在ir文件中搜索是否有float16执行的算子,一般选取hwopt_d_end_graph_*.ir
- 如何添加混合精度
- 添加混合精度方法
- 溢出检测方法
- 当使用混合精度时,算子有可能会有溢出,那如何判断是否会出现溢出呢:溢出检测
当出现溢出时可以怎么做?
- loss_scale设置
- 算子高精度模式:
1 ms.set_context(ascend_config={“precision_mode”: “force_fp16”)