mindstudio-probe 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. mindstudio_probe-1.0.1.dist-info/LICENSE +201 -0
  2. mindstudio_probe-1.0.1.dist-info/METADATA +30 -0
  3. mindstudio_probe-1.0.1.dist-info/RECORD +228 -0
  4. mindstudio_probe-1.0.1.dist-info/WHEEL +5 -0
  5. mindstudio_probe-1.0.1.dist-info/entry_points.txt +2 -0
  6. mindstudio_probe-1.0.1.dist-info/top_level.txt +1 -0
  7. msprobe/README.md +182 -0
  8. msprobe/__init__.py +0 -0
  9. msprobe/config/README.md +397 -0
  10. msprobe/config/config.json +28 -0
  11. msprobe/config/img/free_benchmark.png +0 -0
  12. msprobe/core/common/const.py +241 -0
  13. msprobe/core/common/exceptions.py +88 -0
  14. msprobe/core/common/file_check.py +265 -0
  15. msprobe/core/common/log.py +55 -0
  16. msprobe/core/common/utils.py +516 -0
  17. msprobe/core/common_config.py +58 -0
  18. msprobe/core/data_dump/data_collector.py +140 -0
  19. msprobe/core/data_dump/data_processor/base.py +245 -0
  20. msprobe/core/data_dump/data_processor/factory.py +61 -0
  21. msprobe/core/data_dump/data_processor/pytorch_processor.py +346 -0
  22. msprobe/core/data_dump/json_writer.py +116 -0
  23. msprobe/core/data_dump/scope.py +178 -0
  24. msprobe/mindspore/__init__.py +1 -0
  25. msprobe/mindspore/debugger/__init__.py +0 -0
  26. msprobe/mindspore/debugger/debugger_config.py +51 -0
  27. msprobe/mindspore/debugger/precision_debugger.py +32 -0
  28. msprobe/mindspore/doc/dump.md +65 -0
  29. msprobe/mindspore/dump/__init__.py +0 -0
  30. msprobe/mindspore/dump/api_kbk_dump.py +55 -0
  31. msprobe/mindspore/dump/dump_tool_factory.py +38 -0
  32. msprobe/mindspore/dump/kernel_graph_dump.py +60 -0
  33. msprobe/mindspore/ms_config.py +78 -0
  34. msprobe/mindspore/overflow_check/__init__.py +0 -0
  35. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +45 -0
  36. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +32 -0
  37. msprobe/mindspore/task_handler_factory.py +21 -0
  38. msprobe/msprobe.py +67 -0
  39. msprobe/pytorch/__init__.py +4 -0
  40. msprobe/pytorch/advisor/advisor.py +124 -0
  41. msprobe/pytorch/advisor/advisor_const.py +59 -0
  42. msprobe/pytorch/advisor/advisor_result.py +58 -0
  43. msprobe/pytorch/api_accuracy_checker/.keep +0 -0
  44. msprobe/pytorch/api_accuracy_checker/__init__.py +0 -0
  45. msprobe/pytorch/api_accuracy_checker/common/.keep +0 -0
  46. msprobe/pytorch/api_accuracy_checker/common/__init__.py +0 -0
  47. msprobe/pytorch/api_accuracy_checker/common/config.py +50 -0
  48. msprobe/pytorch/api_accuracy_checker/common/utils.py +224 -0
  49. msprobe/pytorch/api_accuracy_checker/compare/__init__.py +0 -0
  50. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +216 -0
  51. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +545 -0
  52. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +133 -0
  53. msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -0
  54. msprobe/pytorch/api_accuracy_checker/compare/compare.py +345 -0
  55. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +74 -0
  56. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +249 -0
  57. msprobe/pytorch/api_accuracy_checker/config.yaml +4 -0
  58. msprobe/pytorch/api_accuracy_checker/run_ut/.keep +0 -0
  59. msprobe/pytorch/api_accuracy_checker/run_ut/__init__.py +0 -0
  60. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +328 -0
  61. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +203 -0
  62. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +127 -0
  63. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +493 -0
  64. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +7 -0
  65. msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +5 -0
  66. msprobe/pytorch/common/__init__.py +2 -0
  67. msprobe/pytorch/common/compare_script.template +14 -0
  68. msprobe/pytorch/common/log.py +32 -0
  69. msprobe/pytorch/common/parse_json.py +37 -0
  70. msprobe/pytorch/common/utils.py +224 -0
  71. msprobe/pytorch/compare/acc_compare.py +1024 -0
  72. msprobe/pytorch/compare/distributed_compare.py +111 -0
  73. msprobe/pytorch/compare/highlight.py +100 -0
  74. msprobe/pytorch/compare/mapping.yaml +607 -0
  75. msprobe/pytorch/compare/match.py +36 -0
  76. msprobe/pytorch/compare/npy_compare.py +244 -0
  77. msprobe/pytorch/debugger/__init__.py +0 -0
  78. msprobe/pytorch/debugger/debugger_config.py +86 -0
  79. msprobe/pytorch/debugger/precision_debugger.py +95 -0
  80. msprobe/pytorch/doc/FAQ.md +193 -0
  81. msprobe/pytorch/doc/api_accuracy_checker.md +269 -0
  82. msprobe/pytorch/doc/atat/321/207/342/226/223/342/225/233/321/205/342/225/221/320/266/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/206/320/245/342/226/221/321/206/320/235/320/276dump/321/206/320/260/320/227/321/205/320/227/320/226/321/206/320/220/320/267/321/210/320/223/342/225/234/321/205/320/257/342/225/221/321/207/342/225/221/342/224/220/321/206/320/232/320/265/321/205/320/241/320/232.md +182 -0
  83. msprobe/pytorch/doc/dump.md +207 -0
  84. msprobe/pytorch/doc/img/BLOOM-7B_1.png +0 -0
  85. msprobe/pytorch/doc/img/BLOOM-7B_2.png +0 -0
  86. msprobe/pytorch/doc/img/BLOOM-7B_3.png +0 -0
  87. msprobe/pytorch/doc/img/BLOOM-7B_4.png +0 -0
  88. msprobe/pytorch/doc/img/GPT-3_1.png +0 -0
  89. msprobe/pytorch/doc/img/GPT-3_2.png +0 -0
  90. msprobe/pytorch/doc/img/GPT-3_3.png +0 -0
  91. msprobe/pytorch/doc/img/GPT-3_4.png +0 -0
  92. msprobe/pytorch/doc/img/GPT-3_5.png +0 -0
  93. msprobe/pytorch/doc/img/GPT-3_6.png +0 -0
  94. msprobe/pytorch/doc/img/GPT-3_7.png +0 -0
  95. msprobe/pytorch/doc/img/GPT-3_8.png +0 -0
  96. msprobe/pytorch/doc/img/YOLOV5S_1.png +0 -0
  97. msprobe/pytorch/doc/img/YOLOV5S_2.png +0 -0
  98. msprobe/pytorch/doc/img/accuracy_checking_details.png +0 -0
  99. msprobe/pytorch/doc/img/accuracy_checking_result.png +0 -0
  100. msprobe/pytorch/doc/img/api_precision_compare_details.png +0 -0
  101. msprobe/pytorch/doc/img/api_precision_compare_result.png +0 -0
  102. msprobe/pytorch/doc/img/auto_analyze_log.png +0 -0
  103. msprobe/pytorch/doc/img/compare_result_pkl.png +0 -0
  104. msprobe/pytorch/doc/img/compare_result_pkl_md5.png.png +0 -0
  105. msprobe/pytorch/doc/img/cpu_info.png +0 -0
  106. msprobe/pytorch/doc/img/module_compare.png +0 -0
  107. msprobe/pytorch/doc/parse_tool.md +286 -0
  108. msprobe/pytorch/doc/ptdbg_ascend_compare.md +176 -0
  109. msprobe/pytorch/doc/ptdbg_ascend_overview.md +68 -0
  110. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +381 -0
  111. msprobe/pytorch/doc/run_overflow_check.md +25 -0
  112. msprobe/pytorch/doc//321/205/320/254/320/270/321/207/342/225/221/342/224/220/321/207/342/226/223/342/225/233/321/205/342/225/221/320/266/321/206/320/277/320/244/321/205/320/277/342/225/243.md +90 -0
  113. msprobe/pytorch/free_benchmark/__init__.py +8 -0
  114. msprobe/pytorch/free_benchmark/common/__init__.py +0 -0
  115. msprobe/pytorch/free_benchmark/common/constant.py +67 -0
  116. msprobe/pytorch/free_benchmark/common/counter.py +72 -0
  117. msprobe/pytorch/free_benchmark/common/enums.py +37 -0
  118. msprobe/pytorch/free_benchmark/common/params.py +129 -0
  119. msprobe/pytorch/free_benchmark/common/utils.py +98 -0
  120. msprobe/pytorch/free_benchmark/compare/grad_saver.py +183 -0
  121. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -0
  122. msprobe/pytorch/free_benchmark/main.py +102 -0
  123. msprobe/pytorch/free_benchmark/perturbed_layers/__init__.py +0 -0
  124. msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -0
  125. msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -0
  126. msprobe/pytorch/free_benchmark/perturbed_layers/npu/__init__.py +0 -0
  127. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -0
  128. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -0
  129. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -0
  130. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -0
  131. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -0
  132. msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -0
  133. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -0
  134. msprobe/pytorch/free_benchmark/result_handlers/__init__.py +0 -0
  135. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +203 -0
  136. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -0
  137. msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +24 -0
  138. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +31 -0
  139. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -0
  140. msprobe/pytorch/functional/__init__.py +0 -0
  141. msprobe/pytorch/functional/data_processor.py +0 -0
  142. msprobe/pytorch/functional/dump_module.py +39 -0
  143. msprobe/pytorch/hook_module/__init__.py +1 -0
  144. msprobe/pytorch/hook_module/api_registry.py +161 -0
  145. msprobe/pytorch/hook_module/hook_module.py +109 -0
  146. msprobe/pytorch/hook_module/support_wrap_ops.yaml +1876 -0
  147. msprobe/pytorch/hook_module/utils.py +29 -0
  148. msprobe/pytorch/hook_module/wrap_aten.py +100 -0
  149. msprobe/pytorch/hook_module/wrap_distributed.py +75 -0
  150. msprobe/pytorch/hook_module/wrap_functional.py +108 -0
  151. msprobe/pytorch/hook_module/wrap_npu_custom.py +73 -0
  152. msprobe/pytorch/hook_module/wrap_tensor.py +72 -0
  153. msprobe/pytorch/hook_module/wrap_torch.py +88 -0
  154. msprobe/pytorch/hook_module/wrap_vf.py +64 -0
  155. msprobe/pytorch/module_processer.py +98 -0
  156. msprobe/pytorch/online_dispatch/__init__.py +20 -0
  157. msprobe/pytorch/online_dispatch/compare.py +236 -0
  158. msprobe/pytorch/online_dispatch/dispatch.py +274 -0
  159. msprobe/pytorch/online_dispatch/dump_compare.py +186 -0
  160. msprobe/pytorch/online_dispatch/single_compare.py +391 -0
  161. msprobe/pytorch/online_dispatch/torch_ops_config.yaml +50 -0
  162. msprobe/pytorch/online_dispatch/utils.py +187 -0
  163. msprobe/pytorch/parse.py +4 -0
  164. msprobe/pytorch/parse_tool/__init__.py +0 -0
  165. msprobe/pytorch/parse_tool/cli.py +32 -0
  166. msprobe/pytorch/parse_tool/lib/__init__.py +0 -0
  167. msprobe/pytorch/parse_tool/lib/compare.py +259 -0
  168. msprobe/pytorch/parse_tool/lib/config.py +51 -0
  169. msprobe/pytorch/parse_tool/lib/file_desc.py +31 -0
  170. msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -0
  171. msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -0
  172. msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -0
  173. msprobe/pytorch/parse_tool/lib/utils.py +367 -0
  174. msprobe/pytorch/parse_tool/lib/visualization.py +90 -0
  175. msprobe/pytorch/pt_config.py +93 -0
  176. msprobe/pytorch/service.py +167 -0
  177. msprobe/test/core_ut/common/test_utils.py +345 -0
  178. msprobe/test/core_ut/data_dump/test_data_collector.py +47 -0
  179. msprobe/test/core_ut/data_dump/test_json_writer.py +183 -0
  180. msprobe/test/core_ut/data_dump/test_scope.py +151 -0
  181. msprobe/test/core_ut/test_common_config.py +152 -0
  182. msprobe/test/core_ut/test_file_check.py +218 -0
  183. msprobe/test/core_ut/test_log.py +109 -0
  184. msprobe/test/mindspore_ut/test_api_kbk_dump.py +51 -0
  185. msprobe/test/mindspore_ut/test_debugger_config.py +42 -0
  186. msprobe/test/mindspore_ut/test_dump_tool_factory.py +51 -0
  187. msprobe/test/mindspore_ut/test_kernel_graph_dump.py +66 -0
  188. msprobe/test/mindspore_ut/test_kernel_graph_overflow_check.py +63 -0
  189. msprobe/test/mindspore_ut/test_ms_config.py +69 -0
  190. msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +51 -0
  191. msprobe/test/mindspore_ut/test_precision_debugger.py +56 -0
  192. msprobe/test/mindspore_ut/test_task_handler_factory.py +58 -0
  193. msprobe/test/pytorch_ut/advisor/test_advisor.py +83 -0
  194. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_common_utils.py +108 -0
  195. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_config.py +39 -0
  196. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_algorithm.py +112 -0
  197. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_api_precision_compare.py +77 -0
  198. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare.py +125 -0
  199. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_column.py +10 -0
  200. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_utils.py +43 -0
  201. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/dump.json +179 -0
  202. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/forward.json +63 -0
  203. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_data_generate.py +99 -0
  204. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_multi_run_ut.py +115 -0
  205. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_run_ut.py +72 -0
  206. msprobe/test/pytorch_ut/compare/test_acc_compare.py +17 -0
  207. msprobe/test/pytorch_ut/free_benchmark/perturbed_layers/test_perturbed_layser.py +105 -0
  208. msprobe/test/pytorch_ut/free_benchmark/result_handlers/test_result_handler.py +121 -0
  209. msprobe/test/pytorch_ut/free_benchmark/test_main.py +101 -0
  210. msprobe/test/pytorch_ut/functional/test_dump_module.py +15 -0
  211. msprobe/test/pytorch_ut/hook_module/test_api_registry.py +130 -0
  212. msprobe/test/pytorch_ut/hook_module/test_hook_module.py +42 -0
  213. msprobe/test/pytorch_ut/hook_module/test_wrap_aten.py +65 -0
  214. msprobe/test/pytorch_ut/hook_module/test_wrap_distributed.py +35 -0
  215. msprobe/test/pytorch_ut/hook_module/test_wrap_functional.py +20 -0
  216. msprobe/test/pytorch_ut/hook_module/test_wrap_tensor.py +35 -0
  217. msprobe/test/pytorch_ut/hook_module/test_wrap_torch.py +43 -0
  218. msprobe/test/pytorch_ut/hook_module/test_wrap_vf.py +11 -0
  219. msprobe/test/pytorch_ut/test_pt_config.py +69 -0
  220. msprobe/test/pytorch_ut/test_service.py +59 -0
  221. msprobe/test/resources/advisor.txt +3 -0
  222. msprobe/test/resources/compare_result_20230703104808.csv +9 -0
  223. msprobe/test/resources/compare_result_without_accuracy.csv +9 -0
  224. msprobe/test/resources/config.yaml +3 -0
  225. msprobe/test/resources/npu_test.pkl +8 -0
  226. msprobe/test/run_test.sh +30 -0
  227. msprobe/test/run_ut.py +58 -0
  228. msprobe/test/test_module_processer.py +64 -0
@@ -0,0 +1,269 @@
1
+ # **精度预检工具**
2
+
3
+ ## 简介
4
+
5
+ 精度预检工具通过扫描昇腾NPU上用户训练模型中所有API,输出精度情况的诊断和分析。工具通过dump模型中所有的API前反向信息;构造相应的API单元测试,将NPU输出与标杆(CPU高精度)比对,从而计算对应的精度指标,该过程称为run_ut;将NPU环境下dump的预检数据拷贝至GPU环境,同样执行run_ut;最后通过**新精度标准比对法**将NPU和GPU的预检结果进行比对,从而找出NPU中存在精度问题的API。
6
+
7
+ **新精度标准比对法**:依据新精度标准,对不同的API采取不同的比对算法进行比对(包括绝对阈值法,标杆比对法、二进制一致法、ULP误差比对法和双千指标法),最终给定预检判定结果。
8
+
9
+ **真实数据模式**:精度预检工具支持随机生成模式和真实数据模式,即在预检dump时可以选择由工具构造随机数进行输入获得dump数据或选择获取真实输入数据进行预检dump操作;随机生成模式执行效率高,可以快速获得结果,但数据精度低,只能大致判断精度问题;真实数据模式执行效率略低于随机生成模式,但是数据精度高,可以准确判断精度问题。
10
+
11
+ **工具支持PyTorch版本**:2.0/2.1/2.2。
12
+
13
+ **工具特性**
14
+
15
+ - 落盘数据小。
16
+ - 支持随机生成模式和真实数据模式。
17
+ - 单API测试,排除整网中的累计误差问题。
18
+
19
+ ## 预检流程
20
+
21
+ 精度预检操作流程如下:
22
+
23
+ 1. 在NPU和GPU环境下分别安装msprobe工具。详见《[MindStudio精度调试工具](../../README.md)》的“工具安装”章节。
24
+ 2. 在NPU训练脚本内添加msprobe工具dump接口PrecisionDebugger采集待预检数据。详见《[精度数据采集](./dump.md)》。
25
+ 3. 将NPU环境下dump的预检数据拷贝至GPU环境。
26
+ 4. 在NPU和GPU环境下分别执行run_ut,生成结果用于最终api_precision_compare操作的输入。详见“**run_ut预检操作**”。
27
+ 5. 将NPU和GPU执行run_ut生成的`accuracy_checking_details_{timestamp}.csv`结果文件拷贝至同一环境下。
28
+ 6. 运行api_precision_compare.py,输出结果为预检操作的最终结果。详见“**预检结果比对**”。
29
+
30
+ ## 预检操作
31
+
32
+ ### run_ut预检操作
33
+
34
+ 完成待预检数据采集后,仅仅获取了API的输入数据,为了得到NPU vs CPU高精度(标杆)的预检比对结果和GPU vs CPU高精度(标杆)的预检比对结果,还需要进行run_ut操作。
35
+
36
+ run_ut预检操作包括如下场景:
37
+
38
+ - 使用run_ut.py执行预检:run_ut.py适用于数据量较小的单卡场景。
39
+ - 使用multi_run_ut.py执行多线程预检:multi_run_ut.py适用于数据量较大的大模型场景。
40
+
41
+ #### 使用run_ut.py执行预检
42
+
43
+ 1. 将API信息输入给run_ut模块运行精度检测并比对,运行如下命令:
44
+
45
+ ```bash
46
+ msprobe -f pytorch run_ut -api_info ./dump.json
47
+ ```
48
+
49
+ | 参数名称 | 说明 | 是否必选 |
50
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
51
+ | -api_info或--api_info_file | 指定API信息文件dump.json。 | 是 |
52
+ | -save_error_data | 保存精度未达标的API输入输出数据。 | 否 |
53
+ | -o或--out_path | 指定run_ut执行结果存盘路径,默认“./”(相对于run_ut的路径)。 | 否 |
54
+ | -j或--jit_compile | 开启jit编译。 | 否 |
55
+ | -d或--device | 指定Device ID,选择UT代码运行所在的卡,默认值为0。 | 否 |
56
+ | -csv_path或--result_csv_path | 指定本次运行中断时生成的`accuracy_checking_result_{timestamp}.csv`文件路径,执行run_ut中断时,若想从中断处继续执行,配置此参数即可。需要指定为上次中断的`accuracy_checking_result_{timestamp}.csv`文件。详见“**断点续检**”。 | run_ut操作中断后继续执行场景下必选 |
57
+ | -f或--filter_api | 过滤模型中除最大值和最小值以外其他参数和结构相同的API。适用于模型较大且重复API较多的场景。 | 否 |
58
+
59
+ 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`中查询其各个输出的达标情况以及比较指标。详细介绍请参见“**预检结果**”。
60
+
61
+ 2. (可选)如果需要保存比对不达标的输入和输出数据,可以在run_ut执行命令结尾添加-save_error_data,例如:
62
+
63
+ ```bash
64
+ msprobe -f pytorch run_ut -api_info ./dump.json -save_error_data
65
+ ```
66
+
67
+ 数据默认会存盘到'./ut_error_data{timestamp}'路径下(相对于启动run_ut的路径),有需要的话,用户可以通过修改mstt/debug/accuracy_tools/api_accuracy_checker目录下,config.yaml文件的error_data_path参数来配置保存路径,详见“config.yaml文件说明”。
68
+
69
+ #### 使用multi_run_ut.py执行多线程预检
70
+
71
+ multi_run_ut.py脚本,可以并行执行多个run_ut操作,从而降低预检耗时。
72
+
73
+ 命令示例如下:
74
+
75
+ ```bash
76
+ msprobe -f pytorch multi_run_ut -api_info ./dump.json -n 32 -d 0 1 2 3
77
+ ```
78
+
79
+ | 参数名称 | 说明 | 是否必选 |
80
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
81
+ | -api_info或--api_info_file | 指定API信息文件dump.json。 | 是 |
82
+ | -save_error_data | 保存精度未达标的API输入输出数据。 | 否 |
83
+ | -o或--out_path | 指定run_ut执行结果存盘路径,默认“./”(相对于run_ut的路径)。 | 否 |
84
+ | -j或--jit_compile | 开启jit编译。 | 否 |
85
+ | -n | 同时执行run_ut线程的数量,默认为8,最大支持64,但每个Device最大支持8个线程,当指定多个线程和多个Device时,则线程数在每张卡上均分。 | 否 |
86
+ | -d或--device | 指定Device ID,选择UT代码运行所在的卡,默认值为0,支持同时指定0~7,共8个Device。 | 否 |
87
+ | -csv_path或--result_csv_path | 指定本次运行中断时生成的`accuracy_checking_result_{timestamp}.csv`文件路径,执行run_ut中断时,若想从中断处继续执行,配置此参数即可。需要指定为上次中断的`accuracy_checking_result_{timestamp}.csv`文件。详见“**断点续检**”。 | run_ut操作中断后继续执行场景下必选 |
88
+ | -f或--filter_api | 过滤模型中除最大值和最小值以外其他参数和结构相同的API。适用于模型较大且重复API较多的场景。 | 否 |
89
+
90
+ #### 断点续检
91
+
92
+ 精度预检run_ut过程中,若因环境、数据量过大等原因导致预检进程中断,那么当用户解决这些问题后,重新执行run_ut操作,可以通过断点续检操作继续前面未完成的预检,会在-csv_path指定的`accuracy_checking_result_{timestamp}.csv`文件以及对应的`accuracy_checking_details_{timestamp}.csv`文件中继续写入后续的结果,不会重新创建结果文件。
93
+
94
+ 须指定为上次预检中断的`accuracy_checking_result_{timestamp}.csv`文件。请勿修改`accuracy_checking_result_{timestamp}.csv`和`accuracy_checking_details_{timestamp}.csv`文件名,包括时间戳,否则断点续检会因无法识别到文件名而失败。
95
+
96
+ 断点续检操作通过如下命令执行:
97
+
98
+ ```bash
99
+ msprobe -f pytorch run_ut -api_info ./dump.json -csv_path /home/xxx/ut/accuracy_checking_result_{timestamp}.csv
100
+ ```
101
+
102
+ #### API预检白名单
103
+
104
+ run_ut过程支持API预检白名单,操作方式如下:
105
+
106
+ 修改mstt/debug/accuracy_tools/api_accuracy_checker目录下config.yaml文件的white_list参数,配置需要预检的API名称,详见“config.yaml文件说明”。
107
+
108
+ ### config.yaml文件说明
109
+
110
+ config.yaml文件可以通过配置参数来控制dump和run_ut操作的白名单等功能。
111
+
112
+ 文件路径为:mstt/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/config.yaml
113
+
114
+ | 参数名称 | 说明 | 是否必选 |
115
+ | --------------- | ------------------------------------------------------------ | -------- |
116
+ | white_list | API dump白名单,指定dump具体API数据,也可以直接配置预检的API白名单,详细请参见“**API预检白名单**”。参数示例:white_list=["conv1d", "conv2d"]。默认未配置白名单,即dump全量API数据。 | 否 |
117
+ | error_data_path | 配置保存精度未达标的API输入输出数据路径。 | 否 |
118
+ | precision | 浮点数表示位数,默认取小数点后14位。 | 否 |
119
+
120
+ ## 预检结果
121
+
122
+ 精度预检生成的`accuracy_checking_result_{timestamp}.csv`和`accuracy_checking_details_{timestamp}.csv`文件示例如下:
123
+
124
+ 可以通过先查看`accuracy_checking_result_{timestamp}.csv`文件的Forward Test Success和Backward Test Success,判断是否存在未通过测试的API,再查看`accuracy_checking_details_{timestamp}.csv`文件的API详细达标情况,API达标情况介绍请参见“**API预检指标**”。
125
+
126
+ `accuracy_checking_result_{timestamp}.csv`
127
+
128
+ ![accuracy_checking_result](img/accuracy_checking_result.png)
129
+
130
+ | 字段 | 含义 |
131
+ | --------------------- | ------------------------------------------------------------ |
132
+ | API name | API名称。 |
133
+ | Forward Test Success | 前向API是否通过测试,pass为通过,warning为待观察,error为错误。 |
134
+ | Backward Test Success | 反向API是否通过测试,pass为通过,warning为待观察,error为错误,如果是空白的话代表该API没有反向输出。 |
135
+ | Message | 提示信息。 |
136
+
137
+ 该结果为中间结果,仅作为参考,建议完成“**预检结果比对**”后查看比对结果。该结果后续将会删除。
138
+
139
+ Forward Test Success和Backward Test Success是否通过测试是由`accuracy_checking_details_{timestamp}.csv`中的余弦相似度、最大绝对误差、双百双千双万指标判定结果决定的。
140
+
141
+ 需要注意的是`accuracy_checking_details_{timestamp}.csv`中可能存在一个API的前向(反向)有多个输出,那么每个输出记录一行,而在`accuracy_checking_result_{timestamp}.csv`中的结果需要该API的所有结果均为pass才能标记为pass,只要存在一个error则标记error,仅存在waring和pass且不存在error标记waring。
142
+
143
+ `accuracy_checking_details_{timestamp}.csv`
144
+
145
+ ![accuracy_checking_details](img/accuracy_checking_details.png)
146
+
147
+ | 字段 | 含义 |
148
+ | ------------------- | ------------------------------------------------------------ |
149
+ | API name | NPU或GPU下的API名称。 |
150
+ | Bench Dtype | 标杆数据的API数据类型。 |
151
+ | DEVICE Dtype | NPU或GPU数据的API数据类型。 |
152
+ | Shape | API的Shape信息。 |
153
+ | 余弦相似度 | NPU或GPU数据与标杆数据的余弦相似度。 |
154
+ | 最大绝对误差 | NPU或GPU数据与标杆数据的最大绝对误差。 |
155
+ | 双百指标 | 双百精度指标。是指NPU或GPU的Tensor中的元素逐个与对应的标杆数据对比,相对误差小于百分之一的个数占总元素个数的比例。测试通过标准为相对误差大于百分之一的个数占总元素个数的比例小于百分之一。 |
156
+ | 双千指标 | 双千精度指标。是指NPU或GPU的Tensor中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。 |
157
+ | 双万指标 | 双万精度指标。是指NPU或GPU的Tensor中的元素逐个与对应的标杆数据对比,相对误差小于万分之一的个数占总元素个数的比例。测试通过标准为相对误差大于万分之一的个数占总元素个数的比例小于万分之一。 |
158
+ | 二进制一致错误率 | NPU或GPU数据中每个Tensor精度不一致的数值的数量与Tensor中数值数量的比值。只有数据是builtin类型(bool、int、float、str)、torch.bool和torch的int类型或者在新精度标准中使用二进制一致算法进行比对的API才会展示。 |
159
+ | 误差均衡性 | NPU或GPU数据与标杆数据精度差的上下浮动情况。 |
160
+ | 均方根误差 | NPU或GPU数据与标杆数据的均方根误差。 |
161
+ | 小值域错误占比 | NPU或GPU Tensor中与标杆的绝对误差大于错误阈值的小值在小值域(小值的总数量)中的占比。判断为小值以及绝对误差的错误阈值见“**小值域阈值**”。 |
162
+ | 相对误差最大值 | NPU或GPU数据与标杆数据相对误差的最大值。 |
163
+ | 相对误差平均值 | NPU或GPU数据与标杆数据相对误差的平均值。 |
164
+ | inf/nan错误率 | NPU与标杆inf/nan计算不一致的元素个数占总元素的个数比例。 |
165
+ | 相对误差错误率 | NPU与标杆的正常值计算相对误差,其大于错误阈值的元素个数占正常值元素个数的比例。 |
166
+ | 绝对误差错误率 | NPU与标杆的小值计算绝对误差,其大于错误阈值的元素个数占小值元素个数的比例。 |
167
+ | ULP误差最大值 | NPU或GPU数据与标杆数据ULP误差的最大值(取绝对值后)。 |
168
+ | ULP误差平均值 | NPU或GPU数据与标杆数据ULP误差的平均值(取绝对值后)。 |
169
+ | ULP误差大于阈值占比 | NPU或GPU数据与标杆数据的ULP误差(取绝对值后)大于阈值(当NPU或GPU数据类型为float16或bfloat16时,阈值为1;当NPU或GPU数据类型为float32时,阈值为32)的元素个数占总元素的个数比例。 |
170
+ | Status | API预检通过状态,pass表示通过测试,error表示未通过,warning表示测试未通过双千或双万精度指标,SKIP表示该API的某个参数的反向不要计算梯度,所以没有任何计算过程,其他信息均为空。 |
171
+ | message | 提示信息。 |
172
+
173
+ ### 小值域阈值
174
+
175
+ 判定为小值的阈值为:
176
+
177
+ - torch.float32:e-6
178
+ - torch.float16:e-3
179
+ - torch.bfloat16:e-3
180
+
181
+ 小值域的绝对误差阈值为:
182
+
183
+ - torch.float32:e-9
184
+ - torch.float16:e-5
185
+ - torch.bfloat16:e-5
186
+
187
+ ### API预检指标
188
+
189
+ API预检指标是通过对`accuracy_checking_details_{timestamp}.csv`中的余弦相似度、最大绝对误差双百、双千、双万精度指标的数值进行判断,得出该API是否符合精度标准的参考指标。
190
+
191
+ API预检通过测试,则在`accuracy_checking_details_{timestamp}.csv`文件中的“Status”列标记“pass”,否则标记“error”或“warning”,详细规则如下:
192
+
193
+ 1. 余弦相似度 > 0.99:≤ 0.99为不达标,标记“error”,> 0.99达标,进行下一步;
194
+ 2. 最大绝对误差 < 0.001:< 0.001达标,标记“pass”,≥ 0.001为不达标,进行下一步;
195
+ 3. 双百、双千、双万精度指标:
196
+ - 对于float16和bfloat16数据:双百指标不通过,标记“error”;双百指标通过,双千指标不通过,标记“warning”;双百、双千指标均通过,标记“pass”。
197
+ - 对于float32和float64数据:双千指标不通过,标记“error”;双千指标通过,双万指标不通过,标记“warning”;双千、双万指标均通过,标记“pass”。
198
+
199
+ 4. 在`accuracy_checking_result_{timestamp}.csv`中以“Forward Test Success”和“Backward Test Success”字段统计该算子前向反向输出的测试结果,对于标记“pass”的算子,则在`accuracy_checking_result_{timestamp}.csv`中标记“TRUE”表示测试通过,对于标记“error”或“warning”的算子,则在`accuracy_checking_result_{timestamp}.csv`中标记“FALSE”表示测试不通过。由于一个算子可能有多个前向或反向的输入或输出,那么该类算子的输入或输出中必须全为“pass”,才能在`accuracy_checking_result_{timestamp}.csv`中标记“TRUE”,只要有一个输入或输出标记“error”或“warning”,那么在`accuracy_checking_result_{timestamp}.csv`中标记“FALSE”。
200
+
201
+ ## 预检结果比对
202
+
203
+ 需要同时获取NPU和GPU环境下run_ut操作的预检结果`accuracy_checking_details_{timestamp}.csv`文件。执行如下命令进行NPU和GPU预检结果的比对:
204
+
205
+ ```bash
206
+ msprobe -f pytorch api_precision_compare -npu /home/xxx/npu/accuracy_checking_details_{timestamp}.csv -gpu /home/xxx/gpu/accuracy_checking_details_{timestamp}.csv -o /home/xxx/
207
+ ```
208
+
209
+ | 参数名称 | 说明 | 是否必选 |
210
+ | -------------------- | ------------------------------------------------------------ | -------- |
211
+ | -npu或--npu_csv_path | NPU预检结果`accuracy_checking_details_{timestamp}.csv`文件路径。默认从当前目录下识别该文件。 | 否 |
212
+ | -gpu或--gpu_csv_path | GPU预检结果`accuracy_checking_details_{timestamp}.csv`文件路径。默认从当前目录下识别该文件。 | 否 |
213
+ | -o或--out_path | 指定api_precision_compare.py执行结果存盘路径,默认为当前目录。 | 否 |
214
+
215
+ 执行完成后输出`api_precision_compare_result_{timestamp}.csv`和`api_precision_compare_details_{timestamp}.csv`文件。文件示例如下:
216
+
217
+ 可以通过先查看`api_precision_compare_result_{timestamp}.csv`文件的Forward Test Success和Backward Test Success,判断是否存在未通过测试的API,再查看`api_precision_compare_details_{timestamp}.csv`文件的API详细达标情况。
218
+
219
+ `api_precision_compare_result_{timestamp}.csv`
220
+
221
+ ![api_precision_compare_result](img/api_precision_compare_result.png)
222
+
223
+ | 字段 | 含义 |
224
+ | --------------------- | ------------------------------------------------------------ |
225
+ | API name | API名称。 |
226
+ | Forward Test Success | 前向API是否通过测试,pass为通过,warning为待观察,error为错误,skip表示该API的数据类型不支持使用新精度标准进行比对,如float64。 |
227
+ | Backward Test Success | 反向API是否通过测试,pass为通过,warning为待观察,error为错误,如果是空白的话代表该API没有反向输出,skip表示该API的数据类型不支持使用新精度标准进行比对,如float64。 |
228
+ | Message | 提示信息。 |
229
+
230
+ Forward Test Success和Backward Test Success是否通过测试是由`api_precision_compare_details_{timestamp}.csv`中的各个指标判定结果决定的。需要注意的是`api_precision_compare_details_{timestamp}.csv`中可能存在一个API的前向(反向)有多个输出,那么每个输出记录一行,而在`api_precision_compare_result_{timestamp}.csv`中的结果需要该API的所有结果均为pass才能标记为pass,只要存在一个error则标记error,仅存在warning和pass且不存在error标记warning。
231
+
232
+ `api_precision_compare_details_{timestamp}.csv`
233
+
234
+ ![api_precision_compare_details](img/api_precision_compare_details.png)
235
+
236
+ | 字段 | 含义 |
237
+ | ------------------------ | ------------------------------------------------------------ |
238
+ | API name | NPU或GPU下的API名称。 |
239
+ | 小值域错误比值 | NPU与CPU的小值域的错误比率/GPU与CPU的小值域的错误比率。标杆比对法指标。 |
240
+ | 小值域错误判定结果 | 小值域错误比值小于等于1标记为pass,1~2之间标记为waring,大于2标记为error。 |
241
+ | 均方根误差比值 | NPU与CPU的均方根误差/GPU与CPU的均方根误差。标杆比对法指标。 |
242
+ | 均方根误差判定结果 | 均方根误差比值小于等于1标记为pass,1~2之间标记为waring,大于2标记为error。 |
243
+ | 相对误差最大值比值 | NPU与CPU的相对误差最大值/GPU与CPU的相对误差最大值。标杆比对法指标。 |
244
+ | 相对误差最大值判定结果 | 相对误差最大值比值小于等于1标记为pass,1~10之间标记为waring,大于10标记为error。 |
245
+ | 相对误差平均值比值 | NPU与CPU的相对误差的平均值/GPU与CPU的相对误差的平均值。标杆比对法指标。 |
246
+ | 相对误差平均值判定结果 | 相对误差平均值比值小于等于1标记为pass,1~2之间标记为waring,大于2标记为error。 |
247
+ | 误差均衡性比值 | NPU与CPU的误差均衡性/GPU与CPU的误差均衡性。标杆比对法指标。 |
248
+ | 误差均衡性判定结果 | 误差均衡性比值小于等于1标记为pass,1~2之间标记为waring,大于2标记为error。该字段暂不参与api_precision_compare_result的结果判定。 |
249
+ | inf/nan错误率 | NPU与标杆inf/nan计算不一致的元素个数占总元素的个数比例。绝对阈值法指标。 |
250
+ | inf/nan判定结果 | inf/nan错误率判定结果,等于0标记为pass,其余情况标记为error。 |
251
+ | 相对误差错误率 | NPU与标杆的正常值计算相对误差,其大于错误阈值的元素个数占正常值元素个数的比例。绝对阈值法指标。 |
252
+ | 相对误差判定结果 | 相对误差错误率判定结果,等于0标记为pass,其余情况标记为error。 |
253
+ | 绝对误差错误率 | NPU与标杆的小值计算绝对误差,其大于错误阈值的元素个数占小值元素个数的比例。绝对阈值法指标。 |
254
+ | 绝对误差判定结果 | 绝对误差错误率判定结果,等于0标记为pass,其余情况标记为error。 |
255
+ | 二进制一致错误率 | NPU或GPU数据中每个Tensor精度不一致的数值的数量与Tensor中数值数量的比值。只有数据是builtin类型(bool、int、float、str)、torch.bool和torch的int类型或者在新精度标准中使用二进制一致算法进行比对的API才会展示。二进制一致法指标。 |
256
+ | 二进制一致错误率判定结果 | 二进制一致错误率判定结果,等于0标记为pass,其余情况标记为error。 |
257
+ | ULP误差平均值 | NPU数据与标杆数据ULP误差的平均值(取绝对值后)。ULP误差比对法指标。 |
258
+ | ULP误差大于阈值占比 | NPU数据与标杆数据的ULP误差(取绝对值后)大于阈值(当NPU数据类型为float16或bfloat16时,阈值为1;当NPU数据类型为float32时,阈值为32)的元素个数占总元素的个数比例。ULP误差比对法指标。 |
259
+ | ULP误差大于阈值占比比值 | NPU与CPU的ULP误差大于阈值占比/GPU与CPU的ULP误差大于阈值占比。ULP误差比对法指标。 |
260
+ | ULP误差判定结果 | ULP误差判定结果。<br/> 当NPU或GPU数据类型是float16或bfloat16时,以下两条标准满足其一标记为pass,否则标记为error:<br> NPU ULP误差大于阈值占比小于0.001;<br/> NPU ULP误差大于阈值占比小于GPU ULP误差大于阈值占比。<br/> 当NPU或GPU数据类型是float32时,以下三条标准满足其一标记为pass,否则标记为error:<br/> NPU ULP误差平均值小于64;<br/> NPU ULP误差大于阈值占比小于0.05;<br/> NPU ULP误差大于阈值占比小于GPU ULP误差大于阈值占比。 |
261
+ | 双千指标 | 双千精度指标。是指NPU的Tensor中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。仅conv1d和conv2d使用该指标。双千指标法指标。 |
262
+ | 双千指标判定结果 | 双千指标判定结果。双千指标大于0.999标记为pass,否则标记为error。 |
263
+ | 比对结果 | 综合所有指标的最终结果。如果比对指标中有error,则标记为error;有warning,则标记为warning;否则标记为pass。 |
264
+ | 比对算法 | API使用的比对算法,为标杆比对法、二进制一致法、绝对阈值法和ULP误差比对法中的一种。 |
265
+ | Message | 提示信息。当前提示该API比对结果为error或warning时对应不符合标准的指标。 |
266
+
267
+ # FAQ
268
+
269
+ [FAQ](./FAQ.md)
@@ -0,0 +1,182 @@
1
+ # msprobe精度工具标准性能基线报告
2
+
3
+ ## 环境信息
4
+
5
+ NPU:Atlas A2 训练系列产品
6
+
7
+ CPU:
8
+
9
+ ![输入图片说明](img/cpu_info.png)
10
+
11
+ Torch:2.1.0
12
+
13
+ CANN:8.0.T2
14
+
15
+ 除上述环境信息影响性能外,API的数量、种类以及Shape都会对性能产生影响,因此本次选取指定网络进行测试,为了避免算子编译耗时的影响,所有模型运行时都开启二进制,模型中添加torch.npu.set_compile_mode(jit_compile=False),所有模型都dump第二个step的数据。
16
+
17
+ ## 模型信息和性能基线
18
+
19
+ 大模型在使用msprobe工具dump数据时,建议先简化模型层数,减少dump数据量。
20
+
21
+ 以下场景的性能基线测试数据均为多次测试后取平均值,因此实际运行时性能数据可能会根据环境状态稍有浮动。
22
+
23
+ ### 工具配置信息
24
+
25
+ dump全部API级别输入输出数据以及相应堆栈信息,配置如下:
26
+
27
+ ```python
28
+ debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump")
29
+ debugger.configure_hook(mode="api_stack")
30
+ ```
31
+
32
+ 多卡指定rank0 dump,配置如下:
33
+
34
+ ```python
35
+ debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump",rank=0)
36
+ debugger.configure_hook(mode="api_stack")
37
+ ```
38
+
39
+ dump保存API统计信息的pkl文件,配置如下:
40
+
41
+ ```python
42
+ debugger = PrecisionDebugger(dump_path="./dump_path", hook_name="dump")
43
+ debugger.configure_hook(mode="api_stack", summary_only=True)
44
+ ```
45
+
46
+ ### YOLOV5s
47
+
48
+ 单卡
49
+
50
+ 主要数据类型:FLOAT32
51
+
52
+ 启动命令参数:python3 train_ptdbg.py --data ./data/coco.yaml --cfg yolov5s.yaml --weights '' --epochs 1 --batch-size 8 --device 1
53
+
54
+ dump保存API统计信息的pkl文件耗时:**7s**
55
+
56
+ 进行单卡dump全部API级别输入输出数据以及相应堆栈信息耗时:**11s**
57
+
58
+ - dump存盘的API numpy文件大小:13G
59
+
60
+ ![输入图片说明](img/YOLOV5S_1.png)
61
+
62
+ - api numpy文件数量:3009个
63
+
64
+ ![输入图片说明](img/YOLOV5S_2.png)
65
+
66
+
67
+
68
+
69
+ ### GPT-3
70
+
71
+ #### NUM_LAYER:1
72
+
73
+ 8卡
74
+
75
+ 主要数据类型:FLOAT16
76
+
77
+ 启动命令参数:
78
+
79
+ ```
80
+ python3 -m torch.distributed.launch $DISTRIBUTED_ARGS ../../pretrain_gpt_ptdbg.py --num-layers 1 --hidden-size 12288 --num-attention-heads 24 --micro-batch-size 2 --global-batch-size 2 --seq-length 1024 --max-position-embeddings 1024 --train-iters 10 --lr-decay-iters 320000 --save $CHECKPOINT_PATH --load $CHECKPOINT_PATH --data-path $DATA_PATH --tensor-model-parallel-size 8 --use-distributed-optimizer --pipeline-model-parallel-size 8 --vocab-file gpt2-vocab.json --merge-file gpt2-merges.txt --data-impl mmap --split 949,50,1 --distributed-backend nccl --lr 0.375e-5 --lr-decay-style cosine --min-lr 0.375e-6 --weight-decay 0.1 --clip-grad 1.0 --lr-warmup-fraction .01 --adam-beta1 0.9 --adam-beta2 0.95 --init-method-std 0.006
81
+ --recompute-granularity full --recompute-method uniform --no-gradient-accumulation-fusion --log-interval 1 --save-interval 10000 --eval-interval 1000 --eval-iters 10 --fp16
82
+ ```
83
+
84
+ dump保存API统计信息的pkl文件耗时:**3.3s**
85
+
86
+ 进行8卡dump全部API级别输入输出数据以及相应堆栈信息耗时:**53s**
87
+
88
+ - dump存盘的api numpy文件大小:145G
89
+
90
+ ![输入图片说明](img/GPT-3_1.png)
91
+
92
+ - API numpy文件数量:5130个
93
+
94
+ ![输入图片说明](img/GPT-3_2.png)
95
+
96
+
97
+ **经测试8卡同时写入磁盘已达到磁盘I/O上限,工具的dump速度取决于磁盘性能,本机环境多进程写入磁盘上限为3GB/秒左右,理论上保存145GB的数据需要50秒左右,如果dump的数据中包含许多的小文件,那么耗时将会更久。**
98
+
99
+ 指定rank0 dump耗时:**9s**
100
+
101
+ - dump存盘的api numpy文件大小:19G
102
+
103
+ ![输入图片说明](img/GPT-3_3.png)
104
+
105
+ - api numpy文件数量:643个
106
+
107
+ ![输入图片说明](img/GPT-3_4.png)
108
+
109
+
110
+ #### NUM_LAYER:8
111
+
112
+ 8卡
113
+
114
+ 主要数据类型:FLOAT16
115
+
116
+ 启动命令参数:
117
+
118
+ ```
119
+ python3 -m torch.distributed.launch $DISTRIBUTED_ARGS ../../pretrain_gpt_ptdbg.py --num-layers 8 --hidden-size 12288 --num-attention-heads 24 --micro-batch-size 2 --global-batch-size 2 --seq-length 1024 --max-position-embeddings 1024 --train-iters 10 --lr-decay-iters 320000 --save $CHECKPOINT_PATH --load $CHECKPOINT_PATH --data-path $DATA_PATH --tensor-model-parallel-size 8 --use-distributed-optimizer --pipeline-model-parallel-size 8 --vocab-file gpt2-vocab.json --merge-file gpt2-merges.txt --data-impl mmap --split 949,50,1 --distributed-backend nccl --lr 0.375e-5 --lr-decay-style cosine --min-lr 0.375e-6 --weight-decay 0.1 --clip-grad 1.0 --lr-warmup-fraction .01 --adam-beta1 0.9 --adam-beta2 0.95 --init-method-std 0.006 --recompute-granularity full --recompute-method uniform --no-gradient-accumulation-fusion --log-interval 1 --save-interval 10000 --eval-interval 1000 --eval-iters 10 --fp16
120
+ ```
121
+
122
+ dump保存API统计信息的pkl文件耗时:**6.7s**
123
+
124
+ 进行8卡dump全部API级别输入输出数据以及相应堆栈信息耗时:**323s**
125
+
126
+ - dump存盘的API numpy文件大小:878G
127
+
128
+ ![输入图片说明](img/GPT-3_5.png)
129
+
130
+ - API numpy文件数量:24002个
131
+
132
+ ![输入图片说明](img/GPT-3_6.png)
133
+
134
+
135
+ 指定rank0 dump耗时:**47s**
136
+
137
+ - dump存盘的API numpy文件大小:110G
138
+
139
+ ![输入图片说明](img/GPT-3_7.png)
140
+
141
+ - API numpy文件数量:3002个
142
+
143
+ ![输入图片说明](img/GPT-3_8.png)
144
+
145
+
146
+ ### BLOOM-7B
147
+
148
+ 8卡
149
+
150
+ NUM_LAYER:1
151
+
152
+ 主要数据类型:BFLOAT16
153
+
154
+ 启动命令参数:
155
+
156
+ ```
157
+ python -m torch.distributed.launch $DISTRIBUTED_ARGS pretrain_llama.py --DDP-impl local --tensor-model-parallel-size 8 --pipeline-model-parallel-size 1 --sequence-parallel --num-layers 1 --hidden-size 12288 --position-embedding-type rope --normalization RMSNorm --ffn-hidden-size 11008 --num-attention-heads 24 --attention-dropout 0.0 --hidden-dropout 0.0 --init-method-std 0.01 --micro-batch-size 2 --global-batch-size 2 --seq-length 1024 --max-position-embeddings 1024 --data-path $DATA_PATH --tokenizer-name-or-path $TOKENIZER_PATH --tokenizer-not-use-fast --split 100,0,0 --distributed-backend nccl --lr 1.25e-5 --min-lr 1.25e-6 --lr-decay-style cosine --weight-decay 1e-1 --clip-grad 1.0 --initial-loss-scale 65536.0 --adam-beta1 0.9 --adam-beta2 0.95 --log-interval 1 --load ${LOAD_CHECKPOINT_PATH} --save ${SAVE_CHECKPOINT_PATH} --save-interval 10000 --eval-interval 10000 --eval-iters 0 --use-fused-rotary-pos-emb --no-masked-softmax-fusion --no-load-optim --no-load-rng --train-iters 20 --lr-warmup-fraction 0.01 --mlp-layer-fusion --use-flash-attn --use-fused-rmsnorm --bf16
158
+ ```
159
+
160
+ dump保存API统计信息的pkl文件耗时:**3s**
161
+
162
+ 进行8卡dump全部API级别输入输出数据以及相应堆栈信息耗时:**61s**
163
+
164
+ - dump存盘的API numpy文件大小:160G
165
+
166
+ ![输入图片说明](img/BLOOM-7B_1.png)
167
+
168
+ - API numpy文件数量:4924个
169
+
170
+ ![输入图片说明](img/BLOOM-7B_2.png)
171
+
172
+
173
+ 指定rank0 dump耗时:**17s**
174
+
175
+ - dump存盘的API numpy文件大小:20G
176
+
177
+ ![输入图片说明](img/BLOOM-7B_3.png)
178
+
179
+ - API numpy文件数量:633个
180
+
181
+ ![输入图片说明](img/BLOOM-7B_4.png)
182
+
@@ -0,0 +1,207 @@
1
+ # **精度数据采集**
2
+
3
+ msprobe工具主要通过在训练脚本内添加dump接口并启动训练的方式来采集精度数据。
4
+
5
+ 执行dump操作需要安装msprobe工具。详见《[MindStudio精度调试工具](../../README.md)》的“工具安装”章节。
6
+
7
+ ## dump接口介绍
8
+
9
+ ### PrecisionDebugger
10
+
11
+ **功能说明**
12
+
13
+ 通过加载dump配置文件的方式来确定dump操作的详细配置。
14
+
15
+ 可以在from msprobe.pytorch import PrecisionDebugger和模型初始化之间的任意位置添加该接口。
16
+
17
+ **原型**
18
+
19
+ ```Python
20
+ PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, model=None, step=None)
21
+ ```
22
+
23
+ 说明:上述参数除config_path和model外,其他参数均在[config.json](../../config)文件中可配,此处的参数优先级高于[config.json](../../config)文件中的配置,而config.json文件可以配置更多参数,若需要进行更多场景的精度数据dump,建议配置[config.json](../../config)文件。
24
+
25
+ **参数说明**
26
+
27
+ | 参数名 | 说明 | 是否必选 |
28
+ | ----------- | ------------------------------------------------------------ | -------- |
29
+ | config_path | 指定dump配置文件路径,String类型。参数示例:"./config.json"。未配置该路径时,默认使用[config.json](../../config)文件的默认配置。 | 否 |
30
+ | task | dump的任务类型,String类型。可取值"statistics"(仅dump API统计信息)、"tensor"(dump API统计信息和完全复刻整网的API运行情况的真实数据)、"overflow_check"(溢出检测),默认未配置,取"statistics",参数示例:task="tensor"。 | 否 |
31
+ | dump_path | 设置dump数据目录路径,String类型。参数示例:dump_path="./dump_path"。 | 否 |
32
+ | level | dump级别,根据不同级别dump不同数据,String类型。可取值:<br> "L0":dump module模块级精度数据,仅PyTorch场景支持”。<br/> "L1":dump API级精度数据,默认值。<br/> "L2":dump kernel级精度数据。<br/> "mix":dump module模块级和API级精度数据。<br/>配置示例:level="L1"。 | 否 |
33
+ | model | 指定具体的torch.nn.Module,默认未配置,level配置为"L0"或"mix"时必须配置该参数。配置示例参见“**model配置代码示例**”。 | 否 |
34
+ | step | 指定dump某个step的数据,list[int]类型。默认未配置,表示dump所有step数据。dump特定step时,须指定为训练脚本中存在的step。step为list格式,可配置逐个step,例如:step=[0,1,2]。 | 否 |
35
+
36
+ #### model配置代码示例
37
+
38
+ 示例中定义了一个nn.Module类型的简单网络,在进行数据dump时使用原型函数PrecisionDebugger并传入config_path参数和model参数,其中model参数传入数据的类型为torch.nn.Module类型或torch.nn.Module子类型。
39
+
40
+ ```python
41
+ #根据需要import包
42
+ import os
43
+ import torch
44
+ import torch.nn as nn
45
+ import torch_npu
46
+ import torch.nn.functional as F
47
+ from msprobe.pytorch import PrecisionDebugger
48
+
49
+ torch.npu.set_device("npu:0")
50
+ #定义一个简单的网络
51
+ class ModuleOP(nn.Module):
52
+ def __init__(self) -> None:
53
+ super().__init__()
54
+ self.linear_1 = nn.Linear(in_features=8,out_features=4)
55
+ self.linear_2 = nn.Linear(in_features=4,out_features=2)
56
+
57
+ def forward(self,x):
58
+ x1 = self.linear_1(x)
59
+ x2 = self.linear_2(x1)
60
+ r1 = F.relu(x2)
61
+ return r1
62
+
63
+ if __name__ == "__main__"
64
+ module = ModuleOP()
65
+
66
+ #注册工具
67
+ debugger = PrecisionDebugger('./config.json',model=module)
68
+ debugger.start()
69
+ x = torch.randn(10,8)
70
+ out = module(x)
71
+ loss = out.sum()
72
+ loss.backward()
73
+ debugger.stop()
74
+ ```
75
+
76
+ ### start函数
77
+
78
+ **功能说明**
79
+
80
+ 启动函数。
81
+
82
+ 在模型初始化之后的任意位置添加。
83
+
84
+ **原型**
85
+
86
+ ```Python
87
+ debugger.start()
88
+ ```
89
+
90
+ 该函数为类函数,可以使用debugger.start()也可以使用PrecisionDebugger.start()。
91
+
92
+ ### stop函数
93
+
94
+ **功能说明**
95
+
96
+ 停止函数。
97
+
98
+ 在**start**函数之后的任意位置添加。
99
+
100
+ **原型**
101
+
102
+ ```Python
103
+ debugger.stop()
104
+ ```
105
+
106
+ 该函数为类函数,可以使用debugger.stop()也可以使用PrecisionDebugger.stop()。
107
+
108
+ ### step函数
109
+
110
+ **功能说明**
111
+
112
+ 结束标识。
113
+
114
+ 在最后一个**stop**函数后或一个step结束的位置添加。
115
+
116
+ **原型**
117
+
118
+ ```Python
119
+ debugger.step()
120
+ ```
121
+
122
+ 该函数为类函数,可以使用debugger.step()也可以使用PrecisionDebugger.step()。
123
+
124
+ ## 示例代码
125
+
126
+ ```Python
127
+ from msprobe.pytorch import PrecisionDebugger
128
+ debugger = PrecisionDebugger(config_path="./config.json", dump_path="./dump_path")
129
+ # 请勿将以上初始化流程插入到循环代码中
130
+
131
+ # 模型初始化
132
+ # 下面代码也可以用PrecisionDebugger.start()和PrecisionDebugger.stop()
133
+ debugger.start()
134
+
135
+ # 需要dump的代码片段1
136
+
137
+ debugger.stop()
138
+ debugger.start()
139
+
140
+ # 需要dump的代码片段2
141
+
142
+ debugger.stop()
143
+ debugger.step()
144
+ ```
145
+
146
+ ## dump结果文件介绍
147
+
148
+ 训练结束后,工具将dump的数据保存在dump_path参数指定的目录下。
149
+
150
+ dump结果目录结构示例如下:
151
+
152
+ ```Python
153
+ ├── dump_path
154
+ │ ├── step0
155
+ │ | ├── rank0
156
+ │ | │ ├── dump_tensor_data
157
+ | | | | ├── Tensor.permute.1.forward.pt
158
+ | | | | ├── MyModule.0.forward.input.pt # 开启模块级精度数据dump时存在模块级的dump数据文件
159
+ | | | | ...
160
+ | | | | └── Fcuntion.linear.5.backward.output.pt
161
+ │ | | ├── dump.json # 保存前反向算子、算子的统计量信息或溢出算子信息。包含dump数据的API名称(命名格式为:`{api_type}_{api_name}_{API调用次数}_{前向反向}_{input/output}.{参数序号}`)、dtype、 shape、各数据的max、min、mean、L2norm统计信息以及当配置summary_mode="md5"时的md5数据。其中,“参数序号”表示该API下的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API的第1个参数的第1个子参数;L2norm表示2范数(平方根)
162
+ │ | | ├── stack.json # 算子调用栈信息
163
+ │ | | └── construct.json # 分层分级结构
164
+ │ | ├── rank1
165
+ | | | ├── dump_tensor_data
166
+ | | | | └── ...
167
+ │ | | ├── dump.json
168
+ │ | | ├── stack.json
169
+ | | | └── construct.json
170
+ │ | ├── ...
171
+ │ | |
172
+ | | └── rank7
173
+ │ ├── step1
174
+ │ | ├── ...
175
+ │ ├── step2
176
+ ```
177
+
178
+ dump过程中,pt文件在对应算子或者模块被执行后就会落盘,而json文件则需要在正常执行PrecisionDebugger.stop()后才会被落盘保存,异常的程序终止会保存终止前被执行算子的相关pt文件,但是不会生成json文件。
179
+
180
+ 其中rank为设备上各卡的ID,每张卡上dump的数据会生成对应dump目录。
181
+
182
+ pt文件保存的前缀和PyTorch对应关系如下:
183
+
184
+ | 前缀 | Torch模块 |
185
+ | ----------- | ------------------- |
186
+ | Tensor | torch.Tensor |
187
+ | Torch | torch |
188
+ | Functional | torch.nn.functional |
189
+ | NPU | NPU亲和算子 |
190
+ | VF | torch._VF |
191
+ | Aten | torch.ops.aten |
192
+ | Distributed | torch.distributed |
193
+
194
+ ## 工具支持的API列表
195
+
196
+ msprobe工具维护固定的API支持列表,若需要删除或增加dump的API,可以在msprobe/pytorch/hook_module/support_wrap_ops.yaml文件内手动修改,如下示例:
197
+
198
+ ```Python
199
+ functional: # functional为算子类别,找到对应的类别,在该类别下按照下列格式删除或添加API
200
+ - conv1d
201
+ - conv2d
202
+ - conv3d
203
+ ```
204
+
205
+ # FAQ
206
+
207
+ [FAQ](./FAQ.md)