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的前向传播与反向传播时的输入与输出,排查存在计算精度误差,进行问题的精准定位。
精度比对流程
- 当模型在CPU或GPU上进行正向和反向传播时,分别dump每一层的数值输入与输出。
- 当模型在NPU中进行计算时,采用相同的方式dump下相应的数据。
- 通过对比dump出的数值,计算余弦相似度和最大绝对误差的方式,定位和排查NPU API存在的计算精度问题。如图所示。
PyTorch精度比对总体流程
- 准备CPU或GPU训练工程。
- 在环境下安装ptdbg_ascend工具。
- 在训练脚本内插入ptdbg_ascend工具dump接口。
- 执行训练dump数据。
- 准备NPU训练工程。
- 在NPU环境下安装ptdbg_ascend工具。
- 在NPU训练脚本内插入ptdbg_ascend工具dump接口。
- NPU环境下执行训练dump数据。
- 比对结果分析。
使用方式快速入门(debugger方式)
通过ptdbg_ascend工具进行精度比对和分析,主要使用“debugger方式dump和溢出检测”和“CPU或GPU与NPU精度数据比对”下面介绍的ptdbg_ascend工具接口。
-
分别在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}
-
-
在训练脚本内插入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结束代码
-
-
回到模型训练路径下,启动训练任务
-
采集结束任务会自动停止,同时在任务目录下生成dump_result目录
生成.pkl文件
-
另一个环境重复1-4步骤进行dump日志数据采集
-
使用“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堆栈模式打开
-
执行脚本进行对比,比对完成会生成如下目录,advisor为专家建议,compare为各算子比对结果
-
查看advisor_xxxx.txt文件,给出了可能存在精度问题的API的专家建议,可以直接查看。
-
打开结果文件中的compare_result_xxxx.xlsx文件进行分析
-
重点关注“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()。