日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

MNN介紹、安裝和編譯

 beginnow1 2022-12-02 發(fā)布于廣東

MNN是一個輕量級的深度神經網絡推理引擎,在端側加載深度神經網絡模型進行推理預測。目前,MNN已經在阿里巴巴的手機淘寶、手機天貓、優(yōu)酷等20多個App中使用,覆蓋直播、短視頻、搜索推薦、商品圖像搜索、互動營銷、權益發(fā)放、安全風控等場景。此外,IoT等場景下也有若干應用。

整體特點

輕量性
· 針對端側設備特點深度定制和裁剪,無任何依賴,可以方便地部署到移動設備和各種嵌入式設備中。
· iOS平臺:armv7+arm64靜態(tài)庫大小5MB左右,鏈接生成可執(zhí)行文件增加大小620KB左右,metallib文件600KB左右。
· Android平臺:so大小500KB左右,OpenCL庫300KB左右,Vulkan庫300KB左右。

通用性
· 支持Tensorflow、Caffe、ONNX等主流模型文件格式,支持CNN、RNN、GAN等常用網絡。
· 支持 149 個TensorflowOp、47 個CaffeOp、74 個 ONNX Op;各計算設備支持的MNN Op數(shù):CPU 110個,Metal 55個,OpenCL 29個,Vulkan 31個。
· 支持iOS 8.0+、Android 4.3+和具有POSIX接口的嵌入式設備。
· 支持異構設備混合計算,目前支持CPU和GPU,可以動態(tài)導入GPU Op插件,替代CPU Op的實現(xiàn)。

高性能
· 不依賴任何第三方計算庫,依靠大量手寫匯編實現(xiàn)核心運算,充分發(fā)揮ARM CPU的算力。
· iOS設備上可以開啟GPU加速(Metal),常用模型上快于蘋果原生的CoreML。
· Android上提供了OpenCL、Vulkan、OpenGL三套方案,盡可能多地滿足設備需求,針對主流GPU(Adreno和Mali)做了深度調優(yōu)。
· 卷積、轉置卷積算法高效穩(wěn)定,對于任意形狀的卷積均能高效運行,廣泛運用了 Winograd 卷積算法,對3x3 -> 7x7之類的對稱卷積有高效的實現(xiàn)。
· 針對ARM v8.2的新架構額外作了優(yōu)化,新設備可利用半精度計算的特性進一步提速。

易用性
· 有高效的圖像處理模塊,覆蓋常見的形變、轉換等需求,一般情況下,無需額外引入libyuv或opencv庫處理圖像。
· 支持回調機制,可以在網絡運行中插入回調,提取數(shù)據(jù)或者控制運行走向。
· 支持只運行網絡中的一部分,或者指定CPU和GPU間并行運行。



安裝

git clone https://github.com/alibaba/MNN.git

推理框架編譯(Linux / macOS)

環(huán)境要求

· cmake(建議使用3.10或以上版本)、
· protobuf(使用3.0或以上版本)
· gcc(使用4.9或以上版本)

編譯選項

使用cmake編譯時,可以修改CMakeLists.txt中的選項:
· MNN_DEBUG
默認關閉,關閉時,不保留符號,開啟優(yōu)化。
· MNN_OPENMP
默認開啟,關閉后,禁用openmp多線程優(yōu)化。
· MNN_OPENCL
默認關閉,開啟后,編譯OpenCL部分,可以通過指定MNN_FORWARD_OPENCL利用GPU進行推理。
· MNN_OPENGL
默認關閉,開啟后,編譯OpenGL部分,可以通過指定MNN_FORWARD_OPENGL利用GPU進行推理。
· MNN_VULKAN
默認關閉,開啟后,編譯Vulkan部分,可以通過指定MNN_FORWARD_VULKAN利用GPU進行推理。
· MNN_METAL
默認關閉,開啟后,編譯Metal部分,可以通過指定MNN_FORWARD_METAL利用GPU進行推理,僅限iOS或macOS上開啟。
· MNN_ARM82
默認關閉,開啟后,編譯Arm8.2部分,用Arm8.2+擴展指令集實現(xiàn)半精度浮點計算(fp16)和int8(sdot)加速

具體步驟

cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh # 可選,模型僅demo工程需要
mkdir build && cd build && cmake .. && make -j8

編譯完成后MNN/build目錄下出現(xiàn)MNN的動態(tài)庫(libMNN.so)。



推理框架Android編譯

環(huán)境要求

· cmake(建議使用3.10或以上版本)、
· protobuf(使用3.0或以上版本)
· gcc(使用4.9或以上版本)

編譯選項

使用cmake編譯時,可以修改CMakeLists.txt中的選項:
· MNN_DEBUG
默認關閉,關閉時,不保留符號,開啟優(yōu)化。
· MNN_USE_THREAD_POOL
默認開啟,使用 MNN 內部的無鎖線程池實現(xiàn)多線程優(yōu)化。關閉后,視MNN_OPENMP開關選擇OpenMP或關閉多線程優(yōu)化。
注:MNN 的無鎖線程池最多允許兩個實例同時使用,即最多供兩個模型同時推理使用。參考代碼 source/backend/cpu/ThreadPool.cpp 中 MNN_THREAD_POOL_MAX_TASKS 宏的定義。
· MNN_OPENMP
默認開啟,在 MNN_USE_THREAD_POOL 關閉時生效,依賴OpenMP實現(xiàn)多線程優(yōu)化。關閉后,禁用OpenMP。
· MNN_OPENCL
默認關閉,開啟后,編譯OpenCL部分,可以通過指定MNN_FORWARD_OPENCL利用GPU進行推理。
· MNN_OPENGL
默認關閉,開啟后,編譯OpenGL部分,可以通過指定MNN_FORWARD_OPENGL利用GPU進行推理。
需要android-21及以上,亦即腳本中指定 -DANDROID_NATIVE_API_LEVEL=android-21
· MNN_VULKAN
默認關閉,開啟后,編譯Vulkan部分,可以通過指定MNN_FORWARD_VULKAN利用GPU進行推理。
· MNN_ARM82
默認關閉,開啟后,編譯Arm8.2部分,用Arm8.2+擴展指令集實現(xiàn)半精度浮點計算(fp16)和int8(sdot)加速

具體步驟

在https://developer./ndk/downloads/下載安裝NDK,建議使用最新穩(wěn)定版本
在 .bashrc 或者 .bash_profile 中設置 NDK 環(huán)境變量,例如:export ANDROID_NDK=/Users/username/path/to/android-ndk-r14b
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh(可選,模型僅demo工程需要)。注意get_model.sh需要事先編譯好模型轉換工具。
cd project/android
編譯armv7動態(tài)庫:mkdir build_32 && cd build_32 && ../build_32.sh
編譯armv8動態(tài)庫:mkdir build_64 && cd build_64 && ../build_64.sh



轉換工具Linux / macOS編譯,例程編譯

cd MNN/
./schema/generate.sh
mkdir build
cd build
cmake .. -DMNN_BUILD_CONVERTER=true && make -j4

編譯產物包含模型轉換工具MNNConvert和模型輸出工具MNNDump2Json.out

打開cmake的MNN_BUILD_DEMO(編譯例程)和DMNN_BUILD_CONVERTER(編譯模型轉換工具)開關,進行編譯

mkdir build && cd build
cmake .. -DMNN_BUILD_DEMO=ON -DMNN_BUILD_CONVERTER=true
make -j4


在build文件夾里面就有相應工具啦,可以運行官方示例模型,注意用的圖片尺寸有要求的,跟著示例圖片大小來就是。


aarch64交叉構建編譯

安裝aarch64工具鏈可參考:
在MNN的目錄執(zhí)行以下操作,根據(jù)實際路徑修改,可以做成sh腳本

export cross_compile_toolchain=/opt/gcc-aarch64-linux-gnu
mkdir build && cd build
sudo cmake .. -D CMAKE_SYSTEM_NAME=Linux -D CMAKE_SYSTEM_VERSION=1 -D CMAKE_SYSTEM_PROCESSOR=aarch64 -D CMAKE_C_COMPILER=/opt/gcc-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=/opt/gcc-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
sudo make -j4

如果編譯不成功,單獨執(zhí)行sudo make -j4會有以下錯誤提示:

error: 'CPUINFO_ARM_LINUX_FEATURE_I8MM’ was not declared in this scope; did you mean 'CPUINFO_ARM_LINUX_FEATURE_FPHP’?

按提示將該路徑的CPURuntime.cpp中第1559行 

 if (isa_features & CPUINFO_ARM_LINUX_FEATURE_I8MM)

改為 if (isa_features & CPUINFO_ARM_LINUX_FEATURE_FPHP)

References:

  1. MNN官方文檔

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多