欢迎光临散文网 会员登陆 & 注册

MegEngine 使用小技巧:如何使用 MegCC 进行模型编译

2023-07-06 17:36 作者:旷视天元MegEngine  | 我要投稿

MegEngine 作为一个训推一体的 AI 框架,为用户提供了模型训练以及部署的能力。但是在部署模型时,由于会存在对于部署的模型计算来说不必要的代码,导致 SDK 体积比较大。为了解决上述问题,我们提供了新的工具:AI 编译器 MegCC(https://github.com/MegEngine/MegCC)。

MegCC 有以下特性:

  1. 只生成完成输入模型计算的必要的 kernel 代码以及用户指定的 CV 算子,编译得到的二进制文件体积很小。

  2. 支持 int8 量化模型以及 float16 量化,且生成的 kernel 是精心优化过的,推理性能好。

  3. 支持平台广。硬件方面,支持 Armv8、Armv7 以及 X86。操作系统方面,支持标准和非标准操作系统。

本文将重点解析模型部署中的重要步骤之一-模型编译:编译 MegEngine 模型,生成运行这个模型对应的 Kernel 以及和这些 Kernel 绑定的模型。

编译模型时:

  • MegCC 生成模型使用的内核和用户所需的 CV 内核

  • MegCC 做了多项优化,例如静态内存规划和模型优化

  • MegCC 将上述数据转储到最终模型中

模型编译阶段主要使用 mgb-to-tinynn 工具,编译完成之后,会在用户给定的目录下面,生成对应的纯 C 代码的 Kernel 以及对应的模型。为了编译模型,mgb-to-tinynn 工具需要用户提供一个 Json(https://en.wikipedia.org/wiki/JSON) 文件来配置编译选项。

目前 MegCC 只支持 mge 模型作为输入,其他模型格式可以考虑转换到 ONNX,然后通过 mgeconvert(https://github.com/MegEngine/mgeconvert#13-sparkles-onnx%E6%A8%A1%E5%9E%8B%E4%BA%92%E8%BD%AC) 进行模型格式转换。

编写 Json 文件

json模板如下:

  • 设置模型编译之后 dump 的路径,可以在 mgb-to-tinynn 工具中通过 --dump 参数进行 override。

  • Json 文件中需要指定使用 mgb-to-tinynn 编译的模型名称,模型的路径,以及模型的输入数据,以及一些优化参数等

    • 如果部署的实际情况中需要多个模型组成 pipline,可以指定多个模型

    • 如果一个模型在实际推理过程中可能需要多种输入 shape,需要分别在 input_shape_str 中指定,并用 : 分割开。

    • 支持 enable_nchw44 和 enable_nchw44_dot 两个优化选项,enable_nchw44 为 true 表示,优化模型推理中 Tensor layout 为 NC4HW4。enable_nchw44_dot 为 true 表示,优化模型推理中 Tensor layout 为 NC4HW4,并且在推理过程中使用 ArmV8.2 dot 指令进行推理加速

    • 开启 enable_ioc16 优化选项,可以使用 float16 进行 float32 模型的计算,可提升推理性能,代价是损失一些精度。通常需要同时开启 enable_nchw88 选项

  • 另外为了方便用户集成时候使用 cv 算子进行模型的前后处理,可以在这个 Json 文件中指定需要用到的 cv 算子的名称以及对应的数据类型。MegCC 支持的 cv 算子 列表(https://github.com/MegEngine/MegCC/blob/main/runtime/include/tinycv_c.h)。

模型编译

编译模型目前可以使用 mgb-to-tinynn 这个可执行文件完成编译,也可以使用 Release 包里面的现成脚本 ./script/ppl_gen.sh 进行编译。

使用现成脚本进行模型编译(推荐)

Release 包中的 script 目录下面有一个 ppl_gen.sh 的文件,直接执行:

./script/ppl_gen.sh 这个脚本将执行模型编译,并把 Runtime 需要的资源一同打包在一个压缩包中,方便后续 Runtime 的编译,解压这个压缩包将得到:

使用可执行文件编译

使用 mgb-to-tinynn 和上面写好的 Json 文件执行:

成模型编译后,将生成的运行这个模型的 Kernel,和这些 Kernel 绑定的模型文件以及 cv 算子都放在 Json 文件中指定的目录。其中

  • target:可以是 baremetal, arm64, armv7, arm64v7.

  • baremetal: 生成的 Kernel 为单片机可以运行的纯 C 形式

  • arm64v7: 生成能够同时在 Arm64 和 ArmV7 上运行的两套 Kernel 以及他们对应的模型,这时候,模型文件可能会比 target 为 arm64 时候大一点。

如编译 Release 包中的 mobilenet 模型,目标机器是 arm64 机器,运行如下命令

更多 MegEngine 信息获取,您可以查看:

文档:https://www.megengine.org.cn/doc/stable/zh/ 

深度学习框架 MegEngine 官网:https://www.megengine.org.cn/

GitHub 项目:https://github.com/MegEngine,或加入 MegEngine 用户交流 QQ 群:1029741705


MegEngine 使用小技巧:如何使用 MegCC 进行模型编译的评论 (共 条)

分享到微博请遵守国家法律