From bfb92d62b1ea9dc456977bb5492037dbc3102b2c Mon Sep 17 00:00:00 2001 From: user_10012209 <734267852@qq.com> Date: Tue, 12 Dec 2023 15:39:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[api=5Faccuracy=5Fchecker&ptdbg=5Fascend]?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=B5=8B=E8=AF=95=E5=8F=8D=E9=A6=88=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api_accuracy_checker/README.md | 62 ++++++++++++++---- .../img/accuracy_checking_details.png | Bin 0 -> 63640 bytes .../img/accuracy_checking_result.png | Bin 0 -> 8733 bytes debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md | 61 ++++++++++++----- ...03\275\350\257\264\346\230\216_v4.0.T3.md" | 11 +++- 5 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_details.png create mode 100644 debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_result.png diff --git a/debug/accuracy_tools/api_accuracy_checker/README.md b/debug/accuracy_tools/api_accuracy_checker/README.md index 53a904f52..ab4991faa 100644 --- a/debug/accuracy_tools/api_accuracy_checker/README.md +++ b/debug/accuracy_tools/api_accuracy_checker/README.md @@ -70,26 +70,28 @@ Ascend模型精度预检工具能在昇腾NPU上扫描用户训练模型中所 若有需要,用户可以通过msCheckerConfig.update_config来配置dump路径以及开启真实数据模式、指定dump某个step或配置API dump白名单,详细请参见“**msCheckerConfig.update_config**”。 -3. 将API信息输入给run_ut模块运行精度检测并比对,运行如下命令: +2. 将API信息输入给run_ut模块运行精度检测并比对,运行如下命令: ```bash cd $ATT_HOME/debug/accuracy_tools/api_accuracy_checker/run_ut python run_ut.py -forward ./forward_info_0.json -backward ./backward_info_0.json ``` + 某些场景下(如推理),可以不指定backward_info_0.json,不影响预检功能。 + | 参数名称 | 说明 | 是否必选 | | -------------------------------- | ------------------------------------------------------------ | -------- | | -forward或--forward_input_file | 指定前向API信息文件forward_info_{pid}.json。 | 是 | - | -backward或--backward_input_file | 指定反向API信息文件backward_info_{pid}.json。 | 是 | + | -backward或--backward_input_file | 指定反向API信息文件backward_info_{pid}.json。 | 否 | | -save_error_data | 保存精度未达标的API输入输出数据。 | 否 | | -o或--out_path | 指指定run_ut执行结果存盘路径,默认“./”(相对于run_ut的路径)。 | 否 | | -j或--jit_compile | 开启jit编译。 | 否 | | -d或--device | 指定Device ID,选择UT代码运行所在的卡,默认值为0。 | 否 | - | -csv_path或--result_csv_path | 指定本次运行中断时生成的accuracy_checking_result_{timestamp}.csv文件路径,执行run_ut中断时,若想从中断处继续执行,配置此参数即可。 | 否 | + | -csv_path或--result_csv_path | 指定本次运行中断时生成的`accuracy_checking_result_{timestamp}.csv`文件路径,执行run_ut中断时,若想从中断处继续执行,配置此参数即可。 | 否 | - run_ut执行结果包括`accuracy_checking_result_{timestamp}.csv`和`accuracy_checking_details_{timestamp}.csv`两个文件。`accuracy_checking_result_{timestamp}.csv`是API粒度的,标明每个API是否通过测试。建议用户先查看`accuracy_checking_result_{timestamp}.csv`文件,对于其中没有通过测试的或者特定感兴趣的API,根据其API name字段在`accuracy_checking_details_{timestamp}.csv`中查询其各个输出的达标情况以及比较指标。API达标情况介绍请参考“**API预检指标**”。 + run_ut执行结果包括`accuracy_checking_result_{timestamp}.csv`和`accuracy_checking_details_{timestamp}.csv`两个文件。`accuracy_checking_result_{timestamp}.csv`是API粒度的,标明每个API是否通过测试。建议用户先查看`accuracy_checking_result_{timestamp}.csv`文件,对于其中没有通过测试的或者特定感兴趣的API,根据其API name字段在`accuracy_checking_details_{timestamp}.csv`中查询其各个输出的达标情况以及比较指标。详细介绍请参见“**预检结果**”。 -4. 如果需要保存比对不达标的输入和输出数据,可以在run_ut执行命令结尾添加-save_error_data,例如: +3. 如果需要保存比对不达标的输入和输出数据,可以在run_ut执行命令结尾添加-save_error_data,例如: ```bash python run_ut.py -forward ./forward_info_0.json -backward ./backward_info_0.json -save_error_data @@ -157,6 +159,41 @@ msCheckerConfig.update_config(dump_path="./", real_data=False, target_iter=[1], - 配置的API名称须存在于att\debug\accuracy_tools\api_accuracy_checker\hook_module目录下的support_wrap_ops.yaml文件下。 - 方式一和方式二都可以在dump时设置并控制dump对应的API,默认情况下没有配置白名单,dump所有API数据,若在dump操作时没有配置白名单,那么可以在执行run_ut模块前使用方式一配置白名单。 +## 预检结果 + +精度预检生成的`accuracy_checking_result_{timestamp}.csv`和`accuracy_checking_details_{timestamp}.csv`文件示例如下: + +可以通过先查看`accuracy_checking_result_{timestamp}.csv`文件的Forward Test Success和Backward Test Success,判断是否存在未通过测试的API,再查看`accuracy_checking_details_{timestamp}.csv`文件的API详细达标情况,API达标情况介绍请参见“**API预检指标**”。 + +`accuracy_checking_result_{timestamp}.csv` + +![891a3bd8_12631423](img/accuracy_checking_result.png) + +| 字段 | 含义 | +| --------------------- | ------------------------------------------------------------ | +| API name | API名称。 | +| Forward Test Success | 前向API是否通过测试,TRUE为通过,FALSE为不通过,N/A表示该行非前向API。 | +| Backward Test Success | 反向API是否通过测试,TRUE为通过,FALSE为不通过,N/A表示该行非反向API。 | +| Message | 备注信息。 | + +`accuracy_checking_details_{timestamp}.csv` + +![f07237b1_12631423](img/accuracy_checking_details.png) + +| 字段 | 含义 | +| ------------------------------------- | ------------------------------------------------------------ | +| Npu Name | NPU下的API名称。 | +| Bench Dtype | 标杆数据的数据类型。 | +| NPU Dtype | NPU数据的数据类型。 | +| Shape | API的Shape信息。 | +| Cosine Similarity | 余弦相似度。 | +| Max Abs Error | 最大绝对误差。 | +| Relative Error (dual hundredth) | 双百精度指标。 | +| Relative Error (dual thousandth) | 双千精度指标。 | +| Relative Error (dual ten thousandth) | 双万精度指标。 | +| Error Rate | 误差率。 | +| Status | 通过状态,pass表示通过测试,error表示未通过,waring表示存在双千或双万精度指标未通过测试。 | + ## API预检指标 API预检通过测试,则在`accuracy_checking_details_{timestamp}.csv`文件中的“pass”列标记“pass”,否则标记“error”或“warning”,详细规则如下: @@ -173,11 +210,11 @@ API预检通过测试,则在`accuracy_checking_details_{timestamp}.csv`文件 # 溢出解析工具 -针对训练过程中的溢出检测场景(参见[ptdbg_ascend精度工具功能说明](https://gitee.com/ascend/att/tree/master/debug/accuracy_tools/ptdbg_ascend/doc)中的"溢出检测场景"进行溢出检测dump),对于输入正常但输出存在溢出的API,会在训练执行目录下将溢出的API信息按照前向和反向分类,dump并保存为`forward_info_{pid}.json`和`backward_info_{pid}.json`,前向过程溢出的API可通过该工具对`forward_info_{pid}.json`进行解析,输出溢出API为正常溢出还是非正常溢出,从而帮助用户快速判断。 +针对训练过程中的溢出检测场景(参见[ptdbg_ascend精度工具功能说明](https://gitee.com/ascend/att/tree/master/debug/accuracy_tools/ptdbg_ascend/doc)中的"溢出检测场景"进行溢出检测dump),对于输入正常但输出存在溢出的API,会在训练执行目录下将溢出的API信息按照前向和反向分类,dump并保存为`forward_info_{pid}.json`,前向过程溢出的API可通过该工具对`forward_info_{pid}.json`进行解析,输出溢出API为正常溢出还是非正常溢出,从而帮助用户快速判断。 工具支持PyTorch版本:1.8.1/1.11.0/2.0/2.1。 -若溢出检测场景dump结果生成`forward_info_{pid}.json`和`backward_info_{pid}.json`文件,则使用本工具进行解析。操作步骤如下: +若溢出检测场景dump结果生成`forward_info_{pid}.json`文件,则使用本工具进行解析。操作步骤如下: 1. 安装预检工具 @@ -200,12 +237,11 @@ API预检通过测试,则在`accuracy_checking_details_{timestamp}.csv`文件 python run_overflow_check.py -forward ./forward_info_0.json ``` - | 参数名称 | 说明 | 是否必选 | - | -------------------------------- | -------------------------------------------------- | -------- | - | -forward或--forward_input_file | 指定前向API信息文件forward_info_{pid}.json。 | 是 | - | -backward或--backward_input_file | 指定反向API信息文件backward_info_{pid}.json。 | 是 | - | -j或--jit_compile | 开启jit编译。 | 否 | - | -d或--device | 指定Device ID,选择UT代码运行所在的卡,默认值为0。 | 否 | + | 参数名称 | 说明 | 是否必选 | + | ------------------------------ | -------------------------------------------------- | -------- | + | -forward或--forward_input_file | 指定前向API信息文件forward_info_{pid}.json。 | 是 | + | -j或--jit_compile | 开启jit编译。 | 否 | + | -d或--device | 指定Device ID,选择UT代码运行所在的卡,默认值为0。 | 否 | 反向过程溢出的API暂不支持该功能。 diff --git a/debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_details.png b/debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_details.png new file mode 100644 index 0000000000000000000000000000000000000000..db65c788f682cb2badda9dd303770b3f94f5b4d1 GIT binary patch literal 63640 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

Q63?Ze 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 o#y#;f9HhO~l$if57yEoKn-f86x;qyPW_ literal 0 HcmV?d00001 diff --git a/debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_result.png b/debug/accuracy_tools/api_accuracy_checker/img/accuracy_checking_result.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f60d0916690d871f7a2eca37ca919e42596c15 GIT binary patch literal 8733 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 Date: Tue, 12 Dec 2023 19:23:20 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[api=5Faccuracy=5Fchecker&ptdbg=5Fascend]?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=B5=8B=E8=AF=95=E5=8F=8D=E9=A6=88=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debug/accuracy_tools/api_accuracy_checker/README.md | 2 +- ...\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.T3.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/README.md b/debug/accuracy_tools/api_accuracy_checker/README.md index ab4991faa..a7d69b2f9 100644 --- a/debug/accuracy_tools/api_accuracy_checker/README.md +++ b/debug/accuracy_tools/api_accuracy_checker/README.md @@ -43,7 +43,7 @@ Ascend模型精度预检工具能在昇腾NPU上扫描用户训练模型中所 Exception: Model pretest: exit after iteration 1. ``` - - 若报错信息不一致,可能是由于服务器的其他错误信息覆盖导致,可以尝试查找报错信息中的Exception。 + 若报错信息不一致,可能是由于服务器的其他错误信息覆盖导致,可以尝试查找报错信息中的Exception。 - 若训练脚本中的代码不是通过torch.utils.data.dataloader来加载数据或在部分流水并行、张量并行场景下,工具的开关无法在每张卡上自动打开,导致多卡训练dump结果只有一组json,那么需要在训练代码中添加打开工具开关的调用: 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 bcea669ec..03c7c02b7 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" @@ -1390,7 +1390,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"。必选。
- "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。可选。 | 是 | +| 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。 | 否 | -- Gitee From 08d7d36812dd4eea8b87e1208bb009ec4340e618 Mon Sep 17 00:00:00 2001 From: user_10012209 <734267852@qq.com> Date: Tue, 12 Dec 2023 19:30:46 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[api=5Faccuracy=5Fchecker&ptdbg=5Fascend]?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=B5=8B=E8=AF=95=E5=8F=8D=E9=A6=88=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debug/accuracy_tools/api_accuracy_checker/README.md | 4 ++-- debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/README.md b/debug/accuracy_tools/api_accuracy_checker/README.md index a7d69b2f9..352031cf7 100644 --- a/debug/accuracy_tools/api_accuracy_checker/README.md +++ b/debug/accuracy_tools/api_accuracy_checker/README.md @@ -172,8 +172,8 @@ msCheckerConfig.update_config(dump_path="./", real_data=False, target_iter=[1], | 字段 | 含义 | | --------------------- | ------------------------------------------------------------ | | API name | API名称。 | -| Forward Test Success | 前向API是否通过测试,TRUE为通过,FALSE为不通过,N/A表示该行非前向API。 | -| Backward Test Success | 反向API是否通过测试,TRUE为通过,FALSE为不通过,N/A表示该行非反向API。 | +| Forward Test Success | 前向API是否通过测试,TRUE为通过,FALSE为不通过。 | +| Backward Test Success | 反向API是否通过测试,TRUE为通过,FALSE为不通过,N/A表示该API没有反向。 | | Message | 备注信息。 | `accuracy_checking_details_{timestamp}.csv` diff --git a/debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md b/debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md index 08be8f541..12c8b454f 100644 --- a/debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md +++ b/debug/accuracy_tools/ptdbg_ascend/doc/FAQ.md @@ -60,7 +60,7 @@ echo $PYTHONPATH 若配置了精度预检工具的环境变量,则执行如下命令取消该环境变量。 ```bash -unset $PYTHONPATH +unset PYTHONPATH ``` ### 2. 单机多卡场景dump目录下只生成一个rank目录或pkl文件格式损坏 -- Gitee From f3cedef57248ad13eec2d73ca41b307f2d800454 Mon Sep 17 00:00:00 2001 From: user_10012209 <734267852@qq.com> Date: Tue, 12 Dec 2023 19:40:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[api=5Faccuracy=5Fchecker&ptdbg=5Fascend]?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=B5=8B=E8=AF=95=E5=8F=8D=E9=A6=88=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debug/accuracy_tools/api_accuracy_checker/README.md | 2 +- ...\345\212\237\350\203\275\350\257\264\346\230\216_v4.0.T3.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/README.md b/debug/accuracy_tools/api_accuracy_checker/README.md index 352031cf7..264839ae8 100644 --- a/debug/accuracy_tools/api_accuracy_checker/README.md +++ b/debug/accuracy_tools/api_accuracy_checker/README.md @@ -192,7 +192,7 @@ msCheckerConfig.update_config(dump_path="./", real_data=False, target_iter=[1], | Relative Error (dual thousandth) | 双千精度指标。 | | Relative Error (dual ten thousandth) | 双万精度指标。 | | Error Rate | 误差率。 | -| Status | 通过状态,pass表示通过测试,error表示未通过,waring表示存在双千或双万精度指标未通过测试。 | +| Status | 通过状态,pass表示通过测试,error表示未通过,warning表示存在双千或双万精度指标未通过测试。 | ## 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.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 03c7c02b7..427cf52d5 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" @@ -1390,7 +1390,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"。可选。
- "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。可选。 | 是 | +| 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。可选。 | 是 | | 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。 | 否 | -- Gitee