训练网络执行过程中,可能发生频繁的浮点异常情况,即loss scale值下降次数较多或者直接下降为1,此时需要通过分析溢出数据,对频繁的浮点异常问题进行定界定位。
但在训练多个step的场景下,如果只是某个step出现了溢出,则可能是正常的偶发溢出,一般在开启loss scale的情况下,会自动跳过该step的训练结果,梯度不更新。对于这种偶发溢出场景一般可以不用关注。
溢出数据检测的主要过程如下所示。
以下操作在NPU训练环境执行。
1 2 |
import precision_tool.tf_config as npu_tf_config npu_tf_config.npu_device_dump_config(npu_device, action='overflow') |
溢出数据分析依赖CANN Toolkit软件包中的atc工具和msaccucmp.py工具,以下操作需要在CANN开发环境,即Toolkit安装环境进行。
├── precision_tool │ ├── cli.py │ ├── ... ├── precision_data │ ├── overflow │ │ ├── dump
pip3 install rich
# 依赖Toolkit包中的atc和msaccucmp.py工具,一般在run包安装目录,配置到父目录即可 # 默认Toolkit包安装在/usr/local/Ascend,可以不用修改,指定目录安装则需要修改 CMD_ROOT_PATH = '/usr/local/Ascend'
python3 ./precision_tool/cli.py
进入交互命令行界面:
PrecisionTool >
PrecisionTool > ac
根据数据量大小,分析过程需要时间不同,当执行过程中出现算子溢出,则会输出如下结果。
从上图可以看到:
当出现多个算子溢出时,会出现N个溢出算子信息,默认按照算子执行顺序排序,由于后面算子溢出可能是因为前一个算子溢出导致,建议用户优先分析第一个异常算子。
1 2 3 |
import npu_device as npu with npu.keep_dtype_scope(): v = tf.add(1, 1) |