解析dump数据

  1. 执行命令将原始的dump二进制数据文件解析为numpy可读取的npy文件。

    find precision_data/npu/debug_0 -type f -name "*" | xargs -i python3 /usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py convert -d {} -out dump_data_npy/ -v 2

    该命令将“precision_data/npu/debug_0”目录下的文件通过msaccucmp.py脚本进行格式转换,并保存到dump_data_npy目录下。其中“/usr/local/Ascend/ascend-toolkit/”目录为cann安装目录,可根据实际修改,msaccucmp.py脚本命令使用可参考《CANN 精度调试工具用户指南》中“dump数据文件Format转换”章节

  2. 从npy文件中查找nan来源。

    转换后的npy数据保存在“dump_data_npy”目录下,包含网络中所有算子的输入和输出数据,文件按照“.”分割后的5个位置是时间戳,将所有文件按照时间戳从小到大排序,依次判断文件中是否存在nan,从中找到最先出现nan的数据文件,如果存在则打印文件名称,并终止循环;如果没有打印,说明文件中不存在nan,需要检查dump步骤是否正确执行。文件的命名格式说明可参考《CANN 精度调试工具用户指南》中“数据格式要求”章节

    执行python3 find_nan.py命令,find_nan.py内容如下:

    import glob 
    import numpy as np  
    
    files = glob.glob("dump_data_npy/*") 
    files.sort(key = lambda x : int(x.split(".")[4])) 
    for i in files:     
          f = np.load(i)     
          if np.isnan(f).any():         
          print(i)         
          break