环境要求
- cmake(建议使用3.10或以上版本)、
- protobuf(使用3.0或以上版本)
- gcc(使用4.9或以上版本)
编译选项
使用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_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;
// Option 1: 如需运行浮点模型以运用FP16的加速,选择低精度Precision_Low
backendConfig.precision = BackendConfig::Precision_Low;
config.backendConfig = &backendConfig;
// Option 2: 如需运行量化模型以运用INT8 SDOT加速,选择普通精度(默认值)
backendConfig.precision = BackendConfig::Precision_Normal;
config.backendConfig = &backendConfig;
具体步骤
- 在
https://developer.android.com/ndk/downloads/
下载安装NDK,建议使用最新稳定版本 - 在 .bashrc 或者 .bash_profile 中设置 NDK 环境变量,例如:
export ANDROID_NDK=/Users/username/path/to/android-ndk-r14b
cd /path/to/MNN
./schema/generate.sh
(可选,更改 schema 文件后需要重新生成)./tools/script/get_model.sh
(可选,模型仅demo工程需要)。注意get_model.sh需要事先编译好模型转换工具,参见这里。cd project/android
- 编译动态库,可选择命令行方式或者 Android Studio 方式
- 命令行方式,适用 linux / mac 系统
- 编译armv7动态库:
mkdir build_32 && cd build_32 && ../build_32.sh
- 编译armv8动态库:
mkdir build_64 && cd build_64 && ../build_64.sh
- 编译armv7动态库:
- Android Studio 方式,全平台适用
- 用 Android Studio 打开 project/android/demo ,编译 apk
- 用 zip 解压编译好的 apk ,lib 目录下包含 mnn 的 so
- 命令行方式,适用 linux / mac 系统