文章作者:Rakshith Vasudev 和 John Lockman - HPC AI Innovation Lab,2019年 10 月
如前所述,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,可提供優異的密度和效能。
硬體組態: | 軟體組態: |
---|---|
|
|
隨著新的運算裝置 (如 GPU 和 TPU) 能以越來越快的速度訓練神經網路,CPU 的處理能力很容易成為瓶頸。tf.data API 可為使用者提供建置模塊,設計能有效運用 CPU 的輸入管道,最佳化 ETL 程序的每個步驟。
若要執行訓練步驟,您必須先擷取並轉換訓練資料,然後再傳送至在加速器上執行的模型。然而,在原生的不同步實作中,當 CPU 在準備資料時,加速器只能閒置等待。反之,當加速器在訓練模型時,CPU 便會進入閒置。因此,訓練步驟時間是 CPU 預先處理時間和加速器訓練時間的總和
管道可重疊訓練步驟中的預先處理和模型運行。加速器執行訓練步驟 N 時,CPU 會準備步驟 N+1 的資料。如此可將擷取和轉換資料所需的訓練步驟時間縮至最短 (相較於加總)。
在沒有使用管道的情況下,CPU 和 GPU/TPU 會有很長的閒置時間:
圖 1:逐次執行會經常使 GPU 處於閒置狀態
使用管道時,閒置時間會大幅減少:
圖 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 順序):
不過,這不是效能最高的程式碼。這會導致停滯和頻繁出現 0% gpu 使用率。基本上,這無法有效地運用加速器。
為了正確設定 tf 資料管道,我們特別遵循 tensorflow 官方模型針對 ResNet 的專用方法。 舊方法與新方法之間的差異,在於資料管道在傳送至模型之前的設定方式。
新方法的外觀與此類似:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
TensorFlow 官方模型方法也稱為新方法,如下所示:
以下使用 TF 官方模型,比較新舊方法的效能。
圖 3:採用新方法,可預期獲得更近線性擴充的效能。
正如所見,出現了大規模的效能差異,而舊方法完全沒有擴充成效。GPU 的使用率經常很低,或完全沒有使用,導致效能低落。在單一 GPU 上提高運算效率,在通訊處理良好的狀況下,便可讓多個節點上的多個 GPU 運算更有效率。
以快速的通訊速度,讓 CPU 平行執行預先處理、在記憶體中預先擷取處理資料,並透過 GPU 處理繁重的矩陣乘法作業,這也是讓此新方法在擴充多個節點時更具吸引力的另一個層面。
執行工作的環境和工作一樣重要,擁有正確的程式庫/模組非常重要,因為這會影響訓練的效能。此外,使用與最新 CUDA 相關的程式庫亦可協助提升效能。
如果您沒有可正常運作的環境設定,請按照此教學進行安裝。
MPI 是一種通訊程式庫,可協助分派工作。探索到不同的繫結和對應參數選項,且 C4140 的最佳參數則是由插槽對應。建議設定如下:mpirun --map-by socket -np x python pyfile.py --pyoptions
如果單一 gpu 上運作超過一個程序,那麼它們很可能彼此爭搶 GPU 資源、佔用 GPU 記憶體,導致效能無法處理每個批次的影像,使 GPU 效能受到影響。已探索到 Tensorflow 1.13.1,但當時似乎有錯誤。它會在每個 GPU 啟動一個以上的程序。
摘要: