数据dump比对场景
通常情况下,用户可以优先选择整网dump数据比对,常见现象为loss不收敛。注意在dump CPU或GPU、NPU数据时,使用的torch版本要保持一致。
单卡场景
PyTorch训练场景的精度问题分析建议参考以下思路进行精度比对和比对结果分析:
- 整网比对:dump整网数据并进行精度比对,初步定位异常范围。
- 缩小范围:根据Accuracy Reached or Not找出不符合精度标准的API。
- 范围比对:对不符合精度标准的API重新dump详细信息。
- 分析原因并优化:分析API精度不符合标准的原因并进行优化调整。
- 整网比对:重新进行整网比对,判断优化后的API是否已符合精度标准以及是否出现新的精度问题。
- 重复1至5,直到不存在精度问题为止。
具体操作步骤:
- 参考工具安装,完成ptdbg_ascend组件包安装。dump整网数据。分别dump CPU或GPU以及NPU数据,在PyTorch训练脚本插入dump接口,示例代码如下(下面以NPU为例,CPU或GPU dump基本相同):
from ptdbg_ascend import PrecisionDebugger 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()
- 比对整网数据。
1中的NPU dump数据目录为npu_dump,假设GPU dump数据目录为gpu_dump;dump将生成pkl数据文件和npy数据目录为api_stack_dump.pkl和api_stack_dump。
参考compare.py脚本示例创建并配置精度比对脚本,以创建compare.py为例,示例代码如下:from ptdbg_ascend import * dump_result_param={ "npu_pkl_path": "./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl", "bench_pkl_path": "./gpu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl", "npu_dump_data_dir": "./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump", "bench_dump_data_dir": "./gpu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump", "is_print_compare_log": True } compare(dump_result_param, "./output", stack_mode=True)
执行比对:
python3 compare.py
在output目录下生成结果文件,包括:compare_result_{timestamp}.csv和advisor_{timestamp}.txt。
- 查看比对结果文件,找出存在问题的API。
- 根据advisor_{timestamp}.txt或打屏信息的提示,可找到存在精度问题的算子(Suspect Nodes)和专家建议(Expert Advice)。
图1 advisor_{timestamp}.txt提示
- 根据2结果文件compare_result_{timestamp}.csv中的Accuracy Reached or No字段显示为NO的API,针对该API执行后续比对操作,分析该API存在的精度问题。
- 根据advisor_{timestamp}.txt或打屏信息的提示,可找到存在精度问题的算子(Suspect Nodes)和专家建议(Expert Advice)。
- (可选)提取指定API的堆栈信息和dump数据统计信息。
通过parse接口可以清晰的显示特定API的堆栈信息和dump数据统计信息,结合堆栈信息分析代码中可能存在的精度问题。
创建并配置提取脚本,以创建parse.py为例,示例代码如下:
from ptdbg_ascend import * # 提取dump信息中第1次调用的API:Torch_batch_normal的堆栈信息及数据统计信息 parse("./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl", "Torch_batch_normal_1_forward")
执行提取:
python3 parse.py
- (可选)指定API对其底层ACL数据进行dump。
dump指定前向API的ACL级别数据:
debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) debugger.configure_hook(mode="acl", scope=["Tensor_permute_1_forward"], acl_config="./dump.json") # 模型初始化 # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop() debugger.start() # 需要dump的代码片段1 debugger.stop() debugger.start() # 需要dump的代码片段2 debugger.stop() debugger.step()
dump指定反向API的ACL级别数据:
debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) # dump指定反向API的ACL级别数据、bool和整型的tensor以及浮点、bool和整型的标量 debugger.configure_hook(mode="acl", scope=["Functional_conv2d_1_backward"], acl_config="./dump.json", backward_input=["./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump/Functional_conv2d_1_backward_input.0.npy"]) # 模型初始化 # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop() debugger.start() # 需要dump的代码片段1 debugger.stop() debugger.start() # 需要dump的代码片段2 debugger.stop() debugger.step()
- (可选)重新比对。
根据4和5的dump数据重新配置compare.py并执行比对,可以对单API模型进行问题复现。
- mode="acl"场景下,会增加npu的内存消耗,请谨慎开启。
- 部分API存在调用嵌套关系,比如functional.batch_norm实际调用torch.batch_norm,该场景会影响acl init初始化多次,导致功能异常。
多卡场景
- 多卡一般为多进程,须保证每个进程都正确调用PrecisionDebugger,或把PrecisionDebugger插入到import语句后,如:
from ptdbg_ascend import PrecisionDebugger debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0])
如此可保证PrecisionDebugger在每个进程都被调用。
- 两次运行须用相同数量的卡,传入compare_distributed的两个文件夹下须有相同个数的rank文件夹,且不包含其他无关文件,否则将无法比对。
精度工具多卡场景下的精度比对步骤与单卡场景基本一致。不同的是精度比对时需要使用compare_distributed函数进行比对:
多机多卡场景需要每个设备单独执行比对操作。
- 参考工具安装,完成ptdbg_ascend组件包安装。创建比对脚本,例如compare_distributed.py。
from ptdbg_ascend import * compare_distributed('./npu_dump/ptdbg_dump_v4.0/step0', './gpu_dump/ptdbg_dump_v4.0/step0', './output')
- 执行比对。
python3 compare_distributed.py
完成比对后会生成比对结果文件。
图2 生成文件
父主题: 精度比对工具说明