准备工作
在定位精度问题之前,首先需要排除训练脚本及参数配置等差异的干扰。目前大部分精度无法对齐的问题都是由于模型超参数、Python三方库版本、模型源码等与标杆环境(GPU/CPU)设置的不一致导致,为了在定位过程中少走弯路,需要在定位前先对训练环境及代码做有效排查。此外,问题定位主要基于GPU环境和NPU环境上运行的过程数据做对比,所以需要分别准备GPU和NPU训练环境,大部分场景需要规模相同的训练环境。如果已经将模型缩减到单机可运行,则只是单台GPU设备即可。
定位前的排查当前主要包含如下几个方面:
- 训练超参数。常见的超参如下图所示:
图1 训练超参数
模型的超参通常可能调整的主要有学习率、batch size、并行切分策略、学习率warm-up、模型参数、FA配置等。用户在进行NPU精度和GPU精度比对前,需要保证两边的配置一致。
表1 超参说明 超参
说明
学习率
影响模型收敛程度,决定了模型在每次更新权重时所采用的步长。学习率过高,模型可能会过度调整权重,导致不稳定的训练过程;如果学习率过低,模型训练速度会变慢,甚至陷入局部最优。
batch size
影响训练速度,有时候也会影响模型精度。
micro batch size
影响流水线并行中设备的计算效率。
切分策略
包括DP(Data Parallel)、TP(Tensor Parallel)、PP(Pipeline Parallel)。
- DP:数据并行(Data Parallelism)是大规模深度学习训练中常用的并行模式,它会在每个进程(设备)或模型并行组中维护完整的模型和参数,但在每个进程上或模型并行组中处理不同的数据。因此,数据并行非常适合大数据量的训练任务。
- TP:张量并行也叫层内并行,通过将网络中的权重切分到不同的设备,从而降低单个设备的显存消耗,使得超大规模模型训练成为可能。张量并行不会增加设备等待时间,除了通信代价外,没有额外代价。
- PP:流水线并行将模型的不同层放置到不同的计算设备,降低单个计算设备的显存消耗,从而实现超大规模模型训练。流水线并行也叫层间并行,层输入输出的依赖性使得设备需要等待前一步的输出,通过batch进一步切分成微batch, 网络层在多个设备上的特殊安排和巧妙的前向后向计算调度,可以最大程度减小设备等待(计算空泡),从而提高训练效率。
学习率预热
不同的学习率调度器(决定什么阶段用多大的学习率)有不同的学习率调度相关超参,例如线性调度可以选择从一个初始学习率lr-warmup-init开始预热。您可以选择多少比例的训练迭代步使用预热阶段的学习率。不同的训练框架有不同的参数命名,需要结合代码实现设置对应的参数。
模型结构
配置模型结构的超参主要有num-layer、hidden-size、seq-length等。
FA配置
超参数为use-flash-attn,决定训练过程中的Attention模块是否使用融合flash attention算子(性能较优)或者使用小算子。
- 训练脚本
由算法迁移人员排查迁移后的NPU脚本是否存在问题,可以通过Beyond Compare工具比对GPU训练脚本和NPU训练脚本之间是否存在差异。例如是否GPU环境下开启了FA但是NPU上未开启FA。
- 三方库版本比对
- 环境版本更新
这一项仅在条件允许的情况下进行,根据精度问题定位经验,部分问题是由于使用了较早版本的昇腾软件版本或者非商用发布的昇腾软件版本,所以推荐在条件允许的前提下配套安装最新商发版本的昇腾开发套件CANN Toolkit、昇腾驱动以及torch_npu包。具体操作,请参考昇腾商用版资源下载指导。
- 数据集。
- 初始权重。