From 930f236b71f35638001df4888b46a8fa64e8bf52 Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 11:36:34 +0800 Subject: [PATCH 01/22] infnan --- .../api_accuracy_checker/dump/api_info.py | 32 +++++++++++-- .../run_ut/data_generate.py | 46 +++++++++++++++---- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index e14405fe1..0bff80aea 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -19,9 +19,29 @@ def get_tensor_extremum(data, operator): return False not in data data_clone = data.clone().detach() if operator == 'max': - return torch._C._VariableFunctionsClass.max(data_clone.float()).item() + max_result = torch._C._VariableFunctionsClass.max(data_clone.float()) + if torch.isinf(max_result) or torch.isnan(max_result): + return handle_tensor_extremum_nan_inf(data_clone, operator), max_result.item() + else: + return max_result.item(), max_result.item() else: - return torch._C._VariableFunctionsClass.min(data_clone.float()).item() + min_result = torch._C._VariableFunctionsClass.min(data_clone.float()) + if torch.isinf(min_result) or torch.isnan(min_result): + return handle_tensor_extremum_nan_inf(data_clone, operator), min_result.item() + else: + return min_result.item(), min_result.item() + + +def handle_tensor_extremum_nan_inf(data_clone, operator): + data_no_nan = data_clone[~torch.isnan(data_clone)] + if len(data_no_nan) == 0: + return float('nan') + data_no_inf = data_no_nan[~torch.isinf(data_no_nan)] + if len(data_no_inf) == 0: + return torch._C._VariableFunctionsClass.max(data_no_nan.float()).item() if operator =='max' else \ + torch._C._VariableFunctionsClass.min(data_no_nan.float()).item() + return torch._C._VariableFunctionsClass.max(data_no_inf.float()).item() if operator =='max' else \ + torch._C._VariableFunctionsClass.min(data_no_inf.float()).item() def get_type_name(name): @@ -118,8 +138,12 @@ class APIInfo: single_arg.update({'type': 'torch.Tensor'}) single_arg.update({'dtype': str(arg.dtype)}) single_arg.update({'shape': arg.shape}) - single_arg.update({'Max': transfer_types(get_tensor_extremum(arg, 'max'), str(arg.dtype))}) - single_arg.update({'Min': transfer_types(get_tensor_extremum(arg, 'min'), str(arg.dtype))}) + max_handle, max_origin = get_tensor_extremum(arg,'max') + single_arg.update({'Max': transfer_types(max_handle, str(arg.dtype))}) + single_arg.update({'Max_origin': transfer_types(max_origin, str(arg.dtype))}) + min_handle, min_origin = get_tensor_extremum(arg,'min') + single_arg.update({'Min': transfer_types(min_handle, str(arg.dtype))}) + single_arg.update({'Min_origin': transfer_types(min_origin, str(arg.dtype))}) single_arg.update({'requires_grad': arg.requires_grad}) else: api_args = self.api_name + '.' + str(self.args_num) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index ec3c539f7..32ad7b3d6 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -18,6 +18,7 @@ import os import torch import numpy +import math from api_accuracy_checker.common.utils import Const, check_file_or_directory_path, check_object_type, print_warn_log, \ print_error_log, get_full_data_path, CompareException @@ -105,6 +106,9 @@ def gen_random_tensor(info, convert_type): """ check_object_type(info, dict) low, high = info.get('Min'), info.get('Max') + low_origin, high_origin = info.get('Min_origin'), info.get('Max_origin') + low_info = [low, low_origin] + high_info = [high, high_origin] data_dtype = info.get('dtype') shape = tuple(info.get('shape')) if not isinstance(low, (int, float)) or not isinstance(high, (int, float)): @@ -113,11 +117,11 @@ def gen_random_tensor(info, convert_type): if data_dtype == "torch.bool": data = gen_bool_tensor(low, high, shape) else: - data = gen_common_tensor(low, high, shape, data_dtype, convert_type) + data = gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type) return data -def gen_common_tensor(low, high, shape, data_dtype, convert_type): +def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): """ Function Description: Based on API basic information, generate int or float tensor @@ -133,10 +137,23 @@ def gen_common_tensor(low, high, shape, data_dtype, convert_type): if ori_dtype == data_dtype: data_dtype = Const.CONVERT.get(convert_type)[1] if data_dtype in FLOAT_TYPE: - if high in [float('inf'), float('-inf')] or low in [float('inf'), float('-inf')]: - error_info = 'Parameter contains inf, skip comparison.' - raise CompareException(CompareException.INVALID_PARAM_ERROR, error_info) - scale = high - low + low, low_origin = low_info[0], low_info[1] + high, high_origin = high_info[0], high_info[1] + if math.isnan(high): + tensor = torch.full(shape, float('nan'), dtype=eval(data_dtype)) + return tensor + low_scale, high_scale = low, high + dtype_finio = torch.finio(eval(data_dtype)) + if high == float('inf'): + high_scale = dtype_finio.max + elif high == float('-inf'): + high_scale = dtype_finio.min + if low == float('inf'): + low_scale = dtype_finio.max + elif low == float('-inf'): + low_scale = dtype_finio.min + + scale = high_scale - low_scale rand01 = torch.rand(shape, dtype=eval(data_dtype)) tensor = rand01 * scale + low elif 'int' in data_dtype or 'long' in data_dtype: @@ -148,8 +165,21 @@ def gen_common_tensor(low, high, shape, data_dtype, convert_type): if tensor.nelement() == 0: return tensor tmp_tensor = tensor.reshape(-1) - tmp_tensor[0] = low - tmp_tensor[-1] = high + if math.isnan(high_origin): + if tmp_tensor.numel() <= 2: + tmp_tensor[0] = float('nan') + tmp_tensor[-1] = high + else: + tmp_tensor[0] = low + tmp_tensor[1] = float('nan') + tmp_tensor[-1] = high + else: + tmp_tensor[0] = low + tmp_tensor[-1] = high + if high_origin in [float('inf'), float('-inf')]: + tmp_tensor[-1] = high_origin + if low_origin in [float('inf'), float('-inf')]: + tmp_tensor[0] = low_origin data = tmp_tensor.reshape(shape) return data -- Gitee From 1764771a25b3436de0a43612800b38f87e4de81f Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 11:43:37 +0800 Subject: [PATCH 02/22] fix --- .../accuracy_tools/api_accuracy_checker/run_ut/data_generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index 32ad7b3d6..2b44ac94f 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -143,7 +143,7 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): tensor = torch.full(shape, float('nan'), dtype=eval(data_dtype)) return tensor low_scale, high_scale = low, high - dtype_finio = torch.finio(eval(data_dtype)) + dtype_finio = torch.finfo(eval(data_dtype)) if high == float('inf'): high_scale = dtype_finio.max elif high == float('-inf'): -- Gitee From bfe717eca7f8f7eb3fe972b5e6844a7daa6fe975 Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 11:45:42 +0800 Subject: [PATCH 03/22] fix --- .../api_accuracy_checker/run_ut/data_generate.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index 2b44ac94f..e325dd517 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -143,15 +143,15 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): tensor = torch.full(shape, float('nan'), dtype=eval(data_dtype)) return tensor low_scale, high_scale = low, high - dtype_finio = torch.finfo(eval(data_dtype)) + dtype_finfo = torch.finfo(eval(data_dtype)) if high == float('inf'): - high_scale = dtype_finio.max + high_scale = dtype_finfo.max elif high == float('-inf'): - high_scale = dtype_finio.min + high_scale = dtype_finfo.min if low == float('inf'): - low_scale = dtype_finio.max + low_scale = dtype_finfo.max elif low == float('-inf'): - low_scale = dtype_finio.min + low_scale = dtype_finfo.min scale = high_scale - low_scale rand01 = torch.rand(shape, dtype=eval(data_dtype)) -- Gitee From e404c3b13e90729c25531722f4d21b9597515035 Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 15:24:03 +0800 Subject: [PATCH 04/22] fix --- debug/accuracy_tools/api_accuracy_checker/compare/compare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py index 15bfb1904..addf2996d 100644 --- a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py +++ b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py @@ -160,9 +160,9 @@ class Comparator: _, api_name, _ = full_api_name.split("*") compare_func = self._compare_dropout if "dropout" in full_api_name else self._compare_core_wrapper fwd_success_status, fwd_compare_alg_results = compare_func(api_name, bench_output, device_output) - bwd_success_status, bwd_compare_alg_results = (CompareConst.PASS, []) if not (bench_grad and npu_grad) else compare_func(api_name, bench_grad[0], npu_grad[0]) if "dropout" in full_api_name else compare_func(api_name, bench_grad, npu_grad) + bwd_success_status, bwd_compare_alg_results = (CompareConst.SPACE, []) if not (bench_grad and npu_grad) else compare_func(api_name, bench_grad[0], npu_grad[0]) if "dropout" in full_api_name else compare_func(api_name, bench_grad, npu_grad) self.record_results(full_api_name, fwd_success_status, bwd_success_status if bwd_compare_alg_results is not None else CompareConst.SPACE, fwd_compare_alg_results, bwd_compare_alg_results) - return fwd_success_status == CompareConst.PASS, bwd_success_status == CompareConst.PASS + return fwd_success_status == CompareConst.PASS, bwd_success_status == CompareConst.PASS or bwd_success_status == CompareConst.SPACE def _compare_core_wrapper(self, api_name, bench_output, device_output): detailed_result_total = [] -- Gitee From c6b9e0bd1532a9dbe82bb787aff261782660ee9a Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 15:27:22 +0800 Subject: [PATCH 05/22] fix --- .../accuracy_tools/api_accuracy_checker/dump/api_info.py | 8 ++++---- .../api_accuracy_checker/run_ut/data_generate.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 0bff80aea..01549932a 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -38,9 +38,9 @@ def handle_tensor_extremum_nan_inf(data_clone, operator): return float('nan') data_no_inf = data_no_nan[~torch.isinf(data_no_nan)] if len(data_no_inf) == 0: - return torch._C._VariableFunctionsClass.max(data_no_nan.float()).item() if operator =='max' else \ + return torch._C._VariableFunctionsClass.max(data_no_nan.float()).item() if operator == 'max' else \ torch._C._VariableFunctionsClass.min(data_no_nan.float()).item() - return torch._C._VariableFunctionsClass.max(data_no_inf.float()).item() if operator =='max' else \ + return torch._C._VariableFunctionsClass.max(data_no_inf.float()).item() if operator == 'max' else \ torch._C._VariableFunctionsClass.min(data_no_inf.float()).item() @@ -138,10 +138,10 @@ class APIInfo: single_arg.update({'type': 'torch.Tensor'}) single_arg.update({'dtype': str(arg.dtype)}) single_arg.update({'shape': arg.shape}) - max_handle, max_origin = get_tensor_extremum(arg,'max') + max_handle, max_origin = get_tensor_extremum(arg, 'max') single_arg.update({'Max': transfer_types(max_handle, str(arg.dtype))}) single_arg.update({'Max_origin': transfer_types(max_origin, str(arg.dtype))}) - min_handle, min_origin = get_tensor_extremum(arg,'min') + min_handle, min_origin = get_tensor_extremum(arg, 'min') single_arg.update({'Min': transfer_types(min_handle, str(arg.dtype))}) single_arg.update({'Min_origin': transfer_types(min_origin, str(arg.dtype))}) single_arg.update({'requires_grad': arg.requires_grad}) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index e325dd517..525831fe5 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -16,9 +16,9 @@ """ import os +import math import torch import numpy -import math from api_accuracy_checker.common.utils import Const, check_file_or_directory_path, check_object_type, print_warn_log, \ print_error_log, get_full_data_path, CompareException -- Gitee From 9867ee5135fca339b1225eac8ed889057293e6bb Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 19:27:56 +0800 Subject: [PATCH 06/22] fix --- debug/accuracy_tools/api_accuracy_checker/dump/api_info.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 01549932a..0439df5ec 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -12,11 +12,11 @@ from ptdbg_ascend.src.python.ptdbg_ascend.common.utils import check_path_before_ def get_tensor_extremum(data, operator): if data.dtype is torch.bool: if data.numel() == 0: - return False + return False, False if operator == 'max': - return True in data + return True in data, True in data elif operator == 'min': - return False not in data + return False not in data, False not in data data_clone = data.clone().detach() if operator == 'max': max_result = torch._C._VariableFunctionsClass.max(data_clone.float()) -- Gitee From 7cd7f3d42a9a8e19d031b735213ee921cbe2442e Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 1 Apr 2024 20:55:23 +0800 Subject: [PATCH 07/22] fix --- .../api_accuracy_checker/dump/api_info.py | 16 ++++++++-------- .../api_accuracy_checker/run_ut/data_generate.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 0439df5ec..e179c3a53 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -19,17 +19,17 @@ def get_tensor_extremum(data, operator): return False not in data, False not in data data_clone = data.clone().detach() if operator == 'max': - max_result = torch._C._VariableFunctionsClass.max(data_clone.float()) - if torch.isinf(max_result) or torch.isnan(max_result): - return handle_tensor_extremum_nan_inf(data_clone, operator), max_result.item() + max_result = torch._C._VariableFunctionsClass.max(data_clone.float()).item() + if np.isinf(max_result) or np.isnan(max_result): + return handle_tensor_extremum_nan_inf(data_clone, operator), max_result else: - return max_result.item(), max_result.item() + return max_result, max_result else: - min_result = torch._C._VariableFunctionsClass.min(data_clone.float()) - if torch.isinf(min_result) or torch.isnan(min_result): - return handle_tensor_extremum_nan_inf(data_clone, operator), min_result.item() + min_result = torch._C._VariableFunctionsClass.min(data_clone.float()).item() + if np.isinf(min_result) or np.isnan(min_result): + return handle_tensor_extremum_nan_inf(data_clone, operator), min_result else: - return min_result.item(), min_result.item() + return min_result, min_result def handle_tensor_extremum_nan_inf(data_clone, operator): diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index 525831fe5..e32927527 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -140,7 +140,7 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): low, low_origin = low_info[0], low_info[1] high, high_origin = high_info[0], high_info[1] if math.isnan(high): - tensor = torch.full(shape, float('nan'), dtype=eval(data_dtype)) + tensor = torch._C._VariableFunctionsClass.full(shape, float('nan'), dtype=eval(data_dtype)) return tensor low_scale, high_scale = low, high dtype_finfo = torch.finfo(eval(data_dtype)) -- Gitee From e1ab1ce7f7fb4fd98da941899611676849cad10c Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 10:10:57 +0800 Subject: [PATCH 08/22] fix --- .../accuracy_tools/api_accuracy_checker/dump/api_info.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index e179c3a53..31e130908 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -38,10 +38,11 @@ def handle_tensor_extremum_nan_inf(data_clone, operator): return float('nan') data_no_inf = data_no_nan[~torch.isinf(data_no_nan)] if len(data_no_inf) == 0: - return torch._C._VariableFunctionsClass.max(data_no_nan.float()).item() if operator == 'max' else \ - torch._C._VariableFunctionsClass.min(data_no_nan.float()).item() - return torch._C._VariableFunctionsClass.max(data_no_inf.float()).item() if operator == 'max' else \ - torch._C._VariableFunctionsClass.min(data_no_inf.float()).item() + float_data = data_no_nan.float() + else: + float_data = data_no_inf.float() + return torch._C._VariableFunctionsClass.max(float_data).item() if operator == 'max' else \ + torch._C._VariableFunctionsClass.min(float_data).item() def get_type_name(name): -- Gitee From e14762b19abe06c1bd8e91b8a9e6db13e4f87079 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 10:19:32 +0800 Subject: [PATCH 09/22] fix --- .../api_accuracy_checker/compare/compare.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py index addf2996d..64d5dde31 100644 --- a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py +++ b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py @@ -160,7 +160,13 @@ class Comparator: _, api_name, _ = full_api_name.split("*") compare_func = self._compare_dropout if "dropout" in full_api_name else self._compare_core_wrapper fwd_success_status, fwd_compare_alg_results = compare_func(api_name, bench_output, device_output) - bwd_success_status, bwd_compare_alg_results = (CompareConst.SPACE, []) if not (bench_grad and npu_grad) else compare_func(api_name, bench_grad[0], npu_grad[0]) if "dropout" in full_api_name else compare_func(api_name, bench_grad, npu_grad) + if not (bench_grad and npu_grad): + bwd_success_status, bwd_compare_alg_results = (CompareConst.SPACE, []) + else: + if "dropout" in full_api_name: + bwd_success_status, bwd_compare_alg_results = compare_func(api_name, bench_grad[0], npu_grad[0]) + else: + bwd_success_status, bwd_compare_alg_results = compare_func(api_name, bench_grad, npu_grad) self.record_results(full_api_name, fwd_success_status, bwd_success_status if bwd_compare_alg_results is not None else CompareConst.SPACE, fwd_compare_alg_results, bwd_compare_alg_results) return fwd_success_status == CompareConst.PASS, bwd_success_status == CompareConst.PASS or bwd_success_status == CompareConst.SPACE -- Gitee From 0cb2524ebd00289f920191d8fc4823bd44bd5208 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 10:45:24 +0800 Subject: [PATCH 10/22] fix --- debug/accuracy_tools/api_accuracy_checker/dump/api_info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 31e130908..bd532d955 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -33,10 +33,10 @@ def get_tensor_extremum(data, operator): def handle_tensor_extremum_nan_inf(data_clone, operator): - data_no_nan = data_clone[~torch.isnan(data_clone)] + data_no_nan = data_clone[~torch._C._VariableFunctionsClass.isnan(data_clone)] if len(data_no_nan) == 0: return float('nan') - data_no_inf = data_no_nan[~torch.isinf(data_no_nan)] + data_no_inf = data_no_nan[~torch._C._VariableFunctionsClass.isinf(data_no_nan)] if len(data_no_inf) == 0: float_data = data_no_nan.float() else: -- Gitee From 2ae7577bd958e7b65aca7d400df8f6e4ff3be38d Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 11:21:34 +0800 Subject: [PATCH 11/22] fix --- .../api_accuracy_checker/dump/api_info.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index bd532d955..41615f23f 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -33,16 +33,19 @@ def get_tensor_extremum(data, operator): def handle_tensor_extremum_nan_inf(data_clone, operator): - data_no_nan = data_clone[~torch._C._VariableFunctionsClass.isnan(data_clone)] - if len(data_no_nan) == 0: + + data_nan = torch._C._VariableFunctionsClass.isnan(data_clone) + if int(torch._C._VariableFunctionsClass.sum(data_nan)) == data_clone.numel(): return float('nan') - data_no_inf = data_no_nan[~torch._C._VariableFunctionsClass.isinf(data_no_nan)] - if len(data_no_inf) == 0: - float_data = data_no_nan.float() + finite_mask = torch._C._VariableFunctionsClass.isfinite(data_clone) + if int(torch._C._VariableFunctionsClass.sum(finite_mask)) > 0: + finite_values = data_clone[finite_mask] + return torch._C._VariableFunctionsClass.max(finite_values).item() if operator == 'max' else \ + torch._C._VariableFunctionsClass.min(finite_values).item() else: - float_data = data_no_inf.float() - return torch._C._VariableFunctionsClass.max(float_data).item() if operator == 'max' else \ - torch._C._VariableFunctionsClass.min(float_data).item() + data_no_nan = data_clone[~torch._C._VariableFunctionsClass.isnan(data_clone)] + return torch._C._VariableFunctionsClass.max(data_no_nan).item() if operator == 'max' else \ + torch._C._VariableFunctionsClass.min(data_no_nan).item() def get_type_name(name): -- Gitee From b8c9230a48f7740bc4ca3adbf329308bc30936c4 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 11:21:52 +0800 Subject: [PATCH 12/22] fix --- debug/accuracy_tools/api_accuracy_checker/dump/api_info.py | 1 - 1 file changed, 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 41615f23f..672ebe409 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -33,7 +33,6 @@ def get_tensor_extremum(data, operator): def handle_tensor_extremum_nan_inf(data_clone, operator): - data_nan = torch._C._VariableFunctionsClass.isnan(data_clone) if int(torch._C._VariableFunctionsClass.sum(data_nan)) == data_clone.numel(): return float('nan') -- Gitee From ccbf5984809c9dffa70405daca4608f2161307bd Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 14:40:07 +0800 Subject: [PATCH 13/22] fix --- .../accuracy_tools/api_accuracy_checker/dump/api_info.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py index 672ebe409..50ad39166 100644 --- a/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/dump/api_info.py @@ -17,15 +17,15 @@ def get_tensor_extremum(data, operator): return True in data, True in data elif operator == 'min': return False not in data, False not in data - data_clone = data.clone().detach() + data_clone = data.float().clone().detach() if operator == 'max': - max_result = torch._C._VariableFunctionsClass.max(data_clone.float()).item() + max_result = torch._C._VariableFunctionsClass.max(data_clone).item() if np.isinf(max_result) or np.isnan(max_result): return handle_tensor_extremum_nan_inf(data_clone, operator), max_result else: return max_result, max_result else: - min_result = torch._C._VariableFunctionsClass.min(data_clone.float()).item() + min_result = torch._C._VariableFunctionsClass.min(data_clone).item() if np.isinf(min_result) or np.isnan(min_result): return handle_tensor_extremum_nan_inf(data_clone, operator), min_result else: @@ -42,7 +42,7 @@ def handle_tensor_extremum_nan_inf(data_clone, operator): return torch._C._VariableFunctionsClass.max(finite_values).item() if operator == 'max' else \ torch._C._VariableFunctionsClass.min(finite_values).item() else: - data_no_nan = data_clone[~torch._C._VariableFunctionsClass.isnan(data_clone)] + data_no_nan = data_clone[~data_nan] return torch._C._VariableFunctionsClass.max(data_no_nan).item() if operator == 'max' else \ torch._C._VariableFunctionsClass.min(data_no_nan).item() -- Gitee From d0bebbe66a494edcd6fade2fb6c8076c4c7a0b65 Mon Sep 17 00:00:00 2001 From: jiangchangting1 Date: Tue, 2 Apr 2024 07:57:06 +0000 Subject: [PATCH 14/22] update debug/accuracy_tools/api_accuracy_checker/test/resources/forward.json. Signed-off-by: jiangchangting1 --- .../api_accuracy_checker/test/resources/forward.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/test/resources/forward.json b/debug/accuracy_tools/api_accuracy_checker/test/resources/forward.json index 5f54e077b..f938f3524 100644 --- a/debug/accuracy_tools/api_accuracy_checker/test/resources/forward.json +++ b/debug/accuracy_tools/api_accuracy_checker/test/resources/forward.json @@ -1,3 +1,3 @@ { - "Functional*silu*0": {"args": [{"type": "torch.Tensor", "dtype": "torch.float32", "shape": [2, 2560, 24, 24], "Max": 5.7421875, "Min": -5.125, "requires_grad": true}], "kwargs" :{"inplace": {"type": "bool", "value": false}}} + "Functional*silu*0": {"args": [{"type": "torch.Tensor", "dtype": "torch.float32", "shape": [2, 2560, 24, 24], "Max": 5.7421875, "Max_origin": 5.7421875, "Min": -5.125, "Min_origin": -5.125, "requires_grad": true}], "kwargs" :{"inplace": {"type": "bool", "value": false}}} } \ No newline at end of file -- Gitee From 091804d1746c14a71af3c93df79f97a6cf0499ba Mon Sep 17 00:00:00 2001 From: jiangchangting1 Date: Tue, 2 Apr 2024 07:58:06 +0000 Subject: [PATCH 15/22] update debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py. Signed-off-by: jiangchangting1 --- .../test/ut/dump/test_api_info.py | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py index 8951d5523..ca2787b1f 100644 --- a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py @@ -2,6 +2,7 @@ import os import shutil import unittest import torch +import numpy as np from api_accuracy_checker.dump.api_info import APIInfo, ForwardAPIInfo, BackwardAPIInfo, transfer_types, \ get_tensor_extremum, get_type_name, is_builtin_class, analyze_device_in_kwargs, analyze_dtype_in_kwargs from api_accuracy_checker.common.config import msCheckerConfig @@ -55,10 +56,52 @@ class TestAPIInfo(unittest.TestCase): def test_get_tensor_extremum(self): data = torch.tensor([1, 2, 3]) - result_max = get_tensor_extremum(data, 'max') - result_min = get_tensor_extremum(data, 'min') + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') self.assertEqual(result_max, 3) self.assertEqual(result_min, 1) + self.assertEqual(result_max_origin, 3) + self.assertEqual(result_min_origin, 1) + + data = torch.tensor([1, float("inf"), 2, 3]) + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') + self.assertEqual(result_max, 3) + self.assertEqual(result_min, 1) + self.assertEqual(result_max_origin, float("inf")) + self.assertEqual(result_min_origin, 1) + + data = torch.tensor([1, float("-inf"), 2, 3]) + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') + self.assertEqual(result_max, 3) + self.assertEqual(result_min, 1) + self.assertEqual(result_max_origin, 3) + self.assertEqual(result_min_origin, float("-inf")) + + data = torch.tensor([1, float("inf"), float("nan"), 3]) + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') + self.assertEqual(result_max, 3) + self.assertEqual(result_min, 1) + self.assertEqual(np.isnan(result_max_origin), True) + self.assertEqual(np.isnan(result_min_origin), True) + + data = torch.tensor([float("inf"), float("nan")]) + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') + self.assertEqual(result_max, float("inf")) + self.assertEqual(result_min, float("inf")) + self.assertEqual(np.isnan(result_max_origin), True) + self.assertEqual(np.isnan(result_min_origin), True) + + data = torch.tensor([float("nan"), float("nan")]) + result_max, result_max_origin = get_tensor_extremum(data, 'max') + result_min, result_min_origin = get_tensor_extremum(data, 'min') + self.assertEqual(np.isnan(result_max), True) + self.assertEqual(np.isnan(result_min), True) + self.assertEqual(np.isnan(result_max_origin), True) + self.assertEqual(np.isnan(result_min_origin), True) def test_get_type_name(self): name = "" -- Gitee From 72451589dfb00b978bb451fe870a7d93073c40f0 Mon Sep 17 00:00:00 2001 From: jiangchangting1 Date: Tue, 2 Apr 2024 07:59:07 +0000 Subject: [PATCH 16/22] update debug/accuracy_tools/api_accuracy_checker/test/ut/run_ut/test_data_generate.py. Signed-off-by: jiangchangting1 --- .../test/ut/run_ut/test_data_generate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/test/ut/run_ut/test_data_generate.py b/debug/accuracy_tools/api_accuracy_checker/test/ut/run_ut/test_data_generate.py index 3f79ecf17..b98f84d51 100644 --- a/debug/accuracy_tools/api_accuracy_checker/test/ut/run_ut/test_data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/test/ut/run_ut/test_data_generate.py @@ -73,9 +73,12 @@ class TestDataGenerateMethods(unittest.TestCase): def test_gen_common_tensor(self): info = api_info_dict.get('args')[0] low, high = info.get('Min'), info.get('Max') + low_origin, high_origin = info.get('Min_origin'), info.get('Max_origin') + low_info = [low, low_origin] + high_info = [high, high_origin] data_dtype = info.get('dtype') shape = tuple(info.get('shape')) - data = gen_common_tensor(low, high, shape, data_dtype, None) + data = gen_common_tensor(low_info, high_info, shape, data_dtype, None) max_diff = abs(data.max() - max_value) min_diff = abs(data.min() - min_value) self.assertEqual(data.dtype, torch.float32) -- Gitee From 27a298ede36bebef5d513168a4a0e9bc1cbdafb7 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 16:14:10 +0800 Subject: [PATCH 17/22] fix --- .../accuracy_tools/api_accuracy_checker/run_ut/data_generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index e32927527..b082f6d59 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -165,7 +165,7 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): if tensor.nelement() == 0: return tensor tmp_tensor = tensor.reshape(-1) - if math.isnan(high_origin): + if high_origin and math.isnan(high_origin): if tmp_tensor.numel() <= 2: tmp_tensor[0] = float('nan') tmp_tensor[-1] = high -- Gitee From d9ed15d43b8007105e1fa9c916825e83aa69a04c Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 16:19:12 +0800 Subject: [PATCH 18/22] fix --- .../test/ut/dump/test_api_info.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py index ca2787b1f..b779fdee4 100644 --- a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py @@ -84,24 +84,24 @@ class TestAPIInfo(unittest.TestCase): result_min, result_min_origin = get_tensor_extremum(data, 'min') self.assertEqual(result_max, 3) self.assertEqual(result_min, 1) - self.assertEqual(np.isnan(result_max_origin), True) - self.assertEqual(np.isnan(result_min_origin), True) + self.assertEqual(bool(np.isnan(result_max_origin)), True) + self.assertEqual(bool(np.isnan(result_min_origin)), True) data = torch.tensor([float("inf"), float("nan")]) result_max, result_max_origin = get_tensor_extremum(data, 'max') result_min, result_min_origin = get_tensor_extremum(data, 'min') self.assertEqual(result_max, float("inf")) self.assertEqual(result_min, float("inf")) - self.assertEqual(np.isnan(result_max_origin), True) - self.assertEqual(np.isnan(result_min_origin), True) + self.assertEqual(bool(np.isnan(result_max_origin)), True) + self.assertEqual(bool(np.isnan(result_min_origin)), True) data = torch.tensor([float("nan"), float("nan")]) result_max, result_max_origin = get_tensor_extremum(data, 'max') result_min, result_min_origin = get_tensor_extremum(data, 'min') - self.assertEqual(np.isnan(result_max), True) - self.assertEqual(np.isnan(result_min), True) - self.assertEqual(np.isnan(result_max_origin), True) - self.assertEqual(np.isnan(result_min_origin), True) + self.assertEqual(bool(np.isnan(result_max)), True) + self.assertEqual(bool(np.isnan(result_min)), True) + self.assertEqual(bool(np.isnan(result_max_origin)), True) + self.assertEqual(bool(np.isnan(result_min_origin)), True) def test_get_type_name(self): name = "" -- Gitee From 29f46390676691a37aa5264215f29a50fabb3d03 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 17:38:55 +0800 Subject: [PATCH 19/22] fix --- .../test/ut/dump/test_api_info.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py index b779fdee4..2c03d56e7 100644 --- a/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py +++ b/debug/accuracy_tools/api_accuracy_checker/test/ut/dump/test_api_info.py @@ -84,24 +84,24 @@ class TestAPIInfo(unittest.TestCase): result_min, result_min_origin = get_tensor_extremum(data, 'min') self.assertEqual(result_max, 3) self.assertEqual(result_min, 1) - self.assertEqual(bool(np.isnan(result_max_origin)), True) - self.assertEqual(bool(np.isnan(result_min_origin)), True) + self.assertTrue(np.isnan(result_max_origin)) + self.assertTrue(np.isnan(result_min_origin)) data = torch.tensor([float("inf"), float("nan")]) result_max, result_max_origin = get_tensor_extremum(data, 'max') result_min, result_min_origin = get_tensor_extremum(data, 'min') self.assertEqual(result_max, float("inf")) self.assertEqual(result_min, float("inf")) - self.assertEqual(bool(np.isnan(result_max_origin)), True) - self.assertEqual(bool(np.isnan(result_min_origin)), True) + self.assertTrue(np.isnan(result_max_origin)) + self.assertTrue(np.isnan(result_min_origin)) data = torch.tensor([float("nan"), float("nan")]) result_max, result_max_origin = get_tensor_extremum(data, 'max') result_min, result_min_origin = get_tensor_extremum(data, 'min') - self.assertEqual(bool(np.isnan(result_max)), True) - self.assertEqual(bool(np.isnan(result_min)), True) - self.assertEqual(bool(np.isnan(result_max_origin)), True) - self.assertEqual(bool(np.isnan(result_min_origin)), True) + self.assertTrue(np.isnan(result_max)) + self.assertTrue(np.isnan(result_min)) + self.assertTrue(np.isnan(result_max_origin)) + self.assertTrue(np.isnan(result_min_origin)) def test_get_type_name(self): name = "" -- Gitee From 7bec9dbc20be4ff351cb4c0d34f1d2fd25b30a77 Mon Sep 17 00:00:00 2001 From: gitee Date: Tue, 2 Apr 2024 19:02:31 +0800 Subject: [PATCH 20/22] fix --- .../api_accuracy_checker/run_ut/data_generate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index b082f6d59..8c52d6204 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -136,9 +136,9 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): ori_dtype = Const.CONVERT.get(convert_type)[0] if ori_dtype == data_dtype: data_dtype = Const.CONVERT.get(convert_type)[1] + low, low_origin = low_info[0], low_info[1] + high, high_origin = high_info[0], high_info[1] if data_dtype in FLOAT_TYPE: - low, low_origin = low_info[0], low_info[1] - high, high_origin = high_info[0], high_info[1] if math.isnan(high): tensor = torch._C._VariableFunctionsClass.full(shape, float('nan'), dtype=eval(data_dtype)) return tensor -- Gitee From 4d083603d742585bcff82804b43973fc942c321c Mon Sep 17 00:00:00 2001 From: gitee Date: Wed, 3 Apr 2024 09:16:08 +0800 Subject: [PATCH 21/22] fix --- .../accuracy_tools/api_accuracy_checker/run_ut/data_generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py index 8c52d6204..9ff8f5ce0 100644 --- a/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py +++ b/debug/accuracy_tools/api_accuracy_checker/run_ut/data_generate.py @@ -155,7 +155,7 @@ def gen_common_tensor(low_info, high_info, shape, data_dtype, convert_type): scale = high_scale - low_scale rand01 = torch.rand(shape, dtype=eval(data_dtype)) - tensor = rand01 * scale + low + tensor = rand01 * scale + low_scale elif 'int' in data_dtype or 'long' in data_dtype: low, high = int(low), int(high) tensor = torch.randint(low, high + 1, shape, dtype=eval(data_dtype)) -- Gitee From b8559ff2185e02c9d53a26520b9775fc3eecc4d4 Mon Sep 17 00:00:00 2001 From: gitee Date: Wed, 3 Apr 2024 09:18:40 +0800 Subject: [PATCH 22/22] fix --- debug/accuracy_tools/api_accuracy_checker/compare/compare.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py index 64d5dde31..cc7c2c83b 100644 --- a/debug/accuracy_tools/api_accuracy_checker/compare/compare.py +++ b/debug/accuracy_tools/api_accuracy_checker/compare/compare.py @@ -168,7 +168,8 @@ class Comparator: else: bwd_success_status, bwd_compare_alg_results = compare_func(api_name, bench_grad, npu_grad) self.record_results(full_api_name, fwd_success_status, bwd_success_status if bwd_compare_alg_results is not None else CompareConst.SPACE, fwd_compare_alg_results, bwd_compare_alg_results) - return fwd_success_status == CompareConst.PASS, bwd_success_status == CompareConst.PASS or bwd_success_status == CompareConst.SPACE + return fwd_success_status == CompareConst.PASS, bwd_success_status == CompareConst.PASS \ + or bwd_success_status == CompareConst.SPACE def _compare_core_wrapper(self, api_name, bench_output, device_output): detailed_result_total = [] -- Gitee