通常情况下,用户可以优先选择整网dump数据比对,常见现象为loss不收敛。注意在dump CPU或GPU、NPU数据时,使用的torch版本要保持一致。
from ptdbg_ascend import register_hook, overflow_check, seed_all, set_dump_path, set_dump_switch, acc_cmp_dump # 在main函数开始前固定随机数 seed_all() # 配置dump数据的路径 set_dump_path("./data/dump", dump_tag='all') # 注册dump回调函数 register_hook(model, acc_cmp_dump) ... # 在第一个迭代开始的位置开启dump和堆栈模式,同时为保证数据完整性开启dump bool和整型的tensor以及浮点、bool和整型的标量。 set_dump_switch("ON", mode="api_stack", filter_switch="OFF") ... # 在第一个迭代结束的位置关闭dump set_dump_switch("OFF")
dump文件目录结构如下,dump文件目录结构说明可参考dump文件目录结构。
all_v1.0 └── rank1 ├── api_stack_dump │ ├── Functional_conv2d_0_forward_input.0.npy │ ├── Functional_conv2d_0_forward_output.npy │ ..... │ ├── Torch_relu__9_forward_input.0.npy │ └── Torch_relu__9_forward_output.npy └── api_stack_dump.pkl
from ptdbg_ascend import compare dump_result_param={ "npu_pkl_path": "./npu/ptdbg_dump_v2.0/rank0/dump.pkl", "bench_pkl_path": "./cpu/ptdbg_dump_v2.0/rank0/dump.pkl", "npu_dump_data_dir": "./npu/ptdbg_dump_v2.0/rank0/dump", "bench_dump_data_dir": "./cpu/ptdbg_dump_v2.0/rank0/dump", "is_print_compare_log": True } compare(dump_result_param, "./output", stack_mode=True)
python3 compare.py
脚本中设置了“is_print_compare_log”为True,则部分回显如下所示:
start comapre: Functional_conv2d_0_forward_input.0 start comapre: Functional_conv2d_0_forward_input.1 start comapre: Functional_conv2d_0_forward_output start comapre: Functional_batch_norm_0_forward_input.0 start comapre: Functional_batch_norm_0_forward_input.1 [Functional_conv2d_0_forward_input.1] Compare result: cosine 0.000649, max_abs_err 0.134957, start comapre: Functional_batch_norm_7_forward_input.0 start comapre: Functional_batch_norm_0_forward_input.2 start comapre: Functional_batch_norm_0_forward_input.3 [Functional_conv2d_0_forward_input.0] Compare result: cosine 1.0, max_abs_err 0.000000, start comapre: Functional_conv2d_7_forward_output start comapre: Functional_batch_norm_0_forward_input.4 [Functional_batch_norm_0_forward_input.3] Compare result: cosine 1.0, max_abs_err 0.000000, start comapre: Functional_batch_norm_7_forward_output [Functional_batch_norm_0_forward_input.1] Compare result: cosine 1.0, max_abs_err 0.000000, start comapre: Functional_batch_norm_7_forward_input.3 start comapre: Functional_batch_norm_0_forward_output [Functional_batch_norm_0_forward_input.2] Compare result: cosine 1.0, max_abs_err 0.000000, start comapre: Functional_batch_norm_7_forward_input.4 ...
比对完成后会在指定的输出目录中生成对比结果文件“compare_result_timestamp.csv”,示例文件如下所示。
例如在比对结果的csv文件中,通过对比dump出的数值,计算两者的余弦相似度、均方根误差和最大绝对误差,定位和排查NPU算子存在的计算精度问题。筛选出余弦相似度(Cosine)小于0.99,最大绝对值误差(MaxAbsError)大于0.001的第一个API,针对该API执行后续比对操作,分析该API存在的精度问题。
from ptdbg_ascend import * seed_all() set_dump_path('./data/dump')
如此可保证set_dump_path在每个进程都被调用。
register_hook(model, acc_cmp_dump, rank=rank_id)
精度工具多卡场景下的精度比对步骤与单卡场景基本一致。不同的是精度比对时需要使用compare_distributed函数进行比对:
多机多卡场景需要每个设备单独执行比对操作。
from ptdbg_ascend import * compare_distributed('npu_dump/dump_conv2d_v1.0', 'gpu_dump/dump_conv2d_v1.0', './output')
python3 compare_distributed.py
完成比对后会生成比对结果文件。