mnn量化

参考:https://zhuanlan.zhihu.com/p/73207495android

今天MNN更新了新的工具包---CNN网络量化工具(quantization),做者也第一时间进行了测试。提高的效果仍是很可观的,量化前的CNN网络大小约为5.7M,在rk3399(android-8.1)的inference速度约为45ms。使用MNN提供的quantization工具进行量化后,模型大小减小为1.5M,在rk3399中的inference速度为29msc++

其使用的流程很是友好,首先使用MNN提供的量化工具对CNN的模型参数文件进行量化编码,编码后的模型可直接由MNN提供的inference-api进行调用,输入和输入跟进行float32的inference同样,接口和调用方式不须要进行任何改变,目前的目标平台主要仍是针对CPU上的int8进行加速。因此,不少对时延有要求的小模型,同时刚好平台中没有GPU或其余辅助计算的协处理器的,能够考虑利用量化模型和量化int8推断的方式来进一步提高网络的性能效率。git

具体量化的算法和过程,咱们会在后续的文章跟你们进行讨论。下面咱们进入实际操做环节,首先要同步到最近版本的MNN代码。若是你已经clone过,执行以下命令进行同步便可算法

git pull

进入MNN的主目录,在进行编译前,须要确认打开CMakeList.txt的以下几个选项:json

option(MNN_BUILD_QUANTOOLS "Build Quantized Tools or not" ON)
option(MNN_USE_INT8_FAST "Enable Int8 Fast Optimization" ON)

而后生成项目所需的schema文件,并创建文件夹进行编译。api

./schema/generate.sh
mkdir build && cd build && cmake .. && make -j4

此时你会在build目录中看见quantized.out文件,这个就是编译好的量化工具。使用很简单,MNN中也给出了使用案例,命令行中执行网络

./quantized.out face_det_300.mnn face_det_300_quant.mnn face_det.json

其中json文件为量化的一些预约义参数,可参考个人配置文件。在进行给定均值方差的白化操做时,MNN的量化工具使用的方式为O = (image - mean) * normal的方式,跟咱们常见的除以std是同样的。另外须要注意的是,path目录须要给定一个,不然程序在运行过程当中可能会崩溃(固然你也能够对量化的源码进行修改)。为了获得较好的量化精度,给定path的文件夹内的数据的domain须要和训练模型的数据domain一致。或者干脆把训练数据选取一些放到该目录下,理论上数据越多效果越好,量化的速度越慢。笔者在实验的时候在目录下放了100张的图片数据。dom

{
    "format":"RGB",
    "mean":[
        123.0,
        123.0,
        123.0
    ],
    "normal":[
        0.017,
        0.017,
        0.017
    ],
    "width":224,
    "height":224,
    "path":"../resource/images"
}

获得量化后的模型文件face_det_300_quant.mnn之后,就能够直接用来进行推断了。若是你想在PC中进行测试,使用编译好的benchmark.out文件就能够,将face_det_300_quant.mnn和face_det_300.mnn一块儿放入测试文件夹路径下,而后执行以下命令便可,工具

./benchmark.out models_folder [loop_count] [forwardtype]

其中models_folder为face_det_300_quant.mnn所在的目录,loop_count为循环的次数,forwardtype为推断的类型,有cpu、opencl、opengl、vulkan等等,这里forwardtype选择0便可。写好的测试脚本以下oop

./benchmark.out ./models 10 0

随后就能够看到face_det_300_quant.mnn和face_det_300.mnn的测试平均耗时了。

另外须要注意的是,本人文中开始的实验结果为基于android-8.1系统的rk3399平台。在PC上不必定能达到好的加速效果,只能保证量化好模型的正确性。

  • 最后

若是对如何在安卓平台上进行MNN部署感兴趣的话,能够参考我以前写过的两篇文章进行部署,详解MNN的tf-MobilenetSSD-cpp部署流程详解MNN的tflite-MobilenetSSD-c++部署流程。另外欢迎你们留言讨论、关注专栏,谢谢你们!

相关文章
相关标签/搜索