张小白带你体验MindSpore 1.3的新特性:MindSpore Lite端侧训练的实现(C++)

MindSpore作为一个不断深入地让开发者学习的国产深度学习框架,一直在推陈出新。

在1.1版本的时候,张小白曾经参加了当时的【1.23-1.24 | MindSpore第五期两日集训营】,并写出了以下博客:

张小白带你体验MindSpore 1.1的新特性:PyNative模式
https://bbs.huaweicloud.com/blogs/242300    

张小白带你体验MindSpore 1.1的新特性:单节点缓存Cache(1)CPU环境下的Cache体验 
https://bbs.huaweicloud.com/blogs/242306    

张小白带你体验MindSpore 1.1的新特性:单节点缓存Cache(2)GPU环境下的Cache体验 
https://bbs.huaweicloud.com/blogs/242307    

张小白带你体验MindSpore 1.1的新特性:MindSpore Lite端侧推理的另类实现 
https://bbs.huaweicloud.com/blogs/242317  


没想到仅仅过了2个小版本号,MindSpore 就不仅支持端侧推理,而且支持端侧训练了。

根据 https://bbs.huaweicloud.com/forum/thread-141383-1-1.html 的介绍:


MindSpore Lite端在手机或IoT上,可以支持对训练导出的模型进行增量训练。它采用了 训练内存复用、virtual batch、混合精度训练(名字好熟,好像在CANN训练营第一期的模型营提到过)、在线融合、量化等手段。

具体的端侧训练流程是:

  1. 基于MindSpore构建训练模型,并导出MindIR模型文件。
  2. 使用MindSpore Lite Converter工具,将MindIR模型转为端侧MS模型。
  3. 调用MindSpore Lite训练API,加载端侧MS模型,执行训练。

就让张小白拿着 https://gitee.com/mindspore/docs/blob/r1.3/docs/lite/docs/source_zh_cn/quick_start/train_lenet.md 这份文档,带着你一起体验一下这个新特性吧。


根据文档要求,需要准备ubuntu 18.04的环境。这里张小白准备了以前安装MindSpore 1.1版本用过的VMWare 虚拟机。

(1)下载MNIST数据集

MNIST数据集下载了很多次,就连正在进行中的 昇腾CANN训练营第二期中也用到了多次。张小白就把这次训练营在Windows中使用的数据集使用XFTP工具上传到 ~/mindspore1.3目录下:

(2)下载MindSpore 1.3分支的代码仓

(3)下载MindSpore Lite

wget https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.3.0-lite/MindSpore/lite/release/linux/mindspore-lite-1.3.0-linux-x64.tar.gz

wget https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.3.0-lite/MindSpore/lite/release/android/gpu/mindspore-lite-1.3.0-android-aarch64.tar.gz

(4)建立output目录,并将Lite拷贝到output目录下

(注意下图中的路径)

(5)安装ADB

(6)安装MindSpore 1.3 for ubuntu (CPU)

先升级pip

打开 https://www.mindspore.cn/install/

按照以下方式选择:

执行安装

pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.3.0/MindSpore/cpu/x86_64/mindspore-1.3.0-cp37-cp37m-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

检查版本:

这里如果出现 libgmpxx.so.4打不开的错

可先确认是否安装了gmp-6.1.2 (gmp-6.1.2的下载链接 https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz

可参考 https://bbs.huaweicloud.com/blogs/198349 Part Two的方式,按照gmp-5.0.1同样的方式安装 gmp-6.1.2.


如果安装了gmp-6.1.2后仍然报错,可执行 sudo apt install libgmpxx4ldbl

(7)安装Android NDK r20b

按官网 https://www.mindspore.cn/lite/docs/zh-CN/master/use/build.html 要求,需要安装Android NDK r20b以上版本。

如果不安装这个版本,在后续的训练时,可能会出现clang++找不到,std++17编译参数不支持,找不到tuple等各种奇怪的编译错误

下载:

解压:

设置环境变量 .bashrc

使环境变量生效

source .bashrc

验证Android NDK安装:

ndk-build

(8)进行本地训练:

进入 mindspore/lite/examples/train_lenet目录:

bash prepare_and_run.sh -D /home/ascend/mindspore1.3/MNIST_Data -t x86

。。。

。。。

(9)连接手机:

张小白将荣耀30手机使用Type-C线与笔记本电脑相连,并打开USB调试开关:

(设置-》系统和更新-》开发人员选项)

查看USB状态:(箭头所指的华为就是荣耀30手机——当时华为和荣耀还没分家。。。)

(10)端侧训练:

执行 bash prepare_and_run.sh -D /PATH/MNIST_Data -t arm64

由于目前端侧训练不支持NPU,虽然上面报了找不到hiai_ddk的错,也不用去官网下载ddk,而是需要编辑 prepare_and_run.sh文件,注释掉处理hiai_ddk的部分:

重新执行训练:

bash prepare_and_run.sh -D /home/ascend/mindspore1.3/MNIST_Data -t arm64

。。。

其实看 prepare_and_run.sh中的带有arm64参数执行的代码部分,分别调用了 adb push, adb shell,就可以知道确实是在 ubuntu上远程进行了训练。

因为,如果张小白拔掉手机与笔记本电脑之间的USB线:

重新执行这个脚本,就会报以下的错:(adb:找不到android设备或者android模拟器)

这真真正正地证明了确实是在手机上跑的训练。


(全文完,谢谢阅读)

(完)