尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN ops-math Polar 算子昇腾 NPU 测试验收实战指南:仓内构建、部署与全链路精度/性能验证

CANN ops-math Polar 算子昇腾 NPU 测试验收实战指南:仓内构建、部署与全链路精度/性能验证 算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载本篇技术指南完整讲解 CANN ops-math 仓库中 Polar 算子在昇腾 NPUAtlas A2/A3环境下的测试验收流程涵盖从 ops-math 仓内构建部署、官方 AscendOpTest 精度验收、pybind 框架功能验证、l0 参考实现性能基线对比到 standalone aclnn 两段式调用冒烟测试的完整链路。读完本文你将掌握 Polar 算子out input·(cos(angle) i·sin(angle))在真实 NPU 环境中的一键复现方法、精度判据细节与性能验收口径可直接用于昇腾算子开发与验收实践。Polar 算子背景与测试总体框架Polar 算子由极坐标模长abs与幅角angle构造复数张量对应 PyTorch 接口torch.polar(abs, angle)是 CANN ops-math 仓库数学类算子库experimental/math/polar中的新贡献算子。它源自昇腾 CANN 训练营社区任务基于 Ascend C 将参考实现的约 6 个串接 l0 设备算子Contiguous → Sin → Cos → Mul → Mul → Complex → ViewCopy融合为单 kernel并在融合过程中原生新增 NumPy 广播支持。从功能规格看见 README.md 与 design.md输入inputfloat32ND 格式极坐标模长分量输入anglefloat32ND 格式极坐标幅角弧度dtype 必须与 input 一致输出outcomplex64ND 格式shape 为 input 与 angle 广播后的 shapereal/imag交替存储约束input 与 angle 维度数均不超过 8 维且满足 NumPy 广播关系不支持 fp16/bf16/fp64/complex128。该算子在 polar_def.cpp 中通过AICore().AddConfig(ascend910b)与AddConfig(ascend910_93)同时注册 Atlas A2 / Atlas A3 两套 SoC 配置这也是测试文档中须在 Atlas A2/A3910B4环境操作的根源。围绕该算子仓库内共沉淀了五层测试交付物本文按官方测试步骤指导experimental/math/polar/tests/测试步骤指导.md的脉络逐一展开层次目录/文件作用仓内构建build.sh --opspolar编译生成.run部署包官方精度验收tests/aot/tests/Polar.jsonAscendOpTest 6 用例权威判据功能验证tests/pybind/torch_npu 下 16 case 广播/边界覆盖性能基线tests/pybind_baseline/l0 参考实现同构对比冒烟测试examples/test_aclnn_polar.cppstandalone aclnn 两段式调用约定$OPSMATH表示 ops-math 仓根目录含本算子experimental/math/polar/$POLAR表示$OPSMATH/experimental/math/polar。环境前置所有测试共用的 NPU 环境准备本文档所有测试本地无 NPU 无法运行须在 Atlas A2/A3910B4环境ModelArts notebook / Developer Space操作。进入环境后先完成统一的环境配置source /home/ma-user/Ascend/cann-8.5.0/set_env.sh # 路径以实际环境为准 export PATH/home/ma-user/gcc/bin:$PATH # 如已配可跳过 export LD_LIBRARY_PATH/home/ma-user/gcc/lib64:$LD_LIBRARY_PATH这三步分别完成昇腾 CANN 运行环境变量注入ASCEND_HOME_PATH、LD_LIBRARY_PATH等、自定义 gcc 工具链置顶、gcc 动态库路径补充。后续所有构建、部署、测试命令都依赖该前置环境。在 ops-math 仓内构建并部署 Polar 算子Polar 算子已按 ops-mathexperimental/math约定集成随仓build.sh构建。由于算子原型polar_def.cpp同时注册了 Atlas A2ascend910b与 Atlas A3ascend910_93两套配置构建时通过--soc参数选择目标二进制cd $OPSMATH # Atlas A2 训练系列产品 (ascend910b) bash build.sh --pkg --socascend910b --opspolar --experimental --vendor_namecustomize -j16 -O3 # Atlas A3 训练系列产品 (ascend910_93)二选一即可亦可分别 build 各自的 .run # bash build.sh --pkg --socascend910_93 --opspolar --experimental --vendor_namecustomize -j16 -O3 ./build_out/*.run --quiet # 安装到 $ASCEND_HOME_PATH/opp/vendors/customize_math/构建参数说明--pkg打包生成可安装的.run部署包--socascend910b/--socascend910_93选择 Atlas A2 / Atlas A3 SoC 目标--opspolar仅构建 Polar 算子--experimental启用 experimental 目录下的实验算子构建--vendor_namecustomize指定 vendor 名注意ops-math build强制 vendor 名为customize_math与--vendor_name无关-j16 -O3并行编译与优化级别。安装完成后必须使部署的算子生效否则后续解析不到自定义实现这是最容易踩的坑source $ASCEND_HOME_PATH/opp/vendors/customize_math/bin/set_env.bash 2/dev/null || true export LD_LIBRARY_PATH$ASCEND_HOME_PATH/opp/vendors/customize_math/op_api/lib:$LD_LIBRARY_PATH关于部署产物有一点需要特别说明aclnn 接口aclnn_polar.haclnnPolar/aclnnPolarGetWorkspaceSize符号由 build 从 OpDef 自动生成并装入该 vendor 的op_api/目录因此无需手写接口注册逻辑。从源码实现看构建出的算子整体为Host 侧 Kernel 侧两层结构见 design.md 详细设计章节Host 侧polar_infershape.cpp、polar_tiling.cppInferShape按 NumPy 广播规则右对齐推导输出 shape逐轴取 max对齐参考实现的OP_CHECK_BROADCAST_AND_INFER_SHAPEInferDataType将输出恒置DT_COMPLEX64Tiling 计算广播 shape/stride、分核策略与数据分块参数下发Kernel 侧op_kernel/polar.cpp单 kernel 内完成Init Process三段式CopyIn → Compute → CopyOutCos/SinMul×2复数交织全部在 UB 内链式完成中间结果驻留片上仅 2 次 GM↔UB 搬运复数交织采用Gather 静态偏移表方案off[j]4·(j1)(j1)·4T规避了 910B vector 不支持 complex64 及Transpose/vintlv/stridedDataCopyPad等方案的约束。该步骤已在 Atlas A2910B4NPU 实测通过2026-05-19构建通过 官方 AscendOpTest 6/6 全 PASS与原 msopgen 产物精度一致、重构零回归。Atlas A3ascend910_93通过同一份 OpDef Kernel 同源构建得到对应.run包kernel 与 host tiling 不含任何平台分支grep 校验过构建产物结构与 A2 一致。官方 AscendOpTest 精度验收权威精度判据优先执行这是任务书指定的权威精度判据必须优先运行。步骤分为用例准备与执行两阶段pip install ml_dtypes cd $POLAR/tests git clone https://gitcode.com/HIT1920/AscendOpTest.git cd AscendOpTest # 修正用例 expect_func 绝对路径 → 指向本仓 polar_golden.py保留 :polar 函数名后缀 sed -i s#\expect_func\: \.*polar_golden.py:polar\#\expect_func\: \$POLAR/tests/aot/polar_golden.py:polar\#g \ $POLAR/tests/aot/polar_cases.json python run_test.py \ -i $POLAR/tests/Polar.json \ -c $POLAR/tests/aot/polar_cases.json \ --op-type custom --op-path $ASCEND_HOME_PATH/opp/vendors/customize_math/op_api --build关键点解释-i $POLAR/tests/Polar.json算子描述文件Polar.json声明 Polar 的 input/angle 为 ND-float、out 为 ND-complex64与 OpDef 原型保持一致-c $POLAR/tests/aot/polar_cases.json用例描述文件polar_cases.json内置 6 个用例Test_same_small、Test_same_16M、Test_bcast_lowhigh、Test_bcast_scalar、Test_bcast_2way、Test_highdim_unalign预期全 PASS含 16Msed修正行因为 case 文件中的expect_func原本指向绝对路径需重定向到本仓的 polar_golden.py保留:polar函数名后缀--op-type custom --op-path .../customize_math/op_api指定自定义算子及 op_api 库路径。精度判据细节务必理解这是验收结论成立的依据complex64 在 AscendOpTestaccuracy_config无内置默认值因此每个output_desc显式配置了err_threshold:[0.0001,0.0001]compare_complex判定方式为实部/虚部各自纯绝对误差 ≤ 1e-4无相对误差回退错误元素数超过size×1e-4即判失败。CPU 基准实现polar_golden.py与算子数学定义完全一致先np.broadcast_arrays对齐 input 与 angle再计算a * (np.cos(th) 1j * np.sin(th))并转为 complex64 输出。这一 golden 同时约束了参数名/顺序须与Polar.json的input_desc一致、返回值须为 complex64 的 numpy 数组。6 个用例覆盖了精度验收的核心场景矩阵用例input shapeangle shape验证点Test_same_small[2,6,10][2,6,10]同 shape 基础小张量Test_same_16M[4096,4096][4096,4096]16M 元素大规模所有核参与Test_bcast_lowhigh[4,1,8][4,5,8]广播低维→高维Test_bcast_scalar[1][3,4,5]广播标量 input × 高维 angleTest_bcast_2way[8,1][1,7]双向广播 → [8,7]Test_highdim_unalign[3,5,17,269]同高维 inner 非 32B 对齐性能测量msprof复用已 build 工程不再加--buildpython run_test.py -i $POLAR/tests/Polar.json -c $POLAR/tests/aot/polar_cases.json \ --op-type custom --op-path $ASCEND_HOME_PATH/opp/vendors/customize_math/op_api --msprof性能统计口径聚合每用例op_summary*.csv的Task Duration 每调用设备时与自测报告口径一致。pybind 测试框架16 case 功能与广播泛化验证pybind 测试框架tests/pybind/依赖torch_npu算子须已按上述 §1 步骤完成部署。框架构成与 case 覆盖详见其 README.mdcommon/pytorch_npu_helper.hpp提供EXEC_NPU_CMD通用胶水动态 dlopenaclnnPolarextension/custom_op.cpp封装EXEC_NPU_CMD(aclnnPolar, input, angle, result)test_op.py内置 8 个基础 case 并做复数 verifyview_as_real拆 real/imag 当 fp32rtol/atol1e-4。运行方式cd $POLAR/tests/pybind bash run.sh 1 # 同 shape 基础 bash run.sh 2 # 广播 低→高新增功能主战场 # case 列表见本目录 README.md / test_op.py 的 case_data运行成功输出xxx verify result pass!time_base... time_use...。其中verify_result与官方compare_complex逐行等价实/虚部纯绝对误差 1e-4保证两套框架判据一致、结论可互证。pybind 共覆盖16 个 case基础 8 个case1–8 泛化交叉 8 个case9–16。基础 case 覆盖同 shape 小张量、低维→高维广播、标量 input、双向广播、16M 大 shape、高维非对齐、1 元素边界、大角度场景case9–16 为泛化交叉重点覆盖新增广播能力与边界条件8D 满秩同形高维5D 中间轴广播双向多轴广播标量 × 高维负 abs大角度归约Sin/Cos 范围归约压力非 32B 对齐 广播组合大向量 × 标量新增 case 只需在test_op.py的case_data中加键即可与社区 S8 测试框架习惯一致。l0 参考实现性能基线对比性能验收的核心口径是所有核参与场景 ≥ 基线 95%。基线来自 l0 参考实现开源仓math/complex/op_host/op_api/aclnn_polar.cpp的拼接实现其测量框架位于 tests/pybind_baseline/与 pybind 框架同构唯一差异在其common/pytorch_npu_helper.hpp强制GetOpApiFuncAddr只解析系统libopapi.sol0 参考不触碰任何共享 vendor 目录从而保证测的是系统基线而非自定义实现cd $POLAR/tests/pybind_baseline bash run.sh 5 # 同 case 在 l0 参考上的耗时 性能基线用 §3/§2 本算子耗时与该基线对比即得加速比。仓库实测数据来自 design.md 可维可测分析AscendOpTest msprof / 每调用设备时场景l0 基线本算子结论小 [2,6,10]14.25 µs12.52 µs更快 ✓16M [4096,4096]所有核1665 µs937.98 µs快 1.78×核心验收达标广播 [4,1,8]×[4,5,8]15.17 µs14.92 µs更快 ✓全场景优于 l0 参考远超 ≥95% 的要求。加速来源即前文所述的单 kernel 融合kernel 启动从约 6 次降为 1 次GM↔UB 搬运从 ≥10 次降为 2 次且 angle 一次读入后 cos/sin 在同一 tile 内计算参考实现无法复用。standalone aclnn 两段式调用冒烟测试examples/test_aclnn_polar.cpp 提供不依赖 torch 的纯 C 直调样例5 个用例包含 warmup 计时 CPU 校验_ref版本调系统 l0。CANN 8.5 编译命令OPP$ASCEND_HOME_PATH/opp/vendors/customize_math ACLINC$ASCEND_HOME_PATH/aarch64-linux/include ASCLIB$ASCEND_HOME_PATH/aarch64-linux/lib64 # 必须 lib64勿用 devlib g -O2 -stdc17 -I$ACLINC -I$OPP/op_api/include -L$ASCLIB -L$OPP/op_api/lib \ $POLAR/examples/test_aclnn_polar.cpp -o /tmp/test_aclnn_polar \ -lascendcl -lnnopbase -lcust_opapi LD_LIBRARY_PATH$OPP/op_api/lib:$ASCLIB:$LD_LIBRARY_PATH /tmp/test_aclnn_polar # 基线版源换 test_aclnn_polar_ref.cpp库 -lcust_opapi 换 -lopapi编译要点链接库-lascendcl -lnnopbase -lcust_opapicust_opapi为自定义 vendor 的 op_api 库基线版换为系统lopapiASCLIB必须指向lib64而非devlib。该测试体现了 aclnn 接口的标准两段式调用aclnnPolarGetWorkspaceSize(input, angle, out, *workspaceSize, **executor)先查询 workspace 大小并创建 executoraclnnPolar(workspace, workspaceSize, executor, stream)再真正执行。需要强调的是standalone 自带的 verify 仅作冒烟用途精度结论一律以 §2 官方 AscendOpTest 为准。测试与交付项对应关系任务书交付项本仓位置复现章节算子工程代码op_host/op_kernel/CMakeLists.txt§1全部测试用例tests/{aot,pybind,pybind_baseline}/、examples/§2–§5用例结果自测报告tests/自测报告.md—测试步骤指导文档tests/测试步骤指导.md—设计文档已通过评审docs/design.md—小结测试验收的关键注意事项环境硬约束所有测试依赖真实昇腾 NPUAtlas A2/A3本地无 NPU 无法运行环境变量注入set_env.sh与部署生效set_env.bashLD_LIBRARY_PATH缺一不可判据分层精度以 §2 AscendOpTest 为权威实/虚部纯绝对误差 1e-4pybind 与 standalone 的 verify 与其逐行等价或仅作冒烟性能以 §4 l0 基线对比为口径核心验收为所有核参与场景 ≥ 基线 95%广播是新增功能点验收用例中Test_bcast_*AscendOpTest与 case2/9–16pybind专门覆盖低维→高维、标量、双向多轴等广播形态是回归测试的重点构建一致性Atlas A2 与 A3 共用同一份 OpDef Kernel 同源构建kernel 与 host tiling 无平台分支可分别产出对应.run包。赞分享算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载相关推荐CANN ops-math Polar 算子 NPU 实战指南基于 pybind 与 msprof 的精度-性能一体化测试框架CANN ops math Polar 算子 NPU 实战指南基于 pybind 与 msprof 的精度 性能一体化测试框架 Polar 是 CANN op算子库人工智能CANNClaude Code Router是什么一个本地AI网关如何统一管控所有AI AgentClaude Code Router是什么一个本地AI网关如何统一管控所有AI Agent Claude Code RouterCCR是一个 本地 AI算子库人工智能CANNCANN ops-math BitwiseXor 算子实战指南aclnn 接口调用、类型推导与昇腾 NPU 实现解析CANN ops math BitwiseXor 算子实战指南aclnn 接口调用、类型推导与昇腾 NPU 实现解析 BitwiseXor 是 CANN op算子库人工智能CANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表