天天看點

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

目錄

<a href="https://yq.aliyun.com/articles/318391?spm=a2c4e.11155435.0.0.3a8633127vfT6L">雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐</a>

<a href="https://yq.aliyun.com/articles/610218?spm=a2c4e.11155435.0.0.3a863312pOsUwi">雲上深度學習實踐(二)-雲上MXNet實踐</a>

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

1 背景

  2015年11月9日,Google釋出深度學習架構TensorFlow。Google表示,TensorFlow在設計上尤其針對克服其第一代深度學習架構DistBelief 的短闆,靈活、更通用、易使用、更快,而且完全開源。在短短的一年時間内,在GitHub上,TensorFlow就成為了最流行的深度學習項目。

  本文将介紹TensorFlow在阿裡雲GPU雲伺服器上的單機性能表現,并對單機多卡的訓練性能調優給出了一些建議。

2 使用卷積神經網絡進行圖像分類

  卷積神經網絡(Convolutional Neural Network)是一種前饋神經網絡,對于圖像處理有非常出色的表現。早在20世紀80年代末,Yann LeCun(曾在多倫多大學跟随深度學習鼻祖Geoffrey Hinton進行博士後研究)作為貝爾實驗室的研究員提出了卷積網絡技術,并展示如何使用它來大幅度提高手寫識别能力。

  2012年,Geoffrey E. Hinton的弟子Alex Krizhevsky在ILSVRC-2012的圖像分類比賽中使用2塊Nvidia GTX 580 GPU訓練的多層神經網絡(後來被稱為AlexNet)以15.3%的top-5測試錯誤率摘得冠軍。AlexNet包含6000萬參數和65萬神經節點。

  2014年,Google公司的GoogleNet摘得ILSVRC挑戰賽的冠軍,将Top5 的錯誤率降低到6.67%,它是一個22層的卷積神經網絡,有500多萬個參數。

  VGG,ILSVRC-2014的亞軍,Top5 的錯誤率為7.32%,16層的VGG網絡,參數高達1億3千多萬。

  ResNet,ILSVRC’15資料集可以達到3.57%的Top-5錯誤率,50層的ResNet參數90多萬,152層參數230多萬。

  InceptionV3,GoogLeNet的更新版,參數不到250萬,ILSVRC-2012資料集Top-5錯誤率可以達到3.5%。

  卷積神經網絡在圖像分類領域已經取得了非常好的表現,被廣泛采用,我們将會使用以上幾個主流的卷積神經網絡的TensorFlow訓練BenchMark在阿裡雲GN5 GPU雲伺服器(8卡P100)上進行性能測試,并給出性能調優的一些建議。

3 調優政策

  如何在多GPU機器上獲得最優的訓練性能是使用者非常關心的問題。通常的方法是使用資料并行。也就是說要将模型的多個拷貝放到每個GPU上,将一個batch的資料劃分到每個GPU上計算。每個GPU如何擷取更新的變量以及傳回梯度對最終的性能和擴充性都會有影響。

  針對不同複雜度的網絡,會有不同的政策。網絡的複雜度展現在變量的數目以及網絡的深度,最終會展現在參數傳遞的資料量和計算量上,對于單機多卡,會更多的考慮變量的規模,這會直接決定訓練過程中的通信資料量,進而影響最終的擴充性。

  目前在TensorFlow上對于變量的放置主要有兩種政策,一種是Parameter Server,一種是Replicated。

  下面幾節會詳細介紹這些政策以及相應的使用場景,但在阿裡雲GPU雲伺服器上的最佳政策,我們會在後面的資料實測章節通過實驗來說明。

3.1 Parameter Server

  這種模式下,梯度的聚合放到參數伺服器(Parameter Server)上,參數伺服器可以是CPU也可以是GPU,通常會放到CPU上。每個GPU上的訓練模型副本都會從參數伺服器擷取最新的變量并各自更新自己本地的變量。擷取變量的方式是使用TensorFlow中的标準顯示拷貝。

  一般建議像ResNet、InceptionV3這樣的參數規模較小的網絡,可以選擇參數伺服器模式,拷貝的壓力不會太大。

3.2 Replicated

  這種模式下,伺服器上的每個GPU都有模型的副本和自己的變量。變量的值在擷取到完全聚合的梯度後會在本地完成變量的更新。是以在訓練開始的時候變量和資料本地都已準備好,可以立即開始前向的計算,後向計算需要彙總說有的GPU計算結果後使用聚合的梯度。

  梯度聚合一般有兩種方式:

使用标準的TensorFlow操作彙總到一個裝置上(CPU或者是GPU),然後再将聚合的梯度拷貝回所有的GPU。

使用NVIDIA的NCCL,具體會在下節闡述。

一般建議像AlexNet和VGG這樣的參數規模比較大的網絡使用這種方式,避免使用Parameter Server模式時集中在一個裝置上做梯度聚合和變量更新導緻出現通信性能瓶頸。

3.3 NCCL

  如上節所述,為了在不同GPU間廣播變量和聚合梯度,可以使用TensorFlow的拷貝機制,也可以選擇NCCL。

  NCCL(NVIDIA Collective Communications Library)提供了不同GPU間廣播和聚合資料的高效通信原語。NCCL會在每個GPU上排程一個協同工作的kernel,這個kernel知道如何最好的利用底層硬體的拓撲(比如可以利用GPUDirect P2P技術或者NVLink)進而選擇合理的通信政策,這個kernel會使用GPU上的一個SM(streaming multiprocessor)來完成上述通信工作。

  使用NCCL通常能夠帶來更高的通信速度,但是并不一定能夠加速整體的訓練性能。因為盡管NCCL可以有更快的傳輸資料,但是它會占用一個SM資源,同時會增加L2 Cache的壓力,是以在某些場景下可能反而加速效果并不如拷貝機制。比如當GPU數目比較多時可能使用NCCL效果會比較好,但是GPU比較少時,拷貝可能會比較好。我們可以從後面的實測資料分析中看到這個結論。

4 性能實測

  我們在阿裡雲上的GN5 GPU雲伺服器(8卡P100)上使用TensorFlow測試了InceptionV3、ResNet50、ResNet152、AlexNet、VGG16幾個經典卷積神經網絡的用于圖像分類模型的訓練性能,并使用不同的政策做了比較,具體實測資料如下。

4.1 InceptionV3

Parameter Server(CPU):

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

Parameter Server(GPU):

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

Replicated(NCCL):

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

Replicated(NONE):

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

Replicated(PSCPU):

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

4.2 ResNet50

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

4.3 ResNet152

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

4.4 AlexNet

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

4.5 VGG16

雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐
雲上深度學習實踐(一)-GPU雲伺服器TensorFlow單機多卡訓練性能實踐

5 資料分析

  從以上實測資料,我們可以總結出在GN5執行個體上的性能政策:

InceptionV3和ResNet這樣參數規模不是很大的網絡,使用CPU做Parameter Server的8卡性能都比較好,另外,使用Replicated政策時,隻使用CPU做梯度聚合時的8卡性能最好,甚至比CPU做Parameter Server還好。是以借助CPU集中處理參數更新或者梯度聚合,對于參數規模不大的網絡來說,的确具有更好的多卡性能擴充性。

對于AlexNet和VGG16這樣的參數規模比較大的網絡,使用Replicated政策的NCCL和PSCPU方式的性能都比較好,不過使用CPU做Parameter Server的效果也不錯。當然,對于即将釋出的支援NVLink的GN6(V100)GPU雲服務來說,相信針對NVLink特别優化的NCCL會有更出色表現,後續我們會在GN6上通過實測來分析驗證。

使用Replicated政策時,NCCL在2卡或者4卡的性能都不是最好的或者是相對較差的,不如拷貝的方式,8卡時往往性能都比較好,這也說明了NCCL在GPU數量較多時的效果會更好一些。

6 總結

  本文通過實測給出了在阿裡雲GPU雲伺服器上使用TensorFlow進行單機多卡訓練的一些性能調優指南,對于其他網絡和架構同樣有一定的參考意義,讀者可以根據自己架構和網絡的特點調整相應參數,進而達到最優的訓練性能。

繼續閱讀