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

**问题描述**

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

**校验超参**

重点检查项：

卡数：对标训练是否使用多卡，使用了几张？

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

batchsize：单卡的batchsize，多卡的总batchsize一般都需要对齐

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

其他检查项：

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

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

**校验初始化参数方法**

1.  检查每个参数的初始化方法，然后按照\[MindSpore设置初始化参数的方法\] 配置初始化方法：

2. 对标脚本中有明确初始化方式的对标实现

3. 对标脚本中无明确初始化方式的查看对标框架API找到默认方式对标实现

4. 多卡参数同步

5. 为保持多卡初始化参数一致，需要设置全局seed或者设置参数广播：

6. \[并行设置参数广播\]

7. 预训练模型部分的参数，检查参数是否被覆盖

8. 检查在加载预训练权重后是否有做全局的参数初始化

9. 在训练前打印参数的值，看是否和原始预训练权重的值一致

**校验优化器参数**

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

**校验混合精度**

1.  判断是否使用混合精度

    a. 检查对标脚本是否使用混合精度，torch.cuda.amp

    b. 查看MindSpore是否有float16的算子，可以在ir文件中搜索是否有float16执行的算子，一般选取hwopt\_d\_end\_graph\_\*.ir

2. 如何添加混合精度

3. 添加混合精度方法

4. 溢出检测方法

5. 当使用混合精度时，算子有可能会有溢出，那如何判断是否会出现溢出呢：溢出检测

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

1.  loss\_scale设置
2.  算子高精度模式:

ms.set\_context\(ascend\_config=\{“precision\_mode”: “force\_fp16”\)

