混合精度为业内通用的性能提升方式,通过降低部分计算精度提升数据计算的并行度。混合精度训练方法是通过混合使用float16和float32数据类型来加速深度神经网络训练的过程,并减少内存使用和存取,从而可以训练更大的神经网络,同时又能基本保持使用float32训练所能达到的网络精度。当前昇腾AI处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。
配置为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()
开启自动混合精度的场景下,系统会自动根据内置的优化策略,对网络中的某些数据类型进行降精度处理,从而在精度损失很小的情况下提升系统性能并减少内存使用。
"Conv2D":{ "precision_reduce":{ "flag":"true" },
用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。
修改训练脚本,在初始化NPU设备前通过添加精度调优中的“modify_mixlist”参数指定混合精度黑白灰算子名单配置文件,配置示例如下:
import npu_device as npu npu.global_options().modify_mixlist = "/home/test/ops_info.json" npu.open().as_default()
{ "black-list": { // 黑名单 "to-remove": [ // 黑名单算子转换为灰名单算子 "Xlog1py" ], "to-add": [ // 白名单或灰名单算子转换为黑名单算子 "Matmul", "Cast" ] }, "white-list": { // 白名单 "to-remove": [ // 白名单算子转换为灰名单算子 "Conv2D" ], "to-add": [ // 黑名单或灰名单算子转换为白名单算子 "Bias" ] } }
假设算子A默认在白名单中,如果您希望将该算子配置为黑名单算子,可以参考如下方法:
{ "black-list": { "to-add": ["A"] } }
则系统会将该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。
{ "black-list": { "to-add": ["A"] }, "white-list": { "to-remove": ["A"] } }
则系统会将该该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。
{ "white-list": { "to-remove": ["A"] } }
此时,系统会将该算子从白名单中删除,然后添加到灰名单中,最终该算子在灰名单中。
对于只从黑/白名单中删除,而不添加到白/黑名单的情况,系统会将该算子添加到灰名单中。
对内置算子信息库进行修改,可能会对其他网络造成影响,请谨慎修改。
chmod u+w aic-<soc_version>-ops-info.json
当前目录下的所有json文件都会被加载到算子信息库中,如果您需要备份原来的json文件,建议备份到其他目录下。