环境要求

  • 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+扩展指令的方法如下:

  1. // 创建session需要的配置
  2. MNN::ScheduleConfig config;
  3. // 选择Backend
  4. config.type = MNN_FORWARD_CPU;
  5. // 线程数
  6. config.numThread = 2;
  7. // 配置相应的Backend
  8. BackendConfig backendConfig;
  9. // Option 1: 如需运行浮点模型以运用FP16的加速,选择低精度Precision_Low
  10. backendConfig.precision = BackendConfig::Precision_Low;
  11. config.backendConfig = &backendConfig;
  12. // Option 2: 如需运行量化模型以运用INT8 SDOT加速,选择普通精度(默认值)
  13. backendConfig.precision = BackendConfig::Precision_Normal;
  14. config.backendConfig = &backendConfig;

具体步骤

  1. https://developer.android.com/ndk/downloads/下载安装NDK,建议使用最新稳定版本
  2. 在 .bashrc 或者 .bash_profile 中设置 NDK 环境变量,例如:export ANDROID_NDK=/Users/username/path/to/android-ndk-r14b
  3. cd /path/to/MNN
  4. ./schema/generate.sh (可选,更改 schema 文件后需要重新生成)
  5. ./tools/script/get_model.sh(可选,模型仅demo工程需要)。注意get_model.sh需要事先编译好模型转换工具,参见这里
  6. cd project/android
  7. 编译动态库,可选择命令行方式或者 Android Studio 方式
    1. 命令行方式,适用 linux / mac 系统
      1. 编译armv7动态库:mkdir build_32 && cd build_32 && ../build_32.sh
      2. 编译armv8动态库:mkdir build_64 && cd build_64 && ../build_64.sh
    2. Android Studio 方式,全平台适用
      1. 用 Android Studio 打开 project/android/demo ,编译 apk
      2. 用 zip 解压编译好的 apk ,lib 目录下包含 mnn 的 so