第九章:NPU算子支持与约束
做AI芯片部署说白了就是跟算子打交道。你想想看一个神经网络模型拆开来看就是一堆算子的组合。高通NPU支持哪些算子不支持的怎么办能不能自己加这些问题我在项目里几乎天天遇到。9.1 支持算子列表高通SNPE和QNN平台对主流算子支持得还算全面。我整理了一份常用算子清单方便你快速查阅算子类别具体算子支持情况卷积类Conv2D, DepthwiseConv2D, Conv1D✅ 原生支持池化类MaxPool, AveragePool, GlobalAvgPool✅ 原生支持激活类ReLU, ReLU6, Tanh, Sigmoid, LeakyReLU✅ 原生支持归一化类BatchNorm, LayerNorm, InstanceNorm✅ 原生支持全连接类FullyConnected, MatMul✅ 原生支持张量操作Reshape, Transpose, Concat, Split, Slice✅ 原生支持逐元素操作Add, Mul, Sub, Div, Exp, Log✅ 原生支持量化相关Quantize, Dequantize, Requantize✅ 原生支持条件控制If, While, Switch⚠️ 部分支持自定义Udo (User Defined Op)✅ 通过Udo接口我的经验实际项目中90%以上的模型算子都在支持列表里。但要注意——算子支持不等于性能最优。比如Transpose操作NPU上跑起来可能比CPU还慢我建议能省则省。9.2 不支持的算子如何处理遇到不支持的算子别慌。我总结了三种处理方式按优先级排序方式一算子替换推荐这是最优雅的方案。把不支持的算子用等价的数学组合替换掉。举个例子# 原始模型使用不支持的 Softplus y softplus(x) # 某些NPU版本不支持 # 替换方案用支持的算子组合 y log(1 exp(x)) # 拆解为 Log Add Exp全部支持我在项目中遇到过GELU激活函数高通NPU早期版本不支持。我当时把它拆成了0.5 * x * (1 tanh(sqrt(2/pi) * (x 0.044715 * x^3)))。嗯虽然看起来复杂但每个子算子都支持跑起来没问题。方式二CPU回退兜底方案实在拆不了就让这部分在CPU上跑。高通平台支持异构计算// QNN中配置CPU回退的伪代码 qnn_backend_config_t config; config.partition_strategy QNN_PARTITION_STRATEGY_AUTO; config.fallback_to_cpu true; // 允许CPU回退注意CPU回退会带来性能损失。我曾经有个项目模型里有个不支持的TopK算子回退到CPU后整体推理延迟从5ms飙到了35ms。后来我改用ArgSort Slice组合才把性能拉回来。方式三图优化重写有些框架支持在编译阶段做图优化。比如ONNX的GraphOptimizer可以自动匹配子图模式并替换# 使用onnxruntime的图优化 import onnxruntime as ort sess_options ort.SessionOptions() sess_options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL sess_options.optimized_model_filepath optimized_model.onnx9.3 自定义算子注册如果上面三种方式都搞不定那就自己写算子。高通提供了UdoUser Defined Operator接口我简单说下流程Udo开发三步走定义算子描述用JSON或YAML描述算子的输入、输出、参数实现计算逻辑用C写前向推理代码注册到QNN编译成动态库运行时加载举个例子假设你要实现一个自定义的HardSwish算子// 1. 算子描述文件 hardswish.json { op_name: HardSwish, inputs: [ {name: input, type: tensor, dtype: float32} ], outputs: [ {name: output, type: tensor, dtype: float32} ], params: [] } // 2. 核心计算实现 hardswish.cpp #include QnnUdoImpl.h Qnn_ErrorHandle_t hardswish_impl( const QnnUdoTensor_t* input, QnnUdoTensor_t* output) { float* in_data (float*)input-data; float* out_data (float*)output-data; size_t count input-currentDimensions[0]; for (size_t i 0; i count; i) { float x in_data[i]; // HardSwish: x * relu6(x3) / 6 float relu6_val std::min(std::max(x 3.0f, 0.0f), 6.0f); out_data[i] x * relu6_val / 6.0f; } return QNN_SUCCESS; }关键点自定义算子注册后需要重新量化模型。因为NPU的量化参数是跟算子绑定的新算子得单独校准量化范围。我吃过这个亏——第一次写Udo没做量化校准推理结果全是NaN。注册到QNN的步骤# 编译Udo动态库 g -shared -fPIC hardswish.cpp -o libhardswish_udo.so # 在QNN模型中引用 qnn_model_t model; qnn_model_add_udo(model, libhardswish_udo.so, HardSwish);9.4 知识体系总览我把这一章的核心逻辑画成了图方便你理解我的建议遇到不支持的算子先试试算子替换。实在不行再考虑CPU回退。自定义Udo是最后的手段——开发周期长还要做量化校准成本不低。我曾经为了一个LayerNorm算子写Udo前后折腾了两周后来发现用已有的算子组合就能实现白费了功夫。

相关新闻

32位ODAC免安装拷贝版配置与避坑指南

32位ODAC免安装拷贝版配置与避坑指南

简介:ODAC1120320Xcopy_32bit.zip 是面向 .NET 开发者的 Oracle 数据访问组件离线安装包,对应 Oracle 11.2.0.3 版本,专为 32 位 Windows 环境准备。它解决的是在未安装完整 Oracle 客户端的情况下,让 .NET 程序通过 ODP.NET 连接…

2026/10/10 2:18:54 阅读更多 →
AlgoNote 算法通关手册:0913 猫和老鼠(Cat and Mouse)博弈论与拓扑排序解法深度解析

AlgoNote 算法通关手册:0913 猫和老鼠(Cat and Mouse)博弈论与拓扑排序解法深度解析

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

2026/10/10 2:17:54 阅读更多 →
栈与队列核心考点:双栈模拟、括号匹配与逆波兰表达式

栈与队列核心考点:双栈模拟、括号匹配与逆波兰表达式

代码随想录算法训练营刷到 Day10,主题是栈与队列。很多刷题的人会觉得,栈和队列属于“我早就懂了”的数据结构——一个先进后出、一个先进先出,概念一两句话就能讲完。但真到了笔试现场,被“用栈实现队列”“用队列实现栈”这种题…

2026/10/10 2:17:54 阅读更多 →

最新新闻

【BFS 解决拓扑排序】课程表

【BFS 解决拓扑排序】课程表

文章目录题目解析算法原理建图入度数组代码实现题目链接:207. 课程表 题目解析 拓扑排序(Topological sorting)要解决的问题是 如何给一个有向无环图的所有节点排序。 有向无环图 (Directed Acyclic Graph, 缩写 DAG&#xff09…

2026/10/10 2:58:07 阅读更多 →
MySQL中的常用SQL语句

MySQL中的常用SQL语句

SQL语句的分类DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter、rename、truncate。其中 create 用于创建数据库对象,drop 用于删…

2026/10/10 2:58:07 阅读更多 →
Python 高阶语法(二):上下文管理器、with、yield 与资源安全释放——从文件到 FastAPI 数据库会话

Python 高阶语法(二):上下文管理器、with、yield 与资源安全释放——从文件到 FastAPI 数据库会话

这一篇我们会学习另一个在后端中非常重要的能力:with __enter__ __exit__ contextmanager yield async with它们会解释为什么文件、数据库连接、HTTP 客户端、模型资源都需要被正确打开和关闭。一、前言在编程中,有很多资源不能只打开、不关闭。例如&…

2026/10/10 2:58:07 阅读更多 →
第16章-RAG

第16章-RAG

第 16 章:RAG 在模型回答前检索可信外部知识,把相关证据加入 Prompt,让回答更贴近私有数据并具备可追溯来源。 前言 模型参数中没有企业最新制度、内部文档和实时知识。RAG(Retrieval-Augmented Generation)不要求重新…

2026/10/10 2:58:07 阅读更多 →
终于有人把数据指标体系讲明白了:指标怎么定、怎么分、怎么用一次讲透

终于有人把数据指标体系讲明白了:指标怎么定、怎么分、怎么用一次讲透

很多企业做数据分析,做到最后都会遇到一个很奇怪的问题:报表越来越多,指标越来越多,但企业反而越来越说不清自己的经营状况。财务有一套收入,销售有一套收入,运营还有另一套收入;老板问一句“这…

2026/10/10 2:58:07 阅读更多 →
【会议征稿】第三届数字经济与计算机科学国际学术会议(DECS 2026)

【会议征稿】第三届数字经济与计算机科学国际学术会议(DECS 2026)

第三届数字经济与计算机科学国际学术会议 (DECS 2026) 2026 3rdInternational Conference on Digital Economy and Computer Science 会议官网: 第三届数字经济与计算机科学国际学术会议(DECS 2026)https://ais.cn/…

2026/10/10 2:57:07 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →