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を使用して、CheXNetの分散スケールアウト トレーニングで最大限のパフォーマンスを実現するためのベスト プラクティスについて説明します。

This article applies to   This article does not apply to 

Symptoms

この文書は、2019年10月にHPC AI Innovation LabのRakshith Vasudev氏とJohn Lockman氏によって作成されました。

Cause

  -

Resolution

以前に紹介したように、CheXNetはDenseNetを活用して指定された胸部レントゲン写真から最大14の病状を特定するためのAI放射線技師アシスタント モデルです。拡張性とトレーニング精度の向上(ポジティブなAUROC)の両方を実証して、ResNet-50を搭載したオリジナルのCheXNet-121と同等以上のパフォーマンスを発揮できるモデルのトレーニングをスケールアウトするために、いくつかのアプローチを検討しました。この記事の作者らは、CPUシステムでの拡張性を実証しましたが、トレーニング プロセスを高速化するためにGPUの並列化を活用することに関心を持ちました。この記事では、Dell EMC C4140サーバーでNVIDIA V100 SXM2 GPUを使用して、CheXNetの分散スケールアウト トレーニングで最大限のパフォーマンスを実現するためのベスト プラクティスについて説明します。Dell EMC PowerEdge C4140は、SXM2構成の4つのNVIDIA V100 GPUで密度とパフォーマンスの両方を実現します。


 

ハードウェア構成: ソフトウェア構成:
  • 4 PowerEdge C4140
  • 4 NVIDIA V100 32 GB SXM2
  • 2 20コア インテル(R)Xeon(R)Gold 6148 CPU @ 2.40GHz
  • 384 GB RAM、DDR4 2666 MHz
  • 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
  • OSおよびバージョン:RHEL 7.4


 


データ パイプラインは、アクセラレーターから最大限のパフォーマンスを得るために不可欠です。



 

tf.dataの概要および使用する理由

 

新しいコンピューティング デバイス(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データ パイプラインは次の処理を行います(胸部レントゲンのデータセットがTFRecordのシーケンスであると仮定します)。

 

  1. ファイル名の絶対リストを取得します。
  2. TFRecordDataset()を使用して、ファイル名のリストからデータセットをビルドします。
  3. 前処理してロードおよびフォーマットする新しいデータセットを作成します。
  4. データセットをシャーディングします。
  5. トレーニング時にデータセットをシャッフルします。
  6. データセットを繰り返します。
  7. データセットをバッチ処理します。
  8. batch_sizeのデータセットをプリフェッチします。


 

ただし、これは最もパフォーマンスの高いコードではありません。これは、停止を引き起こし、頻繁にGPU使用率が0%になります。基本的に、アクセラレーターを効果的に利用していません。

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の使用率が皆無かそれに近い場合が多く、パフォーマンスが水平になります。1つのGPUで計算を効率化すると、通信が適切に処理されている場合に、複数ノード上の複数GPUの計算がより効率的になります。
CPUが前処理を並列で実行し、処理されたデータをメモリーにプリフェッチします。GPUは、高速通信によるマトリックス乗算の重い処理を行います。これは、この新しいアプローチが複数ノードに拡張する際に魅力的な手法となるもう1つの側面です。


 


最適なパフォーマンスを実現するために検討すべきその他の手法:



 

適切な環境を整えることが重要:

 

ジョブを実行する環境はジョブと同じくらい大切です。また、ライブラリー/モジュールはトレーニングのパフォーマンスに影響を与えるため、適切に用意することが重要です。さらに、最新のCUDA関連ライブラリーを持つことで、パフォーマンスを向上させることができます。

作業環境をセットアップしていない場合は、このチュートリアルに従ってインストールします。



 

MPIに正しいバインド パラメーターを使用する:

 

MPIは、Horovodによるジョブの分散を支援する通信ライブラリーです。異なるバインドおよびマッピング パラメーターのオプションが検討された結果、C4140の最適なパラメーターはソケット別マッピングでした。推奨される設定は次のとおりです。
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

1つのプロセスが1つのGPUで動作することを確認する:

 

1つのGPUを動作させるプロセスが複数ある場合、GPUリソースをめぐって競合し、GPUメモリーを消費することがあります。これにより、バッチあたり多くのイメージを効果的に適合することができず、GPUにパフォーマンス ヒットが起こる原因となります。Tensorflow 1.13.1が検討されましたが、その時点でバグがあるようでした。GPUごとに複数のプロセスを起動していました。


 

要約:

  • パフォーマンスを向上させるには、データ パイプラインを正しくセットアップすることが重要です。
  • 適切な環境を設定することは、パフォーマンスの向上に貢献します。
  • MPIに正しいバインド パラメーターを使用すると、パフォーマンスが向上します。
  • GPUを完全に使用していない場合のボトルネックをプロファイルして修正します。


 


Affected Products

High Performance Computing Solution Resources, Poweredge C4140