張小白帶你體驗(yàn)MindSpore 1.1的新特性:?jiǎn)喂?jié)點(diǎn)緩存Cache(1)CPU環(huán)境下的Cache體驗(yàn)
使用ModelArts進(jìn)行深度學(xué)習(xí)訓(xùn)練的朋友們可能會(huì)有一點(diǎn)感觸,就是自己使用的對(duì)象存儲(chǔ)OBS一會(huì)兒就把套餐給用完了。這個(gè)原因其實(shí)很簡(jiǎn)單,因?yàn)樯窠?jīng)網(wǎng)絡(luò)的訓(xùn)練中,需要大量反復(fù)地從OBS讀取訓(xùn)練數(shù)據(jù),對(duì)于目前OBS的計(jì)費(fèi)方式而言,存取一次就算一次的量:
LENET的MNIST是一個(gè)28X28像素的灰度手寫(xiě)數(shù)字的圖片,有60000條訓(xùn)練圖片、10000條測(cè)試圖片;
ResNet50的Cifar10是一個(gè)32X32像素的10個(gè)類別的物體類別的圖片,有50000張訓(xùn)練圖片、10000張測(cè)試圖片
如果多訓(xùn)練幾輪,讀寫(xiě)次數(shù)可想而知,會(huì)非常大。
所以張小白也因此向ModelArts和OBS的官方提過(guò)一些非官方的建議:比如推出ModelArts和OBS融合的套餐,在ModelArts內(nèi)部訪問(wèn)OBS時(shí)能夠減免一點(diǎn)OBS的訪問(wèn)費(fèi)用(大家可能都想不到,OBS除了PUT/COPY要收費(fèi),GET/LIST也要收費(fèi),也就是說(shuō),你使用OBS客戶端看了一下目錄結(jié)構(gòu),就算訪問(wèn)次數(shù)了。。。)。
本來(lái)張小白以為華為會(huì)把心思放在優(yōu)化收費(fèi)策略上,沒(méi)想到MindSpore團(tuán)隊(duì)另辟蹊徑,在MindSpore 1.1推出了一個(gè)單節(jié)點(diǎn)緩存特性(以下簡(jiǎn)稱Cache),讓開(kāi)發(fā)者在使用MindSpore的過(guò)程中,能夠?qū)?shù)據(jù)集緩存到本機(jī)內(nèi)存中,這樣子減少對(duì)數(shù)據(jù)集文件的讀寫(xiě)。(這樣子是不是在拆OBS的臺(tái)呢。。張小白不禁浮想聯(lián)翩ing。。。)
當(dāng)然了,以上這段其實(shí)不是原來(lái)折騰cache過(guò)程貼的內(nèi)容,是張小白柔情加工了下。具體的折騰過(guò)程可參見(jiàn)論壇帖:
【1.23-1.24 | MindSpore第五期兩日集訓(xùn)營(yíng)】實(shí)踐作業(yè)9 ?https://bbs.huaweicloud.com/forum/thread-104914-1-1.html
【1.23-1.24 | MindSpore第五期兩日集訓(xùn)營(yíng)】實(shí)踐作業(yè)10 https://bbs.huaweicloud.com/forum/thread-104974-1-1.html
本文是論壇帖的進(jìn)一步整理的版本。
Cache的視頻教程
參見(jiàn): https://www.bilibili.com/video/BV1y5411E7dL
MindSpore官網(wǎng)的Cache介紹
參見(jiàn):https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/cache.html
Cache簡(jiǎn)介:
單節(jié)點(diǎn)數(shù)據(jù)緩存是MindSpore1.1提供的加速功能。針對(duì)AI訓(xùn)練而言,要么是訓(xùn)練的數(shù)據(jù)集需要經(jīng)過(guò)多輪epoch計(jì)算的反復(fù)讀取,要么每輪訓(xùn)練時(shí)要經(jīng)過(guò)同樣的數(shù)據(jù)增強(qiáng)(如decode、resize等操作)。如果每次都是反復(fù)加載,反復(fù)計(jì)算同樣的內(nèi)容,非常耗時(shí),顯得資源非常浪費(fèi),所以MindSpore在1.1版本開(kāi)始提供了緩存功能。
緩存目前只支持單節(jié)點(diǎn)緩存,即緩存服務(wù)器和客戶端都在同一臺(tái)機(jī)器上,而且緩存服務(wù)是使用共享內(nèi)存實(shí)現(xiàn)的。
實(shí)操過(guò)程:
實(shí)操的過(guò)程包含:
1.Cache的啟動(dòng),使用,查看,關(guān)閉等操作;
2.使用Cache在ubuntu的CPU環(huán)境下裝載LENET的MNIST數(shù)據(jù)集到Cache,并完成LENET的網(wǎng)絡(luò)訓(xùn)練。
3.使用Cache在ubuntu的GPU環(huán)境下裝載Resnet50的Cifar10數(shù)據(jù)集到Cache,并完成ResNet50的網(wǎng)絡(luò)訓(xùn)練。
(其中第三步篇幅較多,會(huì)另起一篇文字)
那讓張小白帶著大家開(kāi)始這段奇妙的旅程吧。。。。
(一)Cache的基本操作
在操作之前先確認(rèn)已經(jīng)成功地在Ubuntu 18.04機(jī)器上安裝了MindSpore 1.1.0 for CPU版本。如不清楚如何安裝可參考 這篇文字進(jìn)行安裝:張小白帶你快速體驗(yàn)MindSpore V1.0(For ubuntu 18.04)https://bbs.huaweicloud.com/blogs/198324? ,當(dāng)然要記得將版本從1.0換為1.1.
在/etc/profile 設(shè)置環(huán)境變量
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執(zhí)行使得環(huán)境變量生效。
啟動(dòng)cache_admin
cache_admin --start
(回答作業(yè)9的第一個(gè)問(wèn)題:?Cache server如何啟動(dòng)?cache_admin --start,當(dāng)然后面可以帶各種參數(shù)。但是不帶也可以啟動(dòng))
(回答作業(yè)9的第二個(gè)問(wèn)題:Cache server創(chuàng)建時(shí)的默認(rèn)port端口號(hào)是什么??緩存服務(wù)器的端口號(hào),默認(rèn)為50052,但是也可以通過(guò)cache_admin --start --port 10052改為10052之類的)
看看50052端口是否偵聽(tīng)了:
netstat -an |grep 50052
已經(jīng)起來(lái)了。。。
(回答作業(yè)9的第三個(gè)問(wèn)題: Cache client實(shí)體在創(chuàng)建時(shí),其
通過(guò)cache_admin -g可以創(chuàng)建緩存會(huì)話(session),系統(tǒng)會(huì)返回session_id.
可以通過(guò)cache_admin --list_sessions看到所有的session_id
而cache client可以在客戶端python腳本中指定session_id,以便連接到服務(wù)器的緩存實(shí)例。如:
import mindspore.dataset as ds
test_cache = ds.DatasetCache(session_id=4154400928, size=0, spilling=True)
查看緩存數(shù)據(jù):
銷毀緩存數(shù)據(jù):
cache_admin --destroy_session 304191202
再重新檢查緩存數(shù)據(jù):
可見(jiàn)session已被清除。
cache_admin --stop
關(guān)閉緩存服務(wù)器
說(shuō)個(gè)TIPS:
MindSpore已經(jīng)內(nèi)置了 很多常用的數(shù)據(jù)集,比如Mnist,Cifar10,Cifar100,Pascal-VOC,COCO等等。。https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/dataset_loading.html
開(kāi)發(fā)者能做的事情應(yīng)該只是改一下處理數(shù)據(jù)集的函數(shù)名就可以了。其他的內(nèi)容MindSpore工程師應(yīng)該都幫你做好了。
比如將Cifar10改為Minst,那么“一般只需要改? Cifar10Dataset? -》MnistDataset ,參數(shù)有些小改動(dòng)就ok了。”,例如:
“data = ds.MnistDataset(dataset_dir=dataset_dir, num_samples=4, shuffle=False, num_parallel_workers=1, cache=test_cache)”
也就是說(shuō),是先有了常用的數(shù)據(jù)集,然后開(kāi)發(fā)cache的老師們?cè)谶@個(gè)常用數(shù)據(jù)集的基礎(chǔ)上增加了cache能力。
這個(gè)是mindspore內(nèi)置的特性,用于提升性能,并不需要用戶額外實(shí)現(xiàn)。所以正常使用xxDataset加載就可以了。如果有cache參數(shù),可以試著打開(kāi),看看是否能提升性能。
(二)使用Cache完成MNIST數(shù)據(jù)集的LENET訓(xùn)練
先git clone代碼倉(cāng)
git clone https://gitee.com/mindspore/mindspore.git
進(jìn)入lenet的目錄
cd ~/mindspore/model_zoo/official/cv/lenet
按照 張小白帶你快速體驗(yàn)MindSpore V1.0(For ubuntu 18.04)https://bbs.huaweicloud.com/blogs/198324? Part Five:使用Mindspore進(jìn)行LENET訓(xùn)練 的 http://yann.lecun.com/exdb/mnist/? 鏈接下載MNIST數(shù)據(jù)集。
把解壓好的數(shù)據(jù)集放入 MNIST_DATA目錄:
(1)不帶Cache的訓(xùn)練
使用原有的dataset.py
然后開(kāi)始跑train.py
跑完了,花了304秒左右。(5分鐘多一點(diǎn))
然后做個(gè)評(píng)估:
好像一切正常,沒(méi)啥問(wèn)題。
(2)帶Cache的訓(xùn)練
修改腳本src/dataset.py,加入cache的相關(guān)語(yǔ)句。
在上面紅框中的代碼修改為以下的樣子:(帶cache處理的部分)
兩者對(duì)比,也就是做了如下的修改:
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改了名字,重新建了一個(gè)新的ckpt的空目錄。
而且,重啟了cache_admin且重置了SESSION_ID.
開(kāi)始跑python train.py
在train.py跑訓(xùn)練的過(guò)程中,隨時(shí)跟蹤cache_admin的session狀態(tài),一共6萬(wàn)張MNIST的圖片,如上圖所示,Mem cached Disk在不停地增加。
直到加載到60000為止。
這個(gè)應(yīng)該說(shuō)明是用到cache了。
等著帶著cache的腳本跑完。
總共花了396秒(6分半鐘多一點(diǎn))。比不帶cache的還要慢一點(diǎn)。。。
小數(shù)據(jù)量可能并不能體現(xiàn)出cache的優(yōu)勢(shì)。。。不過(guò)這至少能說(shuō)明帶cache的數(shù)據(jù)集是可以跑通的。。。
(未完待續(xù))
MindSpore Python 昇騰
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。