张小白带你体验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训练营第一期的模型营提到过)、在线融合、量化等手段。
具体的端侧训练流程是:
- 基于MindSpore构建训练模型,并导出MindIR模型文件。
- 使用MindSpore Lite Converter工具,将MindIR模型转为端侧MS模型。
- 调用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
(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模拟器)
这真真正正地证明了确实是在手机上跑的训练。
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)