mindstudio-probe 8.1.2__py3-none-any.whl → 8.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/METADATA +2 -2
  2. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/RECORD +172 -147
  3. msprobe/README.md +6 -6
  4. msprobe/core/common/const.py +98 -41
  5. msprobe/core/common/db_manager.py +256 -0
  6. msprobe/core/common/file_utils.py +28 -5
  7. msprobe/core/common/log.py +7 -0
  8. msprobe/core/common/megatron_utils.py +59 -0
  9. msprobe/core/common/parallel_state.py +193 -0
  10. msprobe/core/common/utils.py +20 -13
  11. msprobe/core/common_config.py +5 -0
  12. msprobe/core/compare/acc_compare.py +140 -93
  13. msprobe/core/compare/check.py +13 -0
  14. msprobe/core/compare/compare_cli.py +64 -6
  15. msprobe/core/compare/config.py +10 -8
  16. msprobe/core/compare/diff_analyze/diff_analyze_threshold.yaml +14 -0
  17. msprobe/core/compare/diff_analyze/first_diff_analyze.py +135 -0
  18. msprobe/core/compare/diff_analyze/ignore_op_list.yaml +3 -0
  19. msprobe/core/compare/find_first/__init__.py +0 -0
  20. msprobe/core/compare/find_first/analyzer.py +282 -0
  21. msprobe/core/compare/find_first/data_processor.py +35 -0
  22. msprobe/core/compare/find_first/graph.py +188 -0
  23. msprobe/core/compare/find_first/utils.py +189 -0
  24. msprobe/core/compare/highlight.py +74 -101
  25. msprobe/core/compare/layer_mapping/layer_mapping.py +14 -9
  26. msprobe/core/compare/merge_result/merge_result.py +2 -2
  27. msprobe/core/compare/multiprocessing_compute.py +45 -28
  28. msprobe/core/compare/npy_compare.py +7 -10
  29. msprobe/core/compare/utils.py +338 -130
  30. msprobe/core/config_check/checkers/dataset_checker.py +2 -1
  31. msprobe/core/config_check/checkers/env_args_checker.py +5 -5
  32. msprobe/core/config_check/checkers/hyperparameter_checker.py +30 -10
  33. msprobe/core/config_check/checkers/pip_checker.py +4 -3
  34. msprobe/core/config_check/checkers/random_checker.py +3 -3
  35. msprobe/core/config_check/checkers/weights_checker.py +2 -1
  36. msprobe/core/config_check/ckpt_compare/megatron_loader.py +2 -0
  37. msprobe/core/config_check/resource/hyperparameter.yaml +11 -1
  38. msprobe/core/config_check/utils/hyperparameter_parser.py +7 -3
  39. msprobe/core/config_check/utils/utils.py +10 -0
  40. msprobe/core/data_dump/api_registry.py +49 -30
  41. msprobe/core/data_dump/data_collector.py +71 -29
  42. msprobe/core/data_dump/data_processor/base.py +2 -0
  43. msprobe/core/data_dump/data_processor/mindspore_processor.py +47 -53
  44. msprobe/core/data_dump/data_processor/pytorch_processor.py +227 -93
  45. msprobe/core/data_dump/json_writer.py +81 -7
  46. msprobe/core/data_dump/scope.py +4 -6
  47. msprobe/core/hook_manager.py +129 -70
  48. msprobe/core/monitor/csv2db.py +361 -0
  49. msprobe/core/monitor/db_utils.py +278 -0
  50. msprobe/core/monitor/utils.py +35 -1
  51. msprobe/core/service.py +31 -39
  52. msprobe/core/single_save/single_comparator.py +16 -3
  53. msprobe/docs/01.installation.md +51 -19
  54. msprobe/docs/02.config_introduction.md +16 -20
  55. msprobe/docs/03.config_examples.md +26 -0
  56. msprobe/docs/04.kernel_dump_PyTorch.md +1 -1
  57. msprobe/docs/05.data_dump_PyTorch.md +6 -2
  58. msprobe/docs/06.data_dump_MindSpore.md +44 -7
  59. msprobe/docs/07.accuracy_checker_PyTorch.md +1 -1
  60. msprobe/docs/10.accuracy_compare_PyTorch.md +124 -44
  61. msprobe/docs/11.accuracy_compare_MindSpore.md +75 -7
  62. msprobe/docs/14.data_parse_PyTorch.md +1 -1
  63. msprobe/docs/19.monitor.md +94 -7
  64. msprobe/docs/21.visualization_PyTorch.md +71 -101
  65. msprobe/docs/22.visualization_MindSpore.md +69 -119
  66. msprobe/docs/23.generate_operator_PyTorch.md +1 -1
  67. msprobe/docs/25.tool_function_introduction.md +0 -1
  68. msprobe/docs/26.data_dump_PyTorch_baseline.md +7 -7
  69. msprobe/docs/28.debugger_save_instruction.md +184 -81
  70. msprobe/docs/29.data_dump_MSAdapter.md +6 -0
  71. msprobe/docs/31.config_check.md +4 -2
  72. msprobe/docs/36.calculation_result_change.md +75 -0
  73. msprobe/docs/FAQ.md +22 -1
  74. msprobe/docs/data_dump_MindSpore/dynamic_graph_quick_start_example.md +6 -2
  75. msprobe/docs/img/compare_result.png +0 -0
  76. msprobe/docs/img/visualization/vis_browser_1.png +0 -0
  77. msprobe/docs/img/visualization/vis_match_info.png +0 -0
  78. msprobe/docs/img/visualization/vis_precision_info.png +0 -0
  79. msprobe/docs/img/visualization/vis_search_info.png +0 -0
  80. msprobe/docs/img/visualization/vis_show_info.png +0 -0
  81. msprobe/docs/img/visualization/vis_showcase.png +0 -0
  82. msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
  83. msprobe/docs/visualization/mindspeed_llamafactoary_img/1.png +0 -0
  84. msprobe/docs/visualization/mindspeed_llamafactoary_img/2.png +0 -0
  85. msprobe/docs/visualization/mindspeed_llamafactoary_img/3.png +0 -0
  86. msprobe/docs/visualization/mindspeed_llamafactoary_img/4.png +0 -0
  87. msprobe/docs/visualization/mindspeed_llamafactoary_img/5.png +0 -0
  88. msprobe/docs/visualization/mindspeed_llamafactoary_img/6.png +0 -0
  89. msprobe/docs/visualization/mindspeed_llamafactoary_img/7.png +0 -0
  90. msprobe/docs/visualization/mindspeed_llamafactoary_img/llamafactory-qwen25vl.txt +59 -0
  91. msprobe/docs/visualization/mindspeed_llamafactoary_img/llamafactory1.png +0 -0
  92. msprobe/docs/visualization/mindspeed_llamafactoary_img/llamafactory2.png +0 -0
  93. msprobe/docs/visualization/mindspeed_llamafactoary_img/mindspeed-mm-qwen25vl.txt +80 -0
  94. msprobe/docs/visualization/mindspeed_llamafactoary_img/mindspeed1.png +0 -0
  95. msprobe/docs/visualization/mindspeed_llamafactoary_img/mindspeed2.png +0 -0
  96. msprobe/docs/visualization/mindspeed_llamafactory_mapping.md +330 -0
  97. msprobe/mindspore/__init__.py +1 -1
  98. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +1 -1
  99. msprobe/mindspore/api_accuracy_checker/api_runner.py +9 -6
  100. msprobe/mindspore/api_accuracy_checker/compute_element.py +18 -12
  101. msprobe/mindspore/cell_processor.py +64 -25
  102. msprobe/mindspore/common/utils.py +51 -7
  103. msprobe/mindspore/compare/common_dir_compare.py +45 -37
  104. msprobe/mindspore/compare/ms_compare.py +10 -2
  105. msprobe/mindspore/compare/ms_graph_compare.py +47 -52
  106. msprobe/mindspore/debugger/debugger_config.py +18 -7
  107. msprobe/mindspore/debugger/precision_debugger.py +16 -12
  108. msprobe/mindspore/dump/cell_dump_process.py +130 -68
  109. msprobe/mindspore/dump/cell_dump_with_insert_gradient.py +10 -2
  110. msprobe/mindspore/dump/graph_mode_cell_dump.py +35 -9
  111. msprobe/mindspore/dump/graph_tensor_dump.py +11 -0
  112. msprobe/mindspore/dump/hook_cell/api_register.py +19 -20
  113. msprobe/mindspore/dump/hook_cell/hook_cell.py +12 -34
  114. msprobe/mindspore/dump/hook_cell/ms_hook_manager.py +142 -21
  115. msprobe/mindspore/dump/kernel_kbyk_dump.py +24 -0
  116. msprobe/mindspore/exception_dump/__init__.py +0 -0
  117. msprobe/mindspore/exception_dump/exception_dump_tool_factory.py +51 -0
  118. msprobe/mindspore/exception_dump/kernel_graph_exception_dump.py +57 -0
  119. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +5 -4
  120. msprobe/mindspore/mindspore_service.py +2 -2
  121. msprobe/mindspore/mindtorch/mindtorch_adaptor.py +12 -7
  122. msprobe/mindspore/monitor/features.py +82 -0
  123. msprobe/mindspore/monitor/module_hook.py +168 -10
  124. msprobe/mindspore/monitor/utils.py +27 -1
  125. msprobe/mindspore/ms_config.py +12 -4
  126. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +1 -1
  127. msprobe/mindspore/task_handler_factory.py +3 -1
  128. msprobe/nan_analyze/graph.py +1 -1
  129. msprobe/pytorch/api_accuracy_checker/common/config.py +3 -36
  130. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +0 -24
  131. msprobe/pytorch/api_accuracy_checker/compare/compare.py +2 -12
  132. msprobe/pytorch/api_accuracy_checker/config.yaml +1 -6
  133. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +2 -2
  134. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +12 -132
  135. msprobe/pytorch/common/utils.py +1 -21
  136. msprobe/pytorch/compare/pt_compare.py +10 -2
  137. msprobe/pytorch/{hook_module/jit_script_wrapper.py → compare/pt_diff_analyze.py} +3 -15
  138. msprobe/pytorch/compare/utils.py +2 -1
  139. msprobe/pytorch/debugger/debugger_config.py +18 -23
  140. msprobe/pytorch/dump/module_dump/hook_wrapper.py +10 -7
  141. msprobe/pytorch/dump/module_dump/module_processer.py +41 -19
  142. msprobe/pytorch/free_benchmark/main.py +7 -4
  143. msprobe/pytorch/hook_module/api_register.py +62 -24
  144. msprobe/pytorch/hook_module/hook_module.py +9 -29
  145. msprobe/pytorch/hook_module/pt_hook_manager.py +84 -15
  146. msprobe/pytorch/hook_module/script_wrapper.py +140 -0
  147. msprobe/pytorch/hook_module/support_wrap_ops.yaml +6 -0
  148. msprobe/pytorch/monitor/csv2tb.py +1 -1
  149. msprobe/pytorch/monitor/features.py +94 -0
  150. msprobe/pytorch/monitor/module_hook.py +221 -81
  151. msprobe/pytorch/monitor/module_metric.py +27 -1
  152. msprobe/pytorch/monitor/optimizer_collect.py +109 -4
  153. msprobe/pytorch/online_dispatch/dispatch.py +42 -24
  154. msprobe/pytorch/online_dispatch/dump_compare.py +1 -1
  155. msprobe/pytorch/parse_tool/lib/visualization.py +0 -1
  156. msprobe/pytorch/pt_config.py +2 -51
  157. msprobe/pytorch/pytorch_service.py +7 -14
  158. msprobe/visualization/builder/graph_builder.py +192 -63
  159. msprobe/visualization/builder/graph_merger.py +986 -0
  160. msprobe/visualization/builder/msprobe_adapter.py +17 -15
  161. msprobe/visualization/compare/graph_comparator.py +26 -16
  162. msprobe/visualization/db_utils.py +252 -0
  163. msprobe/visualization/graph/base_node.py +2 -22
  164. msprobe/visualization/graph/distributed_analyzer.py +12 -12
  165. msprobe/visualization/graph/graph.py +44 -16
  166. msprobe/visualization/graph_service.py +143 -59
  167. msprobe/visualization/utils.py +103 -4
  168. msprobe/docs/08.accuracy_checker_online_PyTorch.md +0 -295
  169. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +0 -205
  170. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +0 -378
  171. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +0 -239
  172. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/dump_dispatch.py +0 -115
  173. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +0 -250
  174. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/torch_ops_config.yaml +0 -63
  175. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/utils.py +0 -198
  176. msprobe/pytorch/attl_manager.py +0 -65
  177. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/LICENSE +0 -0
  178. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/WHEEL +0 -0
  179. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/entry_points.txt +0 -0
  180. {mindstudio_probe-8.1.2.dist-info → mindstudio_probe-8.2.1.dist-info}/top_level.txt +0 -0
  181. /msprobe/{pytorch/api_accuracy_checker/tensor_transport_layer → core/compare/diff_analyze}/__init__.py +0 -0
@@ -52,16 +52,20 @@ def _ms_graph_handle_multi_process(func, result_df, mode):
52
52
 
53
53
  def err_call(args):
54
54
  logger.error('multiprocess compare failed! Reason: {}'.format(args))
55
- try:
56
- pool.close()
57
- except OSError as e:
58
- logger.error(f'pool terminate failed: {str(e)}')
59
55
 
60
56
  for df_chunk in df_chunks:
61
57
  result = pool.apply_async(func, args=(df_chunk, mode), error_callback=err_call)
62
58
  results.append(result)
63
- final_results = [r.get() for r in results]
59
+
64
60
  pool.close()
61
+
62
+ try:
63
+ final_results = [r.get(timeout=3600) for r in results]
64
+ except Exception as e:
65
+ logger.error(f"Task failed with exception: {e}")
66
+ pool.terminate()
67
+ raise CompareException(CompareException.MULTIPROCESS_ERROR) from e
68
+
65
69
  pool.join()
66
70
  return pd.concat(final_results, ignore_index=True)
67
71
 
@@ -94,8 +98,8 @@ class CompareRealData:
94
98
  @staticmethod
95
99
  def read_dump_data(result_df):
96
100
  try:
97
- npu_dump_name_list = result_df.iloc[0:, 0].tolist()
98
- dump_tensor_pair_list = result_df.iloc[0:, -1].tolist()
101
+ npu_dump_name_list = result_df.loc[0:, CompareConst.NPU_NAME].tolist()
102
+ dump_tensor_pair_list = result_df.loc[0:, CompareConst.DATA_NAME].tolist()
99
103
  op_name_mapping_dict = {}
100
104
  for index, npu_dump_name in enumerate(npu_dump_name_list):
101
105
  dump_tensor_pair = dump_tensor_pair_list[index]
@@ -104,9 +108,9 @@ class CompareRealData:
104
108
  except ValueError as e:
105
109
  logger.error('result dataframe is not found.')
106
110
  raise CompareException(CompareException.INVALID_DATA_ERROR) from e
107
- except IndexError as e:
111
+ except KeyError as e:
108
112
  logger.error('result dataframe elements can not be access.')
109
- raise CompareException(CompareException.INDEX_OUT_OF_BOUNDS_ERROR) from e
113
+ raise CompareException(CompareException.INVALID_KEY_ERROR) from e
110
114
 
111
115
  @staticmethod
112
116
  def _save_cmp_result(offset, result: ComparisonResult, result_df, lock):
@@ -136,7 +140,7 @@ class CompareRealData:
136
140
  result.five_thousand_err_ratio_result)[i]
137
141
  result_df.loc[process_index, CompareConst.ACCURACY] = (
138
142
  check_accuracy(result.cos_result[i], result.max_err_result[i]))
139
- result_df.loc[process_index, CompareConst.ERROR_MESSAGE] = result.err_msgs[i]
143
+ result_df.loc[process_index, CompareConst.ERROR_MESSAGE] += result.err_msgs[i]
140
144
  return result_df
141
145
  except ValueError as e:
142
146
  logger.error('result dataframe is not found.')
@@ -157,20 +161,23 @@ class CompareRealData:
157
161
  用于读取excel中的NPU_Name和Bench_Name,根据映射关系找到npy或pt文件,然后读取文件中的数据进行比较,计算余弦相似度、欧式距离
158
162
  最大绝对误差、最大相对误差、千分之一误差率、千分之五误差率并生成错误信息
159
163
  """
160
- error_file, relative_err, error_flag = None, None, False
164
+ relative_err, error_flag, err_msg = None, False, None
161
165
 
162
166
  data_name_pair = op_name_mapping_dict.get(npu_op_name)
163
167
  npu_data_name = data_name_pair[0]
164
168
  bench_data_name = data_name_pair[1]
165
169
 
170
+ error_file = data_name_pair
171
+
166
172
  if str(npu_data_name) == CompareConst.NO_REAL_DATA_FLAG: # 没有npu真实数据
167
- n_value, b_value, error_flag = CompareConst.READ_NONE, CompareConst.READ_NONE, True
173
+ n_value, b_value, error_flag = CompareConst.NO_REAL_DATA, CompareConst.NO_REAL_DATA, True
174
+ err_msg = "NPU does not have data file."
168
175
  elif str(bench_data_name) == CompareConst.NO_REAL_DATA_FLAG: # 没有bench真实数据
169
- n_value, b_value, error_flag = CompareConst.READ_NONE, CompareConst.READ_NONE, True
170
- error_file = 'no_bench_data'
176
+ n_value, b_value, error_flag = CompareConst.NO_REAL_DATA, CompareConst.NO_REAL_DATA, True
177
+ err_msg = "Bench does not have data file."
171
178
  elif str(bench_data_name) == CompareConst.N_A: # bench没匹配
172
- n_value, b_value, error_flag = CompareConst.READ_NONE, CompareConst.READ_NONE, True
173
- error_file = None
179
+ n_value, b_value, error_flag = CompareConst.API_UNMATCH, CompareConst.API_UNMATCH, True
180
+ err_msg = "Bench api/module unmatched."
174
181
  else:
175
182
  npu_dir = input_param.get(CompareConst.NPU_DUMP_DATA_DIR)
176
183
  bench_dir = input_param.get(CompareConst.BENCH_DUMP_DATA_DIR)
@@ -187,8 +194,9 @@ class CompareRealData:
187
194
  error_flag = True
188
195
 
189
196
  # 通过n_value, b_value同时得到错误标志和错误信息
190
- n_value, b_value, error_flag, err_msg = get_error_flag_and_msg(n_value, b_value,
191
- error_flag=error_flag, error_file=error_file)
197
+ if not err_msg:
198
+ n_value, b_value, error_flag, err_msg = get_error_flag_and_msg(n_value, b_value, error_flag=error_flag,
199
+ error_file=error_file)
192
200
 
193
201
  result_list, err_msg = compare_ops_apply(n_value, b_value, error_flag, err_msg)
194
202
 
@@ -218,11 +226,17 @@ class CompareRealData:
218
226
  = self.compare_by_op(npu_op_name, bench_op_name, dump_path_dict, input_param)
219
227
 
220
228
  if is_print_compare_log:
221
- logger.info(
222
- "[{}] Compare result: cosine {}, max_abs_err {}, max_relative_err {}, {}, \
223
- one_thousand_err_ratio {}, "
224
- "five_thousand_err_ratio {}".format(npu_op_name, cos_sim, max_abs_err, max_relative_err,
225
- err_msg, one_thousand_err_ratio, five_thousand_err_ratio))
229
+ if "does not have data file" in err_msg:
230
+ logger.info(f"[{npu_op_name}] Compare result: {err_msg} ")
231
+ elif "Bench api/module unmatched" in err_msg:
232
+ logger.info(f"[{npu_op_name}] Compare result: {err_msg} ")
233
+ else:
234
+ logger.info(
235
+ f"[{npu_op_name}] Compare result: cosine {cos_sim}, euc_dist {euc_dist}, "
236
+ f"max_abs_err {max_abs_err}, max_relative_err {max_relative_err}, "
237
+ f"one_thousand_err_ratio {one_thousand_err_ratio}, "
238
+ f"five_thousand_err_ratio {five_thousand_err_ratio}, {err_msg}"
239
+ )
226
240
  cos_result.append(cos_sim)
227
241
  euc_dist_result.append(euc_dist)
228
242
  max_err_result.append(max_abs_err)
@@ -267,10 +281,6 @@ class CompareRealData:
267
281
 
268
282
  def err_call(args):
269
283
  logger.error('multiprocess compare failed! Reason: {}'.format(args))
270
- try:
271
- pool.close()
272
- except OSError:
273
- logger.error("pool terminate failed")
274
284
 
275
285
  progress_bar = tqdm(total=len(result_df), desc="API/Module Item Compare Process", unit="row", ncols=100)
276
286
 
@@ -288,7 +298,14 @@ class CompareRealData:
288
298
  )
289
299
  results.append(result)
290
300
 
291
- final_results = [r.get() for r in results]
292
301
  pool.close()
302
+
303
+ try:
304
+ final_results = [r.get(timeout=3600) for r in results]
305
+ except Exception as e:
306
+ logger.error(f"Task failed with exception: {e}")
307
+ pool.terminate()
308
+ raise CompareException(CompareException.MULTIPROCESS_ERROR) from e
309
+
293
310
  pool.join()
294
311
  return pd.concat(final_results, ignore_index=True)
@@ -56,13 +56,7 @@ def get_error_flag_and_msg(n_value, b_value, error_flag=False, error_file=None):
56
56
  """判断数据是否有异常并返回异常的n_value, b_value,同时返回error_flag和error_msg"""
57
57
  err_msg = ""
58
58
  if error_flag:
59
- if error_file == "no_bench_data":
60
- err_msg = "Bench does not have data file."
61
- elif error_file:
62
- err_msg = f"Dump file: {error_file} not found or read failed."
63
- else:
64
- err_msg = CompareConst.NO_BENCH
65
- error_flag = True
59
+ err_msg = f"Dump file: {error_file} not found or read failed."
66
60
  return CompareConst.READ_NONE, CompareConst.READ_NONE, error_flag, err_msg
67
61
 
68
62
  if n_value.size == 0: # 判断读取到的数据是否为空
@@ -177,8 +171,10 @@ class TensorComparisonBasic(abc.ABC):
177
171
  def get_relative_err(n_value, b_value):
178
172
  """计算相对误差"""
179
173
  with np.errstate(divide='ignore', invalid='ignore'):
174
+ if n_value.dtype not in CompareConst.FLOAT_TYPE:
175
+ n_value = n_value.astype(float)
180
176
  if b_value.dtype not in CompareConst.FLOAT_TYPE:
181
- n_value, b_value = n_value.astype(float), b_value.astype(float)
177
+ b_value = b_value.astype(float)
182
178
 
183
179
  n_value_copy = n_value.copy()
184
180
  b_value_copy = b_value.copy()
@@ -290,7 +286,8 @@ class CompareOps:
290
286
 
291
287
 
292
288
  def error_value_process(n_value):
293
- if n_value in [CompareConst.READ_NONE, CompareConst.UNREADABLE, CompareConst.NONE]:
289
+ if n_value in [CompareConst.READ_NONE, CompareConst.UNREADABLE, CompareConst.NONE,
290
+ CompareConst.NO_REAL_DATA, CompareConst.API_UNMATCH]:
294
291
  return CompareConst.UNSUPPORTED, ""
295
292
  if n_value == CompareConst.SHAPE_UNMATCH:
296
293
  return CompareConst.SHAPE_UNMATCH, ""
@@ -304,7 +301,7 @@ def compare_ops_apply(n_value, b_value, error_flag, err_msg):
304
301
  if error_flag:
305
302
  result, msg = error_value_process(n_value)
306
303
  result_list = [result] * len(CompareOps.compare_ops)
307
- err_msg += msg * len(CompareOps.compare_ops)
304
+ err_msg += msg
308
305
  return result_list, err_msg
309
306
 
310
307
  relative_err = get_relative_err(n_value, b_value)