调优前检查

检查项汇总

精度调试前,请按照如下表格的要求进行检查,并记录相关检查结果,排除参考基准和模型迁移过程中可能存在的问题。

  • 检查参考基准脚本

    检查项 简介 检查结果
    参考基准:多次训练验证精度一致 基准模型多次训练需要得到相同的结果预期,如果基准模型的多次训练相互对比不满足精度比对要求,那么该参考基准不适合用于精度对比。 通过/不通过/未进行
    参考基准:正确使能混合精度训练 由于AI处理器(简称NPU)硬件架构仅支持用户模型执行在混合精度训练模式下,故用户模型也需要以混合精度训练。如果用户模型未使能混合精度训练模式、或使能不当,会有可能导致NPU无法训练或训练精度不符合预期的结果。 通过/不通过/未进行
  • 检查迁移后脚本

    检查项 简介 检查结果
    模型迁移:在NPU上正确使能混合精度 在精度调试前,首先需要确保模型迁移成功且在NPU上功能调通。如果涉及分布式训练,确保正确使能。特别需要注意的是,在迁移过程中,需要确保正确使能混合精度训练。 通过/不通过/未进行
    模型迁移:在NPU上正确使能Loss Scale 迁移后的脚本需在NPU上正确使能Loss Scale。且由于NPU计算特性与GPU混合精度计算特性存在差异,LossScaleManager参数也往往需要进行适当的调整以保证精度。 通过/不通过/未进行
    数据处理:数据集与基准一致 训练数据集往往较大,且可能出现不完整情况,需要确保数据集完整性。 通过/不通过/未进行
    数据处理:预处理流程与基准一致 用户模型代码的数据预处理流程可能存在基于资源自动设定的变量,该变量会导致对数据集打乱的随机性不一致。需要从代码级别确认数据预处理的接口调用,尽可能减小该差异。 通过/不通过/未进行
    数据处理:多节点分片方式与基准一致 用户模型代码的多节点数据预处理流程可能存在基于文件名、文件个数等进行分片的模式。该模式下由于文件读取接口在不同节点上对文件名排序的不同,会导致分片差异较大甚至文件重复分片到不同节点等非预期结果。需要增加调试代码以排除类似问题,确认分片规则与基准一致。 通过/不通过/未进行
    训练流程:与基准一致 用户训练过程中,常常会出现例如未清空中间数据等流程错误,然后基于该不期望的中间数据可能会引起精度不一致的问题。用户需要对训练流程有基本的知识积累,并自行检查整个训练、验证过程的正确性。 通过/不通过/未进行
    模型超参:与基准一致 进行脚本迁移的用户可能对超参的一致性不熟悉,导致迁移完成后,但一些超参的计算事实上与参考基准不一致。此时需要检查实际执行超参与参考基准的一致性。 通过/不通过/未进行

检查参考基准脚本

参考基准:多次训练验证精度一致

目标:基准模型多次训练需要得到相同的结果预期。

说明

以下内容如未特别注明,多次训练均需满足“未固定随机性”的前提。

如果基准模型的多次训练相互对比不满足精度对比要求,那么该参考基准不适合用于精度对比,相应分析思路为:

  • 模型算法稳定,不引起多次训练较大结果偏差。
  • 数据集质量较高,不引起多次训练较大结果偏差。
  • 超参稳定,不引起多次训练较大结果偏差。

对于成熟模型(即hyperparameter borrowing):

  1. 检查执行时使用的超参,确保与给定基准一致。
  2. 对于集群训练,检查集群训练模式,确保与给定基准一致。
  3. 检查数据集文件,确保与给定基准一致。
  4. 检查模型代码与执行参数,确保构造的计算逻辑与给定基准一致。
  5. 进一步检查计算图,确保计算流程与算子维度与给定基准一致。
  6. 重新训练模型并验证最终模型准确度。如果仍旧未达到基准,重复以上检查直到与基准一致。
  7. 重复三次以上的训练,确保每次训练的验证准确度均能够与基准一致。如果有不一致现象,重复以上检查直到满足各步骤需求。

对于成熟模型自定义超参:

  1. 如果数据集文件为自定义样本,需要确保标记信息没有错误,且格式符合模型的设计预期。
  2. 如果无法确认数据集文件的准确性,请直接使用成熟模型提供的数据集(可进行适当裁剪)。
  3. 以成熟模型的原始超参为基准,基于实际训练数据集与集群规模进行修改,得到一组待测超参。
  4. 重复三次以上的训练,确保每次训练的验证准确度均一致。如果有不一致的现象,重复以上检查直到满足各步骤需求。

对于自定义模型:

  • 确保数据集标记没有错误。
  • 选定一组调试时稳定的待测超参。
  • 重复三次以上的训练,确保每次训练的验证准确度均一致。如果有不一致的现象,调整超参、模型结构并重复以上检查,直到满足各步骤需求。

参考基准:正确使能混合精度训练

目标:基准模型为gpu-fp32/cpu-fp32训练时,需要调整为混合精度(gpu-fp16)训练并且能够得到相同的准确度结果。

基准模型为混合精度(gpu-fp16)训练时,建议使用高精度(gpu-fp32/cpu-fp32)模式训练并能够得到相同的准确度结果。

说明

如果由于内存、硬件等限制无法获得高精度模式训练的结果,那么至少需要确保多次重复训练能够得到相同的准确度结果。

NPU硬件架构仅支持用户模型执行在混合精度训练模式下,故用户模型也需要在GPU上以混合精度训练确保模型收敛后作为参考基准。如果用户模型未在GPU的混合精度模式下验证收敛,使用该参考基准迁移到NPU后可能会导致NPU训练不收敛。

如果混合精度训练和高精度训练相互对比不满足精度比对要求,那么该参考基准不适合用于精度对比,原因为:混合精度的fp16数据类型在该训练的场景下对精度引起了明显的差异,导致GPU混合精度以及NPU混合精度训练均存在精度风险,此时需要调整模型结构以确保混合精度训练能够收敛。

参考步骤如下:

  1. 确保基准模型使能混合精度训练模式。

  2. 确保使能动态loss_scale。

    也可使能静态loss_scale,该方法相对复杂,不建议使用。原因是:静态loss_scale场景下,使用GPU的loss_scale值在NPU上训练时,可能会导致不期望的频繁溢出,影响收敛,此种场景下需要调整NPU的loss_scale值。

  3. 观察混合精度训练过程中的浮点异常发生次数,确保发生次数较少(异常次数建议在0.5%以下,global batch size较大时建议在0.1%以下)。

  4. 如果发生次数较多,修改loss_scale的初始值以及放大、缩小的步进阈值,直到训练发生的浮点异常次数非常少。

  5. 重复三次以上的训练,确保每次训练的验证准确度均一致。如果有不一致的现象,调整超参、模型结构并重复以上检查,直到满足各步骤需求。

检查迁移后脚本

模型迁移:在NPU上正确使能混合精度

在精度调试前,首先需要确保模型迁移成功且在NPU上功能调通。如果涉及分布式训练,确保正确使能。

特别需要注意的是,在迁移过程中,需要确保正确使能混合精度训练。

在GPU上使能混合精度主要有以下两种方式:

  • 使用GPU的手动混合精度模式(参考链接),在模型中已经明确定义了所有的算子数据类型。
  • 使用GPU的自动混合精度模式(参考链接),利用TensorFlow框架或者第三方接口(例如Apex)能力,定义模型的算子数据类型。

需要注意,为了尽可能减少重复改图带来不期望的问题,以上方法需要确保仅使能一种,且迁移到NPU上时也保持同样的方式,并确保NPU的精度配置如下:

针对Ascend 950PR/Ascend 950DT,使用“precision_mode_v2”选项,取值为“origin”。

针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,使用“precision_mode_v2”选项,取值为“origin”。

针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,使用“precision_mode_v2”选项,取值为“origin”。

针对Atlas 训练系列产品,使用“precision_mode”选项,取值为“allow_fp32_to_fp16”。

模型迁移:在NPU上正确使能Loss Scale

在混合精度计算中使用float16数据格式数据动态范围降低,造成梯度计算出现浮点溢出,会导致部分参数更新失败。为了保证部分模型训练在混合精度训练过程中收敛,需要配置Loss Scale的方法。

Loss Scale方法通过在前向计算所得的loss乘以Loss Scale系数S,起到在反向梯度计算过程中放大梯度的作用,从而最大程度规避浮点计算中较小梯度值无法用FP16表达而出现的溢出问题。在参数梯度聚合之后以及优化器更新参数之前,将聚合后的参数梯度值除以loss scale系数S还原。

动态loss scale通过在训练过程中检查梯度中浮点计算异常状态,自动动态选取loss scale系数S以适应训练过程中梯度变化,从而解决人工选取loss scale系数S和训练过程中自适应调整的问题。

在具体实现中,AI处理器由于浮点计算特性不同,在计算过程中的浮点异常检查等部分与GPU存在差异,因此需要注意在NPU上正确使能loss scale。

参考步骤:替换LossScaleOptimizer

数据处理:数据集与基准一致

目标:数据集与参考数据集一致。

数据集通常较大,复制过程可能出现不完整的情况,通过校验码确定数据集完整性,操作步骤如下:

  1. 获取参考数据集与实际环境数据集文件列表,确保两个文件列表一致。
  2. 获取参考数据集文件与实际环境数据集文件的MD5校验码,确保两组校验码一致。

数据处理:预处理流程与基准一致

目标:数据预处理流程与参考模型一致。

用户模型代码的数据预处理流程可能存在基于资源自动设定的变量,该变量会导致对数据集打乱的随机性不一致。需要从代码级别确认数据预处理的接口调用,尽可能减小该差异。典型的例子为:

数据集shuffle时自动检测主机内存大小后设定buffer size,如果NPU主机与参考基准主机内存差异过大,那么数据集打乱的随机性也会产生明显差异,从而导致精度产生不期望的差异。

参考步骤如下:

  1. 检查文件读取接口,确保读取数量与参考基准一致。
  2. 检查源数据格式到数据输入样本的转换过程,确保与基准一致。
  3. 检查对输入样本进行补齐等操作时,确保补齐方式与基准一致。
  4. 检查对数据输入样本进行乱序的方式一致,例如乱序片段的样本个数、乱序时的并行度均需一致。

数据处理:多节点分片方式与基准一致

目标:多节点对数据的分片方式需要与参考模型一致。

思路:用户模型代码的多节点数据预处理流程可能存在基于文件名、文件个数等进行分片的模式。

该模式下由于文件读取接口在不同节点上对文件名排序的不同,会导致分片差异较大甚至文件重复分片到不同节点等不期望的结果。

需要增加调试代码排除类似问题,确认分片规则与基准一致,参考步骤如下:

  1. 分别在参考基准和迁移后的模型上增加对输入文件列表的打印。
  2. 检查文件在节点间的分片策略与参考基准一致。

训练流程:与基准一致

目标:训练的起始状态、中间过程、结果状态需要与参考基准一致,验证的样本、流程也需要与参考基准一致。

用户训练过程中,经常会出现例如未清空中间数据等流程错误,基于该不期望的中间数据可能会引起精度不一致的问题。

用户需要对训练流程有基本的知识积累,并自行检查整个训练、验证过程的正确性,操作步骤如下:

  1. 检查权重的初始化方式,当初始权重为随机初始化时,确保随机特性与基准一致;当初始权重为加载预训练权重文件初始化时,确保权重文件与基准一致。
  2. 检查启动脚本,确保使用了正确的脚本和参数。
  3. 对于分布式训练,确保正确进行了分布式训练配置。尤其需要避免常见的各节点仅进行独立训练,而无任何信息同步的问题。

模型超参:与基准一致

目标:模型超参与参考基准一致。

进行脚本迁移的用户可能对超参的一致性不熟悉,导致迁移完成后,一些超参的计算事实上与参考基准不一致。

此时需要检查实际执行超参与参考基准的一致性。

出现较频繁的问题包括:

  • 分布式训练的迁移过程中,全局batch size与单Device batch size的换算出错,导致NPU的全局batch size与参考基准全局batch size不一致。
  • 分布式训练的迁移过程中,全局学习率与单Device学习率的换算出错,导致NPU的全局学习率与参考基准全局学习率不一致。

操作步骤如下:

  1. 对比检查迁移后的脚本与参考基准脚本中的超参设定参数,确保实际设定值一致。
  2. 对比检查与超参相关的配置文件,确保实际使用的配置文件一致。
  3. 运行调试(调试器或打印)参考基准脚本和迁移后的脚本,确认打印的超参数值一致。
  4. 对比训练过程中的学习率打印,确保参考基准和迁移后训练的变化一致。