翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
分散トレーニングの戦略
分散トレーニングは通常、データ並列とモデル並列という 2 つのアプローチに分割されます。データ並列は、分散トレーニングの最も一般的なアプローチです。大量のデータがある場合、バッチにまとめ、データのブロックを複数の CPU または GPU (ノード) に送信してニューラルネットワークや 機械学習アルゴリズムで処理し、結果を結合します。ニューラルネットワークは各ノード同じものになります。モデル並列アプローチは、ノードのメモリにひとかたまりで収まらないような大きなモデルで使用されます。モデルを分割し、異なるノードに異なるパーツを配置します。この場合、モデルのすべての部分でデータが処理されるように、データのバッチを各ノードに送る必要があります。
ネットワークとモデルという用語は、しばしば同じ意味で使われます。大規模なモデルとは、実際には多くのレイヤーとパラメータを持つ大規模なネットワークです。大規模なネットワークでトレーニングすると大規模なモデルが生成され、トレーニング済みのすべてのパラメータとその重みと共にモデルをネットワークにロードし直すと、大規模なモデルがメモリにロードされます。モデルを分解してノード間に分割する場合は、基礎となるネットワークも分解されます。ネットワークはレイヤーで構成されており、ネットワークを分割するには、異なるコンピューティングデバイスにレイヤーを配置します。
デバイス間に複数のレイヤーを単純に分割する際の一般的な落とし穴は、GPU の使用率の著しい低下です。トレーニングは、本質的にフォワードおよびバックワードパスの両方で順次に行われ、ある一時点では 1 つの GPU のみがアクティブに計算でき、他の GPU はアクティベーションが送信されるまで待機します。最新のモデル並列ライブラリは、パイプライン実行スケジュールを使ってデバイスの使用率を向上させることで、この問題を解決しています。ただし、Amazon SageMaker AI の分散モデル並列ライブラリにのみ、自動モデル分割が含まれています。ライブラリの 2 つのコア機能である、自動モデル分割とパイプライン実行スケジューリングは、効率的なデバイス利用につながる自動決定を行うことで、モデル並列の実装プロセスを簡素化します。
データ並列とモデル並列でトレーニングする
大規模なデータセットを使ってトレーニングする場合は、データ並列アプローチから始めます。トレーニング中にメモリが不足した場合、モデル並列のアプローチに切り替えるか、モデルとデータのハイブリッド並列を試すこともできます。データ並列でのパフォーマンスを改善するには、以下を試すこともできます。
-
モデルのハイパーパラメータを変更する。
-
バッチサイズを減らす。
-
収まるまでバッチサイズを減らし続ける。バッチサイズを 1 に減らしてもメモリが不足する場合は、モデル並列トレーニングを試してください。
勾配圧縮を試す (FP16、INT8):
-
NVIDIA TensorCore 搭載ハードウェアでは、混合精度トレーニング
を用いることで高速化とメモリ消費削減の両方を実現できます。 -
SageMaker AI の分散データ並列処理ライブラリは、すぐに使える自動混合精度 (AMP) をサポートしています。AMP を有効にするには、トレーニングスクリプトにフレームワークレベルの変更を加える以外、特別なアクションは必要ありません。勾配が FP16 にある場合、SageMaker AI データ並列処理ライブラリは FP16 でその
AllReduce
オペレーションを実行します。トレーニングスクリプトへの AMP API の実装に関する詳細は、次のリソースを参照してください。-
「Frameworks - PyTorch
」(NVIDIA 深層学習パフォーマンスドキュメント) -
「Frameworks - TensorFlow
」(NVIDIA 深層学習パフォーマンスドキュメント) -
深層学習の自動混合精度
(NVIDIA デベロッパードキュメント) -
NVIDIA GPUでの高速トレーニングのためのネイティブ PyTorch 自動混合精度の導入
(PyTorch ブログ) -
TensorFlow 混合精度 API
(TensorFlow ドキュメント)
-
入力サイズを減らしてみる:
-
シーケンスリンクを増やす場合、バッチサイズを減らすよう調整する必要がある場合、バッチを広げるために GPU を大きくするよう調整する場合は、NLP シーケンスの長さを短くします。
-
イメージの解像度を下げます。
バッチ正規化を使うかどうかをチェックします。これは収束に影響する可能性があるためです。分散トレーニングを使うと、バッチが GPU 間に分割され、バッチサイズが小さいほどエラー率が高くなり、モデルの収束が妨げられる可能性があります。例えば、バッチサイズが 64 の単一の GPU でネットワークのプロトタイプを作成し、4 つの p3dn.24xlarge を使うようスケールアップした場合、GPU は 32 になり、GPU あたりのバッチサイズは 64 から 2 に低下します。これでは、単一ノードの場合に見られた収束が崩れる可能性が高くなります。
次の場合にモデル並列トレーニングを開始します。
-
モデルが 1 つのデバイスに収まらない。
-
モデルサイズが原因で、より大きなバッチサイズを選択する際の制限に直面している (モデルの重みが GPU メモリの大半を占有し、より小さな、最適ではないバッチサイズを選択せざるを得ない場合など)。
SageMaker AI 分散ライブラリの詳細については、以下を参照してください。