3. 推理框架概览:端侧推理引擎对比与选型
做端侧推理,选框架是第一道坎。
我记得刚入行那会儿,团队里为了用 TensorFlow Lite 还是 NCNN 吵了整整一周。最后项目延期了,老板拍板说「两个都试」。结果呢?两个都跑通了,但性能差了一倍。选框架这事儿,真不能拍脑袋。
3.1 主流端侧推理引擎一览
先看看市面上都有谁。我按自己的使用频率排了个序,你感受一下:
| 框架 | 维护方 | 核心定位 | NPU 支持 |
|---|---|---|---|
| TFLite | Android 生态首选 | NNAPI / GPU Delegate | |
| ONNX Runtime | Microsoft | 跨平台、模型互通 | QNN / DML / CoreML |
| NCNN | 腾讯 | 极致 CPU 优化 | Vulkan / 部分 NPU |
| MNN | 阿里巴巴 | 移动端通用推理 | OpenCL / Vulkan / HTP |
| TNN | 腾讯 | 跨平台高性能 | NPU / DSP / GPU |
| Paddle Lite | 百度 | PaddlePaddle 生态 | 华为 / 瑞芯微 / 寒武纪 |
这张表看着简单,但每个框架背后都有「脾气」。我一个个说。
3.2 逐个拆解:每个框架的「脾气」
TFLite:Android 亲儿子
如果你做 Android 端推理,TFLite 是默认选项。Google 把 NNAPI 和 GPU Delegate 都绑死了,生态最成熟。但有个坑——它对量化模型的支持很激进。我曾经把一个 MobileNetV2 用 TFLite 量化,结果精度掉了 3 个点,查了半天发现是量化校准集没选对。
ONNX Runtime:模型「翻译官」
ONNX Runtime 的优势在于「中间人」角色。你从 PyTorch 导出 ONNX,它就能跑。我习惯用它做跨平台验证——先在 PC 上用 ONNX Runtime 跑一遍,再移植到端侧。但说实话,它在端侧的 NPU 支持还不够深,很多 NPU 算子需要自己写。
NCNN:CPU 优化之王
NCNN 是我个人最喜欢的框架。它把 ARM CPU 的 NEON 指令集用到了极致。如果你做 CPU-only 的端侧推理,NCNN 基本是天花板。但它的 NPU 支持比较弱,主要靠 Vulkan 间接调用。
MNN:阿里系首选
MNN 在淘宝、支付宝里用了很多年,稳定性没得说。它的 NPU 支持比 NCNN 好,尤其是对高通 HTP 的适配。我有个项目用 MNN 跑人脸检测,在骁龙 865 上延迟只有 8ms,效果很惊艳。
TNN:腾讯的「全能选手」
TNN 是 NCNN 的升级版,主打跨平台。它支持 NPU、DSP、GPU 三种异构计算。我试过在联发科 Dimensity 上跑 TNN,NPU 调用很顺畅。但它的社区活跃度不如前几个,遇到问题得自己啃源码。
Paddle Lite:百度生态绑定
如果你用 PaddlePaddle 训练模型,Paddle Lite 是自然选择。它对华为昇腾、瑞芯微 RKNN、寒武纪等国产 NPU 的支持最好。我有个客户做安防摄像头,用的就是 Paddle Lite + 瑞芯微方案,量产很稳定。
3.3 选型决策:我总结的「三步法」
选框架不是比参数,而是看场景。我总结了一个三步决策法:
- 看硬件:你的目标 NPU 是什么?高通用 MNN/TFLite,联发科用 TNN,华为用 Paddle Lite。
- 看模型来源:PyTorch 模型优先 ONNX Runtime,TensorFlow 模型优先 TFLite,PaddlePaddle 模型优先 Paddle Lite。
- 看性能需求:CPU-only 选 NCNN,异构计算选 MNN/TNN,生态优先选 TFLite。
3.4 框架选型决策图
下面这张图是我自己画的,帮你快速定位:
3.5 避坑指南:我踩过的几个坑
做端侧推理这几年,我踩了不少坑。挑几个典型的说说:
- 算子兼容性:ONNX 模型转 TFLite 时,有些算子不支持。我遇到过 Swish 激活函数在 TFLite 里没有实现,得手动替换成 ReLU6。
- 量化精度:NCNN 的量化工具比较老,对对称量化支持不好。我建议用 MNN 或 TFLite 的量化工具,精度损失更小。
- NPU 内存:NPU 的显存通常很小。我有个项目用 MNN 跑 YOLOv5,NPU 显存只有 256MB,模型死活加载不了。最后只能切到 CPU+NPU 混合模式。
- 多线程调度:TFLite 的 NNAPI Delegate 在 Android 上会抢占 CPU 线程。我遇到过 NPU 推理时,UI 线程卡顿的问题。解决方案是绑定 CPU 亲和性。
3.6 我的个人建议
如果你刚入门,我建议从 MNN 开始。原因有三:
- 文档全,社区活跃
- NPU 支持覆盖广(高通、联发科、华为都行)
- 量化工具好用,精度损失小
如果你做 Android 原生开发,那就选 TFLite。Google 的生态绑定太强了,别跟自己过不去。
如果你做国产芯片(瑞芯微、寒武纪、地平线),Paddle Lite 是唯一选择。这些芯片的 NPU 驱动只适配了 Paddle Lite,其他框架跑不了。