Win10 Insider会员可下载(暂未上线)Office 2016预览版(win10家庭版和专业版区别)
707
2022-05-30
使用ModelArts进行深度学习训练的朋友们可能会有一点感触,就是自己使用的对象存储OBS一会儿就把套餐给用完了。这个原因其实很简单,因为神经网络的训练中,需要大量反复地从OBS读取训练数据,对于目前OBS的计费方式而言,存取一次就算一次的量:
LENET的MNIST是一个28X28像素的灰度手写数字的图片,有60000条训练图片、10000条测试图片;
ResNet50的Cifar10是一个32X32像素的10个类别的物体类别的图片,有50000张训练图片、10000张测试图片
如果多训练几轮,读写次数可想而知,会非常大。
所以张小白也因此向ModelArts和OBS的官方提过一些非官方的建议:比如推出ModelArts和OBS融合的套餐,在ModelArts内部访问OBS时能够减免一点OBS的访问费用(大家可能都想不到,OBS除了PUT/COPY要收费,GET/LIST也要收费,也就是说,你使用OBS客户端看了一下目录结构,就算访问次数了。。。)。
本来张小白以为华为会把心思放在优化收费策略上,没想到MindSpore团队另辟蹊径,在MindSpore 1.1推出了一个单节点缓存特性(以下简称Cache),让开发者在使用MindSpore的过程中,能够将数据集缓存到本机内存中,这样子减少对数据集文件的读写。(这样子是不是在拆OBS的台呢。。张小白不禁浮想联翩ing。。。)
当然了,以上这段其实不是原来折腾cache过程贴的内容,是张小白柔情加工了下。具体的折腾过程可参见论坛帖:
【1.23-1.24 | MindSpore第五期两日集训营】实践作业9 https://bbs.huaweicloud.com/forum/thread-104914-1-1.html
【1.23-1.24 | MindSpore第五期两日集训营】实践作业10 https://bbs.huaweicloud.com/forum/thread-104974-1-1.html
本文是论坛帖的进一步整理的版本。
Cache的视频教程
参见: https://www.bilibili.com/video/BV1y5411E7dL
MindSpore官网的Cache介绍
参见:https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/cache.html
Cache简介:
单节点数据缓存是MindSpore1.1提供的加速功能。针对AI训练而言,要么是训练的数据集需要经过多轮epoch计算的反复读取,要么每轮训练时要经过同样的数据增强(如decode、resize等操作)。如果每次都是反复加载,反复计算同样的内容,非常耗时,显得资源非常浪费,所以MindSpore在1.1版本开始提供了缓存功能。
缓存目前只支持单节点缓存,即缓存服务器和客户端都在同一台机器上,而且缓存服务是使用共享内存实现的。
实操过程:
实操的过程包含:
1.Cache的启动,使用,查看,关闭等操作;
2.使用Cache在ubuntu的CPU环境下装载LENET的MNIST数据集到Cache,并完成LENET的网络训练。
3.使用Cache在ubuntu的GPU环境下装载Resnet50的Cifar10数据集到Cache,并完成ResNet50的网络训练。
(其中第三步篇幅较多,会另起一篇文字)
那让张小白带着大家开始这段奇妙的旅程吧。。。。
(一)Cache的基本操作
在操作之前先确认已经成功地在Ubuntu 18.04机器上安装了MindSpore 1.1.0 for CPU版本。如不清楚如何安装可参考 这篇文字进行安装:张小白带你快速体验MindSpore V1.0(For ubuntu 18.04)https://bbs.huaweicloud.com/blogs/198324 ,当然要记得将版本从1.0换为1.1.
在/etc/profile 设置环境变量
export PYTHON_HOME=/usr/python3
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PYTHON_HOME/lib/python3.7/site-packages/mindspore:$PYTHON_HOME/lib/python3.7/site-packages/mindspore/lib:$PYTHON_HOME/lib
export PATH=$PATH:$PYTHON_HOME/bin
source /etc/profile执行使得环境变量生效。
启动cache_admin
cache_admin --start
(回答作业9的第一个问题: Cache server如何启动?cache_admin --start,当然后面可以带各种参数。但是不带也可以启动)
(回答作业9的第二个问题:Cache server创建时的默认port端口号是什么? 缓存服务器的端口号,默认为50052,但是也可以通过cache_admin --start --port 10052改为10052之类的)
看看50052端口是否侦听了:
netstat -an |grep 50052
已经起来了。。。
(回答作业9的第三个问题: Cache client实体在创建时,其
通过cache_admin -g可以创建缓存会话(session),系统会返回session_id.
可以通过cache_admin --list_sessions看到所有的session_id
而cache client可以在客户端python脚本中指定session_id,以便连接到服务器的缓存实例。如:
import mindspore.dataset as ds
test_cache = ds.DatasetCache(session_id=4154400928, size=0, spilling=True)
查看缓存数据:
销毁缓存数据:
cache_admin --destroy_session 304191202
再重新检查缓存数据:
可见session已被清除。
cache_admin --stop
关闭缓存服务器
说个TIPS:
MindSpore已经内置了 很多常用的数据集,比如Mnist,Cifar10,Cifar100,Pascal-VOC,COCO等等。。https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/dataset_loading.html
开发者能做的事情应该只是改一下处理数据集的函数名就可以了。其他的内容MindSpore工程师应该都帮你做好了。
比如将Cifar10改为Minst,那么“一般只需要改 Cifar10Dataset -》MnistDataset ,参数有些小改动就ok了。”,例如:
“data = ds.MnistDataset(dataset_dir=dataset_dir, num_samples=4, shuffle=False, num_parallel_workers=1, cache=test_cache)”
也就是说,是先有了常用的数据集,然后开发cache的老师们在这个常用数据集的基础上增加了cache能力。
这个是mindspore内置的特性,用于提升性能,并不需要用户额外实现。所以正常使用xxDataset加载就可以了。如果有cache参数,可以试着打开,看看是否能提升性能。
(二)使用Cache完成MNIST数据集的LENET训练
先git clone代码仓
git clone https://gitee.com/mindspore/mindspore.git
进入lenet的目录
cd ~/mindspore/model_zoo/official/cv/lenet
按照 张小白带你快速体验MindSpore V1.0(For ubuntu 18.04)https://bbs.huaweicloud.com/blogs/198324 Part Five:使用Mindspore进行LENET训练 的 http://yann.lecun.com/exdb/mnist/ 链接下载MNIST数据集。
把解压好的数据集放入 MNIST_DATA目录:
(1)不带Cache的训练
使用原有的dataset.py
然后开始跑train.py
跑完了,花了304秒左右。(5分钟多一点)
然后做个评估:
好像一切正常,没啥问题。
(2)带Cache的训练
修改脚本src/dataset.py,加入cache的相关语句。
在上面红框中的代码修改为以下的样子:(带cache处理的部分)
两者对比,也就是做了如下的修改:
if "SESSION_ID" in os.environ:
session_id = int(os.environ['SESSION_ID'])
else:
raise RuntimeError("Testcase requires SESSION_ID environment variable")
test_cache = ds.DatasetCache(session_id=session_id, size=0, spilling=False)
mnist_ds = ds.MnistDataset(data_path, cache=test_cache)
# mnist_ds = ds.MnistDataset(data_path)
这样就能用上cache了。。
并且将ckpt改了名字,重新建了一个新的ckpt的空目录。
而且,重启了cache_admin且重置了SESSION_ID.
开始跑python train.py
在train.py跑训练的过程中,随时跟踪cache_admin的session状态,一共6万张MNIST的图片,如上图所示,Mem cached Disk在不停地增加。
直到加载到60000为止。
这个应该说明是用到cache了。
等着带着cache的脚本跑完。
总共花了396秒(6分半钟多一点)。比不带cache的还要慢一点。。。
小数据量可能并不能体现出cache的优势。。。不过这至少能说明带cache的数据集是可以跑通的。。。
(未完待续)
MindSpore Python 昇腾
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。