diff --git a/debug/accuracy_tools/ptdbg_ascend/README.md b/debug/accuracy_tools/ptdbg_ascend/README.md index f9ca19daf7d99f4967d383a82fc95146ea449908..d753e7bb9ba49611cc48c500d33efe9d3f4c8a1c 100644 --- a/debug/accuracy_tools/ptdbg_ascend/README.md +++ b/debug/accuracy_tools/ptdbg_ascend/README.md @@ -83,7 +83,7 @@ ptdbg_ascend为PyTorch精度工具,用来进行PyTorch整网API粒度的数据 图1:精度比对逻辑图 - ![op_compare](figures/module_compare.png) + ![](figures/module_compare.png) **API匹配条件** diff --git "a/debug/accuracy_tools/ptdbg_ascend/doc/ptdbg_ascend\347\262\276\345\272\246\345\267\245\345\205\267\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.md" "b/debug/accuracy_tools/ptdbg_ascend/doc/ptdbg_ascend\347\262\276\345\272\246\345\267\245\345\205\267\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.md" index 23ee300d25593173f67910440ecfe9da854af05b..1914803364f633b912cd70959bcffd01319edd08 100644 --- "a/debug/accuracy_tools/ptdbg_ascend/doc/ptdbg_ascend\347\262\276\345\272\246\345\267\245\345\205\267\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.md" +++ "b/debug/accuracy_tools/ptdbg_ascend/doc/ptdbg_ascend\347\262\276\345\272\246\345\267\245\345\205\267\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.md" @@ -4,6 +4,8 @@ ptdbg_ascend工具的原理及安装请参见《[PyTorch精度工具](https://gitee.com/ascend/att/blob/master/debug/accuracy_tools/ptdbg_ascend/README.md)》。 +ptdbg_ascend工具主要支持PyTorch API精度数据dump、溢出检测、精度比对以及parse数据解析功能。其中dump和溢出检测功能支持使用debugger和register_hook方式进行精度数据的dump和溢出检测,推荐使用debugger方式。 + ## PyTorch精度比对总体流程 1. 准备CPU或GPU训练工程。 @@ -30,9 +32,9 @@ ptdbg_ascend工具的原理及安装请参见《[PyTorch精度工具](https://gi 11. 比对结果分析。 -## 场景化示例 +## 快速入门(debugger方式) -本章节主要介绍通过ptdbg_ascend工具进行精度比对和分析,主要使用“**CPU或GPU及NPU精度数据dump**”和“**CPU或GPU与NPU精度数据比对**”章节中介绍的ptdbg_ascend工具接口。 +本章节主要介绍通过ptdbg_ascend工具进行精度比对和分析,主要使用“**debugger方式dump和溢出检测**”和“**CPU或GPU与NPU精度数据比对**”章节中介绍的ptdbg_ascend工具接口。 ### 单卡场景精度比对 @@ -42,7 +44,7 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 1. 整网比对:dump整网数据并进行精度比对,初步定位异常范围。 2. 缩小范围:根据Accuracy Reached or Not找出不符合精度标准的API。 -3. 范围比对:对不符合精度标准的API重新dump。 +3. 范围比对:对不符合精度标准的API重新dump详细信息。 4. 分析原因并优化:分析API精度不符合标准的原因并进行优化调整。 5. 整网比对:重新进行整网比对,判断优化后的API是否已符合精度标准以及是否出现新的精度问题。 6. 重复1~5步,直到不存在精度问题为止。 @@ -54,41 +56,26 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 分别dump CPU或GPU以及NPU数据,在PyTorch训练脚本插入dump接口,示例代码如下(下面以NPU为例,CPU或GPU dump基本相同): ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 from ptdbg_ascend import * - - # 在main函数开始前固定随机数 - seed_all() - - # 配置dump数据目录路径和名称 - set_dump_path("./npu_dump", dump_tag='all') - - # 注册dump回调函数 - register_hook(model, acc_cmp_dump) - - ... - - # 在第一个迭代开始的位置开启dump和堆栈模式,同时为保证数据完整性开启dump bool和整型的tensor以及浮点、bool和整型的标量 - set_dump_switch("ON", mode="api_stack", filter_switch="OFF") - - ... - - # 在第一个迭代结束的位置关闭dump - set_dump_switch("OFF") + debugger = PrecisionDebugger(dump_path="./npu_dump", hook_name="dump", step=[0], enable_dataloader=True) + debugger.configure_hook(mode="api_stack") + # 请勿将以上初始化流程插入到循环代码中 ``` 2. 比对整网数据。 - 第1步中的NPU dump数据文件为npu_dump.pkl,假设NPU dump npy数据目录为npu_dump,GPU dump数据文件为gpu_dump.pkl,GPU dump npy数据目录为gpu_dump。 + 第1步中的NPU dump数据目录为npu_dump,假设GPU dump数据目录为gpu_dump;dump将生成pkl数据文件api_stack_dump.pkl和npy数据目录api_stack_dump。 创建并配置精度比对脚本,以创建compare.py为例,示例代码如下: ```python from ptdbg_ascend import * dump_result_param={ - "npu_pkl_path": "./npu_dump/all_v2.0/rank0/api_stack_dump.pkl", - "bench_pkl_path": "./gpu_dump/all_v2.0/rank0/api_stack_dump.pkl", - "npu_dump_data_dir": "./npu_dump/all_v2.0/rank0/api_stack_dump", - "bench_dump_data_dir": "./gpu_dump/all_v2.0/rank0/api_stack_dump", + "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) @@ -120,7 +107,7 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 from ptdbg_ascend import * # 提取dump信息中第1次调用的API:Torch_batch_normal的堆栈信息及数据统计信息 - parse("./npu_dump/all_v2.0/rank0/api_stack_dump.pkl", "Torch_batch_normal_1_forward") + parse("./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl", "Torch_batch_normal_1_forward") ``` 执行提取: @@ -136,38 +123,19 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 - dump指定前向API的ACL级别数据 ```python - from ptdbg_ascend import * - - # 固定随机数,开启确定性计算 - seed_all(mode=True) - set_dump_path("./dump_path", dump_tag='forward') - register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') - - # dump指定前向API的ACL级别数据、bool和整型的tensor以及浮点、bool和整型的标量 - set_dump_switch("ON", mode="acl", scope=["Tensor_permute_1_forward"], filter_switch="OFF") - - ... - - set_dump_switch("OFF") + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 + debugger = PrecisionDebugger(dump_path="./npu_dump", hook_name="dump", step=[0], enable_dataloader=True) + debugger.configure_hook(mode="acl", scope=["Tensor_permute_1_forward"], acl_config='./dump.json') ``` - dump指定反向API的ACL级别数据 ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 from ptdbg_ascend import * - - # 固定随机数,开启确定性计算 - seed_all(mode=True) - set_dump_path("./dump_path", dump_tag='backward') - register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') - + debugger = PrecisionDebugger(dump_path="./npu_dump", hook_name="dump", step=[0], enable_dataloader=True) # dump指定反向API的ACL级别数据、bool和整型的tensor以及浮点、bool和整型的标量 - set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"], filter_switch="OFF") - set_backward_input(["./npu_dump/all_v2.0/rank0/api_stack_dump/Functional_conv2d_1_backward_input.0.npy"]) - - ... - - set_dump_switch("OFF") + 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"]) ``` 6. (可选)重新比对。 @@ -179,26 +147,110 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 * dump_mode="acl"场景下,会增加npu的内存消耗,请谨慎开启。 * 部分API存在调用嵌套关系,比如functional.batch_norm实际调用torch.batch_norm,该场景会影响acl init初始化多次,导致功能异常。 +### 溢出检测场景 + +溢出检测是针对NPU的PyTorch API,检测是否存在溢出的情况。当前仅支持识别aicore浮点溢出。 + +溢出检测原理:针对溢出阶段,开启acl dump模式,重新对溢出阶段执行,落盘数据。 + +建议按照如下步骤操作: + +1. 在NPU环境下安装ptdbg_ascend工具。 + +2. 在NPU训练脚本内插入ptdbg_ascend工具溢出检测接口。 + + - 示例1:全量溢出检测 + + ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 + from ptdbg_ascend import * + debugger = PrecisionDebugger(dump_path="./overflow_dump", hook_name="overflow_check", step=[0], enable_dataloader=True) + debugger.configure_hook(overflow_nums=-1) + # 请勿将以上初始化流程插入到循环代码中 + ``` + + 多卡使用时各卡单独计算溢出次数。 + + - 示例2:dump指定前向API的ACL级别溢出数据 + + ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 + from ptdbg_ascend import * + debugger = PrecisionDebugger(dump_path="./overflow_dump", hook_name="overflow_check", step=[0], enable_dataloader=True) + debugger.configure_hook(mode="acl", acl_config="./dump.json") + # 请勿将以上初始化流程插入到循环代码中 + ``` + + - 示例3:dump指定反向API的ACL级别的溢出数据 + + 1. 进行全量溢出检测 + + ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 + from ptdbg_ascend import * + debugger = PrecisionDebugger(dump_path="./overflow_dump", hook_name="overflow_check", step=[0], enable_dataloader=True) + debugger.configure_hook(overflow_nums=-1) + # 请勿将以上初始化流程插入到循环代码中 + ``` + + 2. dump指定反向API的ACL级别的溢出数据 + + ```python + # 需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据 + from ptdbg_ascend import * + debugger = PrecisionDebugger(dump_path="./overflow_dump", hook_name="dump", step=[0], enable_dataloader=True) + debugger.configure_hook(mode="acl", scope=["Functional_conv2d_1_backward"], acl_config="./dump.json", backward_input=["./overflow_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump/Functional_conv2d_1_backward_input.0.npy"]) + # 请勿将以上初始化流程插入到循环代码中 + ``` + + 针对前向溢出API,可以通过overflow_nums,配置允许的溢出次数,并将每次溢出API的全部ACL数据dump下来,到达指定溢出次数后停止,停止后会看到堆栈打印包含如下字段。 + + ```bash + ValueError: [overflow xxx times]: dump file is saved in 'xxxxx.pkl'. + ``` + + 其中xxx times为用户设置的次数,xxxxx.pkl为文件生成路径。 + +3. NPU环境下执行训练dump溢出数据。 + + 针对输入正常但输出存在溢出的API,会训练执行目录下将溢出的API信息dump并保存为`forward_info_{pid}.json`和`backward_info_{pid}.json`,通过[Ascend模型精度预检工具](https://gitee.com/ascend/att/tree/master/debug/accuracy_tools/api_accuracy_checker)对json文件进行解析,输出溢出API为正常溢出还是非正常溢出,从而帮助用户快速判断。 + + 精度预检工具执行命令如下: + + ```bash + # 下载att代码仓后执行如下命令 + export PYTHONPATH=$PYTHONPATH:$ATT_HOME/debug/accuracy_tools/ + cd $ATT_HOME/debug/accuracy_tools/api_accuracy_checker/run_ut + python run_overflow_check.py -forward ./forward_info_0.json + ``` + + 反向过程溢出的API暂不支持精度预检功能。 + + 当重复执行溢出检测dump操作时,需要删除上一次dump目录下的溢出检测dump数据,否则将因重名而报错。 + +**注意事项** + +* dump_mode="acl"场景下,会增加npu的内存消耗,请谨慎开启。 +* 部分API存在调用嵌套关系,比如functional.batch_norm实际调用torch.batch_norm,该场景会影响acl init初始化多次,导致功能异常。 +* 混合精度动态loss scale场景下,正常训练会有"Gradient overflow. SKipping step"日志,添加溢出检测后日志消失,可以通过设置环境变量export OVERFLOW_DEBUG_MODE_ENABLE=1,并将register_hook位置调整amp.initialize之前解决。此功能需要cann包配套支持,不支持版本执行报错EZ3003。 + +## 场景化示例 + +本章节主要介绍通过ptdbg_ascend工具进行精度比对和分析,主要使用“**CPU或GPU及NPU精度数据dump**”和“**CPU或GPU与NPU精度数据比对**”章节中介绍的ptdbg_ascend工具接口。 + ### 多卡场景精度比对 精度工具支持多卡场景的精度比对,多卡场景的dump步骤与单卡场景完全一致,请参见“**单卡场景精度比对**”章节,不同的是多卡数据精度比对时需要使用“compare_distributed”函数进行比对。如下示例: 说明:多机多卡场景需要每个设备单独执行比对操作。 -假设NPU dump npy数据目录为npu_dump/dump_conv2d_v3.0,GPU dump npy数据目录为gpu_dump/dump_conv2d_v3.0。 +假设NPU dump npy数据目录为npu_dump/ptdbg_dump_v4.0,GPU dump npy数据目录为gpu_dump/ptdbg_dump_v4.0。 1. 创建比对脚本,例如compare_distributed.py,拷贝如下代码。 ```python from ptdbg_ascend import * - compare_distributed('./npu_dump/dump_conv2d_v3.0', './gpu_dump/dump_conv2d_v3.0', './output') - ``` - - 若使用debugger方式dump数据,且配置了PrecisionDebugger模块的step参数,则compare_distributed指定到step目录层级,如下示例: - - ```python - from ptdbg_ascend import * - compare_distributed('./npu_dump/step0', './gpu_dump/step0', './output') + compare_distributed('./npu_dump/ptdbg_dump_v4.0', './gpu_dump/ptdbg_dump_v4.0', './output') ``` 2. 执行比对: @@ -211,7 +263,14 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 **多卡set_dump_path注意事项** -多卡一般为多进程,须保证每个进程都正确调用set_dump_path,或把set_dump_path插入到import语句后,如: +多卡一般为多进程,须保证每个进程都正确调用PrecisionDebugger或set_dump_path,或把PrecisionDebugger或set_dump_path插入到import语句后,如: + +```python +from ptdbg_ascend import * +debugger = PrecisionDebugger(dump_path="./npu_dump", hook_name="dump", step=[0], enable_dataloader=True) +``` + +或 ```python from ptdbg_ascend import * @@ -296,6 +355,12 @@ register_hook需要在set_dump_path之后调用,也需要在每个进程上被 通信类API数据可以使用全量dump方式获取,若只dump通信类API数据,可以使用如下示例: +```python +debugger.configure_hook(mode="api_list", api_list=["distributed"]) +``` + +或 + ```python set_dump_switch("ON", mode="api_list", api_list=["distributed"]) ``` @@ -318,7 +383,152 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) | 12 | _reduce_scatter_base | | 13 | _all_gather_base | -### 溢出检测场景 +### 单卡场景精度比对(register_hook方式) + +**精度分析建议** + +PyTorch训练场景的精度问题分析建议参考以下思路进行精度比对和比对结果分析: + +1. 整网比对:dump整网数据并进行精度比对,初步定位异常范围。 +2. 缩小范围:根据Accuracy Reached or Not找出不符合精度标准的API。 +3. 范围比对:对不符合精度标准的API重新dump。 +4. 分析原因并优化:分析API精度不符合标准的原因并进行优化调整。 +5. 整网比对:重新进行整网比对,判断优化后的API是否已符合精度标准以及是否出现新的精度问题。 +6. 重复1~5步,直到不存在精度问题为止。 + +**精度分析示例** + +1. dump整网数据。 + + 分别dump CPU或GPU以及NPU数据,在PyTorch训练脚本插入dump接口,示例代码如下(下面以NPU为例,CPU或GPU dump基本相同): + + ```python + from ptdbg_ascend import * + + # 在main函数开始前固定随机数 + seed_all() + + # 配置dump数据目录路径和名称 + set_dump_path("./npu_dump", dump_tag='all') + + # 注册dump回调函数 + register_hook(model, acc_cmp_dump) + + ... + + # 在第一个迭代开始的位置开启dump和堆栈模式,同时为保证数据完整性开启dump bool和整型的tensor以及浮点、bool和整型的标量 + set_dump_switch("ON", mode="api_stack", filter_switch="OFF") + + ... + + # 在第一个迭代结束的位置关闭dump + set_dump_switch("OFF") + ``` + +2. 比对整网数据。 + + 第1步中的NPU dump数据文件为npu_dump.pkl,假设NPU dump npy数据目录为npu_dump,GPU dump数据文件为gpu_dump.pkl,GPU dump npy数据目录为gpu_dump。 + + 创建并配置精度比对脚本,以创建compare.py为例,示例代码如下: + + ```python + from ptdbg_ascend import * + dump_result_param={ + "npu_pkl_path": "./npu_dump/all_v4.0/step0/rank0/api_stack_dump.pkl", + "bench_pkl_path": "./gpu_dump/all_v4.0/step0/rank0/api_stack_dump.pkl", + "npu_dump_data_dir": "./npu_dump/all_v4.0/step0/rank0/api_stack_dump", + "bench_dump_data_dir": "./gpu_dump/all_v4.0/step0/rank0/api_stack_dump", + "is_print_compare_log": True + } + compare(dump_result_param, "./output", stack_mode=True) + ``` + + 执行比对: + + ```bash + python3 compare.py + ``` + + 在output目录下生成结果文件,包括:`compare_result_{timestamp}.csv`和`advisor_{timestamp}.txt` + +3. 找出存在问题的API。 + + 1. 根据`advisor_{timestamp}.txt`或打屏信息的提示,可找到存在精度问题的算子(Suspect Nodes)和专家建议(Expert Advice) + + ![auto_analyze_log](img/auto_analyze_log.png) + + 2. 根据第2步结果文件`compare_result_{timestamp}.csv`中的Accuracy Reached or No字段显示为NO的API,针对该API执行后续比对操作,分析该API存在的精度问题。 + +4. (可选)提取指定API的堆栈信息和dump数据统计信息。 + + 通过parse接口可以清晰的显示特定API的堆栈信息和dump数据统计信息,结合堆栈信息分析代码中可能存在的精度问题。 + + 创建并配置提取脚本,以创建parse.py为例,示例代码如下: + + ```python + from ptdbg_ascend import * + + # 提取dump信息中第1次调用的API:Torch_batch_normal的堆栈信息及数据统计信息 + parse("./npu_dump/all_v4.0/step0/rank0/api_stack_dump.pkl", "Torch_batch_normal_1_forward") + ``` + + 执行提取: + + ```bash + python3 parse.py + ``` + + + +5. (可选)指定API对其底层ACL数据进行dump。 + + - dump指定前向API的ACL级别数据 + + ```python + from ptdbg_ascend import * + + # 固定随机数,开启确定性计算 + seed_all(mode=True) + set_dump_path("./dump_path", dump_tag='forward') + register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') + + # dump指定前向API的ACL级别数据、bool和整型的tensor以及浮点、bool和整型的标量 + set_dump_switch("ON", mode="acl", scope=["Tensor_permute_1_forward"], filter_switch="OFF") + + ... + + set_dump_switch("OFF") + ``` + + - dump指定反向API的ACL级别数据 + + ```python + from ptdbg_ascend import * + + # 固定随机数,开启确定性计算 + seed_all(mode=True) + set_dump_path("./dump_path", dump_tag='backward') + register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') + + # dump指定反向API的ACL级别数据、bool和整型的tensor以及浮点、bool和整型的标量 + set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"], filter_switch="OFF") + set_backward_input(["./npu_dump/all_v4.0/step0/rank0/api_stack_dump/Functional_conv2d_1_backward_input.0.npy"]) + + ... + + set_dump_switch("OFF") + ``` + +6. (可选)重新比对。 + + 根据第4或5步的dump数据重新配置compare.py并执行比对,可以对单API模型进行问题复现。 + +**注意事项** + +* dump_mode="acl"场景下,会增加npu的内存消耗,请谨慎开启。 +* 部分API存在调用嵌套关系,比如functional.batch_norm实际调用torch.batch_norm,该场景会影响acl init初始化多次,导致功能异常。 + +### 溢出检测场景(register_hook方式) 溢出检测是针对NPU的PyTorch API,检测是否存在溢出的情况。当前仅支持识别aicore浮点溢出。 @@ -395,7 +605,7 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) # dump指定反向API的ACL级别溢出数据 register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"]) - set_backward_input(["./npu_dump/ptdbg_dump_v2.0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) + set_backward_input(["./npu_dump/ptdbg_dump_v4.0/step0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) ``` 针对前向溢出API,可以通过overflow_nums,配置允许的溢出次数,并将每次溢出API的全部ACL数据dump下来,到达指定溢出次数后停止,停止后会看到堆栈打印包含如下字段。 @@ -452,7 +662,7 @@ PrecisionDebugger(dump_path=None, hook_name=None, rank=None, step=[], enable_dat | dump_path | 设置dump数据目录路径,参数示例:"./dump_path"。
默认在dump_path目录下生成`ptdbg_dump_{version}`目录,并在该目录下生成`dump.pkl`文件以及`dump`数据文件保存目录。
当**configure_hook**函数配置了mode参数时,`dump.pkl`文件以及`dump`数据文件保存目录名称添加mode参数值为前缀,详情请参见“**dump数据存盘说明**”。
未配置dump_path时,也可以通过环境变量ASCEND_WORK_PATH配置dump路径,此时dump数据将落盘在${ASCEND_WORK_PATH}/dump_data下,自定义配置dump_path优先级高于环境变量,dump_path和环境变量需要二选一。 | 否 | | hook_name | dump模式,可取值dump和overflow_check,表示dump和溢出检测功能,二选一。 | 是 | | rank | 指定对某张卡上的数据进行dump或溢出检测,默认未配置(表示dump所有卡的数据),须根据实际卡的Rank ID配置。应配置为大于0的正整数,且须根据实际卡的Rank ID配置,若所配置的值大于实际训练所运行的卡的Rank ID,则dump数据为空,比如当前环境Rank ID为0~7,实际训练运行0~3卡,此时若配置Rank ID为4或不存在的10等其他值,此时dump数据为空。 | 否 | -| step | 指定dump某个step的数据,默认未配置,须指定为训练脚本中存在的step。step为list格式,可配置逐个step,例如:step=[0,1,2];也可以配置step范围,例如:step=list(range(0,9)),表示dump第0到第8个step。 | 否 | +| step | 指定dump某个step的数据,默认未配置,表示dump所有step数据。dump特定step时,须指定为训练脚本中存在的step。step为list格式,可配置逐个step,例如:step=[0,1,2];也可以配置step范围,例如:step=list(range(0,9)),表示dump第0到第8个step。 | 否 | | enable_dataloader | 自动控制开关,可取值True(开启)或False(关闭),默认为False。配置为True后自动识别dump step参数指定的迭代,并在该迭代执行完成后退出训练,此时start和stop函数可不配置,开启该开关要求训练脚本是通过torch.utils.data.dataloader方式加载数据;配置为False则需要配置start和stop函数,并在最后一个stop函数后或一个step结束的位置添加debugger.step()。 | 否 | | model | 开启model模式,传入网络模型实例化的对象,配置该参数后,dump操作仅dump网络中init方法里调用的方法(nn.Module类),不会对所有API进行dump。参数示例: model=net,net为网络模型实例化的对象名称。默认未配置。
配置该参数时,PrecisionDebugger模块请在模型实例化之后调用。
该模式不支持“溢出检测”和“模块级精度数据dump”。 | 否 | @@ -496,47 +706,51 @@ debugger.configure_hook(mode=None, acl_config=None, overflow_nums=1, need_replic configure_hook可配置多种dump模式,示例如下: -说明:以下均以dump部分API数据为例,API名可以从首次dump整网数据的结果csv文件中的NPU Name或Bench Name列获取。 +说明: + +以下均以dump部分API数据为例,API名可以从首次dump整网数据的结果csv文件中的NPU Name或Bench Name列获取。 + +以下示例均以自动模式dump指定step数据为例,需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据。 - 示例1:dump指定API列表 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="list", scope=["Tensor_permute_1_forward", "Tensor_transpose_2_forward", "Torch_relu_3_backward"]) ``` - 示例2:dump指定范围 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="range", scope=["Tensor_abs_1_forward", "Tensor_transpose_3_forward"]) ``` - 示例3:STACK模式,只dump堆栈信息 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="stack", scope=["Tensor_abs_1_forward", "Tensor_transpose_3_forward"]) ``` - 示例4:dump指定前向API的ACL级别数据 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="acl", scope=["Tensor_permute_1_forward"], acl_config="./dump.json") ``` - 示例5:dump指定反向API的ACL级别数据 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) - debugger.configure_hook(mode="acl", scope=["Functional_conv2d_1_backward"], acl_config="./dump.json", backward_input=["./npu_dump/dump_conv2d_v2.0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) + 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"]) ``` - 示例6:dump指定某一类API的API级别输入输出数据 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="api_list", api_list=["relu"]) ``` @@ -545,7 +759,7 @@ configure_hook可配置多种dump模式,示例如下: - 示例7:dump全部API级别输入输出数据以及相应堆栈信息 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(mode="api_stack") ``` @@ -554,7 +768,7 @@ configure_hook可配置多种dump模式,示例如下: - 示例8: dump全部API级别输入输出数据并包含bool和整型的tensor以及浮点、bool和整型的标量,配置为OFF,会dump bool和整型数据 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(filter_switch="OFF") ``` @@ -563,21 +777,21 @@ configure_hook可配置多种dump模式,示例如下: - 示例9:仅保存dump的数据文件名包含“backward”的反向.npy文件 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(input_output_mode=["backward"]) ``` - 示例10:仅dump pkl文件 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0], enable_dataloader=True) debugger.configure_hook(summary_only=True) ``` - 示例11:溢出检测dump ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="overflow_check", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="overflow_check", step=[0], enable_dataloader=True) debugger.configure_hook(overflow_nums=1) ``` @@ -590,7 +804,7 @@ configure_hook可配置多种dump模式,示例如下: - 示例11:dump溢出API的ACL级别数据 ```python - debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="overflow_check", step=[0]) + debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="overflow_check", step=[0], enable_dataloader=True) debugger.configure_hook(mode="acl", acl_config="./dump.json") ``` @@ -632,7 +846,7 @@ debugger.stop() ### 示例代码(自动模式) -需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据。 +**需要保证用户训练代码是通过torch.utils.data.dataloader方式加载数据。** - 示例1:开启dump @@ -670,7 +884,7 @@ debugger.stop() debugger.stop() debugger.start() - # 需要dump的代码片段1 + # 需要dump的代码片段2 debugger.stop() debugger.step() @@ -692,7 +906,7 @@ debugger.stop() debugger.stop() debugger.start() - # 需要dump的代码片段1 + # 需要dump的代码片段2 debugger.stop() debugger.step() @@ -968,7 +1182,7 @@ set_dump_switch可配置多种dump模式,示例如下: ```python register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"]) - set_backward_input(["./npu_dump/dump_conv2d_v2.0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) + set_backward_input(["./npu_dump/dump_conv2d_v4.0/step0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) ``` 需要配置register_hook的dump_mode='acl'和dump_config配置文件,并通过set_backward_input设置反向API输入的.npy文件。 @@ -1123,7 +1337,7 @@ set_backward_input(backward_input) ```python register_hook(model, acc_cmp_dump, dump_mode='acl', dump_config='./dump.json') set_dump_switch("ON", mode="acl", scope=["Functional_conv2d_1_backward"]) -set_backward_input(["./npu_dump/dump_conv2d_v2.0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) +set_backward_input(["./npu_dump/dump_conv2d_v4.0/step0/rank0/dump/Functional_conv2d_1_backward_input.0.npy"]) ``` ## dump.json配置文件说明 @@ -1320,10 +1534,10 @@ dump过程中,npy文件在对应算子或者模块被执行后就会落盘, **溢出检测dump场景** -PrecisionDebugger模块的hook_name参数或register_hook函数设置了overflow_check时,检测API溢出,dump结果的文件名格式为:`{api_type}___{api_name}___{API调用次数}_{前向反向}_{当前溢出次数}`,dump结果示例如下: +PrecisionDebugger模块的hook_name参数或register_hook函数设置了overflow_check时,检测API溢出,dump结果的文件名格式为:`{api_type}_{api_name}_{API调用次数}_{前向反向}_{当前溢出次数}`,dump结果示例如下: -* `Tensor___add___1_forward_1.pkl` -* `Tensor___add___1_forward_1`目录 +* `Tensor_add_1_forward_1.pkl` +* `Tensor_add_1_forward_1`目录 ## CPU或GPU与NPU精度数据比对 @@ -1362,8 +1576,8 @@ compare_distributed(npu_dump_dir, bench_dump_dir, output_path, **kwargs) | 参数名 | 说明 | 是否必选 | | -------------- | ------------------------------------------------------------ | -------- | -| npu_dump_dir | 配置NPU环境下的dump目录,即set_dump_path函数的dump_tag参数对应的目录名称。参数示例:'./npu_dump/dump_conv2d_v2.0'。 | 是 | -| bench_dump_dir | 配置CPU、GPU或NPU环境下的dump目录,即set_dump_path函数的dump_tag参数对应的目录名称。参数示例:'./gpu_dump/dump_conv2d_v2.0'。 | 是 | +| npu_dump_dir | 配置NPU环境下的dump目录。参数示例:'./npu_dump/ptdbg_dump_v4.0'。register_hook方式可通过set_dump_path函数的dump_tag参数修改该目录名称。 | 是 | +| bench_dump_dir | 配置CPU、GPU或NPU环境下的dump目录。参数示例:'./gpu_dump/ptdbg_dump_v4.0'。register_hook方式可通过set_dump_path函数的dump_tag参数修改该目录名称。 | 是 | | output_path | 配置比对结果csv文件存盘目录。需要预先创建output_path目录。参数示例:'./output'。文件名称基于时间戳自动生成,格式为:`compare_result_rank{npu_ID}-rank{cpu/gpu/npu_ID}_{timestamp}.csv`。 | 是 | | **kwargs | 支持compare的所有可选参数。 | 否 | @@ -1373,7 +1587,7 @@ compare_distributed(npu_dump_dir, bench_dump_dir, output_path, **kwargs) ```python from ptdbg_ascend import * -compare_distributed('./npu_dump/ptdbg_dump_v2.0', './gpu_dump/ptdbg_dump_v2.0', './output') +compare_distributed('./npu_dump/ptdbg_dump_v4.0', './gpu_dump/ptdbg_dump_v4.0', './output') ``` ### compare @@ -1392,9 +1606,9 @@ compare(input_param, output_path, stack_mode=False, auto_analyze=True, fuzzy_mat | 参数名 | 说明 | 是否必选 | | ------------ | ------------------------------------------------------------ | -------- | -| input_param | 配置dump数据文件及目录。配置参数包括:
- "npu_pkl_path":指定NPU dump目录下的.pkl文件。参数示例:"npu_pkl_path": "./npu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump.pkl"。必选。
- "bench_pkl_path":指定CPU、GPU或NPU dump目录下的.pkl文件。参数示例:"bench_pkl_path": "./gpu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump.pkl"。必选。
- "npu_dump_data_dir":"指定NPU dump目录下的dump数据目录。参数示例:"npu_dump_data_dir": "./npu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump"。可选,仅比对pkl文件时不选。
- "bench_dump_data_dir":"指定CPU、GPU或NPU dump目录下的dump数据目录。参数示例:"npu_dump_data_dir": "./gpu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump"。可选,仅比对pkl文件时不选。
- "is_print_compare_log":配置是否开启日志打屏。可取值True或False。可选。 | 是 | +| input_param | 配置dump数据文件及目录。配置参数包括:
- "npu_pkl_path":指定NPU dump目录下的.pkl文件。参数示例:"npu_pkl_path": "./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl"。必选。
- "bench_pkl_path":指定CPU、GPU或NPU dump目录下的.pkl文件。参数示例:"bench_pkl_path": "./gpu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump.pkl"。必选。
- "npu_dump_data_dir":"指定NPU dump目录下的dump数据目录。参数示例:"npu_dump_data_dir": "./npu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump"。可选,仅比对pkl文件时不选。
- "bench_dump_data_dir":"指定CPU、GPU或NPU dump目录下的dump数据目录。参数示例:"npu_dump_data_dir": "./gpu_dump/ptdbg_dump_v4.0/step0/rank0/api_stack_dump"。可选,仅比对pkl文件时不选。
- "is_print_compare_log":配置是否开启日志打屏。可取值True或False。可选。 | 是 | | output_path | 配置比对结果csv文件存盘目录。参数示例:'./output'。文件名称基于时间戳自动生成,格式为:`compare_result_{timestamp}.csv`。 | 是 | -| stack_mode | 配置stack_mode的开关。仅当dump数据时配置set_dump_switch的mode="api_stack"时需要开启。参数示例:stack_mode=True,默认为False。 | 否 | +| stack_mode | 配置stack_mode的开关。仅当dump数据时配置debugger.configure_hook或set_dump_switch的mode="api_stack"时需要开启。参数示例:stack_mode=True,默认为False。 | 否 | | auto_analyze | 自动精度分析,开启后工具自动针对比对结果进行分析,识别到第一个精度不达标节点(在比对结果文件中的“Accuracy Reached or Not”列显示为No),并给出问题可能产生的原因(打屏展示并生成advisor_{timestamp}.txt文件)。可取值True或False,参数示例:auto_analyze=False,默认为True。 | 否 | | fuzzy_match | 模糊匹配。开启后,对于网络中同一层级且命名仅调用次数不同的API,可匹配并进行比对。可取值True或False,参数示例:fuzzy_match=True,默认为False。 | 否 | @@ -1405,10 +1619,10 @@ compare(input_param, output_path, stack_mode=False, auto_analyze=True, fuzzy_mat ```python from ptdbg_ascend import * dump_result_param={ -"npu_pkl_path": "./npu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump.pkl", -"bench_pkl_path": "./gpu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump.pkl", -"npu_dump_data_dir": "./npu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump", -"bench_dump_data_dir": "./gpu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump", +"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) @@ -1434,7 +1648,7 @@ parse(pkl_file, moudule_name_prefix) | 参数名 | 说明 | 是否必选 | | ------------------- | ------------------------------------------------------------ | -------- | -| pkl_file | 指定dump数据文件中的pkl文件名。参数示例:"./npu_dump/ptdbg_dump_v2.0/rank0/dump.pkl"。 | 是 | +| pkl_file | 指定dump数据文件中的pkl文件名。参数示例:"./npu_dump/ptdbg_dump_v4.0/step0/rank0/dump.pkl"。 | 是 | | moudule_name_prefix | 指定待提取的API接口前缀。参数示例:"Torch_norm_1_forward"。 | 是 | **函数示例** @@ -1443,7 +1657,7 @@ parse(pkl_file, moudule_name_prefix) ```python from ptdbg_ascend import * -parse("./npu_dump/ptdbg_dump_v2.0/rank0/dump.pkl", "Torch_batch_normal_1_forward") +parse("./npu_dump/ptdbg_dump_v4.0/step0/rank0/dump.pkl", "Torch_batch_normal_1_forward") ``` ### 计算精度评价指标 diff --git a/debug/accuracy_tools/ptdbg_ascend/figures/module_compare.png b/debug/accuracy_tools/ptdbg_ascend/figures/module_compare.png index 2e1ea564eb191807034afd8aceac92b29b62a086..7262751b27a175a28098a145c883f22ee905e884 100644 Binary files a/debug/accuracy_tools/ptdbg_ascend/figures/module_compare.png and b/debug/accuracy_tools/ptdbg_ascend/figures/module_compare.png differ