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.T3.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.T3.md" index 120c70cddb231b9791a25c8279a4231a3633bd02..2d4207904a302df87d6f82db89ef0414ddd7b107 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.T3.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.T3.md" @@ -55,23 +55,23 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 ```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") ``` @@ -118,7 +118,7 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 ```python 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") ``` @@ -129,7 +129,7 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 python3 parse.py ``` - + 5. (可选)指定API dump数据。 @@ -137,17 +137,17 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 ```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") ``` @@ -155,18 +155,18 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 ```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_v2.0/rank0/api_stack_dump/Functional_conv2d_1_backward_input.0.npy"]) - + ... - + set_dump_switch("OFF") ``` @@ -185,20 +185,13 @@ PyTorch训练场景的精度问题分析建议参考以下思路进行精度比 说明:多机多卡场景需要每个设备单独执行比对操作。 -假设NPU dump npy数据目录为npu_dump/dump_conv2d_v3.0,GPU dump npy数据目录为gpu_dump/dump_conv2d_v3.0。 +假设NPU dump npy数据目录为npu_dump/dump_conv2d_v1.0,GPU dump npy数据目录为gpu_dump/dump_conv2d_v1.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_v2.0', './gpu_dump/ptdbg_dump_v2.0', './output') ``` 2. 执行比对: @@ -346,7 +339,7 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) ... # 设置检测到3次溢出后退出训练 register_hook(model, overflow_check, overflow_nums=3) - + ... ``` @@ -362,15 +355,15 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) ... # dump指定API的ACL级别溢出数据 register_hook(model, overflow_check, dump_mode='acl', dump_config='./dump.json') - + # 在期望溢出检测的step位置开始前打开溢出检测开关 set_overflow_check_switch("ON") - + ... - + # 在step结束的位置关闭溢出检测开关 set_overflow_check_switch("OFF") - + ... ``` @@ -386,12 +379,12 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) ... # 设置检测到3次溢出后退出训练 register_hook(model, overflow_check) - + ... ``` 2. dump指定反向API的ACL级别的溢出数据 - + ```python from ptdbg_ascend import * seed_all() @@ -424,9 +417,9 @@ set_dump_switch("ON", mode="api_list", api_list=["distributed"]) 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数据,否则将因重名而报错。 **注意事项** @@ -633,7 +626,7 @@ debugger.stop() debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0,2], enable_dataloader=True) # 请勿将以上初始化流程插入到循环代码中 ``` - + - 示例2:开启溢出检测dump ```python @@ -652,18 +645,18 @@ debugger.stop() from ptdbg_ascend import * debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump", step=[0]) # 请勿将以上初始化流程插入到循环代码中 - + # 模型初始化 # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop() debugger.start() - + # 需要dump的代码片段1 - + debugger.stop() debugger.start() - + # 需要dump的代码片段1 - + debugger.stop() debugger.step() ``` @@ -674,23 +667,23 @@ debugger.stop() from ptdbg_ascend import * debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="overflow_check", step=[0]) # 请勿将以上初始化流程插入到循环代码中 - + # 模型初始化 # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop() debugger.start() - + # 需要dump的代码片段1 - + debugger.stop() debugger.start() - + # 需要dump的代码片段1 - + debugger.stop() debugger.step() ``` -## CPU或GPU及NPU精度数据dump +## CPU或GPU及NPU精度数据dump ### 总体说明 @@ -702,12 +695,12 @@ debugger.stop() - 工具性能:dump数据量较小时(小于5G),参考dump速度0.1GB/s;dump数据量较大时,参考dump速度0.2GB/s。 推荐环境配置:独占环境,CPU核心数192,固态硬盘(IO速度参考:固态硬盘 > 500MB/s,机械硬盘60 ~ 170MB/s)。 - + 用户环境性能弱于标准约束或非独占使用的比对速度酌情向下浮动。Dump速度的计算方式:Dump数据量/(单个step添加Dump耗时-原始单个step耗时)。 ### 约束 - 进行CPU或GPU数据dump时,请安装torch包而非torch_npu包,避免工具无法识别使用场景,导致失败。 - + - TASK_QUEUE_ENABLE环境变量会导致API下发和执行异步进行,因此在ACL dump前需要将TASK_QUEUE_ENABLE关闭,即export TASK_QUEUE_ENABLE=0。 - 不建议在PyTorch训练脚本中同时添加dump接口和性能数据采集(如Ascend PyThon Profiler)接口,二者可能相互影响导致数据不准确。 @@ -988,13 +981,13 @@ set_dump_switch可配置多种dump模式,示例如下: ``` 配置filter_switch="OFF"同时也可以配置mode、scope和api_list,除dump ACL级别数据。 - + - 示例8:仅保存dump的数据文件名包含“backward”的反向.npy文件 ```python set_dump_switch("ON", dump_mode=["backward"]) ``` - + - 示例9:仅dump pkl文件 ```python @@ -1071,9 +1064,9 @@ set_overflow_check_switch(switch, filter_switch='OFF') ```python register_hook(model, overflow_check) set_overflow_check_switch("ON") - + ... - + set_overflow_check_switch("OFF") ``` @@ -1084,15 +1077,15 @@ set_overflow_check_switch(switch, filter_switch='OFF') ```python register_hook(model, overflow_check, dump_mode='acl', dump_config='./dump.json') set_overflow_check_switch("ON") - + ... - + set_overflow_check_switch("OFF") ``` 该场景set_dump_path不生效,由dump_config中的dump.json文件配置溢出数据目录。 -### set_backward_input +### set_backward_input **功能说明** @@ -1167,7 +1160,7 @@ set_backward_input(["./npu_dump/dump_conv2d_v2.0/rank0/dump/Functional_conv2d_1_ │   └── TransData.trans_TransData_3.37.0.1675157077169473 ``` -## 模块级精度数据dump +## 模块级精度数据dump ### 总体说明 @@ -1235,17 +1228,17 @@ class ModuleOP(nn.Module): x2 = self.linear_2(x1) r1 = F.relu(x2) return r1 - + if __name__ == "__main__": module = ModuleOP() - + # 注册工具 set_dump_path("./dump_data/npu") set_dump_switch("ON") register_hook(module, acc_cmp_dump) - + x = torch.randn(2, 2) - + module_dump(module, "MyModule") # 开启模块级精度数据dump out = module(x) module_dump_end() # 结束模块级精度数据dump @@ -1271,14 +1264,12 @@ dump结果目录结构示例如下: │ ├── rank1 | | ├── dump | | | └── ... -| | └── dump.pkl +| | └── dump.pkl │ ├── ... │ | | └── rank7 ``` -dump过程中,npy文件在对应算子或者模块被执行后就会落盘,而pkl文件则需要在正常执行PrecisionDebugger.stop()或set_dump_switch("OFF")后才会被落盘保存,异常的程序终止会保存终止前被执行算子的相关npy文件,但是不会生成pkl文件。 - 其中ptdbg_dump_{version}为未设置set_dump_path的dump_tag参数时的默认命名;rank为设备上各卡的ID,每张卡上dump的数据会生成对应dump目录。 当使用debugger方式dump数据时,配置了PrecisionDebugger模块的step=[]参数,dump结果目录则以step为父目录,例如配置step=[0,1,2]时,dump结果目录为: @@ -1335,13 +1326,13 @@ register_hook设置了overflow_check时,检测API溢出,dump结果的文件 - 工具性能:比对数据量较小时(参考值单份文件小于10GB),参考比对速度0.1GB/s;比对数据量较大时,参考比对速度0.3GB/s。 推荐环境配置:独占环境,CPU核心数192,固态硬盘(IO速度参考:固态硬盘 > 500MB/s,机械硬盘60 ~ 170MB/s)。 - + 用户环境性能弱于标准约束或非独占使用的比对速度酌情向下浮动。比对速度的计算方式:两份比对文件大小/比对耗时。 ### 约束 - NPU自研API,在CPU或GPU若没有对应的API,该API的dump数据不比对。 - + - NPU与CPU或GPU的计算结果误差可能会随着模型的执行不断累积,最终会出现同一个API因为输入的数据差异较大而无法比对的情况。 - CPU或GPU与NPU中两个相同的API会因为调用次数不同导致无法比对或比对到错误的API,不影响整体运行,该API忽略。 @@ -1392,7 +1383,7 @@ 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_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"。必选。
- "bench_dump_data_dir":"指定CPU、GPU或NPU dump目录下的dump数据目录。参数示例:"npu_dump_data_dir": "./gpu_dump/ptdbg_dump_v2.0/rank0/api_stack_dump"。必选。
- "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。 | 否 | | auto_analyze | 自动精度分析,开启后工具自动针对比对结果进行分析,识别到第一个精度不达标节点(在比对结果文件中的“Accuracy Reached or Not”列显示为No),并给出问题可能产生的原因(打屏展示并生成advisor_{timestamp}.txt文件)。可取值True或False,参数示例:auto_analyze=False,默认为True。 | 否 | @@ -1471,14 +1462,31 @@ PyTorch精度比对是以CPU或GPU的计算结果为标杆,计算Cosine(余 ptdbg_ascend.parse为命令行交互式界面解析工具,提供更多的数据解析功能并且展示结果。 -主要的使用场景包括: +### 进入parse交互式界面 + +安装ptdbg_ascend工具后,可以通过使用命令 **python -m ptdbg_ascend.parse** 进入交互式界面,如下所示: + +```bash +python -m ptdbg_ascend.parse +Parse >>> +``` + +可在parse的界面中执行Shell命令,以及如下场景的相关解析命令: - 支持指定ACL层级算子数据比对。 - 支持指定ACL层级算子数据转换及展示。 - 支持交互式指定pkl文件中API对应dump数据查看。 - 支持API进行可选层级比对和打印(统计级和像素级)。 -安装ptdbg_ascend工具后,可以通过使用命令 **python -m ptdbg_ascend.parse** 进入交互式界面,可在parse的界面中执行Shell命令,以及上述场景的相关解析命令。Ctrl+C可以退出该界面。 +Ctrl+C可以退出parse交互式界面。不退出parse交互式界面若需要执行非该界面下的内置Shell命令,且命令与parse交互式界面命令冲突时,非该界面命令需要使用run命令,在相关命令前加上run前缀,如下示例: + +```bash +python -m ptdbg_ascend.parse +Parse >>> run vim cli.py +Parse >>> vim cli.py +``` + +以上各场景详细介绍请参见下文章节。 ### ACL层级算子数据比对 @@ -1489,14 +1497,14 @@ ptdbg_ascend.parse为命令行交互式界面解析工具,提供更多的数 ```bash vc -m my_dump_path -g golden_dump_path [-out output_path] ``` - - | 参数名称 | 说明 | 是否必选 | - | -------- | ------------------------------------------------------------ | -------- | - | -m | 待比对dump数据目录。 | 是 | - | -g | dump数据目录。 | 是 | - | -out | 结果输出目录。 | 否 | - | -asc | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py。 | 否 | - + + | 参数名称 | 说明 | 是否必选 | + | --------- | ------------------------------------------------------------ | -------- | + | -m | 待比对dump数据目录。 | 是 | + | -g | dump数据目录。 | 是 | + | -out | 结果输出目录。 | 否 | + | -cmp_path | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py。 | 否 | + - 输出结果:result_{timestamp}.csv文件。 - 若指定-out参数需要用户传入输出路径,并且路径需要已存在。 - 若未指定输出目录, 则比对结束后将结果保存在默认目录 “./parse_data/comapre_result”中,比对结束后会打印log提示输出结果存放路径。 @@ -1505,7 +1513,7 @@ ptdbg_ascend.parse为命令行交互式界面解析工具,提供更多的数 ```bash # 传入待比对数据目录以及标杆数据目录 -Parse >>> vc -m ./my_dump_path -g ./golden_data_path +Parse >>> vc -m ./my_dump_path -g ./golden_data_path ...... # 比对结果打印 [INFO] The comparison result have been written to "./parse_data/compare_result/result_20230818104735.csv". @@ -1523,12 +1531,12 @@ Parse >>> vc -m ./my_dump_path -g ./golden_data_path dc -n file_name/file_path [-f format] [-out output_path] ``` - | 参数名称 | 说明 | 是否必选 | - | -------- | ------------------------------------------------------------ | -------- | - | -n | 需转换的dump数据文件或dump数据文件目录。 | 是 | - | -f | 开启format转换,指定该参数时需要配置format格式,若未指定该参数,则直接转换为npy格式。 | 否 | - | -out | 结果输出目录。 | 否 | - | -asc | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py | 否 | + | 参数名称 | 说明 | 是否必选 | + | --------- | ------------------------------------------------------------ | -------- | + | -n | 需转换的dump数据文件或dump数据文件目录。 | 是 | + | -f | 开启format转换,指定该参数时需要配置format格式,若未指定该参数,则直接转换为npy格式。 | 否 | + | -out | 结果输出目录。 | 否 | + | -cmp_path | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py | 否 | [^]: 若传入单个dump文件,则转换单个文件,若传入dump文件目录则转换目录下所有dump文件。 @@ -1546,7 +1554,7 @@ Parse >>> vc -m ./my_dump_path -g ./golden_data_path | -------- | ------------- | -------- | | -n | npy文件路径。 | 是 | - 打印统计信息:shape, dtype, max, min和mean。 + 打印统计信息:shape, dtype, max, min和mean。默认在npy文件路径下将该数据保存为txt文件。 **示例1** @@ -1579,7 +1587,7 @@ Parse >>> pt -n ./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24 # 打印统计信息 [Shape: (1, 16, 56, 56, 16)] [Dtype: float16] [Max: 452.0] [Min: -408.5] [Mean: -3.809] Path: ./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy -TextFile:./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy.txt +TextFile:./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy.txt ``` ### pkl文件中指定API的dump数据信息查看 @@ -1632,9 +1640,9 @@ Statistic Info: | -al | 判定数据存在精度问题的绝对误差阈值,默认0.001。 | 否 | | -rl | 判定数据存在精度问题的相对误差阈值,默认0.001。 | 否 | | -s | 将npy文件保存成txt文件,用于查看,默认开启。 | 否 | - + 输出结果: - + - 统计级比对结果。 - 两个文件的统计信息(shape, dtype, max, min和mean)。 - 错误数据打印表格。 @@ -1660,7 +1668,7 @@ Parse >>> cn -m Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.16194941 │ 2246 │ -0.06376442 │ -0.06121233 │ 0.002552092 │ │ 9 │ -0.73746175 │ -0.73650354 │ 0.00095820427 │ └───────┴───────────────┴──────────────┴──────────────┘ └───────┴─────────────┴─────────────┴───────────────┘ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Left: | +│ Left: | │ |- NpyFile: ./dump/temp/decode/Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.1619494134703053.output.0.npy | │ |- TxtFile: ./dump/temp/decode/Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.1619494134703053.output.0.npy.txt | │ |- NpySpec: [Shape: (32, 8, 8, 320)] [Dtype: float32] [Max: 5.846897] [Min: -8.368301] [Mean: -0.72565556] |