PyTorch精度工具使用教程

PyTorch精度工具

ptdbg_ascend工具主要支持PyTorch API精度数据dump、溢出检测、精度比对以及parse数据解析功能。其中dump和溢出检测功能支持使用debugger和register_hook方式进行精度数据的dump和溢出检测,推荐使用debugger方式。

PyTorch精度工具简介

概述

在PyTorch训练网络,对同一模型或API调试过程中,遇到API相关的计算精度问题,定位时费时费力。

ptdbg_ascend为PyTorch精度工具,用来进行PyTorch整网API粒度的数据dump、精度比对和溢出检测,从而定位PyTorch训练场景下的精度问题。

使用场景

主要的使用场景包括:

  • 同一模型,从CPU或GPU移植到NPU中存在精度下降问题,对比NPU芯片中的API计算数值与CPU或GPU芯片中的API计算数值,进行问题定位。
  • 同一模型,进行迭代(模型、框架版本升级或设备硬件升级)时存在的精度下降问题,对比相同模型在迭代前后版本的API计算数值,进行问题定位。

原理介绍

精度对比工具,通过在PyTorch模型中注册hook,跟踪计算图中API的前向传播与反向传播时的输入与输出,排查存在计算精度误差,进行问题的精准定位。

精度比对流程

  1. 当模型在CPU或GPU上进行正向和反向传播时,分别dump每一层的数值输入与输出。
  2. 当模型在NPU中进行计算时,采用相同的方式dump下相应的数据。
  3. 通过对比dump出的数值,计算余弦相似度和最大绝对误差的方式,定位和排查NPU API存在的计算精度问题。如图所示。

在这里插入图片描述

PyTorch精度比对总体流程

  1. 准备CPU或GPU训练工程。
  2. 在环境下安装ptdbg_ascend工具。
  3. 在训练脚本内插入ptdbg_ascend工具dump接口。
  4. 执行训练dump数据。
  5. 准备NPU训练工程。
  6. 在NPU环境下安装ptdbg_ascend工具。
  7. 在NPU训练脚本内插入ptdbg_ascend工具dump接口。
  8. NPU环境下执行训练dump数据。
  9. 比对结果分析。

使用方式快速入门(debugger方式)

通过ptdbg_ascend工具进行精度比对和分析,主要使用“debugger方式dump和溢出检测”和“CPU或GPU与NPU精度数据比对”下面介绍的ptdbg_ascend工具接口。

  1. 分别在NPU和GPU环境中安装ptdbg_ascend工具

    • 下载ptdbg_ascend精度工具whl包,推荐下载最新版本,并上传至NPU和GPU环境当中

    • 进行whl安装

      执行如下命令进行安装。

      pip3 install ./ptdbg_ascend-{version}-py3-none-any.whl
      

      若为覆盖安装,请在命令行末尾增加“–force-reinstall”参数强制安装,例如:

      pip3 install ./ptdbg_ascend-{version}-py3-none-any.whl --force-reinstall
      

      提示如下信息则表示安装成功。

      Successfully installed ptdbg_ascend-{version}
      
  2. 在训练脚本内插入ptdbg_ascend工具dump接口

    • 精度分析示例

      dump整网数据

      修改训练脚本,添加如下内容:

      #开头导库,并做基本配置
      from ptdbg_ascend import *
      debugger = PrecisionDebugger(dump_path="./npu_dump", hook_name="dump", step=[0])
      debugger.configure_hook(mode="api_stack")
      # 请勿将以上初始化流程插入到循环代码中
      
      # 模型初始化
      # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop()
      debugger.start()
      
      # 需要dump的代码片段1
      
      debugger.stop()
      debugger.start()
      
      # 需要dump的代码片段2
      
      debugger.stop()
      debugger.step()  #dump结束标志
      

      以 transformers架构为例:
      vim /usr/local/python3.10.12/lib/python3.10/site-packages/transformers/trainer.py

      在开头约260-270行添加dump配置代码:
      在这里插入图片描述

      在开始训练处约2180-2190行添加debugger开始代码
      在这里插入图片描述

      在dump结束位置约2130-2140行添加debugger结束代码
      在这里插入图片描述

  3. 回到模型训练路径下,启动训练任务

    在这里插入图片描述

  4. 采集结束任务会自动停止,同时在任务目录下生成dump_result目录

    在这里插入图片描述

    生成.pkl文件

    在这里插入图片描述

  5. 另一个环境重复1-4步骤进行dump日志数据采集

  6. 使用“compare_distributed”工具进行数据比对分析

    假设NPU dump npy数据目录为npu_dump/ptdbg_dump_v6.0,GPU dump npy数据目录为gpu_dump/ptdbg_dump_v6.0。

    创建比对脚本:

    vim compare_distributed.py
    
    from ptdbg_ascend import *
    compare_distributed('./gpu_dump/ptdbg_dump_v6.0/step0', './npu_dump/ptdbg_dump_v6.0/step0', './output_dump',stack_mode=True)
    
    ##四个参数
    #1.GPU dump npy数据路径,需要写到step
    #2.NPU dump npy数据路径,需要写到step
    #3.结果输出路径,需要提前创建
    #4.stack_mode堆栈模式打开
    
  7. 执行脚本进行对比,比对完成会生成如下目录,advisor为专家建议,compare为各算子比对结果

    在这里插入图片描述

  8. 查看advisor_xxxx.txt文件,给出了可能存在精度问题的API的专家建议,可以直接查看。

    在这里插入图片描述

  9. 打开结果文件中的compare_result_xxxx.xlsx文件进行分析

    在这里插入图片描述

  10. 重点关注“result”列及上图标红的这几列,找到有差异的算子,然后进一步分析

包含结果:

  • Waring(NPU与标杆统计信息的比对中存在相对误差大于0.5,则需要重点检查该API);
  • 为空(相对误差小于等于0.5,可以不需要重点关注,但不代表不存在精度问题);
  • Nan(表示统计信息数据没有匹配上)。
  • 同时,需要关注高亮的API,存在红色或黄色高亮的API被认为可能存在问题
    • 红色可能出现的情况有:
      • NPU max或NPU min信息中存在nan/inf
      • Max diff存在大于1e+10的值
      • 统计数据中output的Max diff除以max(0.01, Bench max) > 0.5
      • 真实数据中One Thousandth Err Ratio的input > 0.9同时output < 0.6
    • 黄色可能出现的情况有:
      • Max diff的input与output都大于1,同时output比input大一个数量级以上
      • 统计数据Max diff除以max(0.01, Bench max)的output > 0.1同时input < 0.01
      • 真实数据One Thousandth Err Ratio的input - output > 0.1
      • 真实数据Cosine的input - output > 0.1

debugger方式dump模块介绍

PrecisionDebugger模块

功能说明

PrecisionDebugger模块包含dump和溢出检测功能的总体配置项。可以指定dump目录,设置dump或溢出检测功能,指定dump的卡和迭代。

可以在**from ptdbg_ascend import ***和模型初始化之间的任意位置添加该模块。

原型

PrecisionDebugger(dump_path=None, hook_name=None, rank=None, step=[], enable_dataloader=False, model=None):

参数说明

参数名 说明 是否必选
dump_path 设置dump数据目录路径,参数示例:“./dump_path”。数据类型:str。
hook_name dump模式,可取值"dump"和"overflow_check",表示dump和溢出检测功能,二选一。参数示例:hook_name=“dump”。数据类型:str。
rank 指定对某张卡上的数据进行dump或溢出检测,默认未配置(表示dump所有卡的数据)。数据类型:int。
step 指定dump某个step的数据,默认未配置,表示dump所有step数据。dump特定step时,须指定为训练脚本中存在的step.例如:step=[0,1,2];也可以配置step范围,例如:step=list(range(0,9)),表示dump第0到第8个step。数据类型:List[int]。
enable_dataloader 自动控制开关,可取值True(开启)或False(关闭),默认为False。配置为True后自动识别dump step参数指定的迭代,并在该迭代执行完成后退出训练,此时start和stop函数可不配置,开启该开关要求训练脚本是通过torch.utils.data.dataloader方式加载数据;配置为False则需要配置start和stop函数,并在最后一个stop函数后或一个step结束的位置添加debugger.step()。数据类型:bool。
model 开启init dump模式,传入网络模型实例化的对象,配置该参数后,dump操作仅dump网络中init方法里调用的方法(nn.Module类),不会对所有API进行dump。参数示例: model=net,net为网络模型实例化的对象名称。默认未配置。 配置该参数时,PrecisionDebugger模块请在模型实例化之后调用。数据类型:torch.nn.Module。 该模式不支持“溢出检测”、”ACL级别数据dump“和“模块级精度数据dump”。此模式下dump文件名前缀为网络中定义的模块名或层名。

configure_hook函数(可选)

功能说明

设置dump范围。

建议在PrecisionDebugger模块与模型初始化之间的任意位置添加,不添加此函数时默认使用mode=“api_stack” dump整网数据。

原型

dump:

debugger.configure_hook(mode="api_stack", scope=[], api_list=[], filter_switch="OFF", acl_config=None, backward_input=[], input_output_mode=["all"], summary_only=False, summary_mode="all")

参数说明

参数名 说明 是否必选
mode dump模式。可取值"all"、“list”、“range”、“stack”、“acl”、“api_list”、“api_stack”,各参数含义请参见本节的“函数示例”。参数示例:mode=“list”。默认为"api_stack"。该参数配置值将作为dump数据文件名的前缀,详情请参见“dump数据存盘说明”。数据类型:str。
scope或api_list dump范围。根据model配置的模式选择dump的API范围,mode="api_list"时,需要配置api_list=[],其他模式有需要时配置scope=[]。参数示例:scope=[“Tensor.permute.1.forward”, “Tensor.transpose.2.forward”]、api_list=[“relu”]。默认为空。数据类型:List[str]。
filter_switch dump bool和整型的tensor以及浮点、bool和整型的标量的过滤开关。可取值"ON"(表示开启过滤,即不dump)或"OFF"(表示关闭过滤)。参数示例:filter_switch=“ON”。默认不配置,即filter_switch=“OFF”,表示dump上述数据。数据类型:str。
acl_config acl dump的配置文件。mode="acl"时,该参数必选;mode为其他值时,该参数不选。参数示例:acl_config=‘./dump.json’。dump.json配置文件详细介绍请参见“dump.json配置文件说明”。数据类型:str。
backward_input 该输入文件为首次运行训练dump得到反向API输入的.npy文件。例如若需要dump Functional.conv2d.1 API的反向过程的输入输出,则需要在dump目录下查找命名包含Functional.conv2d.1、backward和input字段的.npy文件。数据类型:str。
input_output_mode dump数据过滤。可取值"all"、“forward”、“backward”、“input"和"output”,表示仅保存dump的数据中文件名包含"forward"、“backward”、"input"和"output"的前向、反向、输入或输出的.npy文件。参数示例input_output_mode=[“backward”]或input_output_mode=[“forward”, “backward”]。默认为[“all”],即保存所有dump的数据。除了all参数只能单独配置外,其他参数可以*组合。数据类型:list。
summary_only dump npy文件过滤,可取值True或False,配置为True后仅dump保存API统计信息的pkl文件,参数示例:summary_only=False,默认为False。数据类型:bool。
summary_mode 控制dump文件输出的模式,可取值md5(dump仅输出包含md5值的pkl文件,用于验证数据的完整性)、summary(dump仅输出包含API统计信息的pkl文件)、all(dump输出包含API统计信息的pkl文件以及具体的npy文件),参数示例:summary_mode=“md5”,默认为"all"。summary_only=True时,不允许配置该参数。数据类型:str。
overflow_nums 控制溢出次数,表示第N次溢出时,停止训练,过程中检测到溢出API对应ACL数据均dump。参数示例:overflow_nums=3。配置overflow_check时可配置,默认不配置,即检测到1次溢出,训练停止,配置为-1时,表示持续检测溢出直到训练结束。数据类型:int。
need_replicate 过程dump数据生成开关,执行溢出检测时,dump目录下会生成forward_real_data和backward_real_data的过程dump数据目录,可取值True(生成)或False(不生成),默认不生成。数据类型:bool。

start函数(可选)

功能说明

dump或溢出检测启动函数。

在模型初始化之后的任意位置添加。

原型

debugger.start()

该函数为类函数,可以使用debugger.start()也可以使用PrecisionDebugger.start()。

stop函数(可选)

功能说明

dump或溢出检测停止函数。

start函数之后的任意位置添加。

原型

debugger.stop()

该函数为类函数,可以使用debugger.stop()也可以使用PrecisionDebugger.stop()。

上一篇:双十一电容笔选哪个好?!西圣、益博思、吉玛仕电容笔实测对比!


下一篇:基于RK3588/算能BM1684 AI盒子:综合视频智能AI分析系统建设方案(二)烟火检测、物品遗留、车道占用