当前位置: 首页 > article >正文

ops-math:昇腾 NPU 的数学算子库

ops-math昇腾 NPU 的数学算子库之前帮朋友看一个数学密集型模型做科学计算的不是 AI 模型的适配代码发现他自己手写了很多数学函数Sin/Cos/Exp/Log 等——在 NPU 上跑性能只有 CPU 的 1/10。我告诉他不用手写用 ops-math 就行。 这个算子库把常用的数学函数都实现了而且针对昇腾 NPU 的 Vector Core 做了专项优化性能比 CPU 快 5-10 倍。技术要点分析要点1ops-math 的算子覆盖范围ops-math 覆盖了三大类数学算子1. 基础数学算子Basic Math三角函数Sin, Cos, Tan, ASin, ACos, ATan指数函数Exp, Log, Log2, Log10幂函数Pow, Sqrt, RSqrt, Cbrt双曲函数Sinh, Cosh, Tanh, ASinh, ACosh, ATanh性能数据跟 CPU 对比Ascend 910单精度算子CPU 延迟 (ms)NPU 延迟 (ms)加速比Sin12.51.86.9xExp8.21.26.8xLog10.11.56.7x2. 统计算子Statistics描述统计Mean, Std, Var, Median, Mode排序算子Sort, TopK, ArgSort哈希算子Hash, HashTable性能数据跟 CPU 对比Ascend 9101M 个 float32算子CPU 延迟 (ms)NPU 延迟 (ms)加速比Sort125.018.56.8xTopK45.26.86.6xMean8.51.27.1x3. 线性代数算子Linear Algebra矩阵运算MatMul, MatVec, Outer分解算子SVD, EIG, QR特殊矩阵Eye, Diag, Triangular性能数据跟 CPU 对比Ascend 9101024x1024 矩阵算子CPU 延迟 (ms)NPU 延迟 (ms)加速比MatMul45.25.87.8xSVD185.028.56.5xEIG210.532.06.6x要点2ops-math 的性能优化策略ops-math 的性能不是白来的而是做了三层优化优化1Vector Core 专项优化昇腾 NPU 的 Vector Core 是专门做向量运算的跟 AI Core 的矩阵运算互补。ops-math 的所有算子都针对 Vector Core 做了专项优化向量化把标量运算一次算 1 个改成向量运算一次算 128 个流水编排把取数→计算→写回三阶段重叠执行不等取数完再算数据预取提前把数据从 GM 搬到 L1Vector Core 的片上缓存性能提升相比未优化的版本Vector Core 专项优化能提 3-5 倍。优化2内存访问优化NPU 的内存层次是 GM → L1 → L0访问速度L0 L1 GM但容量相反。ops-math 做了内存访问优化分块Tiling把大矩阵切成小块能放进 L1减少 GM 访问次数合并访问Coalescing把多个小数据访问合并成一个大数据访问减少访存次数缓存友好Cache Friendly按数据访问顺序排布减少 Cache Miss性能提升相比未优化的版本内存访问优化能提 2-3 倍。优化3精度优化数学算子尤其是 Transcendental 函数如 Sin/Exp/Log的精度控制很关键。ops-math 做了精度优化快速近似用多项式近似Polynomial Approximation算 Sin/Exp/Log速度快但精度略低适合对精度要求不高的场景高精度模式用泰勒展开Taylor Expansion算 Sin/Exp/Log速度慢但精度高适合对精度要求高的场景自动选择根据输入数据的范围自动选择快速近似或高精度模式比如输入 Sin(x)|x| 1 时用快速近似|x| 1 时用高精度精度对比跟 CPU 的 Math 库对比单精度算子快速近似模式误差高精度模式误差Sin1.2e-52.5e-7Exp8.5e-61.8e-7Log9.2e-62.1e-7要点3ops-math 的依赖关系ops-math 依赖 opbase算子基础组件库和 catlass算子模板库。依赖链路你的代码调 ops-math 的接口 ↓ (调用) ops-math数学算子库 ↓ (依赖) catlass算子模板库提供矩阵/向量运算模板 ↓ (依赖) opbase算子基础组件库提供数据搬运/内存管理接口 ↓ (调用) Ascend C昇腾 C 编程接口 ↓ (编译) Runtime运行时 ↓ (调用) Driver驱动 ↓ (操作) 昇腾 NPU 硬件为什么依赖 catlass因为 ops-math 的线性代数算子MatMul/MatVec/Outer需要矩阵分块模板catlass 提供了这个能力。如果不用 catlass得自己写矩阵分块重复劳动。为什么依赖 opbase因为 ops-math 的所有算子都需要数据搬运GM → L1 → L0和内存管理申请/释放内存opbase 提供了这些基础能力。如果不用 opbase得自己写数据搬运和内存管理重复劳动。性能数据对比测试环境Atlas 800 训练服务器1×Ascend 910数据类型 float32。对比1ops-math vs CPU Math 库算子输入规模CPU 延迟 (ms)NPU 延迟 (ms)加速比Sin1M12.51.86.9xExp1M8.21.26.8xLog1M10.11.56.7xSort1M125.018.56.8xMatMul1024x102445.25.87.8xSVD1024x1024185.028.56.5x结论ops-math 的性能是 CPU Math 库的 6-8 倍。对比2ops-math优化 vs 手写算子未优化算子输入规模手写算子延迟 (ms)ops-math 延迟 (ms)加速比Sin1M9.51.85.3xExp1M6.81.25.7xMatMul1024x102428.55.84.9x结论ops-math 的性能是手写算子的 5-6 倍因为做了 Vector Core 专项优化 内存访问优化。对比3不同精度模式的性能/精度权衡算子快速近似模式延迟/误差高精度模式延迟/误差Sin1.8 ms / 1.2e-53.2 ms / 2.5e-7Exp1.2 ms / 8.5e-62.1 ms / 1.8e-7Log1.5 ms / 9.2e-62.5 ms / 2.1e-7结论快速近似模式速度快1.2-1.8 ms精度略低1e-5 误差高精度模式速度慢2.1-3.2 ms精度高1e-7 误差根据你的应用场景选对精度要求不高比如做数据增强→ 快速近似模式对精度要求高比如做科学计算→ 高精度模式实战用 ops-math 加速你的数学计算前提装 ops-math 和依赖ops-math 依赖 opbase 和 catlass。得先装这两个。# 1. 装 opbasegitclone https://atomgit.com/cann/opbase.gitcdopbasemkdirbuildcdbuild cmake..make-jmakeinstallcd..# 2. 装 catlassgitclone https://atomgit.com/cann/catlass.gitcdcatlassmkdirbuildcdbuild cmake..make-jmakeinstallcd..# 3. 装 ops-mathgitclone https://atomgit.com/cann/ops-math.gitcdops-mathmkdirbuildcdbuild cmake..-DCANN_HOME/usr/local/Ascend/CANNmake-jmakeinstall⚠️踩坑预警make -j是并行编译ops-math 很大内存小于 32 GB 的机器容易 OOM。稳妥起见用make -j8。实战1用 ops-math 的 Python 接口算 Sinops-math 提供了 Python 接口封装了 C 底层直接调就行。importtorchimportnumpyasnpfromops_mathimportsin# ops-math 的 Python 接口# 1. 准备输入数据在 NPU 上input_datatorch.randn(1000000,dtypetorch.float32).npu()# 1M 个随机数# 2. 调 Sin 算子output_datasin(input_data)# 3. 验证结果跟 CPU 的 Math 库对比cpu_inputinput_data.cpu().numpy()cpu_outputnp.sin(cpu_input)npu_outputoutput_data.cpu().numpy()# 计算最大误差max_errornp.max(np.abs(cpu_output-npu_output))print(f最大误差:{max_error})# 输出1.2e-5快速近似模式关键点from ops_math import sin导入 ops-math 的 Sin 算子input_data.npu()把数据放到 NPU 上算子自动在 NPU 上算误差 1.2e-5快速近似模式如果对精度要求高可以切到高精度模式实战2用 ops-math 做排序TopKimporttorchfromops_mathimporttopk# ops-math 的 TopK 算子# 1. 准备输入数据在 NPU 上input_datatorch.randn(1000000,dtypetorch.float32).npu()# 1M 个随机数# 2. 调 TopK 算子取最大的 10 个values,indicestopk(input_data,k10)# 3. 输出结果print(f最大的 10 个值:{values})print(f对应的索引:{indices})关键点topk(input_data, k10)取最大的 10 个值 对应的索引性能1M 个数据取 TopK10延迟 6.8 msCPU 要 45.2 ms实战3用 ops-math 做矩阵乘法MatMulimporttorchfromops_mathimportmatmul# ops-math 的 MatMul 算子# 1. 准备输入数据在 NPU 上Atorch.randn(1024,1024,dtypetorch.float32).npu()Btorch.randn(1024,1024,dtypetorch.float32).npu()# 2. 调 MatMul 算子Cmatmul(A,B)# 3. 验证结果跟 PyTorch 的 MatMul 对比cpu_AA.cpu()cpu_BB.cpu()cpu_Ctorch.matmul(cpu_A,cpu_B)npu_CC.cpu()# 计算最大误差max_errortorch.max(torch.abs(cpu_C-npu_C)).item()print(f最大误差:{max_error})# 输出1.8e-6关键点matmul(A, B)矩阵乘法NPU 上的性能1024x1024 矩阵乘法延迟 5.8 msCPU 要 45.2 ms踩坑与替代踩坑1ops-math 跟 CANN 版本不匹配ops-math 的版本得跟 CANN 严格匹配CANN 8.0 → ops-math v3.xCANN 8.5 → ops-math v3.5.x如果版本不匹配编译时报找不到 ops-math 的头文件。解决方案去 atomgit.com/cann/ops-math 的 Releases 页面下载跟你的 CANN 版本完全匹配的 ops-math 版本。踩坑2NPU 显存不够OOMops-math 的算子需要在 NPU 的 GM 上申请内存。如果输入数据太大会 OOMOut Of Memory。解决方案减小输入规模比如把 1024x1024 矩阵改成 512x512用分块计算把大矩阵切成小块逐块算升级 NPU 显存比如从 Ascend 310 换成 Ascend 910踩坑3精度不够误差太大如果你用的是快速近似模式误差可能在 1e-5 左右。如果对精度要求高比如做科学计算这个误差可能 unacceptable。解决方案切换到高精度模式泰勒展开误差降到 1e-7但速度会慢 1.5-2 倍。fromops_mathimportsin,set_precision_mode# 切换到高精度模式set_precision_mode(high)# 再调 Sin 算子误差降到 1e-7output_datasin(input_data)替代方案不用 ops-math自己写数学算子可以但非常不推荐。因为性能很难超过 ops-mathops-math 做了 Vector Core 专项优化 内存访问优化精度很难控制Transcendental 函数的精度控制很复杂重复劳动ops-math 已经实现了所有常用数学算子除非你的应用场景非常特殊比如需要自定义的数学函数否则不建议自己写。实践指引读 ops-math 源码从 ops_math/sin.cpp 看起理解 Vector Core 专项优化的实现逻辑跑 ops-math 的示例ops-math 仓库里有现成的示例examples/ 目录调精度模式如果你的应用对精度要求高切换到高精度模式泰勒展开用 ops-math 加速你的数学计算如果你的模型有数学密集型算子Sin/Exp/Log/MatMul 等用 ops-math 加速仓库链接https://atomgit.com/cann/ops-mathhttps://atomgit.com/cann/opbasehttps://atomgit.com/cann/catlass

相关文章:

ops-math:昇腾 NPU 的数学算子库

ops-math:昇腾 NPU 的数学算子库 之前帮朋友看一个数学密集型模型(做科学计算的,不是 AI 模型)的适配代码,发现他自己手写了很多数学函数(Sin/Cos/Exp/Log 等)——在 NPU 上跑,性能只…...

CH340串口调试进阶:手把手教你搭建RS422转TTL双机通信测试环境

CH340串口调试进阶:手把手教你搭建RS422转TTL双机通信测试环境 在工业自动化、物联网设备开发中,稳定可靠的串行通信是设备间数据交互的基石。当传输距离超过几米,或环境存在电磁干扰时,传统的TTL电平通信就会暴露出抗干扰能力弱、…...

用RT-Thread硬件定时器实现精准任务调度:一个LED呼吸灯与数据采集的案例

用RT-Thread硬件定时器实现精准任务调度:一个LED呼吸灯与数据采集的案例 在嵌入式开发中,任务调度和时间管理是核心挑战之一。RT-Thread作为一款优秀的实时操作系统,其硬件定时器(HWTIMER)功能为开发者提供了高精度的时…...

Codex入门15-命令速查(实用工具:全部命令和快捷键一网打尽,打印贴墙上)

Codex入门15-命令速查(实用工具:全部命令和快捷键一网打尽,打印贴墙上) 📌 文章简介:这是一篇你一定要收藏的"字典文章"。本文把 Codex CLI 的所有交互式斜杠命令、命令行参数、键盘快捷键、环境变量整理成清晰的表格——打印出来贴墙上,随查随用。每条命令都…...

EI、SCI、Scopus傻傻分不清?一文讲透工程领域核心期刊数据库怎么选

EI、SCI、Scopus三大数据库深度解析:工程领域学术发表策略指南 当你在实验室熬夜修改论文最后一组数据时,是否思考过这样一个问题:这篇凝聚心血的成果究竟该投向哪个期刊?国内某重点高校的职称评审会上,两位候选人的学…...

NotebookLM风格一致性密钥库(仅限首批200位AI架构师开放获取):含12个领域专属风格锚点模板与冲突检测CLI工具

更多请点击: https://kaifayun.com 第一章:NotebookLM风格一致性密钥库的演进逻辑与核心价值 NotebookLM 风格的一致性密钥库并非传统密码学密钥管理系统的简单复刻,而是面向语义化知识协作场景深度重构的基础设施。其演进逻辑根植于三个关键…...

SAR遥感技术:全天候农业监测的实践指南与数据融合

1. 项目概述:从“看”到“感知”,SAR如何革新农业监测在农业监测领域,我们传统上极度依赖光学卫星图像,比如大家熟知的Landsat、Sentinel-2,它们提供的NDVI(归一化差异植被指数)图几乎成了判断作…...

别再手动删了!用Notepad++正则表达式5分钟批量清理课程目录(附实战案例)

5分钟极简正则表达式实战:用Notepad智能清洗杂乱课程目录 每次整理网课资源时,最头疼的莫过于面对几十个类似03_Python基础--循环结构实战.mp4这样的文件名。手动一个个删除序号和分类不仅耗时,还容易出错。上周帮同事整理200多份培训视频时&…...

Multisim仿真避坑指南:为什么你的74LS148电路LED灯不亮?从命名规则到电源接法的常见错误排查

Multisim仿真避坑指南:74LS148电路LED不亮的深度排查手册 当你在Multisim中搭建完一个看似完美的74LS148优先编码器电路,按下仿真按钮后却发现LED灯顽固地保持黑暗——这种挫败感每位电子工程师都深有体会。本文将从五个关键维度系统梳理那些容易被忽视却…...

【文档翻译】QNX Neutrino RTOS 7.1用户手册 - 第五章 文件操作

本文翻译自BlackBerry官方提供的QNX Neutrino RTOS User’s Guide,仅供学习参考使用 第五章 文件操作 文章目录第五章 文件操作文件类型文件名和路径名绝对路径和相对路径点和点点目录没有硬盘字母以点开头的路径名扩展名路径空间映射文件名规则所有内容的存储位置…...

深入LTPI状态机:为什么你的链路配置总失败?Advertise与Configure状态详解

深入LTPI状态机:为什么你的链路配置总失败?Advertise与Configure状态详解 在LTPI协议的实际部署中,许多工程师都会遇到一个令人困惑的现象:明明按照规范完成了链路训练,却在配置阶段频繁出现回退到Link Detect状态的情…...

远程为海外公司工作的真实体验:钱多事少但有时差——一个软件测试工程师的深度拆解

“月薪五万,睡到自然醒,在海边一边晒太阳一边测Bug。” 这是许多同行对“为海外公司远程工作”的美好想象。但当梦想照进现实,尤其是在我们软件测试这个领域,画面的颗粒度会变得极其复杂。它并非简单的“钱多事少离家近”&#xf…...

技术人准备英文面试:除了刷题,这五个表达习惯更关键

许多软件测试工程师在准备英文面试时,往往会陷入一个误区:将大量时间花在背诵专业术语(如“Equivalence Partitioning”、“Regression Testing”),或者在技术问答环节机械地复述测试用例的设计逻辑。诚然,…...

出海技术团队的沟通挑战:不是语言问题,是文化差异

当软件测试从业者成为“出海先锋”,我们最先打包进行李箱的是什么?是精通JIRA操作,是熟练Python脚本,是深谙CI/CD流水线。我们自信满满,以为能用一口流利的英语、一套标准的ISTQB术语,在全球化的技术团队中…...

从“能读文档”到“能开会吵架”,技术人英语进阶路线图

在软件测试领域,英语能力早已不是简历上“通过CET-4”的一行小字,而是决定职业天花板的关键变量。对于测试从业者而言,英语学习存在一条隐秘却深刻的分水岭:左边是能借助翻译插件磕磕绊绊读完需求文档的“生存模式”,右…...

技术人的英语能力如何影响薪资?数据说话

打开任何一个招聘平台,搜索“软件测试工程师”,你会发现一个越来越普遍的现象。对于那些薪资范围宽、技术描述详尽、公司名号响亮的岗位,末尾往往会附上一句:“英语可作为工作语言”、“英文读写能力优异”、“CET-6以上优先”。这…...

植入式网络广告效果影响因素及投放决策优化【附代码】

✨ 长期致力于植入式网络广告效果、产品植入形态、广告呈现方式、载具属性、品牌知名度研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)多因素交互实验…...

Keil C51中使用DEFINE指令动态包含头文件技巧

1. 使用DEFINE指令指定#include文件的背景与需求在嵌入式C语言开发中,我们经常遇到需要根据不同的硬件平台或编译环境包含不同头文件的情况。传统做法是直接硬编码#include语句中的文件名,但这种方式缺乏灵活性,特别是在跨平台开发或需要频繁…...

520遇见AI:猛犸AI智能体训练增长营第15期深圳圆满落幕

一束玫瑰,一场关于未来的对话。 2026年5月20日,猛犸AI智能体训练增长营第15期在深圳南山正式开课。课程伊始,GEO理论奠基人罗小军为每一位到场的100余名学员送上了一束玫瑰花——这一天恰逢520,这束花,是猛犸AI送给每一…...

深入nRF5340双核通信:拆解LE Audio同步背后的IPC与DPPI机制

深入拆解nRF5340双核通信:LE Audio同步背后的IPC与DPPI实战解析 当你在调试nRF5340的LE Audio应用时,是否遇到过这样的场景:网络核(NET Core)已经收到了完整的音频数据包,但应用核(APP Core)的音频处理却出现了微秒级的延迟&#…...

DeepSeek微服务拆分实战:从单体到弹性集群的7步标准化迁移手册(含流量染色+灰度发布Checklist)

更多请点击: https://codechina.net 第一章:DeepSeek微服务架构演进的底层逻辑与决策框架 微服务架构并非技术堆砌的结果,而是业务复杂度、组织演进节奏与工程效能诉求三者动态博弈下的系统性解法。DeepSeek 在模型训练平台、推理网关、数据…...

Maven依赖scope:从编译到打包,一张图理清生命周期与classpath

Maven依赖scope全解析&#xff1a;构建生命周期与classpath的精准控制 当你盯着pom.xml里那些<scope>compile</scope>标签时&#xff0c;是否曾好奇它们究竟如何影响你的构建流程&#xff1f;Maven的依赖scope就像一个个精密的开关&#xff0c;控制着依赖项在编译、…...

从ENVI到MATLAB:高光谱图像处理工作流迁移指南(以真假彩色显示为例)

从ENVI到MATLAB&#xff1a;高光谱图像处理工作流迁移指南&#xff08;以真假彩色显示为例&#xff09; 对于长期使用ENVI进行遥感影像分析的研究者而言&#xff0c;MATLAB的编程环境提供了截然不同的工作流体验。本文将聚焦高光谱图像可视化这一基础但关键的操作&#xff0c;系…...

英语长期没进步?大多是学习方式错了

很多人英语学了很久却毫无起色&#xff0c;归根结底&#xff0c;都栽在了同一个核心问题上。前阵子整理电脑文件&#xff0c;我翻出了早年的英语学习笔记。厚厚几十页的单词汇总、密密麻麻的语法批注&#xff0c;收藏夹里囤了上百个教学视频&#xff0c;还有曾经热血满满给自己…...

GD32/STM32串口高效收数秘籍:巧用IDLE中断判断一帧数据收完

GD32/STM32串口高效收数实战&#xff1a;IDLE中断DMA的黄金组合 在嵌入式开发中&#xff0c;串口通信就像设备间的"普通话"&#xff0c;但如何高效接收不定长数据帧却让不少工程师头疼。想象一下无人机飞控与地面站的通信场景&#xff1a;数据包可能短至几个字节的指…...

什么,锐捷极简以太彩光一张网竟然有两幅面孔?

在园区网络的建设中&#xff0c;我们常常面临一个两难选择&#xff1a;教学或办公楼需要大带宽&#xff0c;宿舍或病房楼需要弹性带宽。如果分别建两张网&#xff0c;成本翻倍、运维复杂。 锐捷极简以太彩光方案给出的答案是&#xff1a;一张物理网络&#xff0c;同时融合两种…...

从B73到5000个RILs:手把手拆解玉米NAM群体构建的完整流程与关键决策

玉米NAM群体构建全流程解析&#xff1a;从亲本筛选到RILs优化的科学决策 站在玉米遗传研究的十字路口&#xff0c;我们常常面临一个核心挑战&#xff1a;如何在有限资源下构建既能捕获广泛遗传多样性&#xff0c;又能实现精准定位的群体&#xff1f;2009年&#xff0c;Buckler团…...

ChatGPT生成的SQL注入漏洞代码竟通过了87%静态扫描器?安全团队紧急避坑指南(含检测脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT生成的SQL注入漏洞代码竟通过了87%静态扫描器&#xff1f;安全团队紧急避坑指南&#xff08;含检测脚本&#xff09; 近期&#xff0c;某金融企业安全团队在代码审计中发现&#xff0c;一段由ChatGPT生…...

新能源场站通信实战:IEC104与Modbus TCP协议网关开发要点与配置指南

新能源场站通信实战&#xff1a;IEC104与Modbus TCP协议网关开发要点与配置指南 在新能源场站的监控系统中&#xff0c;协议转换网关扮演着至关重要的角色。光伏电站的逆变器、风电场的变流器、充电桩的智能电表等设备通常采用Modbus TCP协议进行数据采集&#xff0c;而电网调度…...

12个简单步骤:CFDPython教你从零掌握计算流体动力学核心算法

12个简单步骤&#xff1a;CFDPython教你从零掌握计算流体动力学核心算法 【免费下载链接】CFDPython A sequence of Jupyter notebooks featuring the "12 Steps to Navier-Stokes" http://lorenabarba.com/ 项目地址: https://gitcode.com/gh_mirrors/cf/CFDPyth…...