Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products

在搭載 Nvidia V100 GPU 的 Dell C4140 上訓練 CheXNet 的最佳化技巧

Summary: 在 Dell EMC C4140 伺服器中使用 Nvidia V100 SXM2 GPU,實現最大效能分散水平式擴充訓練的最佳實務。

This article applies to   This article does not apply to 

Symptoms

文章作者:Rakshith Vasudev 和 John Lockman - HPC AI Innovation Lab,2019年 10 月

Cause

  -

Resolution

所述,CheXNet 是利用 DenseNet 的人工智慧放射師助理模型,可從提供的胸部 X 光影像中識別多達 14 種病理特性。我們探索了多種方法,以水平式擴充訓練可執行等同或優於原始 ChexNet-121 的模型,其中 ResNet-50 證明了強大的擴充能力和更高的訓練準確度 (陽性 AUROC)。作者在 CPU 系統上示範了擴充能力,但我們也對透過並行 GPU 加速訓練程式十分有興趣。在本文中,我們將說明在 Dell EMC C4140 伺服器中使用 Nvidia V100 SXM2 GPU,實現最大效能分散水平式擴充訓練的最佳實務。Dell EMC PowerEdge C4140 具備採用 SXM2 組態的四個 NVIDIA V100 GPU,可提供優異的密度和效能


 

硬體組態: 軟體組態:
  • 4 個 PowerEdge C4140
  • 4 個 Nvidia V100 32GB SXM2
  • 2 個 20 核心 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
  • 384 GB RAM,DDR4 2666MHz
  • 1 個 Mellanox EDR HCA
  • Lustre 檔案系統
  • 深度學習架構:tensorflow-gpu
  • 架構版本:1.12.0
  • Horovod 版本:0.16.4
  • MPI 版本:4.0.0,支援 cuda 和 ucx
  • CUDA 版本:10.1.105
  • CUDNN 版本:7.6.0
  • NCCL 版本:2.4.7
  • Python 版本:3.6.8
  • 作業系統和版本:RHEL 7.4


 


對於從加速器獲得最大效能來說,資料管道至關重要:



 

什麼是 tf 資料,為何您應該盡力運用它?

 

隨著新的運算裝置 (如 GPU 和 TPU) 能以越來越快的速度訓練神經網路,CPU 的處理能力很容易成為瓶頸。tf.data API 可為使用者提供建置模塊,設計能有效運用 CPU 的輸入管道,最佳化 ETL 程序的每個步驟。

 

若要執行訓練步驟,您必須先擷取並轉換訓練資料,然後再傳送至在加速器上執行的模型。然而,在原生的不同步實作中,當 CPU 在準備資料時,加速器只能閒置等待。反之,當加速器在訓練模型時,CPU 便會進入閒置。因此,訓練步驟時間是 CPU 預先處理時間和加速器訓練時間的總和

 

管道可重疊訓練步驟中的預先處理和模型運行。加速器執行訓練步驟 N 時,CPU 會準備步驟 N+1 的資料。如此可將擷取和轉換資料所需的訓練步驟時間縮至最短 (相較於加總)。

 

在沒有使用管道的情況下,CPU 和 GPU/TPU 會有很長的閒置時間:

SLN318898_en_US__1Sequantial execution
圖 1:逐次執行會經常使 GPU 處於閒置狀態

 

使用管道時,閒置時間會大幅減少:

SLN318898_en_US__2Pipelining overlaps
圖 2:管道重疊 CPU 和 GPU 的使用率,將 GPU 使用率最大化

 

tf.data API 透過 tf.data.Dataset.prefetch 轉換,提供一個軟體管道機制,可用於分離資料的耗用時間與產生時間。具體而言,這樣的轉換會使用背景執行緒和內部緩衝區,在要求之前預先擷取輸入資料集的元素。

 

在此取得更多資訊:https://www.tensorflow.org/guide/performance/datasets

 

當使用者遵循由 tensorflow 提供的準則操作時,可能會取得與此類似的資料管道 (舊方法):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

在此方法 (也稱為舊方法) 中,tf 資料管道會執行下列操作 (假設胸部 x 光資料集為 TFRecords 順序):

 

  1. 取得絕對檔案名稱清單。
  2. 使用 TFRecordDataset() 從檔案名稱清單建立資料集
  3. 建立新的資料集,透過預先處理載入和格式化影像。
  4. 分裂資料集。
  5. 在訓練時切換資料集。
  6. 重複資料集。
  7. 大量執行資料集。
  8. 預先擷取資料集的 batch_size。


 

不過,這不是效能最高的程式碼。這會導致停滯和頻繁出現 0% gpu 使用率。基本上,這無法有效地運用加速器。

為了正確設定 tf 資料管道,我們特別遵循 tensorflow 官方模型針對 ResNet 的專用方法。  舊方法與新方法之間的差異,在於資料管道在傳送至模型之前的設定方式。

 

新方法的外觀與此類似:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

TensorFlow 官方模型方法也稱為新方法,如下所示:

 

  1. 取得絕對檔案名稱清單。
  2. 使用 from_tensor_slices() 從檔案名稱清單建立資料集
  3. 分裂作業會提前完成。
  4. 資料集會在訓練期間切換。
  5. 然後資料集會進行平行交錯,也就是交錯和處理多個檔案 (由 cycle_length 定義),轉換這些檔案以建立 TFRecord 資料集。
  6. 隨即會預先擷取資料集。buffer_size 定義會預先擷取多少記錄,這通常是工作的最小 batch_size。
  7. 資料集會再次切換。切換的詳細資料由 buffer_size 控制。
  8. 接著會重複資料集。  它會重複資料集,直到 num_epochs 進行訓練。
  9. 資料集會根據同時分析 tf 記錄檔案的 map_and_batch(),進而預先處理影像並將其批次處理。
  10. 預先處理的影像將準備就緒為資料集,且可供再次預先擷取。


 

以下使用 TF 官方模型,比較新舊方法的效能。

SLN318898_en_US__3image(12053)
圖 3:採用新方法,可預期獲得更近線性擴充的效能。

 

正如所見,出現了大規模的效能差異,而舊方法完全沒有擴充成效。GPU 的使用率經常很低,或完全沒有使用,導致效能低落。在單一 GPU 上提高運算效率,在通訊處理良好的狀況下,便可讓多個節點上的多個 GPU 運算更有效率。
以快速的通訊速度,讓 CPU 平行執行預先處理、在記憶體中預先擷取處理資料,並透過 GPU 處理繁重的矩陣乘法作業,這也是讓此新方法在擴充多個節點時更具吸引力的另一個層面。


 


為了達到最佳效能所需要考慮的其他技術:



 

擁有正確的環境非常重要:

 

執行工作的環境和工作一樣重要,擁有正確的程式庫/模組非常重要,因為這會影響訓練的效能。此外,使用與最新 CUDA 相關的程式庫亦可協助提升效能。

如果您沒有可正常運作的環境設定,請按照此教學進行安裝。



 

使用正確的 MPI 繫結參數:

 

MPI 是一種通訊程式庫,可協助分派工作。探索到不同的繫結和對應參數選項,且 C4140 的最佳參數則是由插槽對應。建議設定如下:
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

確保每個 GPU 上僅執行一個程序:

 

如果單一 gpu 上運作超過一個程序,那麼它們很可能彼此爭搶 GPU 資源、佔用 GPU 記憶體,導致效能無法處理每個批次的影像,使 GPU 效能受到影響。已探索到 Tensorflow 1.13.1,但當時似乎有錯誤。它會在每個 GPU 啟動一個以上的程序。


 

摘要:

  • 正確設定資料管道是提升效能的關鍵。
  • 設定正確的環境對提升效能來說十分實用。
  • 使用正確的 MPI 繫結參數有助於提升效能。
  • 在未充分運用 GPU 時分析並修正瓶頸。


 


Affected Products

High Performance Computing Solution Resources, Poweredge C4140