记录从0入门学习 MindSpore的过程
相关链接
MindSpore官网
MindSpore论坛
MindSpore视频
一.MindSpore简述
MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低,高效执行包括计算效率、数据预处理效率和分布式训练效率,全场景则指框架同时支持云、边缘以及端侧场景。
MindSpore总体架构分为前端表示层(Mind Expression,ME)、计算图引擎(Graph Engine,GE)和后端运行时三个部分。ME提供了用户级应用软件编程接口(Application Programming Interface,API),用于科学计算以及构建和训练神经网络,并将用户的Python代码转换为数据流图。GE是算子和硬件资源的管理器,负责控制从ME接收的数据流图的执行。后端运行时包含云、边、端上不同环境中的高效运行环境,例如CPU、GPU、Ascend AI处理器、 Android/iOS等。
二.学习预热-1小时入门AI开发工程师
由于之前并不了解MindSpore,于是在听课前先通过了一个1小时开发入门教程熟悉了一遍流程(1小时入门AI开发工程师)
根据教程可以基于MindSpore框架端边云全流程开发一个AI应用,来使手机识别猫和狗,成果图如下
要求Python3.7.5,如果原来有不一致的版本可以选择配置双环境或者卸载旧版本,根据教程所安装的MindSpore版本为1.0.1,而后续实验使用的版本为1.1.0,可使用以下指令对MindSpore升级。
pip install --upgrade mindspore
也可以直接进行1.1.0版本的安装
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindSpore/cpu/windows_x64/mindspore-{version}-cp37-cp37m-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
验证版本
python -c "import mindspore;print(mindspore.__version__)"
这里使用的环境是Win10 64位。
三.学习实践-导出LeNet网络的MindIR格式模型
1.获取lenet的checkpoint文件
如果已经有lenet的checkpoint文件可以直接使用,直接进行第4步操作;如果没有,则可以通过MindSpore官方仓库中的相关代码进行模型训练,得到checkpoint文件。
地址:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/lenet
2.获取MNIST数据集
官方地址:
http://yann.lecun.com/exdb/mnist/
下载后解压到代码文件根目录,目录结构如下:
MNIST_Data/
├── test
│ ├── t10k-images-idx3-ubyte
│ └── t10k-labels-idx1-ubyte
└── train
├── train-images-idx3-ubyte
└── train-labels-idx1-ubyte
3.开始训练,环境是Win10-64位 CPU
python train.py --data_path ./MNIST_DATA/ --ckpt_path=./checkpoint/ --device_target CPU
4.将得到的checkpoint文件转换为MINDIR格式
第1种方式:编写模型转换代码进行转换
import numpy as np
from mindspore import Tensor, export, load_checkpoint, load_param_into_net
from src.lenet import LeNet5
lenet = LeNet5()
load_checkpoint("./checkpoint/checkpoint_lenet-10_1875.ckpt", net=lenet) #这里是对第10个checkpoint文件,即checkpoint_lenet-10_1875.ckpt进行转换
input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32) #Lenet模型的size为32,1,32,32
export(lenet, Tensor(input), file_name='lenet', file_format='MINDIR') #file_name指定转换后文件的文件名
执行转换命令
python lenet_trans.py
第2种方式:直接使用下载的代码文件中的export.py进行转换
export.py --ckpt_file lenet.ckpt --file_format MINDIR --device_target CPU
两种方式均可成功转换为MINDIR文件
四.学习实践-训练ResNet50网络并使用得到的checkpoint文件,导出MindIR格式模型
方式1—在个人机器上训练:
1.获取ResNet50训练代码
MindSpore官方代码仓库中的地址:
https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet
2.获取Cifar10数据集
官方地址:https://www.cs.toronto.edu/~kriz/cifar.html
因资源有限,故选择这个相对较小的训练集,下载完成后解压到代码根目录
3.开始训练
python train.py --net resnet50 --dataset cifar10 --dataset_path ./cifar-10-batches-bin/ --device_target CPU
这个训练的时间受硬件条件影响将会非常非常慢…
4.将得到的checkpoint文件转换为MINDIR格式
第1种方式:编写模型转换代码进行转换
import numpy as np
from mindspore import Tensor, export, load_checkpoint, load_param_into_net
from src.resnet import resnet50 as ResNet50
resnet = ResNet50()
# load the parameter into net
load_checkpoint("./checkpoint/train_resnet_cifar10-10_1562", net=resnet)
input = np.random.uniform(0.0, 1.0, size=[32, 3, 224, 224]).astype(np.float32)
export(resnet, Tensor(input), file_name='resnet', file_format='MINDIR')
执行转换命令
python resnet50_trans.py
第2种方式:直接使用下载的代码文件中的export.py进行转换
export.py --ckpt_file train_resnet_cifar10-10_1562 --file_format MINDIR --device_target CPU
方式2—在ModelArts训练:
1.打开ModerArts的ResNet50训练教程
进入以下地址后点击Run in ModerlArts即可
地址:https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/cv_resnet50.html
2.依照教程操作获得checkpoint文件
执行到训练步骤后可看到训练进度
3.编写代码转换得到MINDIR模型
编写代码进行模型转换,并上传到OBS桶进行下载
ModelArts提供的训练资源还是非常非常强大的
五.学习实践-将下载的模型mobilenetv2.mindir用MindSpore lite converter 转成.ms 模型
1.在win 10 64位上编译MindSpore lite
官方给出的编译依赖:
采坑经验:
1.第一次我选择的是CMake3.18.5+MinGW 8.0.0,但在之后编译失败了,如果要解决这个问题可能需要对代码进行对应修改。之后选择卸载了这两个版本,重新安装了CMake3.19。3和MinGW 7.3.0,成功编译。
2.使用源码1.1分支之后可以编译成功,但是转换模型会出错,使用master版本可以成功转换。
#使用git工具,从MindSpore代码仓下载源码
git clone https://gitee.com/mindspore/mindspore.git
#以指定线程数8编译Windows版本
call build.bat lite 8
之后进入漫长的等待过程,我总从命令执行开始共用了3小时
终于成功了,一路绿时间虽慢但是还是很舒服的。
output目录得到4个文件:
解压得到的convert目录如下
├── mindspore-lite-1.1.0-converter-win-x64
│ └── converter # 模型转换工具
| ├── converter_lite.exe # 可执行程序
| ├── libglog.dll # Glog的动态库
| ├── libmindspore_gvar.dll # 存储某些全局变量的动态库
| ├── libgcc_s_seh-1.dll # MinGW动态库
| ├── libssp-0.dll # MinGW动态库
| ├── libstdc++-6.dll # MinGW动态库
| ├── libwinpthread-1.dll # MinGW动态库
接着就可以进行模型转换了
把MINDIR文件复制到convert目录下,执行命令
call converter_lite --fmk=MINDIR --modelFile=mobilenetv2.mindir --outputFile=mobilenetv2
六.学习体会
当前的MindSpore对各种依赖的版本要求还是有一些要求的,如果没有去修改对应配置以及代码来适应不同版本依赖的能力的话,最好还是使用官方指定的版本,学习会比较顺利。
对于MindSpore的学习可以根据文档和视频进行反复学习实践,一步步对它进行掌握理解。
相信MindSpore会做的越来越好。