MegEngine 作为一个训推一体的 AI 框架,为用户提供了模型训练以及部署的能力。然而在部署模型时,因为会存在对于部署的模型计算来说不必要的代码,导致 SDK 体积比拟大。为了解决上述问题,咱们提供了新的工具:AI 编译器 MegCC。
MegCC 有以下个性:
- 只生成实现输出模型计算的必要的 kernel 代码以及用户指定的 CV 算子,编译失去的二进制文件体积很小。
- 反对 int8 量化模型以及 float16 量化,且生成的 kernel 是精心优化过的,推理性能好。
- 反对平台广。硬件方面,反对 Armv8、Armv7 以及 X86。操作系统方面,反对规范和非标准操作系统。
本文将重点解析模型部署中的重要步骤之一 - 模型编译:编译 MegEngine 模型,生成运行这个模型对应的 Kernel 以及和这些 Kernel 绑定的模型。
编译模型时:
- MegCC 生成模型应用的内核和用户所需的 CV 内核
- MegCC 做了多项优化,例如动态内存布局和模型优化
- MegCC 将上述数据转储到最终模型中
模型编译阶段次要应用 mgb-to-tinynn 工具,编译实现之后,会在用户给定的目录上面,生成对应的纯 C 代码的 Kernel 以及对应的模型。为了编译模型,mgb-to-tinynn 工具须要用户提供一个 Json 文件来配置编译选项。
目前 MegCC 只反对 mge 模型作为输出,其余模型格局能够思考转换到 ONNX,而后通过 mgeconvert 进行模型格局转换。
编写 Json 文件
json 模板如下:
{"@dump_dir":"[Required], specify the directory where the output kernel and model are stored",
"dump_dir":"./batch_dump/",
"models":[
{"@model_name":"[Optional], specify the name of the tiny model to be generated",
"model_name":"det_nchw44",
"@model_path":"[Required], specify the input model path. `mge' and `emod'formats are supported.",
"model_path":"path/to/model.mge",
"@input_shape_str":"[Optional], modify the input shape",
"input_shape_str":"data=(1,1,384,288):data=(1,1,288,384)",
"@enable_nchw44":"[Optional], whether to enable nchw44 optimization, default false",
"enable_nchw44":true,
"@enable_nchw44_dot":"[Optional], whether to enable nchw44 dot optimization for int8, default false",
"enable_nchw44_dot":false,
"@add_nhwc2nchw_to_input":"[Optional], add nhwc2nchw dimshuffle to input",
"add_nhwc2nchw_to_input":false,
"@mgb_fuse_kernel":"[Optional], fuse mgb kernel as possible",
"mgb_fuse_kernel":false,
"@enable_compress_fp16":"[Optional], whether to enable the optimization of using float16 storage to compress the model size",
"enable_compress_fp16":false,
"@enable_nchw88":"[Optional], whether to enable nchw88 optimization, default false",
"enable_nchw88":false,
"@enable_ioc16":"[Optional], whether to enable optimization using float16 calculation, default false",
"enable_ioc16":false
},
{
"model_name":"pf_nchw44",
"model_path":"path/to/another_model.emod",
"input_shape_str":"data=(1,1,112,112)",
"enable_nchw44":true
}
],
"@cv":"[Optional], specify the cv operator used in non-models (e.g. in pre and post processing)",
"cv":{"transpose":["ui8"],
"roicopy":["ui8"],
"rotate":["ui8"],
"flip":["ui8"],
"resize_linear":["ui8", "f32"],
"warp_affine_replicate_linear":["ui8"],
"rgb2bgr":["ui8"],
"yuv2bgr_nv21":["ui8"],
"rgb2yuv":["ui8"]
}
}
- 设置模型编译之后 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 算子 列表。
模型编译
编译模型目前能够应用 mgb-to-tinynn 这个可执行文件实现编译,也能够应用 Release 包外面的现成脚本 ./script/ppl_gen.sh
进行编译。
应用现成脚本进行模型编译(举荐)
Release 包中的 script 目录上面有一个 ppl_gen.sh
的文件,间接执行:
./script/ppl_gen.sh ./bin/mgb-to-tinynn ./example/mobilenet.json mobilenet_gen --arm64
./script/ppl_gen.sh
这个脚本将执行模型编译,并把 Runtime 须要的资源一起打包在一个压缩包中,不便后续 Runtime 的编译,解压这个压缩包将失去:
├── build runtime build 的门路
├── immigration generalIntrinsic 头文件
│ └── include
├── kern 模型 kernel 文件包含 cv 算子
├── mobilenet.json 模型 dump 所用的配置文件
├── model 模型
│ └── mobilenet_nchw44.tiny
├── model_info 模型输出信息
│ └── mobilenet_nchw44.tiny.txt
├── ppl_build.sh
├── runtime runtime 源码
│ ├── CMakeLists.txt
│ ├── example
│ ├── flatcc
│ ├── include
│ ├── schema
│ ├── script
│ └── src
└── test_model.py 模型对分测试脚本
应用可执行文件编译
应用 mgb-to-tinynn 和下面写好的 Json 文件执行:
mgb-to-tinynn --json=/path/to/json --[target]
成模型编译后,将生成的运行这个模型的 Kernel,和这些 Kernel 绑定的模型文件以及 cv 算子都放在 Json 文件中指定的目录。其中
- target:能够是 baremetal, arm64, armv7, arm64v7.
<!—->
- baremetal: 生成的 Kernel 为单片机能够运行的纯 C 模式
- arm64v7: 生成可能同时在 Arm64 和 ArmV7 上运行的两套 Kernel 以及他们对应的模型,这时候,模型文件可能会比 target 为 arm64 时候大一点。
如编译 Release 包中的 mobilenet 模型,指标机器是 arm64 机器,运行如下命令
mkdir mobilenet_gen
./bin/mgb-to-tinynn --json=./example/mobilenet.json --arm64 --dump mobilenet_gen
附
更多 MegEngine 信息获取,您能够:查看文档和 GitHub 我的项目,或退出 MegEngine 用户交换 QQ 群:1029741705。欢送参加 MegEngine 社区奉献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。