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++部署流程。另外歡迎你們留言討論、關注專欄,謝謝你們!

相關文章
相關標籤/搜索