MNN / TNN /TFlite GPU 对比

本文探讨了端侧AI推理引擎的发展,强调了通用性、高性能和易用性的重要性。作者指出,不应仅关注性能基准测试,而应关注新模型、新特性和用户体验。MNN推理引擎在模型支持、GPU算子实现和易用性方面进行了改进,包括模型转换、可视化工具和量化支持。文章最后呼吁行业关注端侧AI的全面进步,而非局限于性能对比。

转自:https://www.zhihu.com/question/400143354

 

作者:阿里巴巴淘系技术
链接:https://www.zhihu.com/question/400143354/answer/1310377675
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

端侧AI在这两三年里,可谓高速发展,新应用、新算法、新硬件推陈出新,也不断有新推理引擎涌现。但对引擎的评价方式定格在了三年前,比较的总是ARMv7/ARM64下MobileNet、SqueezeNet、ResNet不同版本的性能比较。这对我们而言,愈发像是一场性能的"圣杯战争" —— 性能重要吗?当然重要。能不参与吗?又无人身免。但这几个模型的性能真的是推理引擎们的终极目标吗?当然不是!如果我们的目标是真正去降低社区AI应用的门槛,就不能只停留在这些指标上。

测评报告的原初目的,应该是便于用户针对自身的业务,做出选择,而不是秀肌肉。一个好的推理引擎应至少具有三个基本特性:通用性,模型支持是一切应用的前提;高性能,但快慢若脱离业务价值,也会缺失实际意义;易用性,能少搬几块砖,岂不美哉?因此,行业评价推理引擎的方式亟需升级 —— 性能上,除了基准的数据,也应包含对新后端、新特性的支持情况;算子上,用户可能更关心除了CNN以外,能不能支持RNN、GAN、Transformer;易用性上,是不是有提供可视化工具、测评工具、量化工具,编程界面是不是足够友好。

为此,我们一直在努力。

高性能

 


虽然说不能只看性能,但点名了,还是要回应一下的。

做完数据验证,虽然数据和TNN的测评稍有出入,但更为重要的,还是TNN为我们的工程师立刷新了一个小目标。于是,我们把之前搁置的优化拎上了日程。一周不到的时间,835/845上跑MobileNet,CPU上不相上下;GPU上,则是5 ~ 15%的领先。

 


但这再也不是当年从2000ms降低到700ms那样的飞跃了。

而如果我们放眼大一些的模型,比如Inception V3,那么情况会是:

 



又或是打开ARM v8.2的情况下,不论是fp16还是quant,性能都可以有一段跃迁:



你看,可以为业务带来质变优化的点依然存在。而这些,正是我们暂时按下ARM优化的原因。

通用性

除了性能,用户最为关心的指标就是通用性。性能再好,业务模型跑不起来都白搭。而MNN背靠阿里巴巴的众多智能场景,久经各方业务的磨炼,在支持算子的数量、算子实现的质量上,都可谓久经考验。但如果不是MNN的死忠粉,可能都很难意识到,我们在通用性方面下的苦功。

模型转换上,我们没有将Caffe、TensorFlow、TensorFlow Lite的转换转嫁给三方的工具,尽量避免模型格式间转换导致的失败。从开源到现在,在支持的转换算子总量上,MNN翻了一番还多。


算子实现上,我们在计算后端的支持上,应该也是业界最广的。除了前文所述的ARM v8.2,我们在GPU算子的支持上,也不遑多让。

 

(注:计算算子数量时,对Binary、Unary、Reduce算子,统一到友商口径,采用拆分成多种的方式计算。)


易用性


易用性方面,在过去的一年,我们也着墨颇多。

可视化上,我们在跨平台可视化工具Netron上增加了对MNN模型的支持。

模型压缩上,我们的工具同时支持了KL和ADMM两种量化方式,即可以采用Post-training Quantization降低量化门槛,也可以采用Quantization Aware Training来提升量化的精度。

模型测评上,我们提供的校验工具和Profiler工具,可以帮助开发者快速定位模型中的问题所在。

前端语言上,我们还打通了MNN和Python的桥接,方便算法工程师们,在自己熟悉的平台、熟悉的语言上,完成开发、校验。

除了工程之外,文档示例上,我们也没落下。我们搭建了中英文的文档集,也和社区一起搭建了我们的示例集


想点大事

 


如果跳出引擎的小圈子,放眼整个AI生态圈,端侧AI近几年发展到底怎么样呢?

我们以云侧AI为标尺,可以把端侧AI拆解为上下两层:

  • 基础设施

如前所述,不只是性能,推理引擎在通用性、易用性等方面还有待完善。而推理引擎也只是解决了模型在端侧运行的问题,从端侧AI部署的完整迭代来说,模型转换、模型压缩、开发调试、效果评估、算法和工程怎么高效协同等等,需要优化、提效的流程,还有很多。
 

  • 上层应用

从应用角度来说,目前端侧AI应用的广度和深度都是不够的 —— 一方面,杀手级的应用不多,甚至基本就没有;另一方面,AI应用的门槛还比较高,很多长尾需求难以落地。可以说,端侧AI的业务价值还没有充分被挖掘出来。因此,相比于烈火烹油的云侧AI,或是三端一体的Flutter,我们都还需要和社区站在一起,做更进一步的探索。

我们真切得认为端侧AI还处于发展的初期,更需要从业者一起努力推动行业发展,而不是把弹药浪费在无尽的对比内耗上面。我们期望和大家在真正有益于繁荣AI生态的方向上,探索出一片新的空间。

望共勉。

——————————————————————————————————

本账号主体为阿里巴巴淘系技术,淘系技术部隶属于阿里巴巴新零售技术事业群,旗下包含淘宝技术、天猫技术、农村淘宝技术、闲鱼、躺平等团队和业务,是一支是具有商业和技术双重基因的螺旋体。

刚刚入驻知乎,将会给大家带来超多干货分享,立体化输出我们对于技术和商业的思考与见解。

详情介绍可以看这里 阿里巴巴淘系技术介绍

<think> 首先,用户查询是关于如何使用"MNNConvert"工具将ONNX模型转换为MNN模型的。用户指定了参考站内引用,所以我需要基于这些引用整合信息。 引用内容: - [1]:提到使用命令 `./MNNConvert -f ONNX --modelFile test.onnx --MNNModel test.mnn --bizCode MNN` - [2]:讨论了强化学习训练出的ONNX文件转换为MNN格式,包括步骤如检查MNN版本、克隆仓库、编译MNN启用ONNX支持、使用`onnx2mnn`工具。 - [3]:给出了编译指令,使用CMakeNinja在Windows下编译,启用转换器。 用户明确说:"我想查找使用MNNConvert工具将onnx模型转换为MNN模型的方法",所以焦点是`MNNConvert`工具,而不是其他方法如`onnx2mnn`。 从引用[1]直接提供了一个命令:`./MNNConvert -f ONNX --modelFile test.onnx --MNNModel test.mnn --bizCode MNN` 我需要结构化回答: - 使用中文回答。 - 回答结构清晰,逐步解决问题。 - 引用末尾添加引用标识如[^1]。 - 生成相关问题。 - 对于数学表达式,使用$...$或$$...$$,但这里可能不涉及数学,但如果有概率或数值,要正确格式化。 - 确保LaTeX语法正确。 步骤: 1. 确认工具:`MNNConvert`是MNN框架提供的模型转换工具。 2. 准备工作:确保环境设置正确,参考[2]中提到检查MNN版本、克隆仓库、编译启用ONNX支持。 3. 转换命令:基于[1]提供命令。 4. 可能的问题:参考[2]提到如果问题存在,检查目录等。 5. 生成相关问题。 结构化回答: - 引言:解释工具。 - 步骤:逐步说明如何使用`MNNConvert`。 - 引用:在相关部分添加引用。 - 结尾:生成相关问题。 最终回答应包括: - 清晰步骤。 - 代码块用于命令。 - 相关问题。 生成相关问题:基于主题,如转换选项、常见问题、优化等。 </think> ### 使用 MNNConvert 工具将 ONNX 模型转换为 MNN 模型的方法 MNNConvert 是 MNN 框架提供的命令行工具,用于将各种格式的模型(包括 ONNX)转换为 MNN 格式。以下是基于最新最佳实践的逐步指南,确保转换过程顺利。整个流程分为准备环境执行转换两个主要阶段,参考了 MNN 官方文档社区经验。 #### 步骤 1: 准备环境(确保工具可用) 在运行 MNNConvert 之前,需要确保系统环境配置正确。这包括: - **检查 MNN 版本**:使用最新版本的 MNN 以避免兼容性问题。推荐从 MNN 的 GitHub 仓库克隆源代码并编译。从引用[2]中提取的建议: ```bash # 克隆仓库(包含所有子模块) git clone --recurse-submodules https://github.com/alibaba/MNN.git cd MNN ``` - **编译 MNN 并启用 ONNX 支持**:MNNConvert 工具需要在编译时启用 ONNX 支持。以下命令适用于 Linux/macOS 系统(Windows 用户可参考引用[3]的 CMake 配置): ```bash mkdir build cd build cmake .. -DMNN_BUILD_ONNX=ON # 启用 ONNX 支持 make -j$(nproc) # 编译工具 ``` 编译完成后,工具文件位于 `MNN/tools/MNNConvert`(或 `MNNConvert.exe` 在 Windows 下)。如果出现 `onnx` 目录缺失,重新编译并检查 CMake 选项[^2]。 #### 步骤 2: 执行模型转换 一旦环境准备好,即可使用 MNNConvert 转换 ONNX 模型。核心命令格式如下(基于引用[1]): ```bash ./MNNConvert -f ONNX --modelFile <input_path>.onnx --MNNModel <output_path>.mnn --bizCode MNN ``` - **参数解释**: - `-f ONNX`:指定输入模型格式为 ONNX。 - `--modelFile <input_path>.onnx`:替换为你的 ONNX 模型文件路径,例如 `test.onnx`。 - `--MNNModel <output_path>.mnn`:指定输出文件名路径,例如 `test.mnn`。 - `--bizCode MNN`:可选参数,用于设置业务标识符,保持默认即可。 - **示例命令**: ```bash # 假设当前在 MNN/tools/ 目录下 ./MNNConvert -f ONNX --modelFile ./models/test.onnx --MNNModel ./output/model.mnn --bizCode MNN ``` - **运行位置**:确保在编译生成的 `MNN/tools/` 目录下运行命令,以避免路径错误。 #### 步骤 3: 验证问题排查 - **验证输出**:转换成功后,检查输出文件是否正常(如文件大小是否合理)。可使用 MNN 的测试工具加载 `.mnn` 文件进行简单推理。 - **常见问题**: - **工具未找到**:确认编译正确,且在 `MNN/tools/` 目录运行。如果目录缺失,重新编译(参考步骤 1)[^2]。 - **转换错误**:如果 ONNX 模型使用了不支持的算子,MNNConvert 会报错。此时,需检查 ONNX 模型兼容性,或更新 MNN 到最新版本。 - **Windows 支持**:在 Windows 上,可以使用 MinGW 或 MSVC 编译(引用[3]提供 CMake 指令),转换命令格式相同[^3]。 - **获取帮助**:如有错误,查阅 MNN 官方文档或在 GitHub 社区提问[^2]。 #### 注意事項 - **性能考虑**:大规模模型转换时,内存占用可能较高(例如,对于 $n \times n$ 矩阵,内存需求约为 $O(n^2)$),建议在服务器环境中操作。 - **依赖项**:确保系统安装了 CMake 编译器(如 gcc 或 Clang)。ONNX 模型本身应采用标准格式,避免自定义层。 通过以上步骤,您可以高效地将 ONNX 模型转换为 MNN 格式。整个过程基于 MNN 的最新实践,确保了可靠性兼容性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值