通常情况下,用户可以优先选择整网dump数据比对,常见现象为loss不收敛。注意在dump CPU或GPU、NPU数据时,使用的torch版本要保持一致。
PyTorch训练场景的精度问题分析建议参考以下思路进行精度比对和比对结果分析:
具体操作步骤:
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。
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。
通过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
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模型进行问题复现。
from ptdbg_ascend import PrecisionDebugger debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0])
如此可保证PrecisionDebugger在每个进程都被调用。
精度工具多卡场景下的精度比对步骤与单卡场景基本一致。不同的是精度比对时需要使用compare_distributed函数进行比对:
多机多卡场景需要每个设备单独执行比对操作。
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
完成比对后会生成比对结果文件。