整数计算类算子精度验证
1. 算子定义
定义特征: 输入输出均为整型,包含算术运算
2. 验证方法
比对方法: 单标杆比对(CPU实现)
验证脚本: scripts/integer_compute_check.py
3. 使用示例
from scripts.integer_compute_check import check_integer_compute
# 执行算子
npu_output = run_operator_on_npu() # dtype: int32
golden_output = run_reference_on_cpu() # dtype: int32
# 验证精度
result = check_integer_compute(npu_output, golden_output)
assert result['is_pass'], f"整数计算精度不达标"
4. 通过标准
核心标准: 二进制一致 或 绝对误差为0
4.1 判定条件(满足其一即可)
条件1:二进制一致
is_bitwise_match = np.array_equal(npu_output, golden_output)
条件2:绝对误差为0
is_abs_zero = np.all(np.abs(npu_output - golden_output) == 0)
最终判定:
is_pass = is_bitwise_match or is_abs_zero
4.2 为什么允许绝对误差为0但不二进制一致?
整数计算中,可能存在以下情况:
- 不同位宽整数转换后数值相同但二进制表示不同(如int8的10和int64的10)
- 符号扩展方式不同但数值结果一致
只要数值结果一致(绝对误差为0),即视为通过。
5. 脚本详细使用
5.1 单用例检查
from scripts.integer_compute_check import check_integer_compute
result = check_integer_compute(npu_output, golden_output)
# 返回结果
# {
# 'is_pass': True/False,
# 'bitwise_match': True/False,
# 'abs_error_zero': True/False,
# 'max_abs_error': 0,
# 'mean_abs_error': 0.0,
# 'npu_dtype': 'int32',
# 'golden_dtype': 'int32',
# 'shape': (128, 256)
# }
5.2 批量检查
from scripts.integer_compute_check import check_integer_compute_batch
outputs_list = [
(npu_output1, golden_output1),
(npu_output2, golden_output2),
...
]
summary = check_integer_compute_batch(outputs_list)
# 返回汇总信息
# {
# 'total_cases': 100,
# 'pass_count': 95,
# 'fail_count': 5,
# 'pass_rate': 0.95,
# 'bitwise_match_count': 90, # 二进制一致的用例数
# 'abs_zero_count': 5, # 绝对误差为0的用例数
# 'detail_results': [...]
# }
6. 参考文档
- 详细精度标准:见
golden/COMMERCIAL_OPS_PRECISION_DOCS.md - 测试用例生成:见
test_case_generation.md