张小白带你体验MindSpore 1.1的新特性:单节点缓存Cache(1)CPU环境下的Cache体验

举报
张辉 发表于 2021/02/08 00:16:10 2021/02/08
【摘要】 本文介绍了MindSpore的新特性——单节点缓存。

使用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

image.png

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之类的)

image.png

看看50052端口是否侦听了:

netstat -an |grep 50052

image.png

已经起来了。。。

(回答作业9的第三个问题: Cache client实体在创建时,其<session_id>如何获取?

通过cache_admin -g可以创建缓存会话(session),系统会返回session_id.

可以通过cache_admin --list_sessions看到所有的session_id

image.png

而cache client可以在客户端python脚本中指定session_id,以便连接到服务器的缓存实例。如:

import mindspore.dataset as ds

test_cache = ds.DatasetCache(session_id=4154400928, size=0, spilling=True)

image.png

查看缓存数据:

image.png

销毁缓存数据:

cache_admin --destroy_session 304191202

再重新检查缓存数据:

image.png

可见session已被清除。

cache_admin --stop 

关闭缓存服务器

image.png

说个TIPS:

MindSpore已经内置了 很多常用的数据集,比如Mnist,Cifar10,Cifar100,Pascal-VOC,COCO等等。。https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/dataset_loading.html    

image.png

开发者能做的事情应该只是改一下处理数据集的函数名就可以了。其他的内容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

image.png

进入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目录:

image.png

(1)不带Cache的训练

使用原有的dataset.py

然后开始跑train.py

image.png

跑完了,花了304秒左右。(5分钟多一点)

然后做个评估:

image.png

好像一切正常,没啥问题。

(2)带Cache的训练

修改脚本src/dataset.py,加入cache的相关语句。

image.png

在上面红框中的代码修改为以下的样子:(带cache处理的部分)

image.png

两者对比,也就是做了如下的修改:

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.

image.png

开始跑python train.py

image.png

在train.py跑训练的过程中,随时跟踪cache_admin的session状态,一共6万张MNIST的图片,如上图所示,Mem cached Disk在不停地增加。

image.png

直到加载到60000为止。

这个应该说明是用到cache了。

等着带着cache的脚本跑完。

image.png

总共花了396秒(6分半钟多一点)。比不带cache的还要慢一点。。。

小数据量可能并不能体现出cache的优势。。。不过这至少能说明带cache的数据集是可以跑通的。。。

(未完待续)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。