文档
注册
评分
提单
论坛
小AI

混合精度训练

混合精度简介

混合精度为业内通用的性能提升方式,通过降低部分计算精度提升数据计算的并行度。混合精度训练方法是通过混合使用float16和float32数据类型来加速深度神经网络训练的过程,并减少内存使用和存取,从而可以训练更大的神经网络,同时又能基本保持使用float32训练所能达到的网络精度。当前昇腾AI处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。

  • allow_fp32_to_fp16:对于矩阵类算子,使用float16;对于矢量类算子,优先保持原图精度,如果网络模型中算子支持float32,则保留原始精度float32,如果网络模型中算子不支持float32,则直接降低精度到float16。
  • force_fp16:算子既支持float16又支持float32数据类型时,强制选择float16。
  • cube_fp16in_fp32out/force_fp32:算子既支持float16又支持float32数据类型时,系统内部根据算子类型的不同,选择合适的处理方式。配置为force_fp32或cube_fp16in_fp32out,效果等同,cube_fp16in_fp32out为新版本中新增配置,对于矩阵计算类算子,该选项语义更清晰。
    • 对于矩阵计算类算子,系统内部会按算子实现的支持情况处理:
      1. 优先选择输入数据类型为float16且输出数据类型为float32。
      2. 如果1中的场景不支持,则选择输入数据类型为float32且输出数据类型为float32。
      3. 如果2中的场景不支持,则选择输入数据类型为float16且输出数据类型为float16。
      4. 如果以上场景都不支持,则报错。
    • 对于矢量计算类算子,如果网络模型中算子同时支持float16和float32,强制选择float32,若原图精度为float16,也会强制转为float32。如果网络模型中存在部分算子,并且该算子实现不支持float32,比如某算子仅支持float16类型,则该参数不生效,仍然使用支持的float16;如果该算子不支持float32,且又配置了混合精度黑名单(precision_reduce = false),则会使用float32的AI CPU算子。
  • must_keep_origin_dtype:保持原图精度。如果原图中某算子精度为float16,但NPU中该算子实现不支持float16、仅支持float32,则系统内部自动采用高精度float32;如果原图中某算子精度为float32,但NPU中该算子实现不支持float32、仅支持float16,此场景下不能使用此参数值,系统不支持使用低精度。
  • allow_mix_precision_fp16/allow_mix_precision:开启自动混合精度功能,表示混合使用float16和float32数据类型来处理神经网络的过程。

    配置为allow_mix_precision或allow_mix_precision_fp16,效果等同,其中allow_mix_precision_fp16为新版本中新增配置,语义更清晰,便于理解。针对全网中float32数据类型的算子,系统会按照内置优化策略自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。开启该功能开关后,用户可以同时使能Loss Scaling,从而补偿降低精度带来的精度损失。

如果在训练脚本中未手工开启自动混合精度,默认采用“allow_fp32_to_fp16”。

开启“自动混合精度”的场景下,推荐使用LossScale优化器(LossScale优化器的迁移请参见替换LossScaleOptimizer),从而补偿降低精度带来的精度损失;若后续进行Profiling数据进行分析时,发现需要手工调整某些算子的精度模式,可以参考修改混合精度黑白名单自行指定哪些算子允许降精度,哪些算子不允许降精度。

精度模式设置

修改训练脚本,在初始化NPU设备前通过添加精度调优中的“precision_mode”参数设置精度模式。

import npu_device as npu
npu.global_options().precision_mode = 'allow_mix_precision'
npu.open().as_default()

修改混合精度黑白名单

开启自动混合精度的场景下,系统会自动根据内置的优化策略,对网络中的某些数据类型进行降精度处理,从而在精度损失很小的情况下提升系统性能并减少内存使用。

内置优化策略在“OPP安装目录/opp/built-in/op_impl/ai_core/tbe/config/<soc_version>/aic-<soc_version>-ops-info.json”,例如:
"Conv2D":{
    "precision_reduce":{
        "flag":"true"
},
  • precision_mode配置为allow_mix_precision_fp16/allow_mix_precision的场景:
    • 若取值为true(白名单),则表示允许将当前float32类型的算子,降低精度到float16。
    • 若取值为false(黑名单),则不允许将当前float32类型的算子降低精度到float16,相应算子仍使用float32精度。
    • 若网络模型中算子没有配置该参数(灰名单),当前算子的混合精度处理机制和前一个算子保持一致,即如果前一个算子支持降精度处理,当前算子也支持降精度;如果前一个算子不允许降精度,当前算子也不支持降精度。

用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。

  • (推荐)通过modify_mixlist参数指定混合精度黑白灰算子名单

    修改训练脚本,在初始化NPU设备前通过添加精度调优中的“modify_mixlist”参数指定混合精度黑白灰算子名单配置文件,配置示例如下:

    import npu_device as npu
    npu.global_options().modify_mixlist = "/home/test/ops_info.json"
    npu.open().as_default()
    其中ops_info.json为混合精度黑白灰算子名单配置文件,多个算子使用英文逗号分隔,样例如下:
    {
      "black-list": {                  // 黑名单
         "to-remove": [                // 黑名单算子转换为灰名单算子
         "Xlog1py"
         ],
         "to-add": [                   // 白名单或灰名单算子转换为黑名单算子
         "Matmul",
         "Cast"
         ]
      },
      "white-list": {                  // 白名单
         "to-remove": [                // 白名单算子转换为灰名单算子 
         "Conv2D"
         ],
         "to-add": [                   // 黑名单或灰名单算子转换为白名单算子
         "Bias"
         ]
      }
    }

    假设算子A默认在白名单中,如果您希望将该算子配置为黑名单算子,可以参考如下方法:

    1. (正确示例)用户将该算子添加到黑名单中:
      {
        "black-list": { 
           "to-add": ["A"]
        }
      }

      则系统会将该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。

    2. (正确示例)用户将该算子从白名单中删除,同时添加到黑名单中:
      {
        "black-list": {
           "to-add": ["A"]
        },
        "white-list": {
           "to-remove": ["A"]
        }
      }

      则系统会将该该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。

    3. (错误示例)用户将该算子从白名单中删除,此时算子最终是在灰名单中,而不是黑名单。
      {
        "white-list": {
           "to-remove": ["A"]
        }
      }

      此时,系统会将该算子从白名单中删除,然后添加到灰名单中,最终该算子在灰名单中。

      对于只从黑/白名单中删除,而不添加到白/黑名单的情况,系统会将该算子添加到灰名单中。

  • 修改算子信息库

    对内置算子信息库进行修改,可能会对其他网络造成影响,请谨慎修改。

    1. 切换到“OPP安装目录/opp/built-in/op_impl/ai_core/tbe/config/<soc_version>”目录下。
    2. 对aic-<soc_version>-ops-info.json文件增加写权限。
      chmod u+w aic-<soc_version>-ops-info.json

      当前目录下的所有json文件都会被加载到算子信息库中,如果您需要备份原来的json文件,建议备份到其他目录下。

    3. 修改或增加算子信息库aic-<soc_version>-ops-info.json文件中对应算子的precision_reduce字段。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词