十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN ops-math Polar 算子 pybind 基线测试框架:从 case 设计到 msprof 性能门禁的完整实践

CANN ops-math Polar 算子 pybind 基线测试框架:从 case 设计到 msprof 性能门禁的完整实践 算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载导读本文围绕 CANN 数学基础算子库ops-math中Polar极坐标复数构造算子的 pybind 基线测试框架展开该框架位于experimental/math/polar/tests/pybind_baseline/用于在 NPU 环境下对自定义 Polar 算子进行正确性验证与性能基线校验。读完本文你将掌握Polar 算子的数学语义与 l0 参考实现sin/cos/mul/complex拼接链的对齐方式、测试框架六个文件的职责划分与调用关系、8 个 case 的广播/边界/性能覆盖设计、msprof计时与get_time.py均值提取的完整流程以及如何新增 case、如何将性能基线从哨兵值回填为真实门禁值。框架定位验证什么对齐什么Polar 算子的功能定义如下out input · (cos(angle) i·sin(angle))input极坐标模长abs与angle幅角弧度均为fp32FLOAT且支持 NumPy 广播input.dim与angle.dim可不一致out为complex64COMPLEX64shape 为input与angle广播后的 shape。该框架的对齐基准是 ops-math 仓中的 l0 拼接版参考实现 math/polar/op_api/aclnn_polar.cpp。从源码可以看到该 aclnn 入口在非 RegBase 平台上正是用 l0 算子拼接实现 Polar 的// math/polar/op_api/aclnn_polar.cpp 中 aclnnPolarGetWorkspaceSize 的核心计算链 auto angleSin l0op::Sin(angleContiguous, uniqueExecutor.get()); auto angleCos l0op::Cos(angleContiguous, uniqueExecutor.get()); auto absSin l0op::Mul(angleSin, inputContiguous, uniqueExecutor.get()); auto absCos l0op::Mul(angleCos, inputContiguous, uniqueExecutor.get()); output l0op::Complex(absCos, absSin, out-GetDataType(), uniqueExecutor.get());即先对angle求sin/cos再分别与input相乘得到虚部/实部最后通过Complex组装出复数并通过l0op::ViewCopy拷贝到非连续的out上。参数检查方面该文件还通过DTYPE_SUPPORT_LIST {DT_FLOAT}、OUTPUT_DTYPE_SUPPORT_LIST {DT_COMPLEX64}约束输入输出类型一致通过OP_CHECK_BROADCAST_AND_INFER_SHAPE约束广播语义、MAX_DIM_LEN 8约束维度上限约束说明 中亦明确维度不超过 8 维。这意味着 pybind 基线测试的输入构造必须覆盖广播fp32→complex64高维这些参考实现同样处理的场景测试才有对齐意义。文件构成与职责框架目录结构与 S8case_910b/Op/完全一致共 6 个文件其中 3 个逐字复用 S8算子无关3 个为 Polar 适配文件来源说明common/pytorch_npu_helper.hpp逐字复用 S8EXEC_NPU_CMD通用胶水算子无关动态 dlopenaclnnPolarsetup.py/get_time.py逐字复用 S8pybind wheel 构建 / msprofop_summary*.csv取 [20:40] 均值extension/custom_op.cppPolar 适配EXEC_NPU_CMD(aclnnPolar, input, angle, result)resultcomplex64、shapebroadcast(input,angle)50 轮供 msprof 取平均test_op.pyPolar 适配8 个 case 复数 verifyview_as_real拆 real/imag 当 fp32rtol/atol1e-4run.shPolar 适配重建 wheel → msprof 计时 → get_time → 基线校验LD 指向custom_mathvendor注与 pybind 目录experimental/math/polar/tests/pybind/相比本pybind_baseline目录的差异仅在common/pytorch_npu_helper.hpp的GetOpApiFuncAddr实现上详见下文基线变体一节。前置准备编译并安装自定义 Polar 算子框架只能在 NPU 环境运行依赖torch_npu本地无法自检——这与 S8 相同。在第一次运行或修改 kernel 后重做以下步骤# 在 ops-math 仓编译并安装自定义 Polar 算子 bash build.sh --pkg --socascend910b --opspolar -j16 # A3: --socascend910_93 ./build_out/cann-ops-math-*linux*.run构建产物会安装到${ASCEND_HOME_PATH}/opp/vendors/custom_math/即算子的 op_api 库libcust_opapi.so与 kernel 实现均落在custom_mathvendor 下。run.sh中正是通过如下 LD 配置让测试进程能找到该 vendor 下的 op_api 动态库# run.sh 中的 vendor 路径注入custom_math 为主customize 兜底 _OPP${ASCEND_OPP_PATH:-${ASCEND_HOME_PATH}/opp} export LD_LIBRARY_PATH$_OPP/vendors/custom_math/op_api/lib/:$_OPP/vendors/customize/op_api/lib/:$LD_LIBRARY_PATH用法一条命令完成重建 wheel → 计时 → 校验cd case_910b/Polar # 即本框架目录 experimental/math/polar/tests/pybind_baseline/ bash run.sh 2 # 跑 case2广播主战场run.sh的完整执行流水线为每次 run 都重建 wheel删除./dist ./build ./custom_ops.egg-info执行python3 setup.py build bdist_wheel再pip3 install dist/custom_ops*.whl --force-reinstall。这样避免上次跑别的 op 留下的 wheel signature 不匹配msprof 计时timeout 180 msprof --applicationpython3 test_op.py $1超时退出码 124即判失败退出提取耗时time_use$(($(python3 get_time.py)))解析 msprof 生成的op_summary*.csv基线校验当前time_base9999999999999为哨兵值仅做正确性门禁time_use0直接报[ERROR] Performance not achieved待硬件实测出 l0 参考实现耗时后回填真实基线输出结论echo Operator performance and accuracy have passed。预期输出为xxx verify result pass!逐 case 打印time_base ... time_use ...。核心实现深读1.extension/custom_op.cppPolar 适配点该文件是唯一需要按算子改写的 pybind 扩展// 关键调用链50 轮重复执行供 msprof 取平均 auto out_shape at::infer_size(input.sizes(), angle.sizes()); // numpy 广播规则推导输出 shape auto round 50; // msprof 取平均重复 50 次 for (size_t i 0; i round; i) { result at::empty(out_shape, input.options().dtype(c10::kComplexFloat)); EXEC_NPU_CMD(aclnnPolar, input, angle, result); } return result;要点at::infer_size(input.sizes(), angle.sizes())在扩展侧按 NumPy 广播规则推导输出 shape与参考实现中的OP_CHECK_BROADCAST_AND_INFER_SHAPE语义对齐输出张量以c10::kComplexFloat创建对应OUTPUT_DTYPE_SUPPORT_LIST的DT_COMPLEX64重复 50 轮使 msprof 能采集到足够多的执行样本供get_time.py取 [20:40] 区间均值对外注册myops.my_op(Tensor input, Tensor angle) - Tensor并绑定PrivateUse1NPU后端实现PYBIND11_MODULE暴露custom_op函数供 Python 侧custom_ops_lib.custom_op(input_npu, angle_npu)调用。2.test_op.py8 个 case 与复数精度比对case 数据通过case_data字典维护新增 case 直接加键即可与 S8 习惯一致键名形如caseN值为{input: np.ndarray(fp32), angle: np.ndarray(fp32)}caseinput shapeangle shape考点1[2,6,10][2,6,10]同 shape 基础2[4,1,8][4,5,8]广播低维→高维新增功能主战场3[1][3,4,5]广播标量 input4[8,1][1,7]广播双向 → [8,7]5[4096,4096][4096,4096]大 shape性能6[3,5,17,269]同高维 inner 非 32B 对齐1076B/行7[1][1]1 元素边界8[64,1024][64,1024]大角度Sin/Cos 范围归约压力case 设计意图与数据细节case 1input取uniform(0,10)、angle取uniform(-3.14,3.14)覆盖常规同 shape 路径case 2[4,1,8] × [4,5,8]input低维向angle高维广播是新增广播功能的主战场case 3input[1]numel1广播到[3,4,5]验证标量输入路径angle范围放大到±6.28case 4[8,1] × [1,7]双向广播到[8,7]input取uniform(-10,10)覆盖负模长case 5[4096,4096]大 shapeinput取uniform(0,100)拉大模长量级用于性能采集case 6[3,5,17,269]高维最后一维 269 使每行 fp32 数据为 1076B非 32B 对齐考验 kernel 的访存/对齐处理case 7input[2.5]、angle[π/4]1 元素边界angle 用np.pi/4便于人工核对out ≈ 2.5·(√2/2 i·√2/2)case 8angle取uniform(-10000,10000)大角度专门施加 Sin/Cos 的范围归约压力。复数结果的 verify 逻辑verify_result是框架的关键设计因为 AscendOpTest 对复数采用拆实虚部当 fp32 比对的同口径这里用torch.view_as_real把 complex64 拆成最后一维为 2real/imag的 fp32 张量再逐元素比对real_f32 torch.view_as_real(real_result.to(torch.complex64)).to(torch.float32) golden_f32 torch.view_as_real(golden.to(torch.complex64)).to(torch.float32) rtol, atol 1e-4, 1e-4比对采用abs_diff atol | rel_diff rtol的宽松判据相对误差分母取max(|real|, |golden|)为 0 时以10e-10兜底并显式容忍双方同为 NaN 的情况。失败时打印前 10 个错误点的索引、NPU 值、CPU golden 值与绝对误差便于定位。golden 由torch.polar生成且先经torch.broadcast_tensors显式广播再 contiguous确保 golden 与广播语义一致a, b torch.broadcast_tensors(t_in, t_ang) return torch.polar(a.contiguous(), b.contiguous()) # complex643.get_time.pymsprof 结果提取与均值遍历当前目录下所有op_summary*.csv取每行Task Duration(us)列转换为纳秒int(float(time_use) * 1000000)后对time_use_list[20:40]求均值并打印。取 [20:40] 区间是为了避开前 20 轮包含首轮初始化、JIT/编译开销、cache 冷启动等异常样本用中间稳定的 20 个样本代表稳态性能。4.setup.pypybind wheel 构建通过torch_npu.utils.cpp_extension.NpuExtension编译./extension/custom_op.cpp为custom_ops_lib扩展并显式追加 torch_npu 安装路径下的 ACL 头文件目录-I torch_npu/include/third_party/acl/inc。wheel 名为custom_opsversion 1.0run.sh用pip3 install dist/custom_ops*.whl --force-reinstall强制重装。5.common/pytorch_npu_helper.hppEXEC_NPU_CMD 与基线变体该头文件是 S8 逐字复用的算子无关胶水层核心是EXEC_NPU_CMD(aclnn_api, ...)宏。它通过GetOpApiFuncAddr动态解析aclnnPolar、aclnnPolarGetWorkspaceSize、InitHugeMemThreadLocal等符号完成GetWorkspaceSize → 申请 workspace → CommonOpExecutorRun三步调用并把参数at::Tensor/at::Scalar等统一ConvertType成 ACL 侧的aclTensor/aclScalar/aclIntArray等句柄运行结束后ReleaseConvertTypes释放。本框架的关键差异点也是pybind_baseline的命名由来在GetOpApiFuncAddr// [BASELINE 变体] 强制只解析系统 libopapi.sol0 参考实现跳过 libcust_opapi.so // 故即使自定义 Polar 已安装本测试调用的也是系统 aclnnPolar l0 拼接参考基线。 static auto opApiHandler GetOpApiLibHandler(GetOpApiLibName()); // libopapi.so即即使自定义 Polar 已安装到custom_mathvendor基线测试也强制只从系统libopapi.so解析aclnnPolar从而保证被测对象始终是l0 拼接参考实现与 math/polar/op_api/aclnn_polar.cpp 形成严格对齐。与之对比experimental/math/polar/tests/pybind/目录下的同名头文件走的是常规解析路径libcust_opapi.so优先用于测自定义实现本身——两套目录一个测自研实现 vs 系统基线一个测自研实现本身的正确性/性能建议结合使用。与 S8 的差异仅构建层维度S8Polar本框架构建方式每算子自带S8/Op/build.shauto_submit.sh直接 build构建走ops-math 仓级build.sh --pkg --opspolar与本测试框架解耦upload/run 阶段auto_submit.sh -o Op直接可用auto_submit.sh -o Polar仍可复用其 upload/run 阶段但 build 阶段需替换为 ops-math 命令待算子工程落地后再接线这是仅构建层的差异测试用例、计时提取、基线校验的编排逻辑与 S8 保持一致只是 Polar 的算子包由 ops-math 仓级构建产出安装到custom_mathvendor而不是由 S8 目录内脚本独立构建。注意事项与基线回填指引精度阈值当前为 fp32rtol/atol1e-4任务要求采用AscendOpTest 默认阈值待 AscendOpTest 工具实际阈值确认后在test_op.py:verify_result回填阈值调整点为rtol, atol 1e-4, 1e-4一处性能基线run.sh:time_base当前为哨兵值9999999999999仅正确性门禁硬件实测出 l0 参考实现耗时后需回填真实基线任务要求自研实现性能 ≥ 基线 95%即time_use time_base / 0.95量级的门禁语义回填点即run.sh中time_base...一处运行环境框架只能在 NPU 环境运行依赖torch_npu、msprof本地无法自检——与 S8 相同每次运行都会重建 wheel 并清理PROF*目录若手动跑python3 test_op.py N单测正确性请先保证 wheel 已安装。小结pybind_baseline目录为 Polar 算子提供了一个与 S8 框架同构、与 l0 参考实现严格对齐的 NPU 测试闭环custom_op.cpp负责以 pybind 扩展形式反复触发aclnnPolartest_op.py用 8 个精心设计的 case同 shape/三种广播形态/大 shape/非对齐高维/边界/大角度覆盖正确性run.sh msprof get_time.py完成性能采样pytorch_npu_helper.hpp的基线变体保证被测对象锁定为系统 l0 拼接版。若要在仓库中继续深入可对照阅读 l0 参考实现、Polar 算子总览含参数表与约束说明、同结构的 pybind 目录 以及 AOT 测试。赞分享算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载相关推荐CANN ops-math AssignSub 算子深度解析从算子定义到 aclnn 调用实践CANN ops math AssignSub 算子深度解析从算子定义到 aclnn 调用实践 导读 AssignSub 是 CANN ops math 数学算子库人工智能CANNCANN ops-math 算子贡献指南从新算子提交到合入的完整流程CANN ops math 算子贡献指南从新算子提交到合入的完整流程 本指南以 CANN ops math 开源数学算子库的 CONTRIBUTING.md算子库人工智能CANNCANN ops-transformer quant_sparse_flash_mla 算子 pytest 测试框架实战指南CANN ops transformer quant_sparse_flash_mla 算子 pytest 测试框架实战指南 本篇技术指南围绕 quant_sp算子库人工智能深度学习Ascend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表