溢出检测使用指南
- 在训练脚本中导入精度工具包,使能精度工具溢出定位。
from ptdbg_ascend import register_hook, overflow_check, seed_all, set_dump_path, set_dump_switch, acc_cmp_dump
- 在模型定义后,训练循环开始前,添加溢出检测函数。
- 全量溢出检测。
from ptdbg_ascend import register_hook, overflow_check, seed_all, set_dump_path, set_dump_switch, acc_cmp_dump seed_all() ... set_dump_path("./data/dump/npu.pkl", dump_tag='npu_overflow') # 设置dump路径,最终数据保存在此路径下 register_hook(model, overflow_check, overflow_nums=jump_out_num) # 使能溢出检测 ...
- dump指定API的ACL级别溢出数据。
from ptdbg_ascend import register_hook, overflow_check, seed_all, set_dump_path, set_dump_switch, acc_cmp_dump seed_all() ... # dump指定API的ACL级别溢出数据 register_hook(model, overflow_check, dump_mode='acl', dump_config='./dump.json') # 在期望溢出检测的step位置开始前打开溢出检测开关 set_overflow_check_switch("ON") ... # 在step结束的位置关闭溢出检测开关 set_overflow_check_switch("OFF") ...
- dump指定反向API的ACL级别的溢出数据。
from ptdbg_ascend import register_hook, overflow_check, seed_all, set_dump_path, set_dump_switch, acc_cmp_dump seed_all()... # dump指定反向API的ACL级别溢出数据 register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"]) set_backward_input(["acl_dump_xxx//Functional_conv2d_1_backward_input.0.npy"])
- 全量溢出检测。
- 执行训练,dump溢出数据。若有溢出,则会抛出异常并结束训练。样例异常信息如下图。图1 溢出异常
- 参考解析dump文件,将dump文件转换为numpy格式文件。再通过如下脚本将numpy文件转换为tensor并打印。
import numpy as np path = 'path_to_numpy_file' # 文件路径请根据实际情况设置 tensor = np.load(path) print(tensor)
- 逐个检视打印的tensor中是否有inf、nan的元素。若有,则说明该算子出现了溢出问题,可以联系华为工程师解决。若没有,则说明该算子的溢出不影响精度,非问题,需要进一步找别的溢出算子进行分析、或进行dump分析定位问题。
父主题: 精度调优