MXNet大規(guī)模圖像分類

寫在?前面:本教程對計算機硬件要求?較高,教程中使用了?AWS提供的服務(wù).

訓(xùn)練一個具有大量圖像的神經(jīng)網(wǎng)絡(luò)會帶來一些挑戰(zhàn)棋傍。即使使用最新的GPU亚亲,也不可能在合理的時間內(nèi)使用單個GPU來訓(xùn)練大型網(wǎng)絡(luò)彻采。在一臺機器中使用多個gpu可以稍微減輕這個問題腐缤。但是,可以連接到一臺機器上的gpu的數(shù)量是有限的(通常為8或16)肛响。本教程解釋了如何使用多個包含多個gpu的多臺機器來訓(xùn)練大的網(wǎng)絡(luò)岭粤,使用tb級的數(shù)據(jù)。

Note:This blog without all the resources that are outside the original,reproduced please indicate the source.

官網(wǎng):mxnet.incubator.apache.org,文中如有任何錯漏的地方請諒解并指出,不勝感激.

準備

想與之前?幾個教程相似:

- 安裝MXNet
- OpenCV python庫
$ pip install opencv-python

處理

?磁盤空間

對大數(shù)據(jù)進行訓(xùn)練的第一步是下載數(shù)據(jù)并進行預(yù)處理特笋。對于本教程剃浇,我們將使用完整的ImageNet數(shù)據(jù)集。請注意猎物,至少需要2 TB的磁盤空間來下載和預(yù)處理這些數(shù)據(jù)虎囚。強烈建議使用SSD代替HDDSSD更擅長處理大量的小圖像文件蔫磨。在預(yù)處理完成并將圖像打包成recordIO文件后淘讥,HDD應(yīng)該可以接受訓(xùn)練。

在本教程中质帅,我們將使用AWS存儲實例進行數(shù)據(jù)預(yù)處理适揉。存儲實例i3.4xlarge在兩個NVMe SSD磁盤上有3.8 TB的磁盤空間。我們將使用軟件RAID將它們組合成一個磁盤并在~/data上掛載它煤惩。

sudo mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 \
    /dev/nvme0n1 /dev/nvme1n1
sudo mkfs /dev/md0
sudo mkdir ~/data
sudo mount /dev/md0 ~/data
sudo chown ${whoami} ~/data

我們現(xiàn)在有足夠的磁盤空間來下載和預(yù)處理數(shù)據(jù)嫉嘀。

下載ImageNet

在本教程中,我們將使用完整的ImageNet數(shù)據(jù)集魄揉,可以從http://www.image-net.org/download-images下載剪侮。fall11_whole.tar包含所有的圖像。該文件的大小為1.2 TB洛退,需要很長時間才能下載瓣俯。

下載后,解壓文件兵怯。

export ROOT=full
mkdir $ROOT
tar -xvf fall11_whole.tar -C $ROOT

這應(yīng)該會給您一個tar文件的集合彩匕。每個tar文件表示一個類別,并包含屬于該類別的所有圖像媒区。我們可以解壓縮每個tar文件并將圖像復(fù)制到一個以tar文件名稱命名的文件夾中驼仪。

for i in $ROOT/*.tar; do j=${i%.*}; echo $j;  mkdir -p $j; tar -xf $i -C $j; done
rm $ROOT/*.tar

ls $ROOT | head
n00004475
n00005787
n00006024
n00006484
n00007846
n00015388
n00017222
n00021265
n00021939
n00120010

刪除不常見的轉(zhuǎn)移學(xué)習(xí)類(可選)

在ImageNet數(shù)據(jù)上訓(xùn)練網(wǎng)絡(luò)的一個常見原因是用于傳輸學(xué)習(xí)(包括特征提取或?qū)ζ渌P瓦M行微調(diào))。根據(jù)這項研究袜漩,沒有圖片的類在轉(zhuǎn)移學(xué)習(xí)上沒有幫助绪爸。因此,我們可以刪除一些少于一定數(shù)量圖像的類宙攻。下面的代碼將刪除少于500個圖像的類奠货。

BAK=${ROOT}_filtered
mkdir -p ${BAK}
for c in ${ROOT}/n*; do
    count=`ls $c/*.JPEG | wc -l`
    if [ "$count" -gt "500" ]; then
        echo "keep $c, count = $count"
    else
        echo "remove $c, $count"
        mv $c ${BAK}/
    fi
done

生成驗證組

為了確保我們不超過數(shù)據(jù),我們將創(chuàng)建一個獨立于訓(xùn)練集的驗證集座掘。在訓(xùn)練期間递惋,我們將頻繁地監(jiān)視驗證集上的損失柔滔。我們通過從每個類中挑選50個隨機圖像并將它們移動到驗證集來創(chuàng)建驗證集。

VAL_ROOT=${ROOT}_val
mkdir -p ${VAL_ROOT}
for i in ${ROOT}/n*; do
    c=`basename $i`
    echo $c
    mkdir -p ${VAL_ROOT}/$c
    for j in `ls $i/*.JPEG | shuf | head -n 50`; do
        mv $j ${VAL_ROOT}/$c/
    done
done

將圖像壓縮到記錄文件中

雖然MXNet可以直接讀取圖像文件萍虽,但建議將圖像文件打包到一個recordIO文件中以提高性能廊遍。MXNet提供了一個工具(tools/im2rec.py)來完成這個任務(wù)。要使用這個工具贩挣,需要在系統(tǒng)中安裝MXNetOpenCVpython模塊喉前。

將環(huán)境變量MXNET設(shè)置為指向MXNET安裝目錄,并將其命名為數(shù)據(jù)集的名稱王财。在這里卵迂,我們假設(shè)MXNet安裝在~/MXNet

MXNET=~/mxnet
NAME=full_imagenet_500_filtered

為了創(chuàng)建recordIO文件,我們首先在recordIO文件中創(chuàng)建我們想要的圖像列表绒净,然后使用im2rec將列表中的圖像打包到recordIO文件中见咒。我們在train_meta創(chuàng)建這個列表。培訓(xùn)數(shù)據(jù)在1TB左右挂疆。我們把它分成8個部分改览,每個部分大約有100 GB大小。

mkdir -p train_meta
python ${MXNET}/tools/im2rec.py --list True --chunks 8 --recursive True \
train_meta/${NAME} ${ROOT}

然后我們調(diào)整圖像大小缤言,使短邊是480像素宝当,并將圖像打包成recordIO文件。由于大部分工作是磁盤I/O胆萧,所以我們使用多個(16)線程來更快地完成工作庆揩。

python ${MXNET}/tools/im2rec.py --resize 480 --quality 90 \
--num-thread 16 train_meta/${NAME} ${ROOT}

完成后,我們將rec文件移動到名為train的文件夾中跌穗。

mkdir -p train
mv train_meta/*.rec train/

我們對驗證集進行類似的預(yù)處理订晌。

mkdir -p val_meta
python ${MXNET}/tools/im2rec.py --list True --recursive True \
val_meta/${NAME} ${VAL_ROOT}
python ${MXNET}/tools/im2rec.py --resize 480 --quality 90 \
--num-thread 16 val_meta/${NAME} ${VAL_ROOT}
mkdir -p val
mv val_meta/*.rec val/

現(xiàn)在,我們已經(jīng)在訓(xùn)練和val目錄中分別使用了recordIO格式的訓(xùn)練和驗證圖像蚌吸。我們現(xiàn)在可以用這些了.rec文件訓(xùn)練锈拨。

訓(xùn)練

ResNet已經(jīng)展示了它在ImageNet競爭中的有效性。我們的實驗也重現(xiàn)了報告中的結(jié)果羹唠。當(dāng)我們將層數(shù)從18層增加到152層時奕枢,我們看到驗證精度的穩(wěn)步提高。鑒于這是一個巨大的數(shù)據(jù)集肉迫,我們將使用具有152層的Resnet验辞。

由于計算復(fù)雜度很高稿黄,即使是最快的GPU也需要超過一天的時間來處理數(shù)據(jù)喊衫。在訓(xùn)練收斂到良好的驗證精度之前,我們通常需要幾十個epoch杆怕。雖然我們可以在機器中使用多個gpu族购,但機器中g(shù)pu的數(shù)量通常限制在8或16壳贪。為了加快訓(xùn)練,在本教程中寝杖,我們將使用多個包含多個gpu的機器來訓(xùn)練模型违施。

設(shè)置

我們將使用16臺機器(p2.16 x實例),每個機器包含16個gpu(特斯拉K80)瑟幕。這些機器通過20 Gbps以太網(wǎng)相互連接磕蒲。

AWS云的形成使得創(chuàng)建深度學(xué)習(xí)集群非常容易。我們遵循這個頁面的指示只盹,并創(chuàng)建一個具有16個p2.16 x實例的深度學(xué)習(xí)集群辣往。

我們在第一個機器中加載數(shù)據(jù)和代碼(我們將此機器稱為master)。我們將數(shù)據(jù)和代碼共享給其他使用EFS的機器殖卑。

如果您正在手動設(shè)置集群站削,而不使用AWS cloud編組,請記住以下步驟:

  1. 使用USE_DIST_KVSTORE = 1編譯MXNet孵稽,以支持分布式培訓(xùn)许起。

  2. 在master中創(chuàng)建一個包含所有集群機器主機名的主機文件。例如菩鲜,

    $ head -3 hosts
    deeplearning-worker1
    deeplearning-worker2
    deeplearning-worker3
通過從文件中調(diào)用ssh园细,可以通過調(diào)用ssh來從主ssh到這些機器中的任何一個。例如,
    $ ssh deeplearning-worker2
    ===================================
    Deep Learning AMI for Ubuntu
    ===================================
    ...
    ubuntu@ip-10-0-1-199:~$

其中一種方法是使用ssh代理轉(zhuǎn)發(fā)接校。請查看本頁珊肃,了解如何設(shè)置。簡而言之馅笙,您將使用本地機器上的特定證書(mycert.pem)配置所有計算機登錄伦乔。然后使用證書和-a開關(guān)登錄到主服務(wù)器,以啟用代理轉(zhuǎn)發(fā)《埃現(xiàn)在烈和,您應(yīng)該能夠通過提供主機名(例如ssh深度學(xué)習(xí)- worker2)登錄到集群中的任何其他機器。

運行訓(xùn)練

在集群設(shè)置之后皿淋,從$ {MXNET}/example/image分類中登錄到master并運行以下命令

../../tools/launch.py -n 16 -H $DEEPLEARNING_WORKERS_PATH python train_imagenet.py --network resnet \
--num-layers 152 --data-train ~/data/train --data-val ~/data/val/ --gpus 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 \
--batch-size 8192 --model ~/data/model/resnet152 --num-epochs 1 --kv-store dist_sync

launch.py運行集群中所有機器中提供的命令招刹。集群中機器的列表必須通過- h開關(guān)向launch.py提供。這里是用于launch. py的選項的描述窝趣。

train_imagenet.py使用--data-train--data-val 選項提供的數(shù)據(jù)來訓(xùn)練--network選項提供的網(wǎng)絡(luò)疯暑。這里是train_imagenet.py中使用的選項的描述。

訓(xùn)練完成后哑舒,--model選項指定目錄中可用的已經(jīng)訓(xùn)練的模型妇拯。模型被保存在兩個部分:定義網(wǎng)絡(luò)的model-symbol.jsonn次訓(xùn)練后保存參數(shù)的model-n.params

可伸縮性

使用大量機器進行訓(xùn)練的一個常見問題是可伸縮性。我們在集群上運行幾個流行的網(wǎng)絡(luò)越锈,有多達256個gpu仗嗦,而且速度非常接近理想。

這個可伸縮性測試運行在16個p2.16 xl的實例上甘凭,總共有256個gpu稀拐。我們使用了AWS深度學(xué)習(xí)AMI和CUDA 7.5和CUDNN 5.1安裝。

我們固定了每GPU的批量大小丹弱,并在以后的測試中增加GPU的數(shù)量德撬。同步的SGD(- kv-store dist_device_sync)被使用。所使用的CNNs在這里躲胳。

每秒處理的圖像數(shù)如下表所示:

下圖顯示了對使用的gpu數(shù)量的加速砰逻,并將其與理想的加速進行比較。

故障排除指南

驗證準確性

實現(xiàn)一個合理的驗證精度通常很簡單泛鸟,但要達到報告中所報告的最先進的數(shù)字有時是非常困難的蝠咆。這里有幾件事你可以試著提高驗證的準確性。

  • 增加更多的數(shù)據(jù)增強通常會減少訓(xùn)練和確認準確度之間的差距北滥。數(shù)據(jù)增加可以在更接近尾聲的時期減少刚操。
  • 從一個大的學(xué)習(xí)速率開始,并保持長時間的學(xué)習(xí)再芋。例如菊霜,在CIFAR10中,您可以將第一個200次訓(xùn)練的學(xué)習(xí)速率保持在0.1济赎,然后將其降低到0.01鉴逞。
  • 不要使用規(guī)模太大的批處理大小,特別是批大小> >的類司训。

速度

  • 分布式培訓(xùn)提高了批量計算成本的速度构捡。所以,要確保你的工作量不是太小(就像在MNIST上的LeNet一樣)壳猜。確保批量大小相當(dāng)大勾徽。
  • 確保數(shù)據(jù)讀取和預(yù)處理不是瓶頸。使用——test-io 1標(biāo)志檢查每秒處理多少圖像统扳。
  • 增加- data- nthreads(默認值是4)以使用更多的線程來進行數(shù)據(jù)預(yù)處理喘帚。
  • 數(shù)據(jù)預(yù)處理是由opencv完成的。如果opencv是從源代碼編譯的咒钟,請檢查它是否配置正確吹由。
  • 使用--benchmark 1使用隨機生成的數(shù)據(jù),而不是實際數(shù)據(jù)朱嘴,以縮小瓶頸所在的位置倾鲫。
  • 查看此頁面了解更多細節(jié)。

內(nèi)存

如果批大小太大,就會耗盡GPU內(nèi)存级乍。如果發(fā)生這種情況,您將看到錯誤消息“cudaMalloc failed:out of memory”或類似的東西帚湘。有幾種方法可以解決這個問題:

  • 減少批量大小玫荣。
  • 將環(huán)境變量MXNET_BACKWARD_DO_MIRROR設(shè)置為1。它通過降低速度來減少內(nèi)存消耗大诸。例如捅厂,在批處理大小為64的情況下,incepa - v3使用10G內(nèi)存资柔,在一個K80 GPU上訓(xùn)練30個圖像/秒焙贷。當(dāng)鏡像啟用時,使用10G GPU內(nèi)存消耗贿堰,我們可以使用128的批大小運行incepa - v3辙芍。成本大致是這樣,速度降低到27張圖片/秒羹与。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末故硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵搁,更是在濱河造成了極大的恐慌吃衅,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腾誉,死亡現(xiàn)場離奇詭異徘层,居然都是意外死亡,警方通過查閱死者的電腦和手機利职,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門趣效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猪贪,你說我怎么就攤上這事英支。” “怎么了哮伟?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵干花,是天一觀的道長。 經(jīng)常有香客問我楞黄,道長池凄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任鬼廓,我火速辦了婚禮肿仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己尤慰,他們只是感情好馏锡,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伟端,像睡著了一般杯道。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上责蝠,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天党巾,我揣著相機與錄音,去河邊找鬼霜医。 笑死齿拂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肴敛。 我是一名探鬼主播署海,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼医男!你這毒婦竟也來了叹侄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昨登,失蹤者是張志新(化名)和其女友劉穎趾代,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰辣,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡撒强,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笙什。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飘哨。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琐凭,靈堂內(nèi)的尸體忽然破棺而出芽隆,到底是詐尸還是另有隱情,我是刑警寧澤统屈,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布胚吁,位于F島的核電站,受9級特大地震影響愁憔,放射性物質(zhì)發(fā)生泄漏腕扶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一吨掌、第九天 我趴在偏房一處隱蔽的房頂上張望半抱。 院中可真熱鬧脓恕,春花似錦、人聲如沸窿侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至乃秀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乘瓤,已是汗流浹背环形。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工策泣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衙傀,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓萨咕,卻偏偏與公主長得像统抬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子危队,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容