端侧编译
本章节介绍如何快速编译出MindSpore Lite。
MindSpore Lite包含模块:
模块 |
支持平台 |
说明 |
---|---|---|
converter |
Linux, Windows |
模型转换工具 |
runtime(cpp、java) |
Linux, Windows, Android, iOS, OpenHarmony(OHOS) |
模型推理框架(Windows平台不支持java版runtime) |
benchmark |
Linux, Windows, Android, OpenHarmony(OHOS) |
基准测试工具 |
benchmark_train |
Linux, Android |
性能测试和精度校验工具 |
cropper |
Linux |
libmindspore-lite.a静态库裁剪工具 |
minddata |
Linux, Android |
图像处理库 |
codegen |
Linux |
模型推理代码生成工具 |
obfuscator |
Linux |
模型混淆工具 |
Linux环境编译
环境要求
系统环境:Linux x86_64,推荐使用Ubuntu 18.04.02LTS
C++编译依赖
GCC >= 7.3.0
CMake >= 3.18.3
Git >= 2.28.0
Android_NDK >= r20
配置环境变量:
export ANDROID_NDK=NDK路径
-
下载OpenHarmony NDK:前往OpenHarmony的每日构建,选择"形态组件"为"ohos-sdk",任选一个成功构建的包进行下载。下载之后解压压缩包,其中以native开头的文件即为OpenHarmony NDK。
配置环境变量:
export OHOS_NDK=NDK路径
、export TOOLCHAIN_NAME=ohos
Java API模块的编译依赖(可选),未设置JAVA_HOME环境变量则不编译该模块。
Gradle >= 6.6.1
配置环境变量:
export GRADLE_HOME=GRADLE路径
和export GRADLE_USER_HOME=GRADLE路径
将bin目录添加到PATH中:
export PATH=${GRADLE_HOME}/bin:$PATH
Maven >= 3.3.1
配置环境变量:
export MAVEN_HOME=MAVEN路径
将bin目录添加到PATH中:
export PATH=${MAVEN_HOME}/bin:$PATH
OpenJDK 1.8 到 1.15
配置环境变量:
export JAVA_HOME=JDK路径
将bin目录添加到PATH中:
export PATH=${JAVA_HOME}/bin:$PATH
-
创建一个新目录,配置环境变量
export ANDROID_SDK_ROOT=新建的目录
下载
SDK Tools
,解压缩后进入cmdline-tools/bin
目录,通过sdkmanager
创建SDK:./sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "cmdline-tools;latest"
通过
${ANDROID_SDK_ROOT}
目录下的sdkmanager
接受许可证:yes | ./sdkmanager --licenses
Python API模块的编译依赖(可选),未安装Python3或者NumPy则不编译该模块。
Gradle建议采用gradle-6.6.1-complete版本,配置其他版本gradle将会采用gradle wrapper机制自动下载
gradle-6.6.1-complete
。也可直接使用已配置好上述依赖的Docker编译镜像。
下载镜像:
docker pull swr.cn-south-1.myhuaweicloud.com/mindspore-build/mindspore-lite:ubuntu18.04.2-20210530
创建容器:
docker run -tid --net=host --name=docker01 swr.cn-south-1.myhuaweicloud.com/mindspore-build/mindspore-lite:ubuntu18.04.2-20210530
进入容器:
docker exec -ti -u 0 docker01 bash
编译选项
MindSpore根目录下的build.sh
脚本可用于MindSpore Lite的编译。
build.sh
的参数使用说明
参数 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
-I |
选择目标架构 |
arm64、arm32、x86_64 |
无 |
-A |
编译AAR包(包含arm32和arm64) |
on、off |
off |
-d |
设置该参数,则编译Debug版本,否则编译Release版本 |
无 |
无 |
-i |
设置该参数,则进行增量编译,否则进行全量编译 |
无 |
无 |
-j[n] |
设定编译时所用的线程数,否则默认设定为8线程 |
Integer |
8 |
-a |
是否启用AddressSanitizer |
on、off |
off |
编译x86_64版本时,若配置了JAVA_HOME环境变量并安装了Gradle,则同时编译JAR包。
在
-I
参数变动时,如-I x86_64
变为-I arm64
,添加-i
参数进行增量编译不生效。编译AAR包时,必须添加
-A on
参数,且无需添加-I
参数。
模块构建编译选项
模块的构建通过环境变量进行控制,用户可通过声明相关环境变量,控制编译构建的模块。在修改编译选项后,为使选项生效,在使用‵build.sh‵脚本进行编译时,不可添加-i
参数进行增量编译。
通用模块编译选项
选项 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
MSLITE_GPU_BACKEND |
设置GPU后端,在非OpenHarmony系统且 |
opencl、tensorrt、off |
在 |
MSLITE_ENABLE_NPU |
是否编译NPU算子,仅在非OpenHarmony系统且 |
on、off |
off |
MSLITE_ENABLE_TRAIN |
是否编译训练版本 |
on、off |
on |
MSLITE_ENABLE_SSE |
是否启用SSE指令集,仅在 |
on、off |
off |
MSLITE_ENABLE_AVX |
是否启用AVX指令集,仅在 |
on、off |
off |
MSLITE_ENABLE_AVX512 |
是否启用AVX512指令集,仅在 |
on、off |
off |
MSLITE_ENABLE_CONVERTER |
是否编译模型转换工具,仅在 |
on、off |
on |
MSLITE_ENABLE_TOOLS |
是否编译配套工具 |
on、off |
on |
MSLITE_ENABLE_TESTCASES |
是否编译测试用例 |
on、off |
off |
MSLITE_ENABLE_MODEL_ENCRYPTION |
是否支持模型加解密 |
on、off |
off |
MSLITE_ENABLE_MODEL_PRE_INFERENCE |
是否启用模型编译时预推理 |
on、off |
off |
MSLITE_ENABLE_GITEE_MIRROR |
是否使能三方库从码云镜像下载 |
on、off |
off |
TensorRT 和 NPU 的编译环境配置,参考专用芯片集成说明。
启用AVX指令集时,需要运行环境的CPU同时支持avx特性和fma特性。
模型转换工具的编译时间较长,若非必要,建议通过
MSLITE_ENABLE_CONVERTER
关闭转换工具编译,以加快编译速度。解密所需的OpenSSL加密库crypto支持的版本为1.1.1k,需要用户自行下载编译,相关方法可参考:https://github.com/openssl/openssl#build-and-install。此外,还需要将libcrypto.so.1.1文件的路径加入到LD_LIBRARY_PATH中。
当启用模型编译时预推理时,对于非加密模型,用户调用Build接口时,推理框架会创建一个子进程进行预推理,子进程成功返回之后,主进程会正式执行图编译的流程。
目前OpenHarmony系统仅支持CPU推理,不支持GPU推理。
runtime功能裁剪编译选项
若用户对框架包大小敏感,可通过配置以下选项,对runtime模型推理框架进行功能裁剪,以减少包大小,之后,用户可再通过裁剪工具进行算子裁剪以进一步减少包大小。
选项 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
MSLITE_ENABLE_STRING_KERNEL |
是否支持string数据推理模型,如smart_reply.tflite模型 |
on、off |
on |
MSLITE_ENABLE_CONTROLFLOW |
是否支持控制流模型 |
on、off |
on |
MSLITE_ENABLE_WEIGHT_DECODE |
是否支持权重量化模型推理 |
on、off |
on |
MSLITE_ENABLE_CUSTOM_KERNEL |
是否支持南向算子注册 |
on、off |
on |
MSLITE_ENABLE_DELEGATE |
是否支持Delegate机制 |
on、off |
on |
MSLITE_ENABLE_FP16 |
是否支持FP16算子 |
on、off |
在 |
MSLITE_ENABLE_INT8 |
是否支持INT8算子 |
on、off |
on |
由于NPU和TensorRT的实现依赖于Delegate机制,所以在使用NPU或TensorRT时无法关闭Delegate机制,如果关闭了Delegate机制,则相关功能也必须关闭。
编译示例
首先,在进行编译之前,需从MindSpore代码仓下载源码。
git clone https://gitee.com/mindspore/mindspore.git
然后,在源码根目录下执行如下命令,可编译不同版本的MindSpore Lite。
编译x86_64架构版本,同时设定线程数。
bash build.sh -I x86_64 -j32
编译ARM64架构版本,不编译训练相关的代码。
export MSLITE_ENABLE_TRAIN=off bash build.sh -I arm64 -j32
或者修改
mindspore/lite/CMakeLists.txt
将 MSLITE_ENABLE_TRAIN 设置为 off 后,执行命令:bash build.sh -I arm64 -j32
编译包含aarch64和aarch32的AAR包。
bash build.sh -A on -j32
编译OpenHarmony系统的aarch32或aarch64的包:
编译aarch32
export OHOS_NDK=NDK路径 export TOOLCHAIN_NAME=ohos bash build.sh -I arm32 -j32
编译aarch64
export OHOS_NDK=NDK路径 export TOOLCHAIN_NAME=ohos bash build.sh -I arm64 -j32
最后,会在output/
目录中生成如下文件:
mindspore-lite-{version}-{os}-{arch}.tar.gz
:包含runtime和配套工具。mindspore-lite-maven-{version}.zip
:包含runtime(java)的AAR包。mindspore-lite-{version}-{python}-{os}-{arch}.whl
:包含runtime(Python)的Whl包。
version: 输出件版本号,与所编译的分支代码对应的版本一致。
python: 输出件Python版本, 如:Python3.7为
cp37-cp37m
。os: 输出件应部署的操作系统。
arch: 输出件应部署的系统架构。
若要体验python接口,需要移动到output/
目录下,使用以下命令进行安装Whl安装包。
pip install `mindspore-lite-{version}-{python}-{os}-{arch}.whl`
安装后可以使用以下命令检查是否安装成功:若无报错,则表示安装成功。
python -c "import mindspore_lite"
安装成功后,可使用pip show mindspore_lite
命令查看MindSpore Lite的Python模块的安装位置。
目录结构
当编译选项为
-I x86_64
时:mindspore-lite-{version}-linux-x64 ├── runtime │ ├── include │ ├── lib │ │ ├── libminddata-lite.a # 图像处理静态库 │ │ ├── libminddata-lite.so # 图像处理动态库 │ │ ├── libmindspore-lite.a # MindSpore Lite推理框架的静态库 │ │ ├── libmindspore-lite-jni.so # MindSpore Lite推理框架的jni动态库 │ │ ├── libmindspore-lite.so # MindSpore Lite推理框架的动态库 │ │ ├── libmindspore-lite-train.a # MindSpore Lite训练框架的静态库 │ │ ├── libmindspore-lite-train.so # MindSpore Lite训练框架的动态库 │ │ ├── libmsdeobfuscator-lite.so # 混淆模型加载动态库文件,需开启`MSLITE_ENABLE_MODEL_OBF`选项。 │ │ └── mindspore-lite-java.jar # MindSpore Lite推理框架jar包 │ └── third_party │ └── libjpeg-turbo └── tools ├── benchmark # 基准测试工具 ├── benchmark_train # 训练模型性能与精度调测工具 ├── codegen # 代码生成工具 ├── converter # 模型转换工具 ├── obfuscator # 模型混淆工具 └── cropper # 库裁剪工具
当编译选项为
-I arm64
或-I arm32
时:mindspore-lite-{version}-android-{arch} ├── runtime │ ├── include │ ├── lib │ │ ├── libminddata-lite.a # 图像处理静态库 │ │ ├── libminddata-lite.so # 图像处理动态库 │ │ ├── libmindspore-lite.a # MindSpore Lite推理框架的静态库 │ │ ├── libmindspore-lite.so # MindSpore Lite推理框架的动态库 │ │ ├── libmindspore-lite-train.a # MindSpore Lite训练框架的静态库 │ │ ├── libmindspore-lite-train.so # MindSpore Lite训练框架的动态库 │ │ └── libmsdeobfuscator-lite.so # 混淆模型加载动态库文件,需开启`MSLITE_ENABLE_MODEL_OBF`选项。 │ └── third_party │ ├── hiai_ddk │ └── libjpeg-turbo └── tools ├── benchmark # 基准测试工具 ├── benchmark_train # 训练模型性能与精度调测工具 └── codegen # 代码生成工具
当编译选项为
-A on
时:mindspore-lite-maven-{version} └── mindspore └── mindspore-lite └── {version} └── mindspore-lite-{version}.aar # MindSpore Lite推理框架aar包
当编译选项为
-I arm64
或-I arm32
,并且指定TOOLCHAIN_NAME=ohos
时:mindspore-lite-{version}-ohos-{arch} ├── runtime │ ├── include │ └── lib │ ├── libmindspore-lite.a # MindSpore Lite推理框架的静态库 │ └── libmindspore-lite.so # MindSpore Lite推理框架的动态库 └── tools └── benchmark # 基准测试工具
Windows环境编译
环境要求
系统环境:Windows 7,Windows 10;64位。
MinGW 编译依赖
CMake >= 3.18.3
编译64位:MinGW-W64 x86_64 = GCC-7.3.0
编译32位:MinGW-W64 i686 = GCC-7.3.0
Visual Studio 编译依赖
Visual Studio = 2017,已自带cmake。
编译64位:进入开始菜单,点击“适用于 VS 2017 的 x64 本机工具命令提示”,或者打开cmd窗口,执行
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Profession\VC\Auxiliary\Build\vcvars64.bat"
。编译32位:进入开始菜单,点击“VS 2017的 x64_x86 交叉工具命令提示符”,或者打开cmd窗口,执行
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Profession\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
。
编译选项
MindSpore根目录下的build.bat
脚本可用于MindSpore Lite的编译。
build.bat
的编译参数
参数 |
参数说明 |
是否必选 |
---|---|---|
lite |
设置该参数,则对MindSpore Lite工程进行编译 |
是 |
[n] |
设定编译时所用的线程数,否则默认设定为6线程 |
否 |
mindspore/lite/CMakeLists.txt
的选项
选项 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
MSLITE_ENABLE_SSE |
是否启用SSE指令集 |
on、off |
off |
MSLITE_ENABLE_AVX |
是否启用AVX指令集(该选项暂不支持Visual Studio编译器) |
on、off |
off |
MSLITE_ENABLE_AVX512 |
是否启用AVX512指令集(该选项暂不支持Visual Studio编译器) |
on、off |
off |
MSLITE_ENABLE_CONVERTER |
是否编译模型转换工具(该选项暂不支持Visual Studio编译器) |
on、off |
on |
MSLITE_ENABLE_TOOLS |
是否编译配套工具 |
on、off |
on |
MSLITE_ENABLE_TESTCASES |
是否编译测试用例 |
on、off |
off |
MSLITE_ENABLE_GITEE_MIRROR |
是否使能三方库从码云镜像下载 |
on、off |
off |
以上选项可通过设置同名环境变量或者
mindspore/lite/CMakeLists.txt
文件修改。模型转换工具的编译时间较长,若非必要,建议通过
MSLITE_ENABLE_CONVERTER
关闭转换工具编译,以加快编译速度。
编译示例
首先,使用git工具,从MindSpore代码仓下载源码。
git clone https://gitee.com/mindspore/mindspore.git
然后,使用cmd工具在源码根目录下,执行如下命令即可编译MindSpore Lite。
打开SSE指令集优化,以8线程编译。
set MSLITE_ENABLE_SSE=on
call build.bat lite 8
最后,会在output/
目录中生成如下文件:
mindspore-lite-{version}-win-x64.zip
:包含模型推理框架runtime和配套工具。
version:输出件版本号,与所编译的分支代码对应的版本一致。
目录结构
当编译器为 MinGW 时:
mindspore-lite-{version}-win-x64 ├── runtime │ ├── 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 # 基准测试工具 └── converter # 模型转换工具
当编译器为 Visual Studio 时:
mindspore-lite-{version}-win-x64 ├── runtime │ ├── include │ └── lib │ ├── libmindspore-lite.dll # MindSpore Lite推理框架的动态库 │ ├── libmindspore-lite.dll.lib # MindSpore Lite推理框架的动态库的导入库 │ └── libmindspore-lite.lib # MindSpore Lite推理框架的静态库 └── tools └── benchmark # 基准测试工具
链接 MinGW 编译出的静态库时,需要在链接选项中,加
-Wl,--whole-archive mindspore-lite -Wl,--no-whole-archive
。链接 Visual Studio 编译出的静态库时,需要在“属性->链接器->命令行->其他选项”中,加
/WHOLEARCHIVE:libmindspore-lite.lib
。使用 Visual Studio 编译器时,读入 model 流必须加 std::ios::binary,否则会出现读取模型文件不完整的问题。
暂不支持在 Windows 进行端侧训练。
macOS环境编译
环境要求
编译脚本中会执行
git clone
获取第三方依赖库的代码。
编译选项
MindSpore根目录下的build.sh
脚本可用于MindSpore Lite的编译。
build.sh
的编译参数
参数 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
-I |
选择目标架构 |
arm64、arm32 |
无 |
-j[n] |
设定编译时所用的线程数,否则默认设定为8线程 |
Integer |
8 |
mindspore/lite/CMakeLists.txt
的选项
选项 |
参数说明 |
取值范围 |
默认值 |
---|---|---|---|
MSLITE_ENABLE_COREML |
是否启用CoreML后端推理 |
on、off |
off |
编译示例
首先,在进行编译之前,需从MindSpore代码仓下载源码。
git clone https://gitee.com/mindspore/mindspore.git
然后,在源码根目录下执行如下命令即可编译MindSpore Lite。
编译ARM64架构版本。
bash build.sh -I arm64 -j8
编译ARM32架构版本。
bash build.sh -I arm32 -j8
最后,会在output/
目录中生成如下文件:
mindspore-lite-{version}-{os}-{arch}.tar.gz
:包含模型推理框架runtime。
version: 输出件版本号,与所编译的分支代码对应的版本一致。
os: 输出件应部署的操作系统。
arch: 输出件应部署的系统架构。
目录结构
mindspore-lite.framework
└── runtime
├── Headers # 推理框架头文件
├── Info.plist # 配置文件
└── mindspore-lite # 静态库
暂不支持在macOS构建端侧训练与模型转换。