环境要求

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

编译选项

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

  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. // 选择低精度
  10. backendConfig.precision = BackendConfig::Precision_Low;
  11. config.backendConfig = &backendConfig;

具体步骤

准备工作

(可选,修改 MNN Schema 后需要)

  1. cd /path/to/MNN
  2. ./schema/generate.sh
  3. ./tools/script/get_model.sh # 可选,模型仅demo工程需要

本地编译

  1. mkdir build && cd build && cmake .. && make -j8

编译完成后本地出现MNN的动态库。

交叉编译

由于交叉编译的目标设备及厂商提供的编译环境类型众多,本文恕无法提供手把手教学。 以下是大致流程,请按照具体场景做相应修改。
交叉编译大致上分为以下两个步骤,即获取交叉编译器以及配置CMake进行交叉编译。

获取交叉编译工具链

以Linaro工具链为例。首先从 https://releases.linaro.org/components/toolchain/binaries/latest-7/ 网页中按照宿主机以及交叉编译目标设备来选择合适的工具链。这里我们以 arm-linux-gnueabi 为例,点击网页上的链接,进入 https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/ 页面。 按照宿主机类型(这里以X64 Linux为例)选择下载链接, 文件名形如 [gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz](https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz) 下载后解压到任意目录。

配置交叉编译CMake

Toolchain 法

对于常用的交叉编译配置,工具链提供方或网络上可能已经有现成的CMake Toolchain。 这种情况下使用如下命令即可:

  1. mkdir build
  2. cd build
  3. cmake 其他CMake参数 /MNN/源码/路径 -DCMAKE_TOOLCHAIN_FILE=CMake/Toolchain/文件/路径

注意部分这类CMake Toolchain中会写死你的交叉编译工具链路径,您可能需要手动编辑这些CMake Toolchain文件进行修改

手动配置法
  1. mkdir build && cd build
  2. cmake .. \
  3. -DCMAKE_SYSTEM_NAME=宿主系统,例如Linux \
  4. -DCMAKE_SYSTEM_VERSION=1 \
  5. -DCMAKE_SYSTEM_PROCESSOR=交叉编译目标处理器的信息。例如armaarch64 \
  6. -DCMAKE_C_COMPILER=交叉编译器中C编译器的路径 \
  7. -DCMAKE_CXX_COMPILER=交叉编译器中C++编译器的路径

例子

还是以Linaro ARM64为例:

下载aarch64交叉编译工具链
  1. mkdir -p linaro/aarch64
  2. cd linaro/aarch64
  3. wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
  4. tar xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz

构建、编译
  1. export cross_compile_toolchain=linaro/aarch64
  2. mkdir build && cd build
  3. cmake .. \
  4. -DCMAKE_SYSTEM_NAME=Linux \
  5. -DCMAKE_SYSTEM_VERSION=1 \
  6. -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
  7. -DCMAKE_C_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-gcc \
  8. -DCMAKE_CXX_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-g++
  9. make -j4

Ubuntu

  1. 安装opencl sdk(可选)

    1. sudo apt install ocl-icd-opencl-dev
  2. 编译构建

    1. mkdir build && cd build
    2. cmake ..
    3. make -j8

注:部分linux系统会出现执行不到openclbackend,需要手动dlopen mnn_opencl.so。