この文書は、2019年10月にHPC AI Innovation LabのRakshith Vasudev氏とJohn Lockman氏によって作成されました。
以前に紹介したように、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で密度とパフォーマンスの両方を実現します。
ハードウェア構成: | ソフトウェア構成: |
---|---|
|
|
新しいコンピューティング デバイス(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データ パイプラインは次の処理を行います(胸部レントゲンのデータセットがTFRecordのシーケンスであると仮定します)。
ただし、これは最もパフォーマンスの高いコードではありません。これは、停止を引き起こし、頻繁にGPU使用率が0%になります。基本的に、アクセラレーターを効果的に利用していません。
tfデータ パイプラインを正しくセットアップするため、Tensorflowの公式モデル、特にResNetのアプローチに従います。 古いアプローチと新しいアプローチの違いは、データ パイプラインをモデルにフィードする前にセットアップする方法です。
新しいアプローチについては、次を参照してください:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
TensorFlowの公式モデル アプローチ(新しいアプローチとも呼ばれる)は、次のとおりです。
以下に、TF公式モデルを使用した、古いアプローチと新しいアプローチの両方のパフォーマンスの比較を示します。
図3:新しいアプローチでは、ほぼ直線的なスケーリングが期待できる。
ご覧のように、古いアプローチでは深刻なパフォーマンス ヒットがあり、スケーリングはまったくありません。GPUの使用率が皆無かそれに近い場合が多く、パフォーマンスが水平になります。1つのGPUで計算を効率化すると、通信が適切に処理されている場合に、複数ノード上の複数GPUの計算がより効率的になります。
CPUが前処理を並列で実行し、処理されたデータをメモリーにプリフェッチします。GPUは、高速通信によるマトリックス乗算の重い処理を行います。これは、この新しいアプローチが複数ノードに拡張する際に魅力的な手法となるもう1つの側面です。
ジョブを実行する環境はジョブと同じくらい大切です。また、ライブラリー/モジュールはトレーニングのパフォーマンスに影響を与えるため、適切に用意することが重要です。さらに、最新のCUDA関連ライブラリーを持つことで、パフォーマンスを向上させることができます。
作業環境をセットアップしていない場合は、このチュートリアルに従ってインストールします。
MPIは、Horovodによるジョブの分散を支援する通信ライブラリーです。異なるバインドおよびマッピング パラメーターのオプションが検討された結果、C4140の最適なパラメーターはソケット別マッピングでした。推奨される設定は次のとおりです。mpirun --map-by socket -np x python pyfile.py --pyoptions
1つのGPUを動作させるプロセスが複数ある場合、GPUリソースをめぐって競合し、GPUメモリーを消費することがあります。これにより、バッチあたり多くのイメージを効果的に適合することができず、GPUにパフォーマンス ヒットが起こる原因となります。Tensorflow 1.13.1が検討されましたが、その時点でバグがあるようでした。GPUごとに複数のプロセスを起動していました。
要約: