ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

端侧AI部署避坑指南:云端、手机、车载与TinyML芯片差异全解析

端侧AI部署避坑指南:云端、手机、车载与TinyML芯片差异全解析

同一个神经网络,放到云端服务器上跑得好好的,为什么一搬到手机、车机或者一块几十块钱的开发板上,就各种水土不服?这个问题我在过去两年里被问过不下几十次,提问的人有做App的、有做嵌入式的、也有做算法的。大家普遍的困惑是:模型明明没变,权重还是那些权重,算子还是那些算子,怎么换个地方就完全不是一回事了?

答案其实不复杂——芯片的设计目标不同,决定了它对模型的态度完全不同。云端芯片追求的是吞吐和通用性,手机SoC追求的是能效比和面积,车载芯片追求的是确定性和安全冗余,而TinyML那一档的MCU追求的是"能跑就行,多一个字节的RAM都是奢侈"。这四种思路背后是四套截然不同的工程哲学,理解了它们,你才能明白为什么同一个模型需要四种部署策略。

这篇内容适合正在做端侧AI落地、或者准备从云端推理转向嵌入式部署的工程师。我会从芯片架构、内存层级、算子支持、工具链、量化策略这几个维度,把云端、手机、车载、TinyML四条路线的差异掰开揉碎讲清楚,中间穿插一些我自己踩过的坑和实测数据。读完你应该能判断:手头这个模型到底该往哪个方向压,以及压到什么程度才算合理。

1. 四种芯片思路的分野:从设计目标倒推部署策略

1.1 云端芯片的"大力出奇迹"逻辑

云端AI芯片(无论是数据中心GPU还是专用加速卡)的核心设计目标是吞吐量最大化。它假设你有充足的供电、完善的散热、几乎无限的带宽,以及最重要的——批处理(batching)。在这个前提下,芯片可以堆叠大量的计算单元,用高带宽内存(HBM)喂数据,通过大规模并行把矩阵乘法的效率拉到极致。

这种设计思路带来的直接后果是:云端推理框架对模型的算子支持极其宽松。动态shape、控制流、稀疏算子、自定义算子,基本都能找到支持。因为云端有足够的资源去做算子融合、图优化、内存池管理,甚至可以在运行时动态编译。你在云端部署一个模型,最不需要担心的就是"这个算子芯片支不支持"。

但代价也很明显:功耗动辄几百瓦,延迟受批处理调度影响,单次推理的成本并不低。云端适合的是高并发、可容忍一定延迟、对单次成本不敏感的场景。

1.2 手机SoC的"螺蛳壳里做道场"

手机SoC是完全不同的游戏。它的核心约束是功耗和面积。一颗旗舰手机SoC的NPU算力可能标称几十TOPS,但那是峰值,实际持续输出受限于散热和电池。手机厂商真正在意的是每瓦性能(TOPS/W),以及NPU占用的芯片面积。

这就导致手机NPU对算子的支持是有选择性的。它会把最常见的卷积、全连接、池化、常见激活函数做成硬件加速单元,但那些冷门算子、动态控制流、复杂的数据依赖操作,要么回退到CPU/GPU,要么直接不支持。你在手机端部署模型,第一件事就是查NPU的算子白名单。

另一个关键差异是内存层级。手机SoC的NPU通常有自己的片上缓存(SRAM),但容量有限,模型权重和中间激活需要频繁在DDR和片上缓存之间搬运。这个搬运的带宽和延迟,往往才是真正的瓶颈,而不是算力本身。

1.3 车载芯片的"确定性压倒一切"

车载AI芯片的设计目标里,功能安全和确定性的优先级高于纯粹的算力。车规级芯片要通过一系列可靠性认证,工作温度范围、电磁兼容、故障率都有严格要求。这意味着车载NPU的架构往往更保守,不会激进地采用最新工艺和最新算子。

车载场景对延迟的要求是确定性而非平均值。自动驾驶的感知-决策-控制链路,每一帧的处理时间必须可预测,不能出现偶发的长尾延迟。这就要求模型和芯片的配合必须非常紧密,通常需要静态编译、固定shape、预分配内存,避免任何运行时的动态行为。

1.4 TinyML的"一个字节都要省"

到了MCU这一档,游戏规则彻底变了。以STM32、ESP32这类芯片为代表,RAM可能只有几十到几百KB,Flash几百KB到几MB,主频几十到几百MHz,没有操作系统或者只有RTOS。在这种环境下跑神经网络,内存是比算力更稀缺的资源。

TinyML的核心思路是:模型必须小到能塞进片上存储,算子必须简单到能用定点运算实现,整个推理过程不能有动态内存分配。你不可能在MCU上跑一个标准的PyTorch模型,必须经过极致的量化、剪枝、算子简化,甚至手工重写推理内核。

下面这张表可以快速对比四种思路的核心差异:

维度云端手机SoC车载TinyML/MCU
首要目标吞吐量能效比确定性/安全内存占用
典型功耗200-700W1-10W5-50W10-500mW
内存容量GB级HBMGB级LPDDRGB级LPDDRKB级SRAM
算子支持极宽松白名单制保守白名单极简算子集
量化策略FP16/FP8INT8/INT4INT8为主INT8/二值
动态shape支持有限支持基本不支持不支持
典型工具链TensorRT/ONNXNCNN/QNN厂商专用TFLite Micro/CMSIS-NN

理解了这张表,后面的很多"为什么"就顺理成章了。

2. 内存墙才是端侧部署的真正敌人

2.1 算力标称值为什么总是骗人

很多人在选型时盯着NPU的TOPS数字看,觉得数字大就能跑得快。实际部署下来发现,标称几十TOPS的NPU,跑一个实际模型可能连十分之一的利用率都达不到。问题出在内存带宽上。

神经网络的推理过程,本质上是不断在权重和激活之间做乘加运算。如果计算单元的速度远快于数据供给的速度,计算单元就会空转等待数据。这就是所谓的"内存墙"。云端用HBM堆带宽,手机用LPDDR5,而MCU的SRAM带宽虽然相对高,但容量太小,装不下大模型。

我实测过一个典型的MobileNetV2变体,在某个标称8TOPS的NPU上,理论算力对应的推理时间应该是几毫秒,但实测下来是二十多毫秒。用性能分析工具一看,超过一半的时间花在DDR和片上缓存的搬运上,计算单元利用率只有30%出头。

2.2 片上缓存决定实际性能

手机和车载NPU通常有几百KB到几MB的片上SRAM。这个容量决定了一个算子能否在片上完成全部计算。如果某个层的输入、输出、权重加起来超过了片上缓存,就必须分块(tiling)处理,每块都要和DDR交互,性能立刻下降。

这也是为什么很多NPU对通道数和特征图尺寸有隐含要求。通道数太小,计算密度低,搬运开销占比高;通道数太大,单层放不下,又要分块。最优的模型结构往往是针对特定NPU的缓存容量"量身定制"的。

提示:做端侧模型设计时,先查清楚目标NPU的片上缓存容量,然后反推每一层的特征图大小和权重体积,尽量让热点层能完整驻留在片上。这一步比调量化参数对性能的影响更大。

2.3 MCU上的内存账要算到字节

到了MCU这一档,内存管理变成了手工活。TFLite Micro的Tensor Arena是一块预分配的连续内存,所有中间张量都从这块内存里分配。你需要精确计算峰值内存占用,然后设置Arena大小。设小了会运行失败,设大了浪费宝贵的RAM。

更麻烦的是,MCU上通常没有MMU,没有虚拟内存,栈和堆的边界要自己规划。我见过不少项目在PC上仿真跑得好好的,烧到板子上就HardFault,最后查出来是Tensor Arena和栈空间重叠了。

一个实用的做法是:先用TFLite Micro的离线分析工具算出模型的内存需求,然后在此基础上留30%余量,再根据链接脚本调整堆栈布局。别嫌麻烦,这一步省不得。

3. 算子支持:从"什么都能跑"到"只有这些能跑"

3.1 云端框架的算子生态

云端推理框架(如TensorRT、ONNX Runtime)的算子库非常丰富,而且支持自定义算子插件。你几乎可以把任何PyTorch模型导出后直接跑起来,遇到不支持的算子,写个插件就行。框架还会自动做算子融合、常量折叠、内存复用等优化。

这种宽松是有代价的:框架体积大,运行时开销高,不适合资源受限环境。而且云端框架的优化策略是针对大batch、大显存设计的,搬到端侧往往水土不服。

3.2 手机NPU的算子白名单

手机NPU厂商通常会提供一份算子支持列表,明确哪些算子能硬件加速,哪些只能回退CPU,哪些完全不支持。这份列表是部署前必须逐条核对的。

常见的坑包括:某些激活函数(如Swish、GELU)在早期NPU上不支持,需要替换成ReLU或HardSwish;某些reshape/transpose操作会触发数据重排,性能骤降;动态shape的算子(如非固定尺寸的ROI Align)基本不支持。

我的经验是,在模型设计阶段就对照目标NPU的白名单来选算子,而不是训练完了再想办法适配。后者往往要改模型结构,重新训练,成本高得多。

3.3 TinyML的极简算子集

TFLite Micro和CMSIS-NN支持的算子集非常有限,基本就是卷积、深度可分离卷积、全连接、池化、常见激活、加法、乘法这些。任何稍微复杂的操作,比如LSTM、Attention、自定义归一化,要么没有实现,要么需要自己写。

这就意味着,想在MCU上跑Transformer类的模型,基本要从头设计一个极简版本。业界有一些尝试,比如把Attention简化成固定模式的加权求和,但效果和通用性都要打折扣。

算子类型云端手机NPUTinyML
标准卷积支持支持支持
深度可分离卷积支持支持支持
动态shape支持有限不支持
LSTM支持部分支持需手写
Attention支持部分支持基本不支持
自定义算子插件支持基本不支持不支持

4. 量化:四种场景下的不同取舍

4.1 云端为什么还在用FP16

云端有充足的算力和带宽,FP16甚至FP32带来的精度优势是实打实的。虽然INT8量化在云端也有应用(主要为了省显存和带宽),但很多对精度敏感的任务仍然用FP16。云端不需要为了省几毫瓦功耗去牺牲精度。

4.2 手机端的INT8是标配

手机NPU基本都以INT8为主要计算精度,部分新芯片支持INT4甚至INT2。INT8量化能把模型体积压到FP32的四分之一,同时利用整数运算单元获得更高的能效。代价是精度损失,需要通过量化感知训练(QAT)或者精细的校准来弥补。

手机端量化的一个关键问题是per-channel还是per-tensor。Per-channel量化精度更好,但需要NPU支持;per-tensor实现简单,但精度损失大。选型时要确认目标NPU支持哪种。

4.3 车载量化的保守策略

车载对精度和确定性的要求更高,量化策略通常更保守。很多车载项目仍然以INT8为主,但会做更严格的精度验证,确保量化后的模型在各种边界条件下都不会出现不可接受的偏差。部分安全相关模块甚至保留FP16。

4.4 TinyML的极致量化

MCU上,INT8是起点,不是终点。为了把模型塞进几百KB的Flash,很多项目会用INT4、二值化(BinaryNet)、甚至三值化。这些极端量化会显著损失精度,但在一些简单任务(关键词唤醒、简单手势识别)上仍然可用。

量化的实操建议:先在PC上用训练后量化(PTQ)快速验证,如果精度掉得太多,再上QAT。QAT需要在训练时插入伪量化节点,成本高但效果好。对于TinyML,往往还要配合剪枝和知识蒸馏,多管齐下才能把模型压到目标体积。

5. 工具链与部署流程的实操差异

5.1 云端:导出即用

云端部署流程相对简单:训练框架导出ONNX,ONNX转TensorRT或直接跑ONNX Runtime,做一下图优化和精度校准,就能上线。整个流程自动化程度高,迭代快。

5.2 手机:转换-量化-验证三步走

手机端部署通常要走:训练框架导出ONNX或TFLite,用厂商工具链(如高通的QNN、联发科的NeuroPilot)转换,做量化和图优化,然后在真机上验证精度和性能。这个过程中最容易出问题的是算子映射和量化校准,往往需要反复迭代。

5.3 车载:静态编译+严格验证

车载部署强调静态编译和确定性。模型shape固定,内存预分配,推理过程无动态行为。验证环节非常严格,要做大量的边界测试和故障注入测试。

5.4 TinyML:手工优化到最后一刻

MCU部署是最"原始"的:模型转成TFLite,再用TFLite Micro的转换工具转成C数组,集成到工程里,手工调整Tensor Arena大小,必要时还要改CMSIS-NN的内核实现。整个过程充满了手工调优。

提示:TinyML项目里,模型转换后的C数组大小、Tensor Arena大小、栈大小这三个数字要反复核对。我踩过的坑是模型转换后Flash占用比预期多了几十KB,最后发现是某个算子的实现带了额外的查找表。

6. 实测中的性能陷阱与排查思路

6.1 手机NPU的"首次推理慢"

很多手机NPU在首次推理时会做图编译和内存分配,耗时可能是后续推理的几十倍。做性能测试时一定要区分首次和稳态,否则数据会严重失真。

6.2 车载的"温度墙"

车载芯片在高温环境下会降频,持续推理性能可能比常温下低不少。做性能预算时要考虑最坏情况,而不是实验室常温数据。

6.3 MCU的"对齐陷阱"

CMSIS-NN的很多内核要求数据按4字节对齐,如果Tensor Arena的起始地址没对齐,或者某个张量的偏移没对齐,会触发HardFault或者性能下降。这个坑很隐蔽,因为PC仿真时不会暴露。

6.4 通用排查思路

遇到端侧性能不达预期,我通常按这个顺序排查:先确认模型是否真的跑在NPU上(而不是回退到CPU),再查算子是否有回退,然后看内存搬运是否是瓶颈,最后才考虑算力本身。大部分问题出在前两步。

7. 选型决策:你的模型该往哪条路走

7.1 按场景倒推

如果你的场景是服务器端高并发推理,云端方案最省心。如果是手机App内的实时推理,优先考虑手机NPU,但要接受算子限制。如果是车载或工业场景,确定性和安全性优先。如果是电池供电的小型设备,TinyML是唯一选择。

7.2 按模型规模倒推

参数量在百万级以上的模型,基本只能走云端或手机。十万级到百万级可以考虑车载或高性能MCU。万级以下的模型才适合TinyML。

7.3 按团队能力倒推

云端部署对团队要求最低,工具链成熟。手机和车载部署需要熟悉厂商工具链,有一定学习成本。TinyML部署对嵌入式功底要求最高,需要懂链接脚本、内存布局、甚至汇编。

我在实际项目中的体会是:不要试图用一套方案打天下。同一个业务,云端做训练和复杂推理,端侧做轻量推理和预处理,各司其职,往往比强行把大模型塞到端侧更划算。端侧AI的价值不在于复现云端的能力,而在于用有限的资源解决特定的、对延迟和隐私敏感的问题。想清楚这一点,选型就不会纠结了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进