MNN环境搭建记录
MNN所需环境要求:
- cmake(建议使用3.10以上版本)
- protobuf(使用3.0以上版本)
- gcc(使用4.9以上版本)
protobuf安装:
下载:
网上说从git下载,但有些资料说git版本没有写配置configure文件,要以configure方式安装需要下载已经打包好的压缩包.链接:
https:// developers.google.com/p rotocol-buffers/docs/downloads
推荐下载all的版本.
安装:
tar -xvf protobuf
cd protobuf
./configure --prefix=/usr/local/protobuf
make check
make install
添加到系统环境变量:
打开配置文件:
vim /etc/profile
写入配置:
####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
######################################
执行:
source /etc/profile
安装完成,查看版本:
protoc --version
MNN编译安装
下载
从git直接拉取:
git clone https://github.com/alibaba/MNN.git
编译选项
使用
cmake
编译时,可以修改
CMakeLists.txt
中的选项:
- MNN_DEBUG
默认关闭,关闭时,不保留符号,开启优化。
- MNN_OPENMP
默认开启,关闭后,禁用openmp多线程优化。
- 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+扩展指令集实现半精度浮点计算(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;
config.backendConfig = &backendConfig;
准备工作
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh # 可选,模型仅demo工程需要
本地编译
mkdir build && cd build && cmake .. && make -j8
可能会遇到的问题:
1.配置不正确:
CMake Error at source/backend/cpu/arm/CMakeLists.txt:11 (LIST):
list does not recognize sub-command FILTER
Call Stack (most recent call first):
source/backend/cpu/CMakeLists.txt:26 (include)
CMakeLists.txt:365 (include)
解决:
打开 source/backend/cpu/arm/CMakeLists.txt配置文件,注释相关代码(这部分本身不适合自己的机器):
if (MNN_SUPPORT_BF16)
FILE(GLOB MNN_NEON_SRC ${MNN_NEON_SRC} ${CMAKE_CURRENT_LIST_DIR}/CommonNeonBF16.cpp)
#else() # 这些配置直接不使用
# LIST(FILTER MNN_AArch32_SRC EXCLUDE REGEX ".*BF16.*") # 注释掉
# LIST(FILTER MNN_AArch64_SRC EXCLUDE REGEX ".*BF16.*") # 当然也要根据自身需求进行注释
endif()
2.libcurl.so.4包冲突
******/libcurl.so.4: no version information available(required by /usr/bin/cmake)
解决:
定位 libcurl.so.4 文件
locate libcurl.so.4
运行命令后大概是这样的
/home/zeng/libcurl.so.4
/home/zeng/anaconda3/lib/libcurl.so.4
/home/zeng/anaconda3/lib/libcurl.so.4.5.0
/home/zeng/anaconda3/pkgs/libcurl-7.61.0-h1ad7b7a_0/lib/libcurl.so.4
/home/zeng/anaconda3/pkgs/libcurl-7.61.0-h1ad7b7a_0/lib/libcurl.so.4.5.0