CANN/catlass精度分析基础
精度分析基础【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass写在前面该文档主要说明CATLASS样例开发中精度分析的基础知识包括样例精度的含义、精度比对方式以及如何调用CATLASS已有的Golden函数计算标杆结果并进行精度比对。1. 样例精度的含义在CATLASS算子开发中样例精度指的是NPU上算子实际计算结果与CPU上标杆Golden计算结果之间的一致性程度。精度是衡量算子正确性的核心指标只有精度达标的算子才能用于实际业务场景。精度分析的基本流程为在CPU侧使用相同输入数据以高精度如float甚至double计算理论正确结果称为标杆Golden将NPU侧算子的实际输出与标杆进行比对根据数据类型和计算规模判断误差是否在允许范围内。2. 精度比对方式CATLASS针对不同数据类型采用不同的精度比对策略。2.1 浮点类型相对误差校验对于halffp16、floatfp32、bfloat16等浮点类型由于NPU硬件计算与CPU计算在舍入方式、累加顺序等方面存在差异允许一定的相对误差。比对公式为$$ |actual - expected| \le rtol \times \max(1.0, |expected|) $$其中rtol相对误差容忍度根据计算次数computeNum动态调整计算次数rtol说明 20481/256计算量较小误差累积少容忍度更严格≥ 20481/128计算量较大误差累积多容忍度适当放宽对于bfloat16类型由于尾数位更少、精度更低容忍度进一步放宽计算次数rtol 20481/128≥ 20481/642.2 浮点标杆的升精度计算浮点类型的标杆计算必须采用升精度策略这是保证精度分析可靠性的关键。具体来说即使算子输入/输出为half或bfloat16等低精度类型标杆计算也应使用float甚至double作为累加器类型在ComputeMatmul等Golden函数中每次乘加操作都会将操作数static_castElementGolden通常为float后再计算避免CPU侧因低精度累加引入额外误差标杆结果存储为float类型与NPU输出可能为half比对时NPU输出会先转换为float再参与误差计算。以basic_matmul.cpp为例输入A、B和输出C均为halffp16类型但标杆Golden使用float计算// 输入输出均为 half 类型 std::vectorfp16_t hostA(lenA); std::vectorfp16_t hostB(lenB); std::vectorfp16_t hostC(lenC); // 标杆使用 float 类型进行升精度计算 std::vectorfloat hostGolden(lenC); golden::ComputeMatmul(options.problemShape, hostA, layoutA, hostB, layoutB, hostGolden, layoutC);2.3 整数类型二进制一致性校验对于int32_t等整数类型由于整数运算不存在舍入误差要求NPU输出与标杆完全一致二进制一致。比对时直接检查差值是否为0// int32_t 特化版本要求完全一致 template std::vectoruint64_t CompareData(const std::vectorint32_t result, const std::vectorint32_t expect, uint32_t computeNum) { std::vectoruint64_t errorIndices; for (uint64_t i 0; i result.size(); i) { if (std::abs(static_castint32_t(result[i]) - expect[i]) ! 0) { errorIndices.push_back(i); } } return errorIndices; }2.4 误差指标说明CATLASS还提供了更精细的误差指标ErrorMetrics用于评估NPU输出相对于同精度CPU计算结果的误差比率指标全称含义MAREMax Absolute Relative Error最大绝对相对误差比率NPU / CPUMEREMean Absolute Relative Error平均绝对相对误差比率NPU / CPURMSERoot Mean Squared Error均方根误差比率NPU / CPU这些指标将NPU输出和同精度CPU输出分别与高精度Golden比对计算两者的误差比率。若比率在阈值范围内默认MARE ≤ 5、MERE ≤ 1.5、RMSE ≤ 1.5则认为精度合格。这用于判断NPU计算精度是否与同精度CPU计算处于同一水平。3. CATLASS Golden函数调用CATLASS在examples/common/golden.hpp中提供了统一的Golden函数入口该头文件聚合了以下模块头文件功能golden/fill_data.hpp随机数据生成golden/matmul.hpp矩阵乘标杆计算golden/compare_data.hpp精度比对golden/conv2d.hpp卷积标杆计算使用时只需包含golden.hpp即可#include golden.hpp所有Golden函数位于Catlass::golden命名空间下。3.1 生成随机测试数据FillRandomDataFillRandomData用于生成指定范围内的随机数据支持多种数据类型template class Element, class ElementRandom void FillRandomData(std::vectorElement data, ElementRandom low, ElementRandom high);Element目标数据类型如half、float、int8_t等low/high随机值的上下界使用示例std::vectorfp16_t hostA(lenA); std::vectorfp16_t hostB(lenB); golden::FillRandomDatafp16_t(hostA, -5.0f, 5.0f); // 生成 [-5.0, 5.0] 范围内的随机 half 数据 golden::FillRandomDatafp16_t(hostB, -5.0f, 5.0f);对于int8_t类型有特化实现使用整数随机生成避免浮点转换损失std::vectorint8_t hostA(lenA); golden::FillRandomDataint8_t, int(hostA, -128, 127); // int8_t 使用整数范围3.2 计算标杆结果ComputeMatmulComputeMatmul在CPU侧以升精度方式计算矩阵乘法的理论正确结果templateclass ElementA, class LayoutA, class ElementB, class LayoutB, class ElementGolden, class LayoutGolden void ComputeMatmul( const GemmCoord problemShape, const std::vectorElementA dataA, const LayoutA layoutA, const std::vectorElementB dataB, const LayoutB layoutB, std::vectorElementGolden dataGolden, const LayoutGolden layoutGolden);关键设计模板参数ElementGolden独立于输入类型ElementA/ElementB允许标杆使用更高精度类型。内部累加器类型为ElementGolden每次乘加都通过static_castElementGolden升精度后再计算accumulator static_castElementGolden(dataA[offsetA]) * static_castElementGolden(dataB[offsetB]);使用示例// 输入为 half标杆输出为 float升精度 std::vectorfloat hostGolden(lenC); golden::ComputeMatmul(options.problemShape, hostA, layoutA, hostB, layoutB, hostGolden, layoutC);除ComputeMatmul外Golden模块还提供了其他矩阵运算的标杆函数函数用途ComputeGemm通用矩阵乘含alpha/beta缩放和C矩阵累加ComputeGemv矩阵-向量乘ComputeBatchedMatmul批量矩阵乘ComputeGroupedMatmul分组矩阵乘ComputeGroupGemm分组通用矩阵乘ComputeMatmulElemWiseAdd矩阵乘后Element-Wise加上述标杆函数若不满足业务场景需要开发者也可自行增加新的标杆函数。3.3 精度比对CompareDataCompareData将NPU实际输出与标杆结果进行比对返回错误元素的索引列表templateclass ElementResult, class ElementCompare std::vectoruint64_t CompareData( const std::vectorElementResult result, const std::vectorElementCompare expect, uint32_t computeNum);resultNPU算子实际输出expectCPU标杆计算结果computeNum计算次数通常为K维大小用于动态选择误差阈值返回值错误元素的索引列表为空表示精度通过使用示例std::vectoruint64_t errorIndices golden::CompareData(hostC, hostGolden, k); if (errorIndices.empty()) { std::cout Compare success. std::endl; } else { std::cerr Compare failed. Error count: errorIndices.size() std::endl; }3.4 完整示例以下摘自examples/00_basic_matmul/basic_matmul.cpp展示了一个完整的精度分析流程#include golden.hpp // 1. 生成随机输入数据half 类型 std::vectorfp16_t hostA(lenA); std::vectorfp16_t hostB(lenB); golden::FillRandomDatafp16_t(hostA, -5.0f, 5.0f); golden::FillRandomDatafp16_t(hostB, -5.0f, 5.0f); // 2. 将输入数据拷贝到Device执行NPU算子... // 省略Device侧内存分配、数据拷贝、算子执行等代码 // 3. 将NPU输出拷贝回Host std::vectorfp16_t hostC(lenC); ACL_CHECK(aclrtMemcpy(hostC.data(), sizeC, deviceC, sizeC, ACL_MEMCPY_DEVICE_TO_HOST)); // 4. 计算CPU标杆float 升精度 std::vectorfloat hostGolden(lenC); golden::ComputeMatmul(options.problemShape, hostA, layoutA, hostB, layoutB, hostGolden, layoutC); // 5. 精度比对 std::vectoruint64_t errorIndices golden::CompareData(hostC, hostGolden, k); if (errorIndices.empty()) { std::cout Compare success. std::endl; } else { std::cerr Compare failed. Error count: errorIndices.size() std::endl; }4. 总结CATLASS的精度分析遵循升精度计算标杆 分类型比对的核心原则数据类型标杆计算比对方式误差容忍浮点half/float/bfloat16升精度float/double累加相对误差计算次数 20481/256≥ 20481/128整数int32_t等同精度二进制一致差值必须为0开发者只需包含golden.hpp头文件调用FillRandomData生成测试数据、ComputeMatmul或其他标杆函数计算标杆、CompareData进行比对即可快速完成算子精度验证。【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考