张小白带你体验MindSpore 1.1的新特性:单节点缓存Cache(2)GPU环境下的Cache体验
本文承接上一篇博客:张小白带你体验MindSpore 1.1的新特性:单节点缓存Cache(1)CPU环境下的Cache体验 https://bbs.huaweicloud.com/blogs/242306
为什么需要使用GPU环境体验Cache呢?这也是没有办法的事情。
当时的作业是:参考MindSpore官方教程model_zoo中resnet50在cifar10数据集训练的脚本,在该训练任务中插入cache模块进行训练。
但是张小白研究了一下ResNet训练的脚本和说明文字:(代码链接:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet ),发现仅能支持Ascend和GPU进行训练。
Ubuntu的GPU环境张小白有一套,但是拆机装机比较麻烦,张小白以前还特意写了一篇博客:张小白GPU安装MindSpore给你看(Ubuntu 18.04.5) https://bbs.huaweicloud.com/blogs/198357 成功了在笔记本上安装了 MindSpore 1.0 for Ubuntu 18.04.
所以,下面的实操都是在这篇博客的基础上将MindSpore 升级到1.1,并且完成了基于cifar10数据集的ResNet50网络的训练,而且用了Cache。
由于所有操作都是直接使用裸机安装的Ubuntu,所以不大好截图,张小白只能多用手机拍摄照片演示操作效果,可能质量未必特别好,还望读者谅解。
(一)拆机,恢复MindSpore 1.0的环境
换上当时在 张小白GPU安装MindSpore给你看(Ubuntu 18.04.5)https://bbs.huaweicloud.com/blogs/198357 里面装好mindspore 1.0的SSD硬盘。
为了保险起见,把原来的三块硬盘都拆下来了。
开机
进入熟悉的ubuntu裸机界面:
然后使用nvidia-smi看一下显卡:
说nvidia-smi已经找不到显卡了。
解决bug是张小白历来的强项,张小白就像小强那样从来没有被吓到过。
于是度娘 https://zhuanlan.zhihu.com/p/89714824
需要两个动作 sudo apt install dkms
以及 sudo dkms install -m nvidia -v 418.87.00
后面这个版本号是根据 ls /usr/src | grep nvidia 查到的。
于是:
在dkms的过程中,会进入以下图形界面:
点击OK继续
设置下SecureBoot的密码,然后等安装完毕。
过程中,按照前面的提示在相关窗口执行下Enroll MOK
按照提示reboot即可。
另外,由于出现这个问题的原因是ubuntu没有关掉自动更新,导致它开机做了更新,结果就跟nvidia显卡驱动不一致了。为了避免再出现相同的状况,需要做一下的设置:
将 (/etc/apt/apt.conf.d/10periodic)文件的1都改为0.
然后需要刷一下内核:
sudo update-initramfs -u
然后在reboot
再用nvidia-smi查看显卡:
顺便看一下原来安装好的mindspore
果然是1.0版本。来做个简单的GPU测试:
也没有任何问题。终于一切回归到了原点。
(二)安装MindSpore 1.1版本
先用最快速的方法装好mindspore 1.1.1的GPU版本
拷贝官方整理好的脚本:(确认是GPU,X86的那种)
一次完成:
(三)启动Cache服务和做装载Cache的验证
修改/etc/profile
source /etc/profile后
执行cache_admin启动cache服务
成功启动了cache_admin.
创建session
cache_admin -g
export SESSION_ID= 前面生成的session号。等等。
浏览器打开 http://www.cs.toronto.edu/~kriz/cifar.html 下载CIFAR-10的数据集
解压 cifar-10-binary.tar.gz
解压完后,resnet的目录如下:
既然cache起来了,先执行下装载cache的脚本:
python mycache.out.py
好像没有任何问题(除了报了warning这种鸡毛蒜皮的小错误)。
(四)加入Cache代码
那么就来魔改resnet的代码吧。
先打开src/dataset.py,先做个备份(下面每个要改的代码最好都做个备份),然后开始加入cache部分:
src/config.py也看一下,经过跟 群里姐夫丁大大的咨询,一个昇腾910的90个epoch要跑40分钟(好像是非常大的配置——24核96G内存)
如果是GPU开90的epoch估计要跑到明天。。。
按照丁大大的建议将epoch改成10
然后修改train.py这块,主要是确定下 网络类型,数据集类型和数据集路径等等参数。
为了不用命令行参数,干脆全写死在train.py里面吧。
如上图所示:
指定 net为 resnet50
指定 dataset为 cifar10
指定 dataset_path为 cifar-10-batches-bin/
指定 device_target 为GPU.
其他的先缺省吧。
(五)训练
然后开始train。。。
python train.py
在一大堆warning之后,python开干了。
首先看下nvidia-smi
确实在适用GPU的是python的训练代码。
当然,这个时候随时注意cache的session的变化趋势:(张小白打了时间,然后再打当时的session情况 cache_admin --list_sessions)
随着时间的推移,Mem cached和Numa hit在不停的往上涨。。
直到 装载到60000条缓存记录的时候,它不再涨了。
TIPS:CIFAR-10是一个微小图像数据集,包含10种类别下的60,000张32x32大小彩**像,平均每种类别6,000张,其中5,000张为训练集,1,000张为测试集。
我们也知道,数据集这个时候应该是已经加载完毕了。后面应该都在用这块数据集在计算了吧。。
随着时间的飞逝,终于train.py有了日志:
1个epoch要1960秒左右,也就是半小时多一点。那么10个epoch需要花19600秒,也就是5.444小时左右。
终于等到了train.py执行完毕。
我们重新拍一下,看一下python train.py的执行全貌:
从上面两张图可以看出,在一批deprecated的warning之后,train.py确实走进了cache_base_op.cc,这个看来真的是跟cache在打交道,而且从 cache_admin --list_sessions的不同时期的日志
可以看出,cache从一开始不断增长到6万,到停止不变,说明cache确实读了这么多。
训练的结果如下:
’
生成了2个ckpt文件,一个是resnet-5_1875.ckpt,一个是resnet-10_1875.ckpt.
(六)评估
尽管每5个epoch生成了一个checkpoint文件,但是张小白还是想把仅有的2个ckpt文件给评估下。
修改eval.py(记得先备份)
跟train.py一样,修改一下参数:
指定 net为 resnet50
指定 dataset为 cifar10
指定 dataset_path为 cifar-10-batches-bin/
指定 device_target 为GPU
其他暂时不变。
并且记住checkpoint的路径叫做 --checkpoint_path
那么,执行 python eval.py --checkpoint_path='./resnet-5_1875.ckpt'
就可以对第一个ckpt做评估了。
0.65.不高。但是想想,这才是第5个epoch啊。而且看loss,第5个epoch的时候还是0.79呢。。。
再执行 python eval.py --checkpoint_path='./resnet-10_1875.ckpt'
可以对第2个ckpt做评估了。
这就已经上升到了0.9275了。。loss也在这几轮到了0.3几。假以时日,张小白相信,会训练的非常好的。但是,非常费GPU。。。特别是费张小白的乞丐GPU。
而且再仔细看日志:在eval的时候好像也在调用 cache_base_op.cc
不过真的不知道,到底eval的时候是不是真的动用了大杀器:cache。
总之,这样的结果也算是令张小白能够结束这段GPU的特殊旅程的吧。
(七)用完cache,删session走人
那张小白在GPU上再做个cache全套(谢幕演出吧)
cache_admin --list_sessions
cache_admin --destroy_session XXX
cache_admin --stop
总结:
从上面在MindSpore 1.1 for GPU版本的神操作可以看出,cache在训练中可以起到一定的作用。让我们回顾下前一篇博客的开头文字:https://bbs.huaweicloud.com/blogs/242306 ,其实张小白还是蛮期待能在 ModelArts上部署好cache.这样子多省钱啊~~~
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)