编译MindSpore Lite

Windows Linux Android 环境准备 中级 高级

本章节介绍如何快速编译出MindSpore Lite。

推理版本包含模块:

模块 支持平台 说明
converter Linux, Windows 模型转换工具
runtime(cpp、java) Linux, Windows, Android 模型推理框架(Windows平台不支持java版runtime)
benchmark Linux, Windows, Android 基准测试工具
cropper Linux libmindspore-lite.a静态库裁剪工具
minddata Linux, Android 图像处理库
codegen Linux 模型推理代码生成工具

训练版本包含模块:

模块 支持平台 说明
converter Linux 模型转换工具
runtime(cpp) Linux, Android 模型训练框架(暂不支持java)
cropper Linux libmindspore-lite.a静态库裁剪工具
minddata Linux, Android 图像处理库
benchmark_train Linux, Android 性能测试和精度校验工具

Linux环境编译

环境要求

  • 当安装完依赖项Android_NDK后,需配置环境变量:export ANDROID_NDK=${NDK_PATH}/android-ndk-r20b

  • 编译脚本中会执行git clone获取第三方依赖库的代码,请提前确保git的网络设置正确可用。

  • 当安装完依赖项Gradle后,需将其安装路径增加到PATH当中:export PATH=${GRADLE_PATH}/bin:$PATH

  • 通过Android command line tools安装Android SDK,首先需要创建一个新目录,并将其路径配置到环境变量${ANDROID_SDK_ROOT}中,然后通过sdkmanager创建SDK:./sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "cmdline-tools;latest",最后通过${ANDROID_SDK_ROOT}目录下的sdkmanager接受许可证:yes | ./sdkmanager --licenses

  • 编译AAR需要依赖Android SDK Build-Tools、Android SDK Platform-Tools等Android SDK相关组件,如果环境中的Android SDK不存在相关组件,编译时会自动下载所需依赖。

  • 编译NPU算子的时候需要下载DDK V500.010,并将压缩包解压后的目录设置为环境变量${HWHIAI_DDK}

编译选项

MindSpore Lite提供编译脚本build.sh用于一键式编译,位于MindSpore根目录下,该脚本可用于MindSpore训练及推理的编译。下面对MindSpore Lite的编译选项进行说明。

选项 参数说明 取值范围 是否必选
-I 选择适用架构,若编译MindSpore Lite c++版本,则此选项必选 arm64、arm32、x86_64
-d 设置该参数,则编译Debug版本,否则编译Release版本
-i 设置该参数,则进行增量编译,否则进行全量编译
-j[n] 设定编译时所用的线程数,否则默认设定为8线程 Integer
-e 编译某种类型的内置算子,仅在ARM架构下适用,否则默认全部编译 cpu、gpu、npu
-h 显示编译帮助信息
-n 指定编译轻量级图片处理模块 lite_cv
-A 指定编译语言,默认cpp。设置为java时,则编译AAR包和Linux X86的JAR包。 cpp、java
-C 设置该参数,则编译模型转换工具,默认为on on、off
-o 设置该参数,则编译基准测试工具、静态库裁剪工具,默认为on on、off
-t 设置该参数,则编译测试用例,默认为off on、off
-T 是否编译训练版本工具,默认为off on、off
-W 启用x86_64 SSE或AVX指令集,默认为off sse、avx、off

-I参数变动时,如-I x86_64变为-I arm64,添加-i参数进行增量编译不生效。

编译AAR包时,必须添加-A java参数,且无需添加-I参数,默认同时编译内置的CPU和GPU算子。

开启编译选项-T只生成训练版本。

任何-e编译选项,CPU都会编译进去。

编译示例

首先,在进行编译之前,需从MindSpore代码仓下载源码。

git clone https://gitee.com/mindspore/mindspore.git -b r1.2

然后,在源码根目录下执行如下命令,可编译不同版本的MindSpore Lite。

  • 编译x86_64架构Debug版本。

    bash build.sh -I x86_64 -d
    
  • 编译x86_64架构Release版本,同时设定线程数。

    bash build.sh -I x86_64 -j32
    
  • 编译x86_64架构Release版本,同时编译测试用例。

    bash build.sh -I x86_64 -t on
    
  • 增量编译ARM64架构Release版本,同时设定线程数。

    bash build.sh -I arm64 -i -j32
    
  • 编译ARM64架构Release版本,只编译内置的CPU算子。

    bash build.sh -I arm64 -e cpu
    
  • 编译ARM64架构Release版本,同时编译内置的CPU和GPU算子。

    bash build.sh -I arm64 -e gpu
    
  • 编译ARM64架构Release版本,同时编译内置的CPU和NPU算子。

    bash build.sh -I arm64 -e npu
    
  • 编译ARM64带图像预处理模块。

    bash build.sh -I arm64 -n lite_cv
    
  • 编译MindSpore Lite AAR和Linux X86_64 JAR版本,MindSpore Lite AAR同时编译内置的CPU和GPU算子,JAR只编译内置的的CPU算子。

    bash build.sh -A java
    
  • 编译MindSpore Lite AAR和Linux X86_64 JAR版本,只编译内置的CPU算子。

    bash build.sh -A java -e cpu
    
  • 编译x86_64架构Release版本,编译模型转换、基准测试和库裁剪工具。

    bash build.sh -I x86_64
    
  • 编译x86_64架构Release版本,模型转换、基准测试、库裁剪工具和端侧运行时 (Runtime) 训练版本工具。

    bash build.sh -I x86_64 -T on
    

端侧推理框架编译输出

执行编译指令后,会在mindspore/output/目录中生成如下文件:

  • mindspore-lite-{version}-inference-{os}-{arch}.tar.gz:包含模型推理框架runtime(cpp)和配套工具。

  • mindspore-lite-maven-{version}.zip:包含模型推理框架runtime(java)的AAR。

version: 输出件版本号,与所编译的分支代码对应的版本一致。

os: 输出件应部署的操作系统。

arch: 输出件应部署的系统架构。

执行解压缩命令,获取编译后的输出件:

tar -xvf mindspore-lite-{version}-inference-{os}-{arch}.tar.gz
unzip mindspore-lite-maven-{version}.zip

模型转换工具converter目录结构说明

仅在-I x86_64编译选项下获得(推理和训练的目录结构相同)内容如下:

mindspore-lite-{version}-inference-linux-x64
└── tools
    └── converter
        ├── converter                # 模型转换工具
        │   └── converter_lite       # 可执行程序
        ├── lib                      # 转换工具依赖的动态库
        │   └── libmindspore_gvar.so # 存储某些全局变量的动态库
        └── third_party              # 转换工具依赖的动态库
            └── glog
                └── lib
                    └── libglog.so.0 # Glog的动态库

代码生成工具Codegen目录结构说明

仅在-I x86_64编译选项下获得Codegen可执行程序,在-I arm64-I arm32编译选项下只生成Codegen生成的推理代码所需要的算子库。

  • -I x86_64编译选项下获得Codegen,内容如下:

    mindspore-lite-{version}-inference-linux-x64
    └── tools
        └── codegen # 代码生成工具
            ├── codegen          # 可执行程序
            └── operator_library # 算子库
                ├── include  # 推理框架头文件
                │   ├── CMSIS # cmsis 算子头文件[CMSIS_5](https://github.com/ARM-software/CMSIS_5)
                │   ├── nnacl # nnacl 算子头文件
                │   └── wrapper
                └── lib      # 推理框架库
                    └── libops.a # MindSpore Lite Codegen生成代码依赖的算子静态库
    
  • -I arm64-I arm32编译选项下获得Codegen,内容如下:

    mindspore-lite-{version}-inference-android-{arch}
    └── tools
        └── codegen # 代码生成工具
            └── operator_library # 算子库
                ├── include   # 推理框架头文件
                │   ├── CMSIS # cmsis 算子头文件[CMSIS_5](https://github.com/ARM-software/CMSIS_5)
                │   ├── nnacl # nnacl 算子头文件
                │   └── wrapper
                └── lib       # 推理框架库
                    └── libops.a # MindSpore Lite Codegen生成代码依赖的算子静态库
    

Runtime及其他工具目录结构说明

推理框架可在-I x86_64-I arm64-I arm32-A java编译选项下获得,内容如下:

  • 当编译选项为-I x86_64时:

    mindspore-lite-{version}-inference-linux-x64
    ├── inference
    │   ├── include  # 推理框架头文件
    │   ├── lib      # 推理框架库
    │   │   ├── libmindspore-lite.a     # MindSpore Lite推理框架的静态库
    │   │   └── libmindspore-lite.so    # MindSpore Lite推理框架的动态库
    │   └── minddata # 图像处理库
    │       ├── include
    │       └── lib
    │           └── libminddata-lite.so # 图像处理动态库文件
    └── tools
        ├── benchmark # 基准测试工具
        │   └── benchmark # 可执行程序
        ├── codegen   # 代码生成工具
        │   ├── codegen   # 可执行程序
        │   └── operator_library # 算子库
        ├── converter # 模型转换工具
        └── cropper   # 库裁剪工具
            ├── cropper                 # 库裁剪工具可执行文件
            └── cropper_mapping_cpu.cfg # 裁剪cpu库所需的配置文件
    
  • 当编译选项为-I arm64-I arm32时:

    mindspore-lite-{version}-inference-android-{arch}
    ├── inference
    │   ├── include     # 推理框架头文件
    │   ├── lib         # 推理框架库
    │   │   ├── libmindspore-lite.a  # MindSpore Lite推理框架的静态库
    │   │   └── libmindspore-lite.so # MindSpore Lite推理框架的动态库
    │   ├── minddata    # 图像处理库
    │   │   ├── include
    │   │   └── lib
    │   │       └── libminddata-lite.so # 图像处理动态库文件
    │   └── third_party # NPU库
    │       └── hiai_ddk
    └── tools
        ├── benchmark # 基准测试工具
        │   └── benchmark
        └── codegen   # 代码生成工具
            └── operator_library # 算子库
    
  • 当编译选项为-A java时:

    mindspore-lite-maven-{version}
    └── mindspore
        └── mindspore-lite
            └── {version}
                └── mindspore-lite-{version}.aar # MindSpore Lite推理框架aar包
    
    mindspore-lite-{version}-inference-linux-x64-jar
    └── jar
        ├── libmindspore-lite-jni.so # MindSpore Lite推理框架的动态库
        ├── libmindspore-lite.so     # MindSpore Lite JNI的动态库
        └── mindspore-lite-java.jar  # MindSpore Lite推理框架jar包
    
  1. 编译ARM64默认可获得cpu/gpu/npu的推理框架输出件,若添加-e gpu则获得cpu/gpu的推理框架输出件,ARM32仅支持CPU。

  2. 运行converter、benchmark目录下的工具前,都需配置环境变量,将MindSpore Lite的动态库所在的路径配置到系统搜索动态库的路径中。

配置converter:

export LD_LIBRARY_PATH=./output/mindspore-lite-{version}-inference-{os}-{arch}/tools/converter/lib:./output/mindspore-lite-{version}-inference-{os}-{arch}/tools/converter/third_party/glog/lib:${LD_LIBRARY_PATH}

配置benchmark:

export LD_LIBRARY_PATH=./output/mindspore-lite-{version}-inference-{os}-{arch}/inference/lib:${LD_LIBRARY_PATH}

端侧训练框架编译输出

如果添加了-T on编译选项,会生成端侧训练转换工具和对应Runtime工具,如下:

mindspore-lite-{version}-train-{os}-{arch}.tar.gz:模型训练框架runtime。

version: 输出件版本号,与所编译的分支代码对应的版本一致。

os: 输出件应部署的操作系统。

arch: 输出件应部署的系统架构。

执行解压缩命令,获取编译后的输出件:

tar -xvf mindspore-lite-{version}-train-{os}-{arch}.tar.gz

训练Runtime及配套工具目录结构说明

训练框架可在-I x86_64-I arm64-I arm32编译选项下获得对应不同硬件平台的版本,内容如下:

  • 当编译选项为-I x86_64时:

    mindspore-lite-{version}-train-linux-x64
    ├── tools
    │   ├── benchmark_train # 训练模型性能与精度调测工具
    │   ├── codegen         # 代码生成工具
    │   │   ├── codegen          # 可执行程序
    │   │   └── operator_library # 算子库
    │   ├── converter       # 模型转换工具
    │   └── cropper         # 库裁剪工具
    │       ├── cropper                 # 库裁剪工具可执行文件
    │       └── cropper_mapping_cpu.cfg # 裁剪cpu库所需的配置文件
    └── train
        ├── include  # 训练框架头文件
        ├── lib      # 训练框架库
        │   ├── libmindspore-lite-train.a  # MindSpore Lite训练框架的静态库
        │   └── libmindspore-lite-train.so # MindSpore Lite训练框架的动态库
        └── minddata # 图像处理库
            ├── include
            ├── lib
            │   └── libminddata-lite.so # 图像处理动态库文件
            └── third_party
    
  • 当编译选项为-I arm64-I arm32时:

    mindspore-lite-{version}-train-android-{arch}
    ├── tools
    │   ├── benchmark       # 基准测试工具
    │   ├── benchmark_train # 训练模型性能与精度调测工具
    │   └── codegen         # 代码生成工具
    │       └── operator_library # 算子库
    └── train
        ├── include # 训练框架头文件
        ├── lib     # 训练框架库
        │   ├── libmindspore-lite-train.a  # MindSpore Lite训练框架的静态库
        │   └── libmindspore-lite-train.so # MindSpore Lite训练框架的动态库
        ├── minddata # 图像处理库
        │   ├── include
        │   ├── lib
        │   │   └── libminddata-lite.so # 图像处理动态库文件
        │   └── third_party
        └── third_party
    

运行converter、benchmark_train目录下的工具前,都需配置环境变量,将MindSpore Lite的动态库所在的路径配置到系统搜索动态库的路径中。

配置converter:

export LD_LIBRARY_PATH=./output/mindspore-lite-{version}-train-{os}-{arch}/tools/converter/lib:./output/mindspore-lite-{version}-train-{os}-{arch}/tools/converter/third_party/glog/lib:${LD_LIBRARY_PATH}

配置benchmark_train:

export LD_LIBRARY_PATH=./output/mindspore-lite-{version}-train-{os}-{arch}/train/lib:${LD_LIBRARY_PATH}

Windows环境编译

环境要求

  • 系统环境:Windows 7,Windows 10;64位。

  • 编译依赖

编译脚本中会执行git clone获取第三方依赖库的代码,请提前确保git的网络设置正确可用。

编译选项

MindSpore Lite提供编译脚本build.bat用于一键式编译,位于MindSpore根目录下,该脚本可用于MindSpore训练及推理的编译。下面对MindSpore Lite的编译选项进行说明。

参数 参数说明 是否必选
lite 设置该参数,则对MindSpore Lite工程进行编译
[n] 设定编译时所用的线程数,否则默认设定为6线程

编译示例

首先,使用git工具,从MindSpore代码仓下载源码。

git clone https://gitee.com/mindspore/mindspore.git -b r1.2

然后,使用cmd工具在源码根目录下,执行如下命令即可编译MindSpore Lite。

  • 以默认线程数(6线程)编译Windows版本。

call build.bat lite
  • 以指定线程数8编译Windows版本。

call build.bat lite 8

端侧推理框架编译输出

编译完成后,进入mindspore/output/目录,可查看编译后生成的文件。文件分为以下几种:

  • mindspore-lite-{version}-inference-win-x64.zip:包含模型推理框架runtime和配套工具。

version:输出件版本号,与所编译的分支代码对应的版本一致。

执行解压缩命令,获取编译后的输出件:

unzip mindspore-lite-{version}-inference-win-x64.zip

Runtime及配套工具目录结构说明

Runtime及配套工具包括以下几部分:

mindspore-lite-{version}-inference-win-x64
├── inference
│   ├── include # 推理框架头文件
│   └── lib
│       ├── libgcc_s_seh-1.dll      # MinGW动态库
│       ├── libmindspore-lite.a     # MindSpore Lite推理框架的静态库
│       ├── libmindspore-lite.dll   # MindSpore Lite推理框架的动态库
│       ├── libmindspore-lite.dll.a # MindSpore Lite推理框架的动态库的链接文件
│       ├── libssp-0.dll            # MinGW动态库
│       ├── libstdc++-6.dll         # MinGW动态库
│       └── libwinpthread-1.dll     # MinGW动态库
└── tools
    ├── benchmark # 基准测试工具
    │   └── benchmark.exe # 可执行程序
    ├── codegen   # 代码生成工具
    │   └── codegen.exe   # 可执行程序
    └── converter # 模型转换工具
        ├── converter
        │   └── converter_lite.exe    # 可执行程序
        └── lib
            ├── libgcc_s_seh-1.dll    # MinGW动态库
            ├── libglog.dll           # Glog的动态库
            ├── libmindspore_gvar.dll # 存储某些全局变量的动态库
            ├── libssp-0.dll          # MinGW动态库
            ├── libstdc++-6.dll       # MinGW动态库
            └── libwinpthread-1.dll   # MinGW动态库

运行converter、benchmark目录下的工具前,都需配置环境变量,将MindSpore Lite的动态库所在的路径配置到系统搜索动态库的路径中。

配置converter:

set PATH=./output/mindspore-lite-{version}-inference-win-x64/tools/converter/lib:%PATH%

配置benchmark:

set PATH=./output/mindspore-lite-{version}-inference-win-x64/inference/lib:%PATH%

暂不支持在Windows进行端侧训练。