目前社区已经有多个移动端深度学习推理框架,如:NCNN、MNN... 这些推理引擎都给社区的用户带来了在移动端上部署深度学习非常多的便利,但是他们也都有一个共性问题:随着不断地迭代以及性能优化,运行时库会逐渐的增大,特别是在不同算子 fuse 的时候,会导致非常多的长尾算子,这就会增大我们 App 或者 SDK 的体积。
为了解决这个问题,由 MegEngine 团队开源的 MegCC 创新使用模型预编译的方案,生成模型推理必要的代码,去除掉了和模型推理无关的代码,因此极大程度上减少了推理引擎的体积。主要方法是:
将传统框架运行时的必要步骤:计算图优化、Kernel 选择、内存分配都移到编译时,从而最大程度上减少了 Runtime 时的二进制体积大小,并根据模型信息做进一步的性能优化。
该方案有以下优点:
- 随着框架的迭代将不会使得推理引擎的体积增大
- 很多的算子融合可以在编译时根据模型信息生成对应的 code
- 模型编译时可以获得整个计算图的信息,这样可以进一步进行极致的性能优化
- 可以吸收社区在代码生成方面的经验用于为 MegCC 生成 code
不同于传统推理框架,MegCC 是一个真真实实的深度学习模型编译器,具备极其轻量的 Runtime 二进制体积,高性能,方便移植,极低内存使用以及快启动等核心特点。用户可在 MLIR 上进行计算图优化,内存规划,最后通过预先写好的 code 模版进行代码生成。目前,MegCC 已支持 Arm64,Armv7,x86,risc-v 以及单片机平台。
GitHub 开源地址:https://github.com/MegEngine/MegCCgithub.com/MegEngine/MegCC
使用方法及效果
使用 MegCC 完成模型部署只需要完成以下 3 步:
- 模型编译:编译 MegEngine 模型,生成运行这个模型对应的 Kernel 以及优化之后的模型。
- Runtime编译:这个阶段会将 Runtime 和上一步中生成的 Kernel 一起编译成一个静态库。
- 集成到应用中:调用上一步编译的静态库的接口进行推理。
以 YOLOX 模型为例,运行效果如下图:
从图中可见,MegCC 生成的推理程序在保证推理性能良好(模型测速结果为 670ms)的情况下,其大小可以达到 95KB。
详细操作文档:MegCC/how-to-use-chinese.md at main · MegEngine/MegCC
手把手操作教程:挑战 100KB 可执行程序高性能推理 YOLOX 模型
未来计划
目前 MegCC 仅支持 MegEngine 模型作为输入,其他模型格式可以考虑转换到 ONNX,然后通过 mgeconvert 进行模型格式转换。
预计在未来 2 个月内,MegCC 将支持更多的模型格式编译。同时实现以下进阶功能:
- 支持ONNX模型作为输入
- 做更多的Kernel fusion
- 支持更多的后端设备
大家在使用 MegCC 过程中有任何问题,欢迎随时提 issue 告诉我们,也欢迎提 PR 帮助 MegCC 变得更好。
精彩分享
- 概述目前端上推理的现状,主要是推理引擎体积方面的情况
- 介绍 MegCC 的编译器方案
- 分享「超轻量、高性能、扩展性强」等特性的实现思路
- 总结 MegCC 的现状、优势以及未来的计划