端侧 AI 这两年从"概念验证"快速滑向"工程落地",我身边做硬件的、做算法的、做产品的朋友,聊到最后几乎都会落到同一个问题上:模型到底跑在哪儿。云端 API 便宜、省事、迭代快,但延迟、带宽、隐私、离线可用性这几座大山压下来,很多场景根本绕不过去。于是"让智能发生在设备本地"就成了一个绕不开的选项——不是因为它时髦,而是因为有些需求只有本地算力才能满足。这篇内容我想把端侧 AI 算力方案这件事从头到尾捋一遍,包括 SoC、NPU、Transformer 这些关键词背后的真实含义,不同算力档位怎么选,部署时踩过的坑,以及我实测下来比较稳的几条路线。不管你是刚接触端侧部署的新手,还是已经在调 NPU 算子的老手,应该都能从里面找到能直接抄作业的部分。
1. 端侧 AI 到底在解决什么问题,别被概念带偏
1.1 云端推理的三个硬伤
先说清楚为什么要有端侧方案。很多人第一反应是"云端算力无限,为什么要费劲在设备上跑模型"。这个想法在 demo 阶段没问题,一旦进入真实产品就会撞墙。
第一个硬伤是延迟。一次云端推理的链路是:设备采集数据 → 编码 → 上传 → 服务端排队 → 推理 → 回传 → 解码。哪怕网络状况极好,这一圈下来几十到几百毫秒是常态。对于语音唤醒、实时翻译、手势识别、工业质检这类要求"即时响应"的场景,这个延迟直接决定产品能不能用。我做过一个语音交互的项目,云端方案端到端延迟稳定在 400ms 以上,用户明显感觉"它反应慢半拍",换成端侧之后压到 80ms 以内,体验完全是两个东西。
第二个硬伤是带宽和成本。视频流、连续音频、高频传感器数据如果全部上传,带宽费用和服务器成本会随用户量线性甚至超线性增长。一个摄像头每秒几 MB 的数据,一万路设备就是每秒几十 GB 的上行压力,这笔账算下来非常吓人。端侧先做一轮筛选和推理,只上传"有价值的结果",能把数据量压掉一到两个数量级。
第三个硬伤是隐私和合规。人脸、声纹、医疗影像、家庭画面这类数据,很多场景下根本不允许离开设备。这不是技术问题,是产品能不能上线的问题。端侧推理让原始数据不出设备,只输出结构化结果,从架构上就规避了大量风险。
1.2 端侧不是"云端缩小版"
这里有个常见误解:以为端侧就是把云端模型拿过来量化一下塞进设备。实际完全不是。端侧有自己的一套约束条件,模型结构、算子选择、内存布局、调度策略都要重新设计。
端侧的约束可以归纳成四条:算力有限、内存有限、功耗敏感、散热受限。手机 SoC 的 NPU 算力通常在几 TOPS 到几十 TOPS 之间,而一张数据中心卡是几百甚至上千 TOPS。内存方面,端侧可用内存经常只有几百 MB 到几 GB,模型权重加上中间激活值必须塞得进去。功耗上,手机持续推理的功耗预算往往只有几瓦,超了就会烫手、降频、掉电快。散热更直接,没有风扇,全靠被动散热,长时间高负载必然触发温控。
所以端侧方案的核心不是"把大模型搬下来",而是"在约束下找到性价比最高的组合"。这就引出了后面要讲的 SoC、NPU、模型轻量化这一整套东西。
1.3 哪些场景真的需要端侧
不是所有场景都值得上端侧。我一般用三个问题来判断:
- 数据能不能离开设备?不能,那必须端侧。
- 延迟要求是不是低于 100ms?是,那大概率要端侧或端云结合。
- 数据量是不是大到上传不划算?是,那端侧预处理加推理更合理。
典型的端侧刚需场景包括:手机上的拍照增强、语音助手唤醒、实时翻译、输入法预测;汽车里的座舱语音、驾驶员状态监测;工业里的缺陷检测、设备异常预警;家居里的摄像头人形检测、门锁人脸识别。这些场景的共同点是"实时、隐私、海量数据"三者至少占两个。
反过来,像复杂的多轮对话、长文档理解、高质量图像生成这类任务,端侧目前还吃力,端云协同是更现实的选择——端侧做唤醒、预处理、简单意图判断,复杂推理交给云端。
2. SoC 与 NPU:端侧算力的物理底座
2.1 SoC 是什么,为什么它决定了端侧 AI 的天花板
SoC 全称 System on Chip,中文叫"片上系统"。你可以把它理解成一台电脑的主板被压缩进了一颗芯片:CPU、GPU、NPU、ISP、DSP、内存控制器、各种外设接口全都集成在一起。手机、平板、车机、开发板上的主芯片基本都是 SoC。
对端侧 AI 来说,SoC 里最关键的几个单元是:
- CPU:通用计算,负责调度、控制流、非规则运算。算力不强但灵活。
- GPU:并行计算,适合矩阵运算,但功耗高,通常用于图形和部分 AI 加速。
- NPU:神经网络处理单元,专门为深度学习算子设计,能效比最高。
- DSP:数字信号处理,适合音频、传感器这类信号处理任务。
- ISP:图像信号处理,摄像头数据进来第一站。
为什么说 SoC 决定天花板?因为 NPU 的算力、内存带宽、支持的算子集,都是芯片设计阶段就定死的。你后面再怎么优化模型,也突破不了硬件的物理上限。选型阶段选错了 SoC,后面全是填坑。
2.2 NPU 的算力单位:TOPS 到底意味着什么
NPU 算力常用 TOPS 衡量,即每秒万亿次操作。但这里有个巨大的坑:TOPS 是理论峰值,实际能跑出多少取决于模型和工具链。
举个例子,某芯片标称 8 TOPS INT8,但这是理想条件下的峰值。实际跑一个真实模型,能用到 30% 到 60% 就算不错了。原因有几个:算子不支持导致回退到 CPU、内存带宽成为瓶颈、数据搬运开销大于计算开销、量化精度损失导致要跑更多次。
所以看 TOPS 不能只看数字,要看三件事:
- 支持的算子集:你的模型里的算子它支不支持,不支持就得回退,性能断崖式下跌。
- 内存带宽:算力再高,喂不饱数据也是白搭。带宽单位是 GB/s,这个数字经常被忽略但极其关键。
- 工具链成熟度:能不能顺利把模型转过去、量化、调优,决定了实际落地难度。
我见过太多"纸面算力很强但实际跑不动"的案例,选型时一定要拿真实模型去实测,别信规格书。
2.3 主流端侧算力平台横向对比
下面这张表是我根据实际项目经验整理的,覆盖几个常见档位。注意具体型号参数会随版本变化,这里给的是量级参考。
| 平台档位 | 典型代表 | NPU 算力量级 | 适用场景 | 工具链特点 |
|---|---|---|---|---|
| 入门级 | 低功耗 MCU 带 NPU | 0.1-1 TOPS | 关键词唤醒、简单分类 | 工具链简单,算子少 |
| 主流移动 | 手机 SoC | 5-40 TOPS | 拍照、语音、翻译 | 生态成熟,量化工具完善 |
| 边缘计算 | RK3588 类 | 6 TOPS 左右 | 视频分析、多路推理 | 开源友好,社区活跃 |
| 高性能边缘 | 车规/工业 SoC | 20-100+ TOPS | 自动驾驶、工业质检 | 工具链偏封闭,需原厂支持 |
这里特别说一下 RK3588 这类芯片,它在国内边缘计算圈子里热度很高,原因是性价比和开源生态。它的 NPU 支持 INT8/INT16,能跑不少视觉模型,社区里升级 NPU 驱动、调优的帖子很多。但它的坑也不少,比如某些算子支持不全、量化工具对 Transformer 类模型不够友好,这些后面会细讲。
手机 SoC 方面,各家旗舰的 NPU 算力每年都在涨,但真正决定体验的是"能效比"和"持续性能"。峰值算力只能撑几秒,持续推理靠的是中低频下的稳定输出。这也是为什么"手机 SoC 天梯图"这类内容很受关注——大家想知道的不只是跑分,而是实际场景下的表现。
3. Transformer 上端侧:为什么难,怎么破
3.1 Transformer 的结构特点与端侧矛盾
Transformer 现在是主流模型架构,从 NLP 到视觉到语音无处不在。它的核心是自注意力机制,计算复杂度随序列长度呈平方增长。这个特性在云端无所谓,在端侧就是灾难。
具体来说,Transformer 端侧部署面临几个矛盾:
- 注意力矩阵的内存占用:序列长度 N 的注意力矩阵是 N×N,N 稍微大一点内存就爆。N=512 时是 26 万个数,N=2048 时是 400 多万个数。
- 算子复杂度高:Softmax、LayerNorm、矩阵乘这些算子,NPU 支持程度参差不齐。
- 动态形状:很多 Transformer 支持变长输入,但 NPU 通常偏好固定形状,动态形状会导致反复编译或回退。
- 量化敏感:注意力里的 Softmax 和 LayerNorm 对量化很敏感,INT8 量化后精度掉得厉害。
这就是为什么"轻量 Transformer"成了热门方向。像 MobileViT、EfficientFormer、Swin Transformer 的轻量版本,都是在想办法把注意力的开销压下来。
3.2 轻量化 Transformer 的几条技术路线
我梳理了一下目前比较有效的轻量化思路,按性价比排序:
第一条路:降低注意力复杂度。用线性注意力、稀疏注意力、局部窗口注意力替代全局注意力。Swin Transformer 就是典型,它把注意力限制在局部窗口内,复杂度从平方降到线性。视觉任务里这条路效果很好。
第二条路:减少层数和通道数。直接砍模型规模,配合知识蒸馏把大模型的能力迁移到小模型。这是最直接的办法,但要注意别砍过头,精度会崩。
第三条路:算子融合与重写。把 LayerNorm、Softmax 这些对 NPU 不友好的算子融合进相邻的矩阵运算,或者用近似实现。这需要深入工具链,属于进阶操作。
第四条路:混合架构。用 CNN 做特征提取,只在关键位置用注意力。很多端侧视觉模型都是这个思路,兼顾效率和精度。
3.3 量化:端侧 Transformer 的必经之路
量化是把 FP32/FP16 的权重和激活值转成 INT8 甚至 INT4,直接带来 2 到 4 倍的内存和带宽节省,算力利用率也大幅提升。但 Transformer 量化有几个专门的坑。
坑一:激活值离群点。Transformer 的激活值分布经常有极端离群点,直接做 min-max 量化会把大部分值压到很小的范围,精度损失严重。解决办法是用 KL 散度校准、或者对激活值做 per-channel 量化。
坑二:Softmax 和 LayerNorm。这两个算子对精度极其敏感,通常做法是保持 FP16 或者用查表法近似。有些工具链会自动处理,有些需要手动指定。
坑三:量化感知训练。训练后量化(PTQ)方便但精度损失大,量化感知训练(QAT)精度好但要重新训练。端侧项目里,如果 PTQ 精度不达标,QAT 基本是唯一出路。
我实测下来,视觉 Transformer 用 PTQ 加精细校准通常能接受,NLP 类 Transformer 建议直接上 QAT,省得反复调。
4. 端侧部署实操:从模型到设备的完整链路
4.1 部署流程的五个阶段
端侧部署不是"把模型文件拷进去"这么简单,完整链路分五个阶段:
- 模型训练与导出:训练完成后导出成通用格式,通常是 ONNX。
- 模型转换:用芯片厂商的工具链把 ONNX 转成芯片专用格式。
- 量化与优化:在转换过程中做量化、算子融合、图优化。
- 精度与性能验证:在设备上跑真实数据,验证精度和速度。
- 集成与调优:集成进应用,处理内存、线程、功耗问题。
每个阶段都有坑,下面挑重点讲。
4.2 模型导出到 ONNX 的注意事项
ONNX 是中间格式的通用选择,但导出时要注意:
- 算子版本:不同 opset 版本支持的算子不同,导出时指定合适的 opset,太新可能工具链不支持,太旧可能缺算子。
- 动态轴:如果模型有动态输入,导出时要明确标注哪些轴是动态的,否则转换工具会当成固定形状。
- 自定义算子:模型里如果有自定义算子,ONNX 导不出来,需要先替换成标准算子或者写插件。
一个实用技巧:导出后用 ONNX Runtime 先跑一遍,确认输出和原模型一致,再去转换。这一步能提前发现大部分问题,省得在芯片工具链里排查。
4.3 芯片工具链转换的常见报错与处理
不同芯片工具链差异很大,但报错类型有共性。我整理了几类高频问题:
| 报错类型 | 典型原因 | 处理思路 |
|---|---|---|
| 算子不支持 | 模型用了工具链没实现的算子 | 替换算子或自定义实现 |
| 形状不匹配 | 动态形状或维度推断失败 | 固定形状,显式指定维度 |
| 量化失败 | 校准数据不足或分布异常 | 增加校准样本,调整量化策略 |
| 内存超限 | 模型太大或中间激活过多 | 模型切分,分阶段推理 |
| 精度不达标 | 量化损失过大 | 混合精度,关键层保 FP16 |
这里重点说"算子不支持"。这是最常见的拦路虎。比如某些工具链不支持GELU的精确实现,只支持近似版本;不支持LayerNorm的某些变体;不支持动态Reshape。遇到这种情况,要么改模型结构,要么写自定义算子。改模型结构更快,但可能影响精度;写自定义算子更保真,但工作量大且需要工具链支持。
4.4 内存与功耗的实测调优
模型能跑起来只是第一步,跑得稳、跑得久才是关键。内存方面,端侧经常遇到"模型能加载但推理时 OOM"的情况,原因是中间激活值占了大头。解决办法:
- 分阶段推理:把模型切成几段,跑完一段释放一段的中间结果。
- 内存复用:让不同层的中间 buffer 复用同一块内存,工具链通常有开关。
- 降低 batch size:端侧基本是 batch=1,但有些框架默认会预留多 batch 空间。
功耗方面,实测下来几个有效手段:
- 限制推理频率:不是每帧都要推理,隔帧推理能省一半功耗。
- 动态调频:根据负载调整 NPU 频率,轻负载降频省电。
- 算子调度优化:减少 CPU 和 NPU 之间的数据搬运,搬运的功耗经常比计算还高。
我做过一个持续推理的摄像头项目,优化前设备表面温度 55 度,优化后降到 42 度,续航从 4 小时提到 7 小时。关键就是减少了无谓的数据搬运和降低了推理频率。
5. 工具链与生态:选对工具省一半力气
5.1 主流端侧推理框架对比
端侧推理框架决定了开发效率。常见的有几类:
- 芯片厂商原生工具链:性能最好,但绑定芯片,迁移成本高。
- 跨平台框架:如 ONNX Runtime、TFLite、NCNN、MNN,通用性好,性能略逊。
- 编译型框架:如 TVM,能针对特定硬件生成优化代码,但学习曲线陡。
选型建议:如果只针对一款芯片,用原生工具链;如果要覆盖多款芯片,用跨平台框架加芯片后端;如果追求极致性能且团队有编译背景,考虑 TVM。
5.2 关于 ollama 不支持 NPU 这件事
社区里经常有人问"为什么 ollama 不支持 NPU"。这背后其实是个架构选择问题。ollama 这类工具主要面向桌面和服务器,走的是 CPU/GPU 路线,GPU 加速靠 CUDA 或 Metal。NPU 的编程模型和 CUDA 差异很大,每家 NPU 的指令集、内存模型、调度方式都不同,要支持就得为每家写后端,维护成本极高。
所以端侧 NPU 部署,基本不会用 ollama 这类通用工具,而是用芯片厂商的专用工具链。这不是技术做不到,是投入产出比的问题。理解这一点,就不会在工具选型上走弯路。
5.3 监控与可观测性:别等出问题才查
端侧部署上线后,怎么知道 NPU 跑得好不好?这就需要监控。Prometheus + Grafana 这套组合在服务端很成熟,端侧也能用,思路是:
- 在设备上暴露 NPU 利用率、内存占用、温度、推理延迟等指标。
- 通过轻量 agent 上报到 Prometheus。
- Grafana 做可视化,设置告警阈值。
端侧监控要注意资源开销,agent 本身不能太吃资源。我一般只采集关键指标,采样频率也不用太高,够用就行。有了监控,很多问题能在爆发前发现,比如温度缓慢上升、内存泄漏、推理延迟抖动。
6. 选型决策:不同场景怎么选算力方案
6.1 按场景匹配算力档位
选型没有万能答案,关键看场景。我总结了一个决策思路:
场景一:超低功耗常驻任务(关键词唤醒、传感器异常检测)。选带 NPU 的低功耗 MCU,算力 0.1-1 TOPS 足够,重点是功耗要低到微瓦级。
场景二:移动端实时任务(拍照增强、语音助手、实时翻译)。选手机 SoC,用其 NPU,算力 5-40 TOPS,重点看能效比和工具链成熟度。
场景三:边缘视频分析(多路摄像头、工业质检)。选 RK3588 这类边缘 SoC,算力 6 TOPS 左右,重点看多路并发能力和开源生态。
场景四:高性能边缘(自动驾驶、复杂工业场景)。选车规或工业级高性能 SoC,算力 20-100+ TOPS,重点看功能安全和原厂支持。
6.2 选型时最容易忽略的三个指标
除了算力,还有三个指标经常被忽略但极其重要:
内存带宽:决定了数据喂给 NPU 的速度。带宽不足,算力再高也跑不满。选型时要看 SoC 的内存规格,LPDDR4 和 LPDDR5 差距很大。
算子覆盖率:你的模型里的算子,芯片支持多少。这个必须拿真实模型去测,规格书不会写。
工具链成熟度:文档是否完整、社区是否活跃、原厂支持是否及时。这一条最玄学但最影响项目进度。我见过算力很强但工具链稀烂的芯片,项目做起来痛不欲生。
6.3 端云协同:不是二选一
最后强调一点,端侧和云端不是对立的。最务实的方案往往是端云协同:
- 端侧做唤醒、预处理、简单推理、隐私敏感处理。
- 云端做复杂推理、模型更新、数据分析。
- 两者通过明确的接口划分职责。
这样既保证了实时性和隐私,又利用了云端的算力弹性。很多成功的产品都是这个架构,而不是纯端或纯云。
7. 我踩过的几个真实坑
7.1 量化后精度崩了,问题出在校准集
有个视觉分类项目,PTQ 量化后精度从 95% 掉到 78%。排查了很久,最后发现是校准集的问题。我一开始用随机图片做校准,但模型实际处理的是特定场景的图像,分布差异大,量化参数自然不准。换成真实场景的 500 张图做校准后,精度回到 93%。这个教训是:校准集必须代表真实数据分布,不能随便凑。
7.2 NPU 算子回退导致性能断崖
另一个项目,模型里有个Resize算子,工具链不支持,自动回退到 CPU。结果整个推理时间从 20ms 涨到 150ms。因为 NPU 和 CPU 之间的数据搬运开销巨大,而且 CPU 算力弱。解决办法是把Resize换成工具链支持的Upsample加卷积组合,性能恢复到 25ms。这个坑告诉我们:转换后一定要看算子分布报告,确认没有意外的 CPU 回退。
7.3 动态形状导致的反复编译
Transformer 类模型支持变长输入,但 NPU 工具链对动态形状支持不好。每次输入长度变化,工具链就重新编译一次,第一次推理延迟高达几秒。解决办法是固定几个常用长度(比如 128、256、512),预编译好,运行时按长度分桶。牺牲一点灵活性,换来稳定的延迟。
7.4 温度墙导致的性能骤降
持续推理场景,设备跑几分钟后温度上来,NPU 降频,推理延迟翻倍。这个问题在规格书里看不到,只有实测才发现。应对办法是控制推理频率、优化散热结构、或者在温控触发前主动降负载。做产品时一定要做长时间压力测试,别只看峰值性能。
8. 给不同阶段读者的实操建议
8.1 刚入门:先跑通一个最小闭环
如果你刚接触端侧 AI,别一上来就搞复杂模型。建议路径:
- 选一块社区活跃的开发板(RK3588 类比较友好)。
- 拿一个现成的轻量模型(比如 MobileNet 做分类)。
- 走完导出 ONNX → 工具链转换 → 设备推理的完整流程。
- 跑通后再逐步换更复杂的模型。
关键是先建立"端侧部署长什么样"的直觉,再深入细节。
8.2 有基础:重点攻克量化和算子
如果你已经能跑通流程,下一步的瓶颈通常在量化和算子。建议:
- 系统学习量化原理,理解 PTQ 和 QAT 的差异。
- 学会看工具链的算子支持列表和转换报告。
- 遇到不支持的算子,练习替换和自定义实现。
- 建立自己的精度和性能测试基准。
8.3 做产品:把可观测性和可维护性放第一位
如果你在做真实产品,技术之外还要考虑:
- 模型怎么更新?OTA 还是重新烧录?
- 出问题怎么定位?有没有日志和监控?
- 不同设备型号怎么兼容?要不要做模型分档?
- 功耗和温度怎么保证?有没有降级策略?
这些问题在 demo 阶段不重要,在产品阶段决定成败。
端侧 AI 这件事,说到底是在约束下做取舍。没有最好的方案,只有最适合当前场景的方案。算力、功耗、成本、开发效率,四者永远在互相拉扯。我的经验是,先把场景需求量化清楚,再去匹配硬件和模型,最后用实测数据验证,别被规格书和跑分带偏。真正跑在产品里的端侧 AI,拼的不是峰值算力,而是稳定、可控、可维护。