3. 推理框架概览:端侧推理引擎对比与选型

做端侧推理,选框架是第一道坎。

我记得刚入行那会儿,团队里为了用 TensorFlow Lite 还是 NCNN 吵了整整一周。最后项目延期了,老板拍板说「两个都试」。结果呢?两个都跑通了,但性能差了一倍。选框架这事儿,真不能拍脑袋。

3.1 主流端侧推理引擎一览

先看看市面上都有谁。我按自己的使用频率排了个序,你感受一下:

框架 维护方 核心定位 NPU 支持
TFLite Google 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 个点,查了半天发现是量化校准集没选对。

注意:TFLite 的 NNAPI Delegate 在不同 Android 版本上行为不一致。Android 10 和 Android 12 的 NPU 调度策略完全不同,建议在目标设备上做回归测试。

ONNX Runtime:模型「翻译官」

ONNX Runtime 的优势在于「中间人」角色。你从 PyTorch 导出 ONNX,它就能跑。我习惯用它做跨平台验证——先在 PC 上用 ONNX Runtime 跑一遍,再移植到端侧。但说实话,它在端侧的 NPU 支持还不够深,很多 NPU 算子需要自己写。

NCNN:CPU 优化之王

NCNN 是我个人最喜欢的框架。它把 ARM CPU 的 NEON 指令集用到了极致。如果你做 CPU-only 的端侧推理,NCNN 基本是天花板。但它的 NPU 支持比较弱,主要靠 Vulkan 间接调用。

我的经验:在骁龙 8 Gen 2 上,NCNN 的 CPU 推理速度比 TFLite 快 20%-30%。但一旦切换到 NPU,NCNN 就没什么优势了。

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 选型决策:我总结的「三步法」

选框架不是比参数,而是看场景。我总结了一个三步决策法:

  1. 看硬件:你的目标 NPU 是什么?高通用 MNN/TFLite,联发科用 TNN,华为用 Paddle Lite。
  2. 看模型来源:PyTorch 模型优先 ONNX Runtime,TensorFlow 模型优先 TFLite,PaddlePaddle 模型优先 Paddle Lite。
  3. 看性能需求:CPU-only 选 NCNN,异构计算选 MNN/TNN,生态优先选 TFLite。
核心原则:没有最好的框架,只有最合适的框架。选框架时,先跑一个最小模型做 benchmark,别信宣传数据。

3.4 框架选型决策图

下面这张图是我自己画的,帮你快速定位:

端侧推理框架选型决策图 你的目标硬件是什么? 高通 Snapdragon 联发科 Dimensity 华为 Kirin / 昇腾 推荐:MNN / TFLite NPU 适配好,生态成熟 推荐:TNN / MNN NPU 调用顺畅,性能稳定 推荐:Paddle Lite 国产 NPU 支持最好 💡 选型建议 先跑 benchmark,再决定。别信宣传,信数据。

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 亲和性。
曾经踩过的坑:有一次我用 TNN 在联发科设备上跑模型,NPU 推理结果全是 NaN。查了两天,发现是 TNN 的 NPU 驱动版本和固件不匹配。升级驱动后就好了。所以,驱动版本一定要和框架版本对齐。

3.6 我的个人建议

如果你刚入门,我建议从 MNN 开始。原因有三:

  • 文档全,社区活跃
  • NPU 支持覆盖广(高通、联发科、华为都行)
  • 量化工具好用,精度损失小

如果你做 Android 原生开发,那就选 TFLite。Google 的生态绑定太强了,别跟自己过不去。

如果你做国产芯片(瑞芯微、寒武纪、地平线),Paddle Lite 是唯一选择。这些芯片的 NPU 驱动只适配了 Paddle Lite,其他框架跑不了。

最后说一句:框架只是工具,真正决定性能的是你对硬件和模型的理解。别在选框架上花太多时间,跑起来再说。