PyTorch1.5.0精度比对

单算子精度比对

PyTorch1.5.0版本适用的精度比对工具请参见CANN 开发工具指南》(开放态)中的“精度比对工具使用指南”章节比对数据准备>训练场景数据准备>准备以PyTorch为原始训练网络的精度比对数据文件章节。

NPU与GPU算子映射

PyTorch1.5.0版本适用的精度比对工具请参见CANN 开发工具指南》(开放态)中的“精度比对工具使用指南”章节比对数据准备>训练场景数据准备>准备以PyTorch为原始训练网络的精度比对数据文件> > 使用get_op_map接口获取原始网络与迁移后网络内算子的映射关系章节。

单算子溢出检测

用户通过算子溢出检测功能检测算子是否有溢出,然后采集溢出算子的数据,从而帮助开发人员快速定位并解决算子精度问题。

本功能只提供CANN层面IR级别的算子溢出检测,且只支持AI CORE算子。使用单算子溢出检测功能时,请不要同时开启APEX的动态Loss Scale模式和使用tensor融合功能。请使用单P对模型进行训练,不使用分布式。

  1. 采集溢出算子数据。

    # check_overflow为溢出检测控制开关
    # dump_path为dump文件保存路径
    with torch.utils.dumper(check_overflow=check_overflow, dump_path=${dump_path}, load_file_path='${文件加载路径}') as dump:
           # 添加需要检测算子溢出的代码片段s
            xxx
            xxxx

    运行一个step,模型运行过程中,如果有算子溢出,会打印出相应IR的名字。若训练过程中采集到了dump数据,则会在{dump_path}路径下生成dump数据的.h5文件。

  2. 配置算子映射。

    1. 配置环境变量。
      export ACL_DUMP_DATA=1    # 算子数据dump功能,调试时使用,可选,开启设置为1,关闭设置为0
    2. 根据精度对比结果,提取需要映射的算子。
      h5copy -pv -i "./input.h5" -o "./output.h5" -s "/op1/seqid/" -d "/op1/seqid/"
      • -i 为输入精度对比文件
      • -o 为输出需要映射的算子.h5文件路径
      • -s 为需要提取的源算子名称及seqid,s与d参数内容需保持一致。
      • -d 为需要提取的目的算子名称及seqid,s与d参数内容需保持一致。

      若需要提取多个算子,则修改-s、-d参数,多次执行该命令,可以把多算子追加提取到output.h5中。

    3. 在模型训练脚本目录下创建acl dump功能所需的的配置文件acl.json。
      {
          "dump":
          {
                  "dump_list":[]
                  "dump_path":"./output_IR2TBE"# 映射结果输出路径
                  "dump_mode":"all"
                  "dump_op_switch":"on"
          }
      }
      表1 参数说明

      字段名

      说明

      dump_list

      待dump数据的算子模型。为空,无需配置。

      dump_path

      dump数据文件存储到运行环境的目录,支持配置绝对路径或相对路径:

      • 绝对路径配置以“/”开头,例如:/home/HwHiAiUser/output。
      • 相对路径配置直接以目录名开始,例如:output。

      dump_mode

      dump数据模式,配置如下:

      • output:dump算子的输出数据,默认取值output。
      • input:dump算子的输入数据。
      • all:dump算子的输入、输出数据。

      dump_op_switch

      单算子模型dump数据开关,配置如下:

      • off:关闭单算子模型dump,默认取值off。
      • on:开启单算子模型dump。

  3. 在训练脚本中添加with语句开启IR映射TBE功能。

    with torch.utils.dumper(use_load=True, dump_path="./",load_file_path="./output.h5", load_with_acl_dump=True) as dump:
        # 模型计算代码,需用户自己添加
        # x = model(input_data)

    运行一步完整的模型计算过程,在计算过程中load遇到output.h5中的数据后,自动开启acl dump功能,执行IR,并dump出IR相对应的TBE算子的输入输出数据,IR执行结束,acl dump结束。运行成功后,在acl.json配置文件中的dump_path路径下查看输出结果文件。

    采集的dump数据会在{dump_path}/{time}/{deviceid}/{model_id}/{data_index}目录下生成。

    存放路径及文件命名规则:

    • dump_path:用户配置的溢出数据存放路径。
    • time:时间戳,例如20200808163566。
    • deviceid:device设备ID号。
    • model_id:子图ID。
    • dump文件:命名规则如{op_type}.{op_name}.{taskid}.{stream_id}.{timestamp},如果op_type、op_name出现了“.”、“/”、“\”、空格时,会转换为下划线表示。

  4. 解析溢出数据。

    1. 进入解析脚本所在路径。
      cd  ${CANN_INSTALL_PATH}/latest/toolkit/tools/operator_cmp/compare
    2. 执行msaccucmp.py脚本,转换dump文件为numpy文件。
      python3 msaccucmp.py convert -d /home/HwHiAiUser/dump -out /home/HwHiAiUser/dumptonumpy -v 2

      -d参数支持传入单个文件,对单个dump文件进行转换,也支持传入目录,对整个path下所有的dump文件进行转换。

    3. 调用Python,转换numpy文件为txt文件。
      import numpy as np
      a = np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy")
      b = a.flatten()
      np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)