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

MegEngine 作为一个训推一体的 AI 框架,为用户提供了模型训练以及部署的能力。但是在部署模型时,由于会存在对于部署的模型计算来说不必要的代码,导致 SDK 体积比较大。为了解决上述问题,我们提供了新的工具:AI 编译器 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 文件来配置编译选项。

目前 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_nchw44enable_nchw44_dot 两个优化选项,enable_nchw44 为 true 表示,优化模型推理中 Tensor layout 为 NC4HW4enable_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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容