mindstudio-probe 1.0.3__py3-none-any.whl → 1.0.4__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 (262) hide show
  1. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/LICENSE +201 -201
  2. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/METADATA +36 -34
  3. mindstudio_probe-1.0.4.dist-info/RECORD +276 -0
  4. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/WHEEL +1 -1
  5. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/entry_points.txt +1 -0
  6. msprobe/README.md +101 -237
  7. msprobe/{config/config.json → config.json} +49 -49
  8. msprobe/core/advisor/advisor.py +124 -124
  9. msprobe/core/advisor/advisor_const.py +59 -59
  10. msprobe/core/advisor/advisor_result.py +58 -58
  11. msprobe/core/common/const.py +341 -318
  12. msprobe/core/common/exceptions.py +99 -99
  13. msprobe/core/common/{file_check.py → file_utils.py} +478 -283
  14. msprobe/core/common/log.py +76 -69
  15. msprobe/core/common/utils.py +385 -616
  16. msprobe/core/common_config.py +85 -71
  17. msprobe/core/compare/acc_compare.py +299 -298
  18. msprobe/core/compare/check.py +95 -95
  19. msprobe/core/compare/compare_cli.py +49 -49
  20. msprobe/core/compare/highlight.py +223 -222
  21. msprobe/core/compare/multiprocessing_compute.py +149 -149
  22. msprobe/core/compare/npy_compare.py +295 -295
  23. msprobe/core/compare/utils.py +430 -429
  24. msprobe/core/data_dump/data_collector.py +154 -144
  25. msprobe/core/data_dump/data_processor/base.py +314 -293
  26. msprobe/core/data_dump/data_processor/factory.py +59 -59
  27. msprobe/core/data_dump/data_processor/mindspore_processor.py +186 -198
  28. msprobe/core/data_dump/data_processor/pytorch_processor.py +366 -389
  29. msprobe/core/data_dump/json_writer.py +96 -116
  30. msprobe/core/data_dump/scope.py +178 -178
  31. msprobe/core/grad_probe/constant.py +70 -70
  32. msprobe/core/grad_probe/grad_compare.py +171 -175
  33. msprobe/core/grad_probe/utils.py +64 -52
  34. msprobe/docs/01.installation.md +89 -0
  35. msprobe/docs/02.config_introduction.md +165 -0
  36. msprobe/docs/03.config_examples.md +247 -0
  37. msprobe/docs/04.acl_config_examples.md +76 -0
  38. msprobe/docs/05.data_dump_PyTorch.md +198 -0
  39. msprobe/docs/06.data_dump_MindSpore.md +243 -0
  40. msprobe/docs/07.accuracy_checker_PyTorch.md +274 -0
  41. msprobe/docs/08.accuracy_checker_online_PyTorch.md +198 -0
  42. msprobe/docs/09.accuracy_checker_MindSpore.md +68 -0
  43. msprobe/docs/10.accuracy_compare_PyTorch.md +245 -0
  44. msprobe/docs/11.accuracy_compare_MindSpore.md +202 -0
  45. msprobe/docs/12.overflow_check_PyTorch.md +79 -0
  46. msprobe/docs/13.overflow_check_MindSpore.md +31 -0
  47. msprobe/{pytorch/doc/parse_tool.md → docs/14.data_parse_PyTorch.md} +283 -286
  48. msprobe/docs/15.free_benchmarking_PyTorch.md +164 -0
  49. msprobe/{doc/grad_probe/grad_probe.md → docs/17.grad_probe.md} +207 -207
  50. msprobe/docs/FAQ_PyTorch.md +177 -0
  51. msprobe/docs/S02.report_free_benchmarking_validation_performance_baseline.md +146 -0
  52. msprobe/docs/img/free_benchmark_framework.png +0 -0
  53. msprobe/mindspore/__init__.py +1 -1
  54. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +254 -245
  55. msprobe/mindspore/api_accuracy_checker/api_info.py +69 -69
  56. msprobe/mindspore/api_accuracy_checker/api_runner.py +155 -151
  57. msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +196 -196
  58. msprobe/mindspore/api_accuracy_checker/cmd_parser.py +6 -0
  59. msprobe/mindspore/api_accuracy_checker/compute_element.py +238 -223
  60. msprobe/mindspore/api_accuracy_checker/main.py +8 -15
  61. msprobe/mindspore/api_accuracy_checker/type_mapping.py +113 -113
  62. msprobe/mindspore/api_accuracy_checker/utils.py +79 -62
  63. msprobe/mindspore/cell_processor.py +34 -34
  64. msprobe/mindspore/common/const.py +106 -87
  65. msprobe/mindspore/common/log.py +37 -37
  66. msprobe/mindspore/common/utils.py +81 -57
  67. msprobe/mindspore/compare/distributed_compare.py +75 -75
  68. msprobe/mindspore/compare/ms_compare.py +219 -117
  69. msprobe/mindspore/compare/ms_graph_compare.py +348 -317
  70. msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -399
  71. msprobe/mindspore/debugger/debugger_config.py +66 -74
  72. msprobe/mindspore/debugger/precision_debugger.py +126 -107
  73. msprobe/mindspore/dump/dump_tool_factory.py +35 -35
  74. msprobe/mindspore/dump/hook_cell/api_registry.py +118 -104
  75. msprobe/mindspore/dump/hook_cell/hook_cell.py +55 -53
  76. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +922 -925
  77. msprobe/mindspore/dump/hook_cell/wrap_api.py +113 -0
  78. msprobe/mindspore/dump/jit_dump.py +72 -56
  79. msprobe/mindspore/dump/kernel_graph_dump.py +59 -60
  80. msprobe/mindspore/dump/kernel_kbyk_dump.py +64 -65
  81. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -116
  82. msprobe/mindspore/free_benchmark/common/config.py +12 -12
  83. msprobe/mindspore/free_benchmark/common/handler_params.py +17 -17
  84. msprobe/mindspore/free_benchmark/common/utils.py +71 -71
  85. msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -842
  86. msprobe/mindspore/free_benchmark/decorator/dec_forward.py +43 -42
  87. msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -107
  88. msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -90
  89. msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -41
  90. msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -36
  91. msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -21
  92. msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -67
  93. msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -21
  94. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -63
  95. msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +51 -0
  96. msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +35 -34
  97. msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -12
  98. msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +29 -27
  99. msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -33
  100. msprobe/mindspore/grad_probe/global_context.py +90 -91
  101. msprobe/mindspore/grad_probe/grad_analyzer.py +231 -231
  102. msprobe/mindspore/grad_probe/grad_monitor.py +27 -27
  103. msprobe/mindspore/grad_probe/grad_stat_csv.py +131 -131
  104. msprobe/mindspore/grad_probe/hook.py +94 -92
  105. msprobe/mindspore/grad_probe/utils.py +29 -28
  106. msprobe/mindspore/ms_config.py +128 -126
  107. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +44 -45
  108. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +34 -34
  109. msprobe/mindspore/runtime.py +4 -4
  110. msprobe/mindspore/service.py +378 -354
  111. msprobe/mindspore/task_handler_factory.py +24 -24
  112. msprobe/msprobe.py +105 -107
  113. msprobe/pytorch/__init__.py +3 -3
  114. msprobe/pytorch/api_accuracy_checker/common/config.py +53 -55
  115. msprobe/pytorch/api_accuracy_checker/common/utils.py +214 -165
  116. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +213 -213
  117. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +606 -581
  118. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +132 -132
  119. msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -390
  120. msprobe/pytorch/api_accuracy_checker/compare/compare.py +386 -381
  121. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +73 -73
  122. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +245 -244
  123. msprobe/pytorch/api_accuracy_checker/config.yaml +10 -10
  124. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +335 -332
  125. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +200 -199
  126. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +133 -134
  127. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +592 -581
  128. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +70 -74
  129. msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +7 -4
  130. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +197 -202
  131. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +325 -324
  132. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -204
  133. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +219 -218
  134. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -10
  135. msprobe/pytorch/bench_functions/__init__.py +15 -15
  136. msprobe/pytorch/bench_functions/apply_adam_w.py +28 -28
  137. msprobe/pytorch/bench_functions/confusion_transpose.py +19 -19
  138. msprobe/pytorch/bench_functions/fast_gelu.py +55 -55
  139. msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -6
  140. msprobe/pytorch/bench_functions/linear.py +12 -12
  141. msprobe/pytorch/bench_functions/matmul_backward.py +48 -48
  142. msprobe/pytorch/bench_functions/npu_fusion_attention.py +509 -421
  143. msprobe/pytorch/bench_functions/rms_norm.py +15 -15
  144. msprobe/pytorch/bench_functions/rotary_mul.py +52 -52
  145. msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -26
  146. msprobe/pytorch/bench_functions/swiglu.py +55 -55
  147. msprobe/pytorch/common/__init__.py +2 -2
  148. msprobe/pytorch/common/compare_script.template +14 -14
  149. msprobe/pytorch/common/log.py +20 -31
  150. msprobe/pytorch/common/parse_json.py +39 -39
  151. msprobe/pytorch/common/utils.py +305 -300
  152. msprobe/pytorch/compare/distributed_compare.py +66 -66
  153. msprobe/pytorch/compare/mapping.yaml +607 -607
  154. msprobe/pytorch/compare/match.py +34 -33
  155. msprobe/pytorch/compare/pt_compare.py +50 -40
  156. msprobe/pytorch/debugger/debugger_config.py +95 -95
  157. msprobe/pytorch/debugger/precision_debugger.py +125 -125
  158. msprobe/pytorch/free_benchmark/__init__.py +8 -8
  159. msprobe/pytorch/free_benchmark/common/constant.py +70 -70
  160. msprobe/pytorch/free_benchmark/common/counter.py +71 -71
  161. msprobe/pytorch/free_benchmark/common/enums.py +37 -37
  162. msprobe/pytorch/free_benchmark/common/params.py +129 -129
  163. msprobe/pytorch/free_benchmark/common/utils.py +102 -102
  164. msprobe/pytorch/free_benchmark/compare/grad_saver.py +179 -179
  165. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -104
  166. msprobe/pytorch/free_benchmark/main.py +105 -105
  167. msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -13
  168. msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -41
  169. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -90
  170. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -104
  171. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -63
  172. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -68
  173. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -28
  174. msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -45
  175. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -19
  176. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +217 -217
  177. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -39
  178. msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +23 -23
  179. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +30 -30
  180. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -170
  181. msprobe/pytorch/function_factory.py +76 -75
  182. msprobe/pytorch/functional/dump_module.py +39 -39
  183. msprobe/pytorch/grad_probe/grad_monitor.py +91 -90
  184. msprobe/pytorch/grad_probe/grad_stat_csv.py +128 -128
  185. msprobe/pytorch/hook_module/api_registry.py +161 -161
  186. msprobe/pytorch/hook_module/hook_module.py +120 -120
  187. msprobe/pytorch/hook_module/support_wrap_ops.yaml +1879 -1877
  188. msprobe/pytorch/hook_module/utils.py +30 -29
  189. msprobe/pytorch/hook_module/wrap_aten.py +110 -110
  190. msprobe/pytorch/hook_module/wrap_distributed.py +78 -78
  191. msprobe/pytorch/hook_module/wrap_functional.py +105 -105
  192. msprobe/pytorch/hook_module/wrap_npu_custom.py +93 -84
  193. msprobe/pytorch/hook_module/wrap_tensor.py +71 -71
  194. msprobe/pytorch/hook_module/wrap_torch.py +86 -86
  195. msprobe/pytorch/hook_module/wrap_vf.py +62 -62
  196. msprobe/pytorch/module_processer.py +138 -138
  197. msprobe/pytorch/online_dispatch/__init__.py +20 -20
  198. msprobe/pytorch/online_dispatch/compare.py +236 -236
  199. msprobe/pytorch/online_dispatch/dispatch.py +271 -271
  200. msprobe/pytorch/online_dispatch/dump_compare.py +155 -156
  201. msprobe/pytorch/online_dispatch/single_compare.py +391 -391
  202. msprobe/pytorch/online_dispatch/torch_ops_config.yaml +49 -49
  203. msprobe/pytorch/online_dispatch/utils.py +130 -146
  204. msprobe/pytorch/parse.py +4 -4
  205. msprobe/pytorch/parse_tool/cli.py +32 -32
  206. msprobe/pytorch/parse_tool/lib/compare.py +260 -271
  207. msprobe/pytorch/parse_tool/lib/config.py +52 -52
  208. msprobe/pytorch/parse_tool/lib/file_desc.py +31 -31
  209. msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -102
  210. msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -54
  211. msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -158
  212. msprobe/pytorch/parse_tool/lib/utils.py +316 -321
  213. msprobe/pytorch/parse_tool/lib/visualization.py +85 -91
  214. msprobe/pytorch/pt_config.py +188 -187
  215. msprobe/pytorch/service.py +246 -252
  216. mindstudio_probe-1.0.3.dist-info/RECORD +0 -272
  217. msprobe/config/README.md +0 -539
  218. msprobe/mindspore/doc/compare.md +0 -58
  219. msprobe/mindspore/doc/dump.md +0 -217
  220. msprobe/mindspore/dump/hook_cell/wrap_functional.py +0 -91
  221. msprobe/mindspore/dump/hook_cell/wrap_tensor.py +0 -63
  222. msprobe/pytorch/doc/FAQ.md +0 -193
  223. msprobe/pytorch/doc/api_accuracy_checker.md +0 -313
  224. msprobe/pytorch/doc/api_accuracy_checker_online.md +0 -187
  225. msprobe/pytorch/doc/dump.md +0 -260
  226. msprobe/pytorch/doc/msprobe/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 +0 -182
  227. msprobe/pytorch/doc/ptdbg_ascend_compare.md +0 -240
  228. msprobe/pytorch/doc/ptdbg_ascend_overview.md +0 -68
  229. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +0 -381
  230. msprobe/pytorch/doc/run_overflow_check.md +0 -25
  231. 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 +0 -90
  232. msprobe/pytorch/doc//321/206/320/247/320/260/321/206/320/260/320/227/321/206/320/255/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/205/320/254/342/225/221/321/206/320/251/320/277/321/211/320/272/320/234/321/210/320/277/320/221/321/205/320/242/320/234/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 +0 -151
  233. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/top_level.txt +0 -0
  234. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_1.png +0 -0
  235. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_2.png +0 -0
  236. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_3.png +0 -0
  237. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_4.png +0 -0
  238. /msprobe/{pytorch/doc → docs}/img/GPT-3_1.png +0 -0
  239. /msprobe/{pytorch/doc → docs}/img/GPT-3_2.png +0 -0
  240. /msprobe/{pytorch/doc → docs}/img/GPT-3_3.png +0 -0
  241. /msprobe/{pytorch/doc → docs}/img/GPT-3_4.png +0 -0
  242. /msprobe/{pytorch/doc → docs}/img/GPT-3_5.png +0 -0
  243. /msprobe/{pytorch/doc → docs}/img/GPT-3_6.png +0 -0
  244. /msprobe/{pytorch/doc → docs}/img/GPT-3_7.png +0 -0
  245. /msprobe/{pytorch/doc → docs}/img/GPT-3_8.png +0 -0
  246. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_1.png +0 -0
  247. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_2.png +0 -0
  248. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_details.png +0 -0
  249. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_result.png +0 -0
  250. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_details.png +0 -0
  251. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_result.png +0 -0
  252. /msprobe/{pytorch/doc → docs}/img/auto_analyze_log.png +0 -0
  253. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl.png +0 -0
  254. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl_md5.png.png +0 -0
  255. /msprobe/{pytorch/doc → docs}/img/cpu_info.png +0 -0
  256. /msprobe/{config → docs}/img/free_benchmark.png +0 -0
  257. /msprobe/{doc/grad_probe/img/image-1.png → docs/img/grad_probe_image-1.png} +0 -0
  258. /msprobe/{doc/grad_probe/img/image-2.png → docs/img/grad_probe_image-2.png} +0 -0
  259. /msprobe/{doc/grad_probe/img/image-3.png → docs/img/grad_probe_image-3.png} +0 -0
  260. /msprobe/{doc/grad_probe/img/image-4.png → docs/img/grad_probe_image-4.png} +0 -0
  261. /msprobe/{doc/grad_probe/img/image.png → docs/img/grad_probe_image.png} +0 -0
  262. /msprobe/{pytorch/doc → docs}/img/module_compare.png +0 -0
@@ -0,0 +1,274 @@
1
+ # PyTorch 场景的离线精度预检
2
+
3
+ ## 1 简介
4
+
5
+ **PyTorch 离线精度预检**<sup>a</sup>通过扫描昇腾 NPU 上用户训练模型中的所有 API,输出模型精度的诊断和分析结果。具体而言,该工具通过采集模型中所有 API 的前反向信息,构造相应的单元测试,将 NPU 输出与标杆(CPU 高精度)比对,从而计算对应的精度指标,该过程已封装为 run_ut.py 函数;将 NPU 环境下采集的预检数据拷贝至 GPU 环境,同样执行 run_ut.py;最后通过**新精度标准比对法**<sup>b</sup>将 NPU 和 GPU 的预检结果进行比对,从而找出 NPU 中存在精度问题的 API。同时,本工具支持随机生成模式和真实数据模式<sup>c</sup>。
6
+
7
+ a. 支持 PyTorch 版本:1.11/2.0/2.1/2.2;
8
+ b. 依据新精度标准,对不同的API采取不同的比对算法(包括绝对阈值法,标杆比对法、二进制一致法、ULP误差比对法和双千指标法),最终给定预检判定结果;
9
+ c. 在预检 dump 时可以选择由工具构造随机数获得 dump 数据或选择真实输入的数据进行预检 dump 操作。随机生成模式执行效率高,可以快速获得结果,但数据精度低,只能大致判断精度问题;真实数据模式执行效率略低于随机生成模式,但是数据精度高,可以准确判断精度问题。
10
+
11
+ ## 2 离线预检流程
12
+
13
+ 1. 在 NPU 和 GPU 环境下分别安装 msprobe。详见[ msprobe 安装](./01.installation.md)章节。
14
+ 2. 在 NPU 训练脚本内添加 msprobe 工具 dump 接口 PrecisionDebugger,采集待预检数据。注意需要配置 level="L1"。
15
+ 3. 将 NPU 环境下 dump 的预检数据拷贝至 GPU 环境。
16
+ 4. 在 NPU 和 GPU 环境下分别执行 run_ut.py,生成的结果最终用于 api_precision_compare.py 函数的输入。详见 [3 离线预检操作指导](#3-离线预检操作指导)。
17
+ 5. 将 NPU 和 GPU 执行 run_ut.py 生成的 `accuracy_checking_details_{timestamp}.csv` 结果文件拷贝至同一环境下。
18
+ 6. 运行 api_precision_compare.py,输出结果为预检操作的最终结果。详见 [5 预检结果比对](#5-预检结果比对)章节。
19
+
20
+ ## 3 离线预检操作指导
21
+
22
+ 完成预检数据采集后,仅仅获取了 API 的输入数据,为了得到 NPU vs. CPU 高精度(标杆)的预检比对结果和 GPU vs. CPU 高精度(标杆)的预检比对结果,还需要进行 run_ut 操作。
23
+
24
+ run_ut 预检操作包括以下两种方式:
25
+
26
+ - 使用 run_ut.py 执行预检:适用于数据量较小的单卡场景。
27
+ - 使用 multi_run_ut.py 执行多线程预检:适用于数据量较大的大模型场景。
28
+
29
+ ### 3.1 使用 run_ut.py 执行预检
30
+
31
+ 将 API 信息输入到 run_ut 模块进行精度检测并比对,运行如下命令:
32
+
33
+ ```bash
34
+ msprobe -f pytorch run_ut -api_info ./dump.json
35
+ ```
36
+
37
+ | 参数名称 | 解释 | 是否必选 |
38
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
39
+ | -api_info 或 --api_info_file | 指定 API 信息文件 dump.json。 | 是 |
40
+ | -save_error_data | 保存精度未达标的 API 输入输出数据。 | 否 |
41
+ | -o 或 --out_path | 指定 run_ut 执行结果存盘路径,默认“./”(相对于 run_ut 的路径)。 | 否 |
42
+ | | | |
43
+ | -j 或 --jit_compile | 开启 jit 编译。 | 否 |
44
+ | -d 或 --device | 指定 Device ID,选择 UT 代码运行所在的卡,默认值为 0。 | 否 |
45
+ | -csv_path 或 --result_csv_path | 指定本次运行中断时生成的 `accuracy_checking_result_{timestamp}.csv` 文件路径,执行 run_ut 中断时,若想从中断处继续执行,配置此参数即可。需要指定为上次中断的 `accuracy_checking_result_{timestamp}.csv` 文件。详见 [3.3 断点续检](#33-断点续检)。 | run_ut 操作中断后继续执行场景下必须配置 |
46
+ | -f 或 --filter_api | 过滤模型中除最大值和最小值以外其他参数和结构相同的 API。适用于模型较大且重复 API 较多的场景。 | 否 |
47
+ | -config 或 --config_path | 指定离线预检操作过程中额外配置(包括黑名单、白名单等)的 [config.json](../config.json) 文件,默认未配置。config.json 文件的配置可参考[配置文件介绍](./02.config_introduction.md)。 | 否 |
48
+
49
+ 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 预检结果](#4-预检结果)。
50
+
51
+ 如果需要保存比对不达标的输入和输出数据,可以在 run_ut 执行命令结尾添加 `-save_error_data`,例如:
52
+
53
+ ```bash
54
+ msprobe -f pytorch run_ut -api_info ./dump.json -save_error_data
55
+ ```
56
+
57
+ 数据默认会存盘到 './ut_error_data{timestamp}' 路径下(相对于启动 run_ut 的路径),如有需要,用户可以通过 error_data_path 参数来配置保存路径,error_data_path 参数在 [config.json](../config.json) 文件或 [config.yaml](../pytorch/api_accuracy_checker/config.yaml) 文件配置,config.json 文件需要在 run_ut 操作时通过 -config 参数指定,config.yaml 。
58
+
59
+ #### 3.1.1 config.yaml 文件说明
60
+
61
+ config.yaml 文件可以通过配置参数来控制 dump 和 run_ut 操作的白名单、黑名单等功能。操作步骤如下:
62
+
63
+ - config.yaml 文件通常位于类似 /home/xxx/miniconda3/envs/xxx/lib/python3.8/site-packages/msprobe/pytorch/api_accuracy_checker/config.yaml 的路径中。
64
+
65
+ - 进入 config.yaml 文件
66
+
67
+ ```bash
68
+ vim /home/xxx/miniconda3/envs/xxx/lib/python3.8/site-packages/msprobe/pytorch/api_accuracy_checker/config.yaml
69
+ ```
70
+
71
+ - 修改 config.yaml 文件参数。
72
+
73
+ ```yaml
74
+ white_list: []
75
+ black_list: []
76
+ error_data_path: './'
77
+ precision: 14
78
+ ```
79
+
80
+ | 参数名称 | 解释 | 是否必选 |
81
+ | ----------- | -----------| -------- |
82
+ | white_list | API dump 白名单,仅对指定的 API 进行 dump。</br>**配置示例**:white_list=["conv1d", "conv2d"]。默认未配置白名单,即 dump 全量 API 数据。 | 否 |
83
+ | black_list | API dump 黑名单,被指定的 API 不进行 dump。</br>**配置示例**:black_list=["conv1d", "conv2d"]。默认未配置黑名单,即 dump 全量 API 数据。 | 否 |
84
+ | error_data_path | 配置保存精度未达标的 API 输入输出数据路径。</br>**配置示例**:"error_data_path": "./"。默认为当前路径。 | 否 |
85
+ | precision | 浮点数表示位数,默认取小数点后14位。 | 否 |
86
+
87
+ 说明:white_list 和 black_list 同时配置时,二者配置的 API 名单若无交集,则白名单生效,若 API 名单存在交集,则白名单排除的部分以及交集的 API 不进行 dump。
88
+
89
+ #### 3.1.2 API 预检黑名单和白名单
90
+
91
+ run_ut 过程支持 API 预检黑名单和白名单,通过如下文件配置 black_list(黑名单)或white_list(白名单)参数来指定不需要或需要预检的API名称:
92
+
93
+ - 配置 [config.json](../config.json) 文件,该文件需要在 run_ut 操作时通过 -config 参数指定。
94
+
95
+ - config.json 文件的优先级高于 config.yaml 文件,即执行 config.json 文件时,config.yaml 文件的配置不生效。
96
+
97
+ ### 3.2 使用 multi_run_ut.py 执行多线程预检
98
+
99
+ multi_run_ut.py 脚本,可以并行执行多个 run_ut 操作,从而减少预检耗时。示例如下:
100
+
101
+ ```bash
102
+ msprobe -f pytorch multi_run_ut -api_info ./dump.json -n 32 -d 0 1 2 3
103
+ ```
104
+
105
+ | 参数名称 | 解释 | 是否必选 |
106
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
107
+ | -api_info 或 --api_info_file | 指定 API 信息文件 dump.json。 | 是 |
108
+ | -save_error_data | 保存精度未达标的 API 输入输出数据。 | 否 |
109
+ | -o 或 --out_path | 指定 run_ut 执行结果存盘路径,默认“./”(相对于 run_ut 的路径)。 | 否 |
110
+ | -j 或 --jit_compile | 开启 jit 编译。 | 否 |
111
+ | -n | 同时执行 run_ut 线程的数量,默认为 8,最大支持 64,但每个 Device 最大支持 8 个线程。当指定多个线程和多个 Device 时,线程数在每张卡上均分。 | 否 |
112
+ | -d 或 --device | 指定 Device ID,选择 UT 代码运行所在的卡,默认值为 0,支持同时指定 0~7,共 8 个 Device。 | 否 |
113
+ | -csv_path 或 --result_csv_path | 指定本次运行中断时生成的 `accuracy_checking_result_{timestamp}.csv` 文件路径,执行 run_ut 中断时,若想从中断处继续执行,配置此参数即可。需要指定为上次中断的 `accuracy_checking_result_{timestamp}.csv` 文件。详见 [3.3 断点续检](#33-断点续检)。 | run_ut 操作中断后继续执行场景下必须配置 |
114
+ | -f 或 --filter_api | 过滤模型中除最大值和最小值以外其他参数和结构相同的 API。适用于模型较大且重复 API 较多的场景。 | 否 |
115
+
116
+ ### 3.3 断点续检
117
+
118
+ 断点续检操作通过如下命令执行:
119
+
120
+ ```bash
121
+ msprobe -f pytorch run_ut -api_info ./dump.json -csv_path /home/xxx/ut/accuracy_checking_result_{timestamp}.csv
122
+ ```
123
+
124
+ 精度预检 run_ut 过程中,若因环境、数据量过大等原因导致预检进程中断,那么当用户解决这些问题后,重新执行 run_ut 操作,可以通过断点续检操作继续前面未完成的预检,会在 -csv_path 指定的 `accuracy_checking_result_{timestamp}.csv` 文件以及对应的 `accuracy_checking_details_{timestamp}.csv` 文件中继续写入后续的结果,不会重新创建结果文件。
125
+
126
+ 须指定为上次预检中断的 `accuracy_checking_result_{timestamp}.csv` 文件。请勿修改 `accuracy_checking_result_{timestamp}.csv` 和 `accuracy_checking_details_{timestamp}.csv` 文件名,包括时间戳,否则断点续检会因无法识别到文件名而失败。
127
+
128
+ ## 4 预检结果
129
+
130
+ 精度预检生成的 `accuracy_checking_result_{timestamp}.csv` 和 `accuracy_checking_details_{timestamp}.csv` 文件示例如下:
131
+
132
+ 可以通过先查看 `accuracy_checking_result_{timestamp}.csv` 文件的 Forward Test Success 和 Backward Test Success,判断是否存在未通过测试的 API,再查看 `accuracy_checking_details_{timestamp}.csv` 文件的 API 详细达标情况,详细介绍请参见 [4.1 API 预检指标](#41-api-预检指标)。
133
+
134
+ `accuracy_checking_result_{timestamp}.csv`
135
+
136
+ ![accuracy_checking_result](img/accuracy_checking_result.png)
137
+
138
+ | 字段 | 含义 |
139
+ | --------------------- | ------------------------- |
140
+ | API name | API 名称。 |
141
+ | Forward Test Success | 前向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。SKIP 表示跳过该 API 的计算,跳过原因在 Message 中说明。 |
142
+ | Backward Test Success | 反向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。如果是空白的话代表该 API 没有反向输出,SKIP 表示该 API 的某个参数的反向不计算梯度。 |
143
+ | Message | 提示信息。 |
144
+
145
+ 该结果为中间结果,仅作为参考,建议完成 [5 预检结果比对](#5-预检结果比对)后查看比对结果。该结果后续将会删除。
146
+
147
+ Forward Test Success 和 Backward Test Success 是否通过测试是由 `accuracy_checking_details_{timestamp}.csv` 中的余弦相似度、最大绝对误差、双百双千双万指标判定结果决定的。
148
+
149
+ 需要注意的是 `accuracy_checking_details_{timestamp}.csv` 中可能存在一个 API 的前向(反向)有多个输出,那么每个输出记录一行,而在 `accuracy_checking_result_{timestamp}.csv` 中的结果需要该 API 的所有结果均为 pass 才能标记为 pass,只要存在一个 error 则标记 error,仅存在 waring 和 pass 且不存在 error 则标记 waring。
150
+
151
+ `accuracy_checking_details_{timestamp}.csv`
152
+
153
+ ![accuracy_checking_details](img/accuracy_checking_details.png)
154
+
155
+ | 字段 | 含义 |
156
+ | ------------------- | ------------------------------------------------------------ |
157
+ | API name | NPU 或 GPU下的 API 名称。 |
158
+ | Bench Dtype | 标杆数据的 API 数据类型。 |
159
+ | DEVICE Dtype | NPU 或 GPU 数据的 API 数据类型。 |
160
+ | Shape | API 的 Shape信息。 |
161
+ | 余弦相似度 | NPU 或 GPU 数据与标杆数据的余弦相似度。 |
162
+ | 最大绝对误差 | NPU 或 GPU 数据与标杆数据的最大绝对误差。 |
163
+ | 双百指标 | 双百精度指标。是指 NPU 或 GPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于百分之一的个数占总元素个数的比例。测试通过标准为相对误差大于百分之一的个数占总元素个数的比例小于百分之一。 |
164
+ | 双千指标 | 双千精度指标。是指 NPU 或 GPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。 |
165
+ | 双万指标 | 双万精度指标。是指 NPU 或 GPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于万分之一的个数占总元素个数的比例。测试通过标准为相对误差大于万分之一的个数占总元素个数的比例小于万分之一。 |
166
+ | 二进制一致错误率 | NPU 或 GPU 数据中每个 Tensor 精度不一致的数值的数量与 Tensor 中数值数量的比值。只有数据是 builtin 类型(bool、int、float、str)、torch.bool 和 torch 的 int 类型或者在新精度标准中使用二进制一致算法进行比对的 API 才会展示。 |
167
+ | 误差均衡性 | NPU 或 GPU 数据与标杆数据精度差的上下浮动情况。 |
168
+ | 均方根误差 | NPU 或 GPU 数据与标杆数据的均方根误差。 |
169
+ | 小值域错误占比 | NPU 或 GPU Tensor 中与标杆的绝对误差大于错误阈值的小值在小值域(小值的总数量)中的占比。判断为小值以及绝对误差的错误阈值参见 [4.2 小值域阈值](#42-小值域阈值)。 |
170
+ | 相对误差最大值 | NPU 或 GPU 数据与标杆数据相对误差的最大值。 |
171
+ | 相对误差平均值 | NPU 或 GPU 数据与标杆数据相对误差的平均值。 |
172
+ | inf/nan 错误率 | NPU 与标杆 inf/nan 计算不一致的元素个数占总元素的个数比例。 |
173
+ | 相对误差错误率 | NPU 与标杆的正常值计算相对误差,其大于错误阈值的元素个数占正常值元素个数的比例。 |
174
+ | 绝对误差错误率 | NPU 与标杆的小值计算绝对误差,其大于错误阈值的元素个数占小值元素个数的比例。 |
175
+ | ULP 误差最大值 | NPU 或 GPU 数据与标杆数据 ULP 误差的最大值(取绝对值后)。 |
176
+ | ULP 误差平均值 | NPU 或 GPU 数据与标杆数据ULP误差的平均值(取绝对值后)。 |
177
+ | ULP 误差大于阈值占比 | NPU 或 GPU 数据与标杆数据的 ULP 误差(取绝对值后)大于阈值(当 NPU 或 GPU 数据类型为 float16 或 bfloat16 时,阈值为 1;当 NPU 或 GPU 数据类型为 float32 时,阈值为 32)的元素个数占总元素的个数比例。 |
178
+ | Status | API 预检通过状态,pass 表示通过测试,error 表示未通过,warning 表示测试未通过双千或双万精度指标,SKIP 表示该 API 的某个参数的反向不要计算梯度,所以没有任何计算过程,其他信息均为空。 |
179
+ | message | 提示信息。 |
180
+
181
+ **\***:
182
+
183
+ ### 4.1 API 预检指标
184
+
185
+ API 预检指标是通过对 `accuracy_checking_details_{timestamp}.csv` 中的余弦相似度、最大绝对误差双百、双千、双万精度指标的数值进行判断,得出该 API 是否符合精度标准的参考指标。
186
+
187
+ API预检通过测试,则在`accuracy_checking_details_{timestamp}.csv`文件中的 Status 列标记 pass,否则标记 error 或 warning,详细规则如下:
188
+
189
+ - 余弦相似度 > 0.99:≤ 0.99 为不达标,标记 error,> 0.99 达标,进行下一步;
190
+ - 最大绝对误差 < 0.001:< 0.001 达标,标记 pass,≥ 0.001 为不达标,进行下一步;
191
+ - 双百、双千、双万精度指标:
192
+ + 对于 float16 和 bfloat16 数据:双百指标不通过,标记 error;双百指标通过,双千指标不通过,标记 warning;双百、双千指标均通过,标记 pass。
193
+ + 对于 float32 和 float64 数据:双千指标不通过,标记 error;双千指标通过,双万指标不通过,标记 warning;双千、双万指标均通过,标记 pass。
194
+ - 在 `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。
195
+
196
+ ### 4.2 小值域阈值
197
+
198
+ 判定为小值的阈值:
199
+
200
+ - torch.float32:e-6
201
+ - torch.float16:e-3
202
+ - torch.bfloat16:e-3
203
+
204
+ 小值域的绝对误差阈值:
205
+
206
+ - torch.float32:e-9
207
+ - torch.float16:e-5
208
+ - torch.bfloat16:e-5
209
+
210
+ ## 5 预检结果比对
211
+
212
+ 需要同时获取 NPU 和 GPU 环境下 run_ut 操作的预检结果 `accuracy_checking_details_{timestamp}.csv` 文件。执行如下命令进行 NPU 和 GPU 预检结果的比对:
213
+
214
+ ```bash
215
+ 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/
216
+ ```
217
+
218
+ | 参数名称 | 说明 | 是否必选 |
219
+ | -------------------- | ------------- | -------- |
220
+ | -npu 或 --npu_csv_path | NPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 | 否 |
221
+ | -gpu 或 --gpu_csv_path | GPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 | 否 |
222
+ | -o 或 --out_path | 指定 api_precision_compare.py 执行结果存盘路径,默认为当前目录。 | 否 |
223
+
224
+ 执行完成后输出 `api_precision_compare_result_{timestamp}.csv` 和 `api_precision_compare_details_{timestamp}.csv` 文件。文件示例如下:
225
+
226
+ 可以通过先查看 `api_precision_compare_result_{timestamp}.csv` 文件的 Forward Test Success 和 Backward Test Success,判断是否存在未通过测试的 API,再查看 `api_precision_compare_details_{timestamp}.csv` 文件的 API 详细达标情况。
227
+
228
+ `api_precision_compare_result_{timestamp}.csv`
229
+
230
+ ![api_precision_compare_result](img/api_precision_compare_result.png)
231
+
232
+ | 字段 | 含义 |
233
+ | --------------------- | ------------------------------------------------------------ |
234
+ | API name | API 名称。 |
235
+ | Forward Test Success | 前向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误,SKIP 表示该 API 的数据类型不支持使用新精度标准进行比对,如 float64。 |
236
+ | Backward Test Success | 反向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误,如果是空白的话代表该 API 没有反向输出,SKIP 表示该 API 的数据类型不支持使用新精度标准进行比对,如 float64。 |
237
+ | Message | 提示信息。 |
238
+
239
+ 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。
240
+
241
+ `api_precision_compare_details_{timestamp}.csv`
242
+
243
+ ![api_precision_compare_details](img/api_precision_compare_details.png)
244
+
245
+ | 字段 | 含义 |
246
+ | ------------------------ | ------------------------------------------------------------ |
247
+ | API name | NPU 或 GPU 下的 API 名称。 |
248
+ | 小值域错误比值 | NPU 与 CPU 的小值域的错误比率 / GPU 与 CPU 的小值域的错误比率。标杆比对法指标。 |
249
+ | 小值域错误判定结果 | 小值域错误比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 waring,大于 2 标记为 error。 |
250
+ | 均方根误差比值 | NPU 与 CPU 的均方根误差 / GPU 与 CPU 的均方根误差。标杆比对法指标。 |
251
+ | 均方根误差判定结果 | 均方根误差比值小于等于 1 标记为 pass,1~2 之间标记为 waring,大于 2 标记为 error。 |
252
+ | 相对误差最大值比值 | NPU 与 CPU 的相对误差最大值 / GPU 与 CPU 的相对误差最大值。标杆比对法指标。 |
253
+ | 相对误差最大值判定结果 | 相对误差最大值比值小于等于 1 标记为 pass,1 ~ 10 之间标记为 waring,大于 10 标记为 error。 |
254
+ | 相对误差平均值比值 | NPU 与 CPU 的相对误差的平均值 / GPU 与 CPU 的相对误差的平均值。标杆比对法指标。 |
255
+ | 相对误差平均值判定结果 | 相对误差平均值比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 waring,大于 2 标记为 error。 |
256
+ | 误差均衡性比值 | NPU 与 CPU 的误差均衡性 / GPU 与 CPU 的误差均衡性。标杆比对法指标。 |
257
+ | 误差均衡性判定结果 | 误差均衡性比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 waring,大于 2 标记为 error。该字段暂不参与 api_precision_compare_result 的结果判定。 |
258
+ | inf / nan 错误率 | NPU 与标杆 inf / nan 计算不一致的元素个数占总元素的个数比例。绝对阈值法指标。 |
259
+ | inf / nan 判定结果 | inf / nan 错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
260
+ | 相对误差错误率 | NPU 与标杆的正常值计算相对误差,其大于错误阈值的元素个数占正常值元素个数的比例。绝对阈值法指标。 |
261
+ | 相对误差判定结果 | 相对误差错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
262
+ | 绝对误差错误率 | NPU 与标杆的小值计算绝对误差,其大于错误阈值的元素个数占小值元素个数的比例。绝对阈值法指标。 |
263
+ | 绝对误差判定结果 | 绝对误差错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
264
+ | 二进制一致错误率 | NPU 或 GPU 数据中每个 Tensor 精度不一致的数值的数量与 Tensor 中数值数量的比值。只有数据是 builtin 类型(bool、int、float、str)、torch.bool 和 torch 的 int 类型或者在新精度标准中使用二进制一致算法进行比对的 API 才会展示。二进制一致法指标。 |
265
+ | 二进制一致错误率判定结果 | 二进制一致错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
266
+ | ULP 误差平均值 | NPU 数据与标杆数据 ULP 误差的平均值(取绝对值后)。ULP 误差比对法指标。 |
267
+ | ULP 误差大于阈值占比 | NPU 数据与标杆数据的 ULP 误差(取绝对值后)大于阈值(当 NPU 数据类型为 float16 或 bfloat16 时,阈值为 1;当 NPU 数据类型为 float32 时,阈值为 32)的元素个数占总元素的个数比例。ULP 误差比对法指标。 |
268
+ | ULP 误差大于阈值占比比值 | NPU 与 CPU 的 ULP 误差大于阈值占比 / GPU 与 CPU 的 ULP 误差大于阈值占比。ULP 误差比对法指标。 |
269
+ | 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 误差大于阈值占比。 |
270
+ | 双千指标 | 双千精度指标。是指 NPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。仅 conv1d 和 conv2d 使用该指标。双千指标法指标。 |
271
+ | 双千指标判定结果 | 双千指标判定结果。双千指标大于 0.999 标记为 pass,否则标记为 error。 |
272
+ | 比对结果 | 综合所有指标的最终结果。如果比对指标中有 error,则标记为 error;有 warning,则标记为 warning;否则标记为 pass;SKIP 表示该 API 的数据类型不支持使用新精度标准进行比对,如 float64。 |
273
+ | 比对算法 | API 使用的比对算法,为标杆比对法、二进制一致法、绝对阈值法和 ULP 误差比对法中的一种。 |
274
+ | Message | 提示信息。当前提示该 API 比对结果为 error 或 warning 时对应不符合标准的指标。 |
@@ -0,0 +1,198 @@
1
+ # PyTorch 场景的在线精度预检
2
+
3
+ ## 1 简介
4
+
5
+ 为了应对大模型场景下,通过离线预检方式 dump API 输入输出数据导致的存储资源紧张问题,提供在线精度预检功能。本功能实现在执行 NPU 训练操作的过程中,通过 TCP/IP 协议在 NPU
6
+ Host 与 GPU Host 设备间建立连接,将 NPU 上对应 API 的输入数据在 GPU 设备上运行,将两份输出数据进行比对,得到预检比对结果,从而减少数据 dump 的步骤,降低存储资源的占用。针对偏差较大的算子,两方比对(NPU vs. GPU)的方法缺少裁判进行裁定。 参考离线预检,在线预检场景同时支持两方比对和三方比对方式,按照 api 的精度标准要求,选择比对两方比对和三方比对。
7
+
8
+ ## 2 在线精度预检流程
9
+
10
+ 在线精度预检当前支持**局域网场景**和**共享存储场景**,请根据不同的场景选择对应的配置。
11
+
12
+ 在线精度预检操作流程如下:
13
+
14
+ 1. 准备 GPU 和 NPU 可正常运行的训练环境,PyTorch 版本大于等于2.0,并保证两台 Host 在同一局域网内可正常通信或能通过共享存储进行通信。
15
+ 2. GPU 和 NPU Host 设备上同时安装msprobe工具,详见[ msprobe 安装](./01.installation.md)章节,其中在线预检要安装 twisted、pyOpenSSL,这些包为 Python 模块。
16
+ 3. 分别配置 GPU 侧、NPU 侧的 config.json 文件。
17
+ 4. 在 GPU 侧运行 `msprobe -f pytorch run_ut -config ./config.json`。
18
+ 5. 在 NPU 侧配置训练脚本。
19
+ 6. 在 NPU 侧执行训练。
20
+
21
+ ## 3 在线精度预检操作指导
22
+
23
+ ### 3.1 配置 config.json 文件
24
+
25
+ 预检工具安装完成后,需要在 GPU 和 NPU 环境下分别配置 config.json。其中需要重点关注文件中的 is_online、is_benchmark_device、host 和 port 参数的配置,保障在线预检时 GPU 和 NPU 两台设备间的通信正常。
26
+
27
+ #### 3.1.1 GPU 侧在线预检配置说明
28
+
29
+ | 参数名称 | 说明 | 是否必选 |
30
+ |-----------------|--------------|------|
31
+ | task | 任务名称,str 类型,配置为 run_ut 表示预检任务。通过其他字段 is_online 判断离线预检、在线预检任务。 | 是 |
32
+ | white_list | 预检的 API 白名单,list[str] 类型。<br/>**配置示例**:white_list=["conv1d", "conv2d"]。默认未配置白名单,即预检全量 API 数据。 | 否 |
33
+ | black_list | 预检的 API 黑名单,list[str] 类型。<br/>**配置示例**:white_list=["conv1d", "conv2d"]。默认未配置黑名单,即预检全量 API 数据。 | 否 |
34
+ | error_data_path | 配置保存精度未达标的 API 输入输出数据路径,str 类型。在线预检模式下该参数不生效。 | 否 |
35
+ | is_online | 在线预检模式开关,bool 类型,可取值 True(开启)、False(关闭),默认关闭。 | 是 |
36
+ | nfs_path | 在线预检模式共享存储目录路径,str 类型,用于 GPU 设备和 NPU 设备间进行通信。配置该参数后 host、port 和 tls_path 不生效。 | 否 |
37
+ | host | 在线预检模式局域网场景信息接收端 IP,str 类型,用于 GPU 设备和 NPU 设备间进行通信,GPU 侧配置为本机地址 127.0.0.1 或本机局域网 IP。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
38
+ | port | 在线预检模式局域网场景信息接收端端口号,int 类型,用于 GPU 设备和 NPU 设备间进行通信,GPU 侧配置为本机可用端口。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
39
+ | rank_list | 指定在线预检的 Rank ID,默认值为 [0],list[int] 类型,应配置为大于等于 0 的整数,且须根据实际卡的 Rank ID 配置,若所配置的值大于实际训练所运行的卡的 Rank ID,则在线预检输出数据为空。GPU 和 NPU 须配置一致。 | 是 |
40
+ | tls_path | 在线预检模式局域网场景 SSL 证书路径,该路径下包含私钥文件 server.key 和公钥文件 server.crt,str 类型,默认值为空,表示明文传输 api 数据,否则采用 TLS1.2 加密传输,加密传输时安全性较高,传输速率较低。 | 否 |
41
+
42
+
43
+ #### 3.1.2 NPU 侧在线预检配置说明
44
+
45
+ | 参数名称 | 说明 | 是否必选 |
46
+ |------------------|-------------|------|
47
+ | task | 任务名称,str 类型,配置为 tensor 表示 dump API 统计信息和完全复刻整网的 API 运行情况的真实数据。通过字段 online_run_ut 判断是否使用在线预检功能。 | 是 |
48
+ | dump_path | dump 路径,str 类型,配置为合法路径即可,兼容 tensor 任务静态检查。 | 是 |
49
+ | level | dump 级别,str 类型,在线预检时配置为 L1,表示 dump API 级精度数据。在线预检可不配置,默认取值 L1。 | 是 |
50
+ | rank | 指定对某张卡上的数据进行 dump,list[int] 类型,默认未配置(表示 dump所有卡的数据),需要与 GPU 侧配置项 rank_list 保持一致。 | 否 |
51
+ | step | 指定 dump 某个 step 的数据,list[int] 类型,默认未配置,表示 dump 所有 step 的数据。dump 特定 step 时,须指定为训练脚本中存在的 step。 | 否 |
52
+ | seed | 随机种子数,int 类型,默认值为 1234。通过固定随机数保证模型的输入或输出一致。 | 否 |
53
+ | is_deterministic | 确定性计算模式,bool 类型,可取值 true(开启)或 false(关闭),默认关闭。 | 否 |
54
+ | scope | dump 范围,list[str] 类型,默认未配置(list 也未配置时表示 dump 所有 api 的数据),配置方式参考 [config.json 配置介绍](./02.config_introduction.md)。 | 否 |
55
+ | list | dump 范围,list[str] 类型,默认未配置(scope 也未配置时表示 dump 所有 api 的数据),配置方式参考 [config.json 配置介绍](./02.config_introduction.md)。 | 否 |
56
+ | online_run_ut | 在线预检模式开关,bool 类型,可取值 True(开启)、False(关闭),默认关闭。 | 是 |
57
+ | nfs_path | 在线预检模式共享存储目录路径,str 类型,用于 GPU 设备和 NPU 设备间进行通信。配置该参数后 host 和 port 不生效。 | 否 |
58
+ | host | 在线预检模式局域网场景信息接收端 IP,str 类型,用于 GPU 设备和 NPU 设备间进行通信,NPU 侧须配置为 GPU 侧的局域网 IP 地址。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
59
+ | port | 在线预检模式局域网场景信息接收端端口号,int 类型,用于 GPU 设备和 NPU 设备间进行通信,NPU 侧须配置为 GPU 侧的端口号。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
60
+
61
+ #### 3.1.3 局域网场景配置示例
62
+
63
+ 若采用TLS1.2协议加密传输api数据,需配置SSL证书,可参考如下生成自签名证书方法,仅供调试使用,生产环境请申请正式证书。
64
+ ```shell
65
+ # 创建私钥文件server.key
66
+ openssl genrsa -out server.key 2048
67
+
68
+ # 创建签名请求文件server.csr
69
+ openssl req -new -key server.key -out server.csr
70
+
71
+ # 自签名, 生成1年期公钥文件server.crt
72
+ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
73
+ ```
74
+
75
+ GPU 侧:
76
+
77
+ ```json
78
+ {
79
+ "task": "run_ut",
80
+ "run_ut": {
81
+ "white_list": [],
82
+ "black_list": [],
83
+ "error_data_path": "./",
84
+ "is_online": true,
85
+ "nfs_path": "",
86
+ "host": "127.0.0.1",
87
+ "port": 59208,
88
+ "rank_list": [0]
89
+ }
90
+ }
91
+ ```
92
+
93
+ NPU 侧:
94
+
95
+ ```json
96
+ {
97
+ "task": "tensor",
98
+ "dump_path": "./dump_path",
99
+ "rank": [0],
100
+ "step": [0],
101
+ "level": "L1",
102
+ "seed": 1234,
103
+ "is_deterministic": true,
104
+ "tensor": {
105
+ "scope": [],
106
+ "list": [],
107
+ "online_run_ut": true,
108
+ "nfs_path": "",
109
+ "host": "xx.xx.xx.x",
110
+ "port": 59208
111
+ }
112
+ }
113
+ ```
114
+
115
+ #### 3.1.4 共享存储场景配置示例
116
+
117
+ GPU 侧:
118
+
119
+ ```json
120
+ {
121
+ "task": "run_ut",
122
+ "run_ut": {
123
+ "white_list": [],
124
+ "black_list": [],
125
+ "error_data_path": "./",
126
+ "is_online": true,
127
+ "nfs_path": "/nfs/xxx/data",
128
+ "host": "",
129
+ "port": -1,
130
+ "rank_list": [0]
131
+ }
132
+ }
133
+ ```
134
+
135
+ NPU 侧:
136
+
137
+ ```json
138
+ {
139
+ "task": "tensor",
140
+ "dump_path": "./dump_path",
141
+ "rank": [0],
142
+ "step": [0],
143
+ "level": "L1",
144
+ "seed": 1234,
145
+ "is_deterministic": true,
146
+ "tensor": {
147
+ "scope": [],
148
+ "list": [],
149
+ "online_run_ut": true,
150
+ "nfs_path": "/nfs/xxx/data",
151
+ "host": "",
152
+ "port": -1
153
+ }
154
+ }
155
+ ```
156
+
157
+ ### 3.2 在 GPU 侧运行 run_ut
158
+
159
+ 由于 GPU 侧为通信接收端,需先于 NPU 侧执行 run_ut 操作,命令如下:
160
+
161
+ ```bash
162
+ msprobe -f pytorch run_ut -config ./config.json
163
+ ```
164
+
165
+ GPU 侧配置好 config.json 文件后执行 run_ut 命令,此时 GPU 处于预检等待状态:
166
+
167
+ - 局域网场景:当 NPU 侧启动训练后将预检的 API 输入和输出数据发送到 GPU 侧时,GPU 启动预检操作。
168
+ - 共享存储场景:当 NPU 侧启动训练后将预检的 API 输入和输出数据发送到共享存储时,GPU 启动预检操作。
169
+
170
+ ### 3.2 在 NPU 侧配置训练脚本
171
+
172
+ 在 NPU 训练脚本中添加如下代码以获取 run_ut 操作的预检 API 输入和输出数据:
173
+
174
+ ```python
175
+ from msprobe.pytorch import PrecisionDebugger
176
+
177
+ debugger = PrecisionDebugger("config.json")
178
+ ...
179
+
180
+ debugger.start()
181
+
182
+ ...
183
+
184
+ debugger.stop()
185
+ debugger.step()
186
+ ```
187
+
188
+ ### 3.3 在 NPU 侧执行训练脚本
189
+
190
+ 配置完 NPU 侧训练脚本后即可执行训练脚本,命令示例如下:
191
+
192
+ ```bash
193
+ bash train.sh
194
+ ```
195
+
196
+ 训练脚本执行完毕后,在GPU侧dump_path目录下生成比对结果文件,
197
+ `accuracy_checking_result_{timestamp}_rank{rank_id}.csv`和`accuracy_checking_details_{timestamp}_rank{rank_id}.csv`记录两方比对结果
198
+ `api_precision_compare_result_{timestamp}_rank{rank_id}.csv`和`api_precision_compare_details_{timestamp}_rank{rank_id}.csv`记录三方比对结果。详细介绍请参见[离线精度预检中的 **4 预检结果**](./07.accuracy_checker_PyTorch.md#4-预检结果)。
@@ -0,0 +1,68 @@
1
+ # MindSpore 动态图场景的离线精度预检
2
+
3
+ ## 1 简介
4
+
5
+ **MindSpore 动态图精度预检**<sup>a</sup>通过扫描昇腾 NPU 上用户训练 MindSpore 模型中的所有 Mint API,输出精度情况的诊断和分析。工具以模型中所有 Mint API 前反向的 dump 结果为输入,构造相应的 API 单元测试,将 NPU 输出与标杆(CPU 高精度)比对,计算对应的精度指标,从而找出 NPU 中存在精度问题的 Mint API。本工具支持随机生成模式和真实数据模式<sup>b</sup>。
6
+
7
+ a. 支持 Mindspore 版本:2.4;
8
+ b. 在预检 dump 时可以选择由工具构造随机数进行输入获得 dump 数据或选择获取真实输入数据进行预检 dump 操作。随机生成模式执行效率高,可以快速获得结果,但数据精度低,只能大致判断精度问题;真实数据模式执行效率略低于随机生成模式,但是数据精度高,可以准确判断精度问题。
9
+
10
+ ## 2 离线预检流程
11
+
12
+ 操作流程如下:
13
+
14
+ 1. 在 NPU 和 GPU 环境下分别安装 msprobe。详见[ msprobe 安装](./01.installation.md)章节。
15
+ 2. 在 NPU 训练脚本内添加 msprobe 工具 dump 接口 PrecisionDebugger,采集待预检数据。详见 [MindSpore 场景下的数据采集](./06.data_dump_MindSpore.md)章节,注意需要配置 level="L1"。
16
+ 3. 执行预检操作,查看预检结果文件,分析预检不达标的API。
17
+
18
+ ## 3 离线预检操作指导
19
+
20
+ 命令如下:
21
+ ```bash
22
+ msprobe -f mindspore run_ut -api_info ./dump.json -o ./checker_result
23
+ ```
24
+
25
+ | 参数名称 | 说明 |参数类型 | 是否必选 |
26
+ | ---------------------------- | --------------------------------------|---------------------- | ---------------------------------- |
27
+ | -api_info 或 --api_info_file | 指定 API 信息文件 dump.json。 | str | 是 |
28
+ | -o 或 --out_path | 指定预检结果存盘路径,默认“./”。 | str | 否 |
29
+
30
+ 预检执行结果包括 `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 预检结果](#4-预检结果)。
31
+
32
+ ## 4 预检结果
33
+
34
+ 精度预检生成的 `accuracy_checking_result_{timestamp}.csv` 和 `accuracy_checking_details_{timestamp}.csv` 文件内容详情如下:
35
+
36
+ `accuracy_checking_details_{timestamp}.csv`
37
+
38
+ | 字段 | 含义 |
39
+ | ------------------- | ------------------------------------------------------------ |
40
+ | API Name | API 名称。 |
41
+ | Bench Dtype | 标杆数据的 API 数据类型。 |
42
+ | Tested Dtype | 被检验数据的 API 数据类型。 |
43
+ | Shape | API 的 Shape 信息。 |
44
+ | Cosine | 被检验数据与标杆数据的余弦相似度。 |
45
+ | MaxAbsErr | 被检验数据与标杆数据的最大绝对误差。 |
46
+ | MaxRelativeErr | 被检验数据与标杆数据的最大相对误差。 |
47
+ | Status | API 预检通过状态,pass 表示通过测试,error 表示未通过。 |
48
+ | message | 提示信息。 |
49
+
50
+ 注意点:torch无法对dtype为整数类型的tensor进行反向求导,mindspore则支持。反向过程的预检仅比较dtype为浮点型的输出。
51
+
52
+ `accuracy_checking_result_{timestamp}.csv`
53
+
54
+ | 字段 | 含义 |
55
+ | --------------------- | ----------------- |
56
+ | API Name | API 名称。 |
57
+ | Forward Test Success | 前向 API 是否通过测试,pass 为通过,error 为错误。 |
58
+ | Backward Test Success | 反向 API 是否通过测试,pass 为通过,error 为错误,如果是空白的话代表该 API 没有反向输出。 |
59
+ | Message | 提示信息。 |
60
+
61
+ Forward Test Success 和 Backward Test Success 是否通过测试是由 `accuracy_checking_details_{timestamp}.csv` 中的余弦相似度、最大绝对误差判定结果决定的。具体规则详见 [4.1 API 预检指标](#41-api-预检指标)。
62
+ 需要注意的是 `accuracy_checking_details_{timestamp}.csv` 中可能存在一个 API 的前向(反向)有多个输出,那么每个输出记录一行,而在 `accuracy_checking_result_{timestamp}.csv` 中的结果需要该 API 的所有结果均为 pass 才能标记为 pass,只要存在一个 error 则标记 error。
63
+
64
+ ### 4.1 API 预检指标
65
+
66
+ - API 预检指标是通过对`accuracy_checking_details_{timestamp}.csv`中的余弦相似度、最大绝对误差的数值进行判断,得出该API是否符合精度标准的参考指标。详细规则如下:
67
+
68
+ - 余弦相似度大于0.99,并且最大绝对误差小于0.0001,标记“pass”,否则标记为“error”。