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.
- {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/LICENSE +201 -201
- {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/METADATA +36 -34
- mindstudio_probe-1.0.4.dist-info/RECORD +276 -0
- {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/WHEEL +1 -1
- {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/entry_points.txt +1 -0
- msprobe/README.md +101 -237
- msprobe/{config/config.json → config.json} +49 -49
- msprobe/core/advisor/advisor.py +124 -124
- msprobe/core/advisor/advisor_const.py +59 -59
- msprobe/core/advisor/advisor_result.py +58 -58
- msprobe/core/common/const.py +341 -318
- msprobe/core/common/exceptions.py +99 -99
- msprobe/core/common/{file_check.py → file_utils.py} +478 -283
- msprobe/core/common/log.py +76 -69
- msprobe/core/common/utils.py +385 -616
- msprobe/core/common_config.py +85 -71
- msprobe/core/compare/acc_compare.py +299 -298
- msprobe/core/compare/check.py +95 -95
- msprobe/core/compare/compare_cli.py +49 -49
- msprobe/core/compare/highlight.py +223 -222
- msprobe/core/compare/multiprocessing_compute.py +149 -149
- msprobe/core/compare/npy_compare.py +295 -295
- msprobe/core/compare/utils.py +430 -429
- msprobe/core/data_dump/data_collector.py +154 -144
- msprobe/core/data_dump/data_processor/base.py +314 -293
- msprobe/core/data_dump/data_processor/factory.py +59 -59
- msprobe/core/data_dump/data_processor/mindspore_processor.py +186 -198
- msprobe/core/data_dump/data_processor/pytorch_processor.py +366 -389
- msprobe/core/data_dump/json_writer.py +96 -116
- msprobe/core/data_dump/scope.py +178 -178
- msprobe/core/grad_probe/constant.py +70 -70
- msprobe/core/grad_probe/grad_compare.py +171 -175
- msprobe/core/grad_probe/utils.py +64 -52
- msprobe/docs/01.installation.md +89 -0
- msprobe/docs/02.config_introduction.md +165 -0
- msprobe/docs/03.config_examples.md +247 -0
- msprobe/docs/04.acl_config_examples.md +76 -0
- msprobe/docs/05.data_dump_PyTorch.md +198 -0
- msprobe/docs/06.data_dump_MindSpore.md +243 -0
- msprobe/docs/07.accuracy_checker_PyTorch.md +274 -0
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +198 -0
- msprobe/docs/09.accuracy_checker_MindSpore.md +68 -0
- msprobe/docs/10.accuracy_compare_PyTorch.md +245 -0
- msprobe/docs/11.accuracy_compare_MindSpore.md +202 -0
- msprobe/docs/12.overflow_check_PyTorch.md +79 -0
- msprobe/docs/13.overflow_check_MindSpore.md +31 -0
- msprobe/{pytorch/doc/parse_tool.md → docs/14.data_parse_PyTorch.md} +283 -286
- msprobe/docs/15.free_benchmarking_PyTorch.md +164 -0
- msprobe/{doc/grad_probe/grad_probe.md → docs/17.grad_probe.md} +207 -207
- msprobe/docs/FAQ_PyTorch.md +177 -0
- msprobe/docs/S02.report_free_benchmarking_validation_performance_baseline.md +146 -0
- msprobe/docs/img/free_benchmark_framework.png +0 -0
- msprobe/mindspore/__init__.py +1 -1
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +254 -245
- msprobe/mindspore/api_accuracy_checker/api_info.py +69 -69
- msprobe/mindspore/api_accuracy_checker/api_runner.py +155 -151
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +196 -196
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +6 -0
- msprobe/mindspore/api_accuracy_checker/compute_element.py +238 -223
- msprobe/mindspore/api_accuracy_checker/main.py +8 -15
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +113 -113
- msprobe/mindspore/api_accuracy_checker/utils.py +79 -62
- msprobe/mindspore/cell_processor.py +34 -34
- msprobe/mindspore/common/const.py +106 -87
- msprobe/mindspore/common/log.py +37 -37
- msprobe/mindspore/common/utils.py +81 -57
- msprobe/mindspore/compare/distributed_compare.py +75 -75
- msprobe/mindspore/compare/ms_compare.py +219 -117
- msprobe/mindspore/compare/ms_graph_compare.py +348 -317
- msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -399
- msprobe/mindspore/debugger/debugger_config.py +66 -74
- msprobe/mindspore/debugger/precision_debugger.py +126 -107
- msprobe/mindspore/dump/dump_tool_factory.py +35 -35
- msprobe/mindspore/dump/hook_cell/api_registry.py +118 -104
- msprobe/mindspore/dump/hook_cell/hook_cell.py +55 -53
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +922 -925
- msprobe/mindspore/dump/hook_cell/wrap_api.py +113 -0
- msprobe/mindspore/dump/jit_dump.py +72 -56
- msprobe/mindspore/dump/kernel_graph_dump.py +59 -60
- msprobe/mindspore/dump/kernel_kbyk_dump.py +64 -65
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -116
- msprobe/mindspore/free_benchmark/common/config.py +12 -12
- msprobe/mindspore/free_benchmark/common/handler_params.py +17 -17
- msprobe/mindspore/free_benchmark/common/utils.py +71 -71
- msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -842
- msprobe/mindspore/free_benchmark/decorator/dec_forward.py +43 -42
- msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -107
- msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -90
- msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -41
- msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -36
- msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -21
- msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -67
- msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -21
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -63
- msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +51 -0
- msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +35 -34
- msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -12
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +29 -27
- msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -33
- msprobe/mindspore/grad_probe/global_context.py +90 -91
- msprobe/mindspore/grad_probe/grad_analyzer.py +231 -231
- msprobe/mindspore/grad_probe/grad_monitor.py +27 -27
- msprobe/mindspore/grad_probe/grad_stat_csv.py +131 -131
- msprobe/mindspore/grad_probe/hook.py +94 -92
- msprobe/mindspore/grad_probe/utils.py +29 -28
- msprobe/mindspore/ms_config.py +128 -126
- msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +44 -45
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +34 -34
- msprobe/mindspore/runtime.py +4 -4
- msprobe/mindspore/service.py +378 -354
- msprobe/mindspore/task_handler_factory.py +24 -24
- msprobe/msprobe.py +105 -107
- msprobe/pytorch/__init__.py +3 -3
- msprobe/pytorch/api_accuracy_checker/common/config.py +53 -55
- msprobe/pytorch/api_accuracy_checker/common/utils.py +214 -165
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +213 -213
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +606 -581
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +132 -132
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -390
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +386 -381
- msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +73 -73
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +245 -244
- msprobe/pytorch/api_accuracy_checker/config.yaml +10 -10
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +335 -332
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +200 -199
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +133 -134
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +592 -581
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +70 -74
- msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +7 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +197 -202
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +325 -324
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -204
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +219 -218
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -10
- msprobe/pytorch/bench_functions/__init__.py +15 -15
- msprobe/pytorch/bench_functions/apply_adam_w.py +28 -28
- msprobe/pytorch/bench_functions/confusion_transpose.py +19 -19
- msprobe/pytorch/bench_functions/fast_gelu.py +55 -55
- msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -6
- msprobe/pytorch/bench_functions/linear.py +12 -12
- msprobe/pytorch/bench_functions/matmul_backward.py +48 -48
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +509 -421
- msprobe/pytorch/bench_functions/rms_norm.py +15 -15
- msprobe/pytorch/bench_functions/rotary_mul.py +52 -52
- msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -26
- msprobe/pytorch/bench_functions/swiglu.py +55 -55
- msprobe/pytorch/common/__init__.py +2 -2
- msprobe/pytorch/common/compare_script.template +14 -14
- msprobe/pytorch/common/log.py +20 -31
- msprobe/pytorch/common/parse_json.py +39 -39
- msprobe/pytorch/common/utils.py +305 -300
- msprobe/pytorch/compare/distributed_compare.py +66 -66
- msprobe/pytorch/compare/mapping.yaml +607 -607
- msprobe/pytorch/compare/match.py +34 -33
- msprobe/pytorch/compare/pt_compare.py +50 -40
- msprobe/pytorch/debugger/debugger_config.py +95 -95
- msprobe/pytorch/debugger/precision_debugger.py +125 -125
- msprobe/pytorch/free_benchmark/__init__.py +8 -8
- msprobe/pytorch/free_benchmark/common/constant.py +70 -70
- msprobe/pytorch/free_benchmark/common/counter.py +71 -71
- msprobe/pytorch/free_benchmark/common/enums.py +37 -37
- msprobe/pytorch/free_benchmark/common/params.py +129 -129
- msprobe/pytorch/free_benchmark/common/utils.py +102 -102
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +179 -179
- msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -104
- msprobe/pytorch/free_benchmark/main.py +105 -105
- msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -13
- msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -41
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -90
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -104
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -63
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -68
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -28
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -45
- msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -19
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +217 -217
- msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -39
- msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +23 -23
- msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +30 -30
- msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -170
- msprobe/pytorch/function_factory.py +76 -75
- msprobe/pytorch/functional/dump_module.py +39 -39
- msprobe/pytorch/grad_probe/grad_monitor.py +91 -90
- msprobe/pytorch/grad_probe/grad_stat_csv.py +128 -128
- msprobe/pytorch/hook_module/api_registry.py +161 -161
- msprobe/pytorch/hook_module/hook_module.py +120 -120
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +1879 -1877
- msprobe/pytorch/hook_module/utils.py +30 -29
- msprobe/pytorch/hook_module/wrap_aten.py +110 -110
- msprobe/pytorch/hook_module/wrap_distributed.py +78 -78
- msprobe/pytorch/hook_module/wrap_functional.py +105 -105
- msprobe/pytorch/hook_module/wrap_npu_custom.py +93 -84
- msprobe/pytorch/hook_module/wrap_tensor.py +71 -71
- msprobe/pytorch/hook_module/wrap_torch.py +86 -86
- msprobe/pytorch/hook_module/wrap_vf.py +62 -62
- msprobe/pytorch/module_processer.py +138 -138
- msprobe/pytorch/online_dispatch/__init__.py +20 -20
- msprobe/pytorch/online_dispatch/compare.py +236 -236
- msprobe/pytorch/online_dispatch/dispatch.py +271 -271
- msprobe/pytorch/online_dispatch/dump_compare.py +155 -156
- msprobe/pytorch/online_dispatch/single_compare.py +391 -391
- msprobe/pytorch/online_dispatch/torch_ops_config.yaml +49 -49
- msprobe/pytorch/online_dispatch/utils.py +130 -146
- msprobe/pytorch/parse.py +4 -4
- msprobe/pytorch/parse_tool/cli.py +32 -32
- msprobe/pytorch/parse_tool/lib/compare.py +260 -271
- msprobe/pytorch/parse_tool/lib/config.py +52 -52
- msprobe/pytorch/parse_tool/lib/file_desc.py +31 -31
- msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -102
- msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -54
- msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -158
- msprobe/pytorch/parse_tool/lib/utils.py +316 -321
- msprobe/pytorch/parse_tool/lib/visualization.py +85 -91
- msprobe/pytorch/pt_config.py +188 -187
- msprobe/pytorch/service.py +246 -252
- mindstudio_probe-1.0.3.dist-info/RECORD +0 -272
- msprobe/config/README.md +0 -539
- msprobe/mindspore/doc/compare.md +0 -58
- msprobe/mindspore/doc/dump.md +0 -217
- msprobe/mindspore/dump/hook_cell/wrap_functional.py +0 -91
- msprobe/mindspore/dump/hook_cell/wrap_tensor.py +0 -63
- msprobe/pytorch/doc/FAQ.md +0 -193
- msprobe/pytorch/doc/api_accuracy_checker.md +0 -313
- msprobe/pytorch/doc/api_accuracy_checker_online.md +0 -187
- msprobe/pytorch/doc/dump.md +0 -260
- 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
- msprobe/pytorch/doc/ptdbg_ascend_compare.md +0 -240
- msprobe/pytorch/doc/ptdbg_ascend_overview.md +0 -68
- msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +0 -381
- msprobe/pytorch/doc/run_overflow_check.md +0 -25
- 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
- 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
- {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/top_level.txt +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_3.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_4.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_3.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_4.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_5.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_6.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_7.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_8.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/YOLOV5S_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/YOLOV5S_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/accuracy_checking_details.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/accuracy_checking_result.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/api_precision_compare_details.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/api_precision_compare_result.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/auto_analyze_log.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/compare_result_pkl.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/compare_result_pkl_md5.png.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/cpu_info.png +0 -0
- /msprobe/{config → docs}/img/free_benchmark.png +0 -0
- /msprobe/{doc/grad_probe/img/image-1.png → docs/img/grad_probe_image-1.png} +0 -0
- /msprobe/{doc/grad_probe/img/image-2.png → docs/img/grad_probe_image-2.png} +0 -0
- /msprobe/{doc/grad_probe/img/image-3.png → docs/img/grad_probe_image-3.png} +0 -0
- /msprobe/{doc/grad_probe/img/image-4.png → docs/img/grad_probe_image-4.png} +0 -0
- /msprobe/{doc/grad_probe/img/image.png → docs/img/grad_probe_image.png} +0 -0
- /msprobe/{pytorch/doc → docs}/img/module_compare.png +0 -0
|
@@ -1,213 +1,213 @@
|
|
|
1
|
-
# 定义比对算法及比对标准
|
|
2
|
-
import torch
|
|
3
|
-
import numpy as np
|
|
4
|
-
|
|
5
|
-
from msprobe.pytorch.api_accuracy_checker.compare.compare_utils import ULP_PARAMETERS
|
|
6
|
-
from msprobe.core.common.const import CompareConst
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
#cos
|
|
10
|
-
def cosine_sim(bench_output, device_output):
|
|
11
|
-
msg = ""
|
|
12
|
-
n_value = device_output.reshape(-1)
|
|
13
|
-
b_value = bench_output.reshape(-1)
|
|
14
|
-
cos = CompareConst.SPACE
|
|
15
|
-
np.seterr(divide="ignore", invalid="ignore")
|
|
16
|
-
if n_value.shape != b_value.shape:
|
|
17
|
-
msg = f"Shape of device and bench outputs don't match. device: {n_value.shape}, bench: {b_value.shape}."
|
|
18
|
-
return -1, False, msg
|
|
19
|
-
if len(n_value) == 1:
|
|
20
|
-
msg = "All the data in device dump data is scalar. Please refer to other compare algorithms."
|
|
21
|
-
return cos, True, msg
|
|
22
|
-
n_value_max = np.max(np.abs(n_value))
|
|
23
|
-
b_value_max = np.max(np.abs(b_value))
|
|
24
|
-
if n_value_max <= np.finfo(float).eps and b_value_max <= np.finfo(float).eps:
|
|
25
|
-
msg = "All the data in device and bench outputs are zero."
|
|
26
|
-
return cos, True, msg
|
|
27
|
-
elif n_value_max <= np.finfo(float).eps:
|
|
28
|
-
msg = "All the data is zero in device dump data."
|
|
29
|
-
return CompareConst.SPACE, False, msg
|
|
30
|
-
elif b_value_max <= np.finfo(float).eps:
|
|
31
|
-
msg = "All the data is zero in bench dump data."
|
|
32
|
-
return CompareConst.SPACE, False, msg
|
|
33
|
-
else:
|
|
34
|
-
n_value = n_value.astype(float) / n_value_max
|
|
35
|
-
b_value = b_value.astype(float) / b_value_max
|
|
36
|
-
cos = np.dot(n_value, b_value) / (np.linalg.norm(n_value) * np.linalg.norm(b_value))
|
|
37
|
-
if np.isnan(cos):
|
|
38
|
-
msg = "Dump data has NaN when comparing with Cosine Similarity."
|
|
39
|
-
cos = np.clip(cos, -1, 1)
|
|
40
|
-
return cos, cos > 0.99, msg
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
#rmse
|
|
44
|
-
def get_rmse(abs_err, inf_nan_mask):
|
|
45
|
-
masked_ae = np.where(inf_nan_mask, 0, abs_err)
|
|
46
|
-
mse = np.mean(np.square(masked_ae))
|
|
47
|
-
inf_nan_cnt = np.sum(inf_nan_mask)
|
|
48
|
-
mse = mse * (abs_err.size / (abs_err.size - inf_nan_cnt + 0.0001) + 0.0001)
|
|
49
|
-
rmse = np.sqrt(mse)
|
|
50
|
-
return rmse
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
#误差均衡性
|
|
54
|
-
def get_error_balance(bench_data, device_data):
|
|
55
|
-
larger_count = np.sum(np.greater(device_data - bench_data.astype(device_data.dtype), 0))
|
|
56
|
-
smaller_count = np.sum(np.less(device_data - bench_data.astype(device_data.dtype), 0))
|
|
57
|
-
total_count = bench_data.size
|
|
58
|
-
error_balance = abs(larger_count - smaller_count) / total_count if total_count > 0 else 0
|
|
59
|
-
return error_balance
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
#小值域错误占比
|
|
63
|
-
def get_small_value_err_ratio(small_value_mask, abs_err_greater_mask):
|
|
64
|
-
err_mask = np.logical_and(small_value_mask, abs_err_greater_mask)
|
|
65
|
-
small_value_err_num = np.sum(err_mask)
|
|
66
|
-
small_value_num = np.sum(small_value_mask)
|
|
67
|
-
return 0 if small_value_num == 0 else small_value_err_num / small_value_num
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def get_rel_err(abs_err, abs_bench_with_eps, small_value_mask, inf_nan_mask):
|
|
71
|
-
rel_err_tmp = abs_err / abs_bench_with_eps
|
|
72
|
-
rel_err_mask = np.logical_or(small_value_mask, inf_nan_mask)
|
|
73
|
-
rel_err = np.where(rel_err_mask, -1, rel_err_tmp)
|
|
74
|
-
return rel_err
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def get_abs_err(bench_data, device_data):
|
|
78
|
-
abs_err = np.abs(device_data - bench_data)
|
|
79
|
-
return abs_err
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def get_rel_err_origin(abs_err, b_value):
|
|
83
|
-
rel_err_origin = np.abs(abs_err / b_value)
|
|
84
|
-
return rel_err_origin
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def get_max_abs_err(abs_err):
|
|
88
|
-
max_abs_err = abs_err.max()
|
|
89
|
-
bool_result = max_abs_err < 0.001
|
|
90
|
-
return max_abs_err, bool_result
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
#相对误差最大值
|
|
94
|
-
def get_max_rel_err(rel_err):
|
|
95
|
-
return np.max(rel_err) if np.max(rel_err) >= 0 else 0
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
#相对误差均值
|
|
99
|
-
def get_mean_rel_err(rel_err):
|
|
100
|
-
non_negative_rel_err = rel_err[rel_err >= 0]
|
|
101
|
-
return np.mean(non_negative_rel_err) if non_negative_rel_err.size > 0 else 0
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def get_rel_err_ratio(rel_err, thresholding):
|
|
105
|
-
if np.size(rel_err) == 0:
|
|
106
|
-
ratio = 1
|
|
107
|
-
else:
|
|
108
|
-
ratio = np.divide(np.sum(rel_err < thresholding), np.size(rel_err))
|
|
109
|
-
bool_result = ratio > (1 - thresholding)
|
|
110
|
-
return ratio, bool_result
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def get_finite_and_infinite_mask(bench_output, device_output):
|
|
114
|
-
device_finite_mask = np.isfinite(device_output)
|
|
115
|
-
bench_finite_mask = np.isfinite(bench_output.astype(device_output.dtype))
|
|
116
|
-
both_finite_mask = np.logical_and(device_finite_mask, bench_finite_mask)
|
|
117
|
-
inf_nan_mask = np.logical_not(both_finite_mask)
|
|
118
|
-
return both_finite_mask, inf_nan_mask
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def get_small_value_mask(abs_bench, both_finite_mask, small_value_threshold):
|
|
122
|
-
small_value_mask = np.less_equal(abs_bench, small_value_threshold)
|
|
123
|
-
small_value_mask = np.logical_and(small_value_mask, both_finite_mask)
|
|
124
|
-
return small_value_mask
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def get_abs_bench_with_eps(bench, dtype):
|
|
128
|
-
abs_bench = np.abs(bench)
|
|
129
|
-
eps = np.finfo(bench.dtype).eps if dtype != torch.bfloat16 else CompareConst.BFLOAT16_EPS
|
|
130
|
-
abs_bench_with_eps = abs_bench + eps
|
|
131
|
-
return abs_bench, abs_bench_with_eps
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def check_inf_nan_value(inf_nan_mask, bench_output, device_output, dtype, rtol):
|
|
135
|
-
'''
|
|
136
|
-
新精度标准的绝对阈值法中,检查npu和golden输出的inf、nan是否一致
|
|
137
|
-
输入:
|
|
138
|
-
inf_nan_mask:npu输出和golden输出的inf、nan的mask
|
|
139
|
-
bench_output:golden输出
|
|
140
|
-
device_output:npu输出
|
|
141
|
-
dtype:npu输出的dtype
|
|
142
|
-
输出:
|
|
143
|
-
inf_nan_err_ratio:npu输出和golden输出的inf、nan不一致的比例
|
|
144
|
-
'''
|
|
145
|
-
abs_gpu, abs_gpu_with_eps = get_abs_bench_with_eps(bench_output, dtype)
|
|
146
|
-
golden_same_dtype = bench_output.astype(device_output.dtype)
|
|
147
|
-
a_min = np.finfo(device_output.dtype).min if dtype != torch.bfloat16 else CompareConst.BFLOAT16_MIN
|
|
148
|
-
a_max = np.finfo(device_output.dtype).max if dtype != torch.bfloat16 else CompareConst.BFLOAT16_MAX
|
|
149
|
-
golden_clip = np.clip(golden_same_dtype, a_min, a_max)
|
|
150
|
-
npu_clip = np.clip(device_output, a_min, a_max)
|
|
151
|
-
clipped_abs_ae = np.abs(npu_clip - golden_clip)
|
|
152
|
-
clipped_re = clipped_abs_ae / abs_gpu_with_eps
|
|
153
|
-
pass_mask = np.less_equal(clipped_re, rtol)
|
|
154
|
-
both_nan_mask = np.logical_and(np.isnan(device_output), np.isnan(golden_clip))
|
|
155
|
-
pass_mask = np.logical_or(pass_mask, both_nan_mask)
|
|
156
|
-
not_pass_mask = np.logical_not(pass_mask)
|
|
157
|
-
not_pass_mask = np.logical_and(not_pass_mask, inf_nan_mask)
|
|
158
|
-
|
|
159
|
-
inf_nan_err_cnt = np.sum(not_pass_mask)
|
|
160
|
-
return 0 if np.sum(inf_nan_mask) == 0 else inf_nan_err_cnt / np.sum(inf_nan_mask)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def check_small_value(abs_err, small_value_mask, small_value_atol):
|
|
164
|
-
'''
|
|
165
|
-
新精度标准的相对阈值法中,检查npu和golden小值域输出的相对误差是否满足阈值
|
|
166
|
-
输入:
|
|
167
|
-
rel_err:npu输出和golden输出的相对误差
|
|
168
|
-
normal_value_mask:npu输出和golden输出的正常值mask
|
|
169
|
-
rtol:相对误差的阈值
|
|
170
|
-
输出:
|
|
171
|
-
rel_err_ratio:npu输出和golden输出的相对误差不满足阈值的比例
|
|
172
|
-
'''
|
|
173
|
-
greater_mask = np.greater(abs_err, small_value_atol)
|
|
174
|
-
err_mask = np.logical_and(greater_mask, small_value_mask)
|
|
175
|
-
err_cnt = np.sum(err_mask)
|
|
176
|
-
return 0 if np.sum(small_value_mask) == 0 else err_cnt / np.sum(small_value_mask)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def check_norm_value(normal_value_mask, rel_err, rtol):
|
|
180
|
-
'''
|
|
181
|
-
新精度标准的绝对阈值法中,检查npu和golden正常值输出的绝对误差是否满足阈值
|
|
182
|
-
输入:
|
|
183
|
-
abs_err:npu输出和golden输出的绝对误差
|
|
184
|
-
normal_value_mask:npu输出和golden输出的正常值mask
|
|
185
|
-
atol:绝对误差的阈值
|
|
186
|
-
输出:
|
|
187
|
-
abs_err_ratio:npu输出和golden输出的绝对误差不满足阈值的比例
|
|
188
|
-
'''
|
|
189
|
-
err_mask = np.greater(rel_err, rtol)
|
|
190
|
-
err_mask = np.logical_and(err_mask, normal_value_mask)
|
|
191
|
-
err_cnt = np.sum(err_mask)
|
|
192
|
-
return 0 if np.sum(normal_value_mask) == 0 else err_cnt / np.sum(normal_value_mask)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
def get_ulp_err(bench_output, device_output, dtype):
|
|
196
|
-
parameters = ULP_PARAMETERS.get(dtype)
|
|
197
|
-
min_eb = parameters.get('min_eb')[0]
|
|
198
|
-
exponent_num = parameters.get('exponent_num')[0]
|
|
199
|
-
abs_bench = np.abs(bench_output)
|
|
200
|
-
eb = np.where(abs_bench == 0, 0, np.floor(np.log2(abs_bench)))
|
|
201
|
-
eb = np.maximum(eb, min_eb)
|
|
202
|
-
|
|
203
|
-
if dtype == torch.float32:
|
|
204
|
-
ulp_err = calc_ulp_err(bench_output, device_output, eb, exponent_num, np.float64)
|
|
205
|
-
else:
|
|
206
|
-
ulp_err = calc_ulp_err(bench_output, device_output, eb, exponent_num, np.float32)
|
|
207
|
-
ulp_err = np.abs(ulp_err)
|
|
208
|
-
return ulp_err
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def calc_ulp_err(bench_output, device_output, eb, exponent_num, data_type):
|
|
212
|
-
return (device_output.astype(data_type) - bench_output).astype(data_type) * \
|
|
213
|
-
np.exp2(-eb + exponent_num).astype(data_type)
|
|
1
|
+
# 定义比对算法及比对标准
|
|
2
|
+
import torch
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from msprobe.pytorch.api_accuracy_checker.compare.compare_utils import ULP_PARAMETERS
|
|
6
|
+
from msprobe.core.common.const import CompareConst
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#cos
|
|
10
|
+
def cosine_sim(bench_output, device_output):
|
|
11
|
+
msg = ""
|
|
12
|
+
n_value = device_output.reshape(-1)
|
|
13
|
+
b_value = bench_output.reshape(-1)
|
|
14
|
+
cos = CompareConst.SPACE
|
|
15
|
+
np.seterr(divide="ignore", invalid="ignore")
|
|
16
|
+
if n_value.shape != b_value.shape:
|
|
17
|
+
msg = f"Shape of device and bench outputs don't match. device: {n_value.shape}, bench: {b_value.shape}."
|
|
18
|
+
return -1, False, msg
|
|
19
|
+
if len(n_value) == 1:
|
|
20
|
+
msg = "All the data in device dump data is scalar. Please refer to other compare algorithms."
|
|
21
|
+
return cos, True, msg
|
|
22
|
+
n_value_max = np.max(np.abs(n_value))
|
|
23
|
+
b_value_max = np.max(np.abs(b_value))
|
|
24
|
+
if n_value_max <= np.finfo(float).eps and b_value_max <= np.finfo(float).eps:
|
|
25
|
+
msg = "All the data in device and bench outputs are zero."
|
|
26
|
+
return cos, True, msg
|
|
27
|
+
elif n_value_max <= np.finfo(float).eps:
|
|
28
|
+
msg = "All the data is zero in device dump data."
|
|
29
|
+
return CompareConst.SPACE, False, msg
|
|
30
|
+
elif b_value_max <= np.finfo(float).eps:
|
|
31
|
+
msg = "All the data is zero in bench dump data."
|
|
32
|
+
return CompareConst.SPACE, False, msg
|
|
33
|
+
else:
|
|
34
|
+
n_value = n_value.astype(float) / n_value_max
|
|
35
|
+
b_value = b_value.astype(float) / b_value_max
|
|
36
|
+
cos = np.dot(n_value, b_value) / (np.linalg.norm(n_value) * np.linalg.norm(b_value))
|
|
37
|
+
if np.isnan(cos):
|
|
38
|
+
msg = "Dump data has NaN when comparing with Cosine Similarity."
|
|
39
|
+
cos = np.clip(cos, -1, 1)
|
|
40
|
+
return cos, cos > 0.99, msg
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
#rmse
|
|
44
|
+
def get_rmse(abs_err, inf_nan_mask):
|
|
45
|
+
masked_ae = np.where(inf_nan_mask, 0, abs_err)
|
|
46
|
+
mse = np.mean(np.square(masked_ae))
|
|
47
|
+
inf_nan_cnt = np.sum(inf_nan_mask)
|
|
48
|
+
mse = mse * (abs_err.size / (abs_err.size - inf_nan_cnt + 0.0001) + 0.0001)
|
|
49
|
+
rmse = np.sqrt(mse)
|
|
50
|
+
return rmse
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#误差均衡性
|
|
54
|
+
def get_error_balance(bench_data, device_data):
|
|
55
|
+
larger_count = np.sum(np.greater(device_data - bench_data.astype(device_data.dtype), 0))
|
|
56
|
+
smaller_count = np.sum(np.less(device_data - bench_data.astype(device_data.dtype), 0))
|
|
57
|
+
total_count = bench_data.size
|
|
58
|
+
error_balance = abs(larger_count - smaller_count) / total_count if total_count > 0 else 0
|
|
59
|
+
return error_balance
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
#小值域错误占比
|
|
63
|
+
def get_small_value_err_ratio(small_value_mask, abs_err_greater_mask):
|
|
64
|
+
err_mask = np.logical_and(small_value_mask, abs_err_greater_mask)
|
|
65
|
+
small_value_err_num = np.sum(err_mask)
|
|
66
|
+
small_value_num = np.sum(small_value_mask)
|
|
67
|
+
return 0 if small_value_num == 0 else small_value_err_num / small_value_num
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def get_rel_err(abs_err, abs_bench_with_eps, small_value_mask, inf_nan_mask):
|
|
71
|
+
rel_err_tmp = abs_err / abs_bench_with_eps
|
|
72
|
+
rel_err_mask = np.logical_or(small_value_mask, inf_nan_mask)
|
|
73
|
+
rel_err = np.where(rel_err_mask, -1, rel_err_tmp)
|
|
74
|
+
return rel_err
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_abs_err(bench_data, device_data):
|
|
78
|
+
abs_err = np.abs(device_data - bench_data)
|
|
79
|
+
return abs_err
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_rel_err_origin(abs_err, b_value):
|
|
83
|
+
rel_err_origin = np.abs(abs_err / b_value)
|
|
84
|
+
return rel_err_origin
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def get_max_abs_err(abs_err):
|
|
88
|
+
max_abs_err = abs_err.max()
|
|
89
|
+
bool_result = max_abs_err < 0.001
|
|
90
|
+
return max_abs_err, bool_result
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
#相对误差最大值
|
|
94
|
+
def get_max_rel_err(rel_err):
|
|
95
|
+
return np.max(rel_err) if np.max(rel_err) >= 0 else 0
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
#相对误差均值
|
|
99
|
+
def get_mean_rel_err(rel_err):
|
|
100
|
+
non_negative_rel_err = rel_err[rel_err >= 0]
|
|
101
|
+
return np.mean(non_negative_rel_err) if non_negative_rel_err.size > 0 else 0
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_rel_err_ratio(rel_err, thresholding):
|
|
105
|
+
if np.size(rel_err) == 0:
|
|
106
|
+
ratio = 1
|
|
107
|
+
else:
|
|
108
|
+
ratio = np.divide(np.sum(rel_err < thresholding), np.size(rel_err))
|
|
109
|
+
bool_result = ratio > (1 - thresholding)
|
|
110
|
+
return ratio, bool_result
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def get_finite_and_infinite_mask(bench_output, device_output):
|
|
114
|
+
device_finite_mask = np.isfinite(device_output)
|
|
115
|
+
bench_finite_mask = np.isfinite(bench_output.astype(device_output.dtype))
|
|
116
|
+
both_finite_mask = np.logical_and(device_finite_mask, bench_finite_mask)
|
|
117
|
+
inf_nan_mask = np.logical_not(both_finite_mask)
|
|
118
|
+
return both_finite_mask, inf_nan_mask
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def get_small_value_mask(abs_bench, both_finite_mask, small_value_threshold):
|
|
122
|
+
small_value_mask = np.less_equal(abs_bench, small_value_threshold)
|
|
123
|
+
small_value_mask = np.logical_and(small_value_mask, both_finite_mask)
|
|
124
|
+
return small_value_mask
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def get_abs_bench_with_eps(bench, dtype):
|
|
128
|
+
abs_bench = np.abs(bench)
|
|
129
|
+
eps = np.finfo(bench.dtype).eps if dtype != torch.bfloat16 else CompareConst.BFLOAT16_EPS
|
|
130
|
+
abs_bench_with_eps = abs_bench + eps
|
|
131
|
+
return abs_bench, abs_bench_with_eps
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def check_inf_nan_value(inf_nan_mask, bench_output, device_output, dtype, rtol):
|
|
135
|
+
'''
|
|
136
|
+
新精度标准的绝对阈值法中,检查npu和golden输出的inf、nan是否一致
|
|
137
|
+
输入:
|
|
138
|
+
inf_nan_mask:npu输出和golden输出的inf、nan的mask
|
|
139
|
+
bench_output:golden输出
|
|
140
|
+
device_output:npu输出
|
|
141
|
+
dtype:npu输出的dtype
|
|
142
|
+
输出:
|
|
143
|
+
inf_nan_err_ratio:npu输出和golden输出的inf、nan不一致的比例
|
|
144
|
+
'''
|
|
145
|
+
abs_gpu, abs_gpu_with_eps = get_abs_bench_with_eps(bench_output, dtype)
|
|
146
|
+
golden_same_dtype = bench_output.astype(device_output.dtype)
|
|
147
|
+
a_min = np.finfo(device_output.dtype).min if dtype != torch.bfloat16 else CompareConst.BFLOAT16_MIN
|
|
148
|
+
a_max = np.finfo(device_output.dtype).max if dtype != torch.bfloat16 else CompareConst.BFLOAT16_MAX
|
|
149
|
+
golden_clip = np.clip(golden_same_dtype, a_min, a_max)
|
|
150
|
+
npu_clip = np.clip(device_output, a_min, a_max)
|
|
151
|
+
clipped_abs_ae = np.abs(npu_clip - golden_clip)
|
|
152
|
+
clipped_re = clipped_abs_ae / abs_gpu_with_eps
|
|
153
|
+
pass_mask = np.less_equal(clipped_re, rtol)
|
|
154
|
+
both_nan_mask = np.logical_and(np.isnan(device_output), np.isnan(golden_clip))
|
|
155
|
+
pass_mask = np.logical_or(pass_mask, both_nan_mask)
|
|
156
|
+
not_pass_mask = np.logical_not(pass_mask)
|
|
157
|
+
not_pass_mask = np.logical_and(not_pass_mask, inf_nan_mask)
|
|
158
|
+
|
|
159
|
+
inf_nan_err_cnt = np.sum(not_pass_mask)
|
|
160
|
+
return 0 if np.sum(inf_nan_mask) == 0 else inf_nan_err_cnt / np.sum(inf_nan_mask)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def check_small_value(abs_err, small_value_mask, small_value_atol):
|
|
164
|
+
'''
|
|
165
|
+
新精度标准的相对阈值法中,检查npu和golden小值域输出的相对误差是否满足阈值
|
|
166
|
+
输入:
|
|
167
|
+
rel_err:npu输出和golden输出的相对误差
|
|
168
|
+
normal_value_mask:npu输出和golden输出的正常值mask
|
|
169
|
+
rtol:相对误差的阈值
|
|
170
|
+
输出:
|
|
171
|
+
rel_err_ratio:npu输出和golden输出的相对误差不满足阈值的比例
|
|
172
|
+
'''
|
|
173
|
+
greater_mask = np.greater(abs_err, small_value_atol)
|
|
174
|
+
err_mask = np.logical_and(greater_mask, small_value_mask)
|
|
175
|
+
err_cnt = np.sum(err_mask)
|
|
176
|
+
return 0 if np.sum(small_value_mask) == 0 else err_cnt / np.sum(small_value_mask)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def check_norm_value(normal_value_mask, rel_err, rtol):
|
|
180
|
+
'''
|
|
181
|
+
新精度标准的绝对阈值法中,检查npu和golden正常值输出的绝对误差是否满足阈值
|
|
182
|
+
输入:
|
|
183
|
+
abs_err:npu输出和golden输出的绝对误差
|
|
184
|
+
normal_value_mask:npu输出和golden输出的正常值mask
|
|
185
|
+
atol:绝对误差的阈值
|
|
186
|
+
输出:
|
|
187
|
+
abs_err_ratio:npu输出和golden输出的绝对误差不满足阈值的比例
|
|
188
|
+
'''
|
|
189
|
+
err_mask = np.greater(rel_err, rtol)
|
|
190
|
+
err_mask = np.logical_and(err_mask, normal_value_mask)
|
|
191
|
+
err_cnt = np.sum(err_mask)
|
|
192
|
+
return 0 if np.sum(normal_value_mask) == 0 else err_cnt / np.sum(normal_value_mask)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def get_ulp_err(bench_output, device_output, dtype):
|
|
196
|
+
parameters = ULP_PARAMETERS.get(dtype)
|
|
197
|
+
min_eb = parameters.get('min_eb')[0]
|
|
198
|
+
exponent_num = parameters.get('exponent_num')[0]
|
|
199
|
+
abs_bench = np.abs(bench_output)
|
|
200
|
+
eb = np.where(abs_bench == 0, 0, np.floor(np.log2(abs_bench)))
|
|
201
|
+
eb = np.maximum(eb, min_eb)
|
|
202
|
+
|
|
203
|
+
if dtype == torch.float32:
|
|
204
|
+
ulp_err = calc_ulp_err(bench_output, device_output, eb, exponent_num, np.float64)
|
|
205
|
+
else:
|
|
206
|
+
ulp_err = calc_ulp_err(bench_output, device_output, eb, exponent_num, np.float32)
|
|
207
|
+
ulp_err = np.abs(ulp_err)
|
|
208
|
+
return ulp_err
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def calc_ulp_err(bench_output, device_output, eb, exponent_num, data_type):
|
|
212
|
+
return (device_output.astype(data_type) - bench_output).astype(data_type) * \
|
|
213
|
+
np.exp2(-eb + exponent_num).astype(data_type)
|