本文主要介紹Ubuntu系統中,MNN的編譯與安裝流程。
1. 依賴環境
- cmake(建議使用3.10或以上版本)
- protobuf(使用3.0或以上版本)
- gcc(使用4.9或以上版本)
執行代碼:
apt-get install cmake gcc
git clone https://github.com/google/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.
出現問題:
./autogen.sh: 4: ./autogen.sh: autoreconf: not found
解決方法:
apt-get install autoconf automake libtool
2. 編譯選項
使用cmake編譯時,可以修改CMakeLists.txt中的選項:
- MNN_DEBUG
默認關閉,關閉時,不保留符號,開啟優化。 - MNN_USE_THREAD_POOL
默認開啟,使用 MNN 內部的無鎖線程池實現多線程優化。關閉后,視MNN_OPENMP開關選擇OpenMP或關閉多線程優化。
注:MNN 的無鎖線程池最多允許兩個實例同時使用,即最多供兩個模型同時推理使用。參考代碼 source/backend/cpu/ThreadPool.cpp 中 MNN_THREAD_POOL_MAX_TASKS 宏的定義。 - MNN_OPENMP
默認開啟,在 MNN_USE_THREAD_POOL 關閉時生效,依賴OpenMP實現多線程優化。關閉后,禁用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_METAL
默認關閉,開啟后,編譯Metal部分,可以通過指定MNN_FORWARD_METAL利用GPU進行推理,僅限iOS或macOS上開啟。 - MNN_ARM82
默認關閉,開啟后,編譯Arm8.2部分,用Arm8.2+擴展指令集實現半精度浮點計算(fp16)和int8(sdot)加速
使用Arm82+擴展指令的方法如下:
// 創建session需要的配置
MNN::ScheduleConfig config;
// 選擇Backend
config.type = MNN_FORWARD_CPU;
// 線程數
config.numThread = 2;
// 配置相應的Backend
BackendConfig backendConfig;
// 選擇低精度/一般配置計算
backendConfig.precision = BackendConfig::Precision_Low;
// 或者
// backendConfig.precision = BackendConfig::Precision_Normal;
config.backendConfig = &backendConfig;
3. 編譯步驟
3.1 准備工作
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh # 可選,模型僅demo工程需要
3.2 本地編譯
mkdir build
cd build
cmake ..
make -j8
編譯完成后本地出現MNN的動態庫。