1. 2 つの分散トレーニング方法
1.DataParallel (DP): 実装が簡単で、コードが少なく、起動が高速です。しかし、速度が遅く、負荷の不均衡の問題があります。単一プロセス、マルチスレッド。メイン カードは、他のカードよりも多くのビデオ メモリを占有します。 Apex を使用した混合精度トレーニングはサポートされていません。これは、ずっと前に Pytorch 公式によって提供された解決策です。 Python GIL の制限により、DP の動作原理は、バッチ サイズの入力データを複数の GPU に均等に分割して計算することです (ここで、バッチ サイズは分割する GPU の数より大きくなければならないことに注意してください)。
2. DistributedDataParallel (DDP): All-Reduce モード。元々は分散トレーニング (複数のマシンと複数のカード) を目的としていましたが、単一のマシンと複数のカードにも使用できます。構成は少し複雑です。マルチプログレス。データの分布は比較的バランスが取れています。新世代のマルチカードトレーニングメソッドです。 torch.distributed ライブラリを使用して並列処理を実現します。 GPU および CPU の分散トレーニング サポートを含む分散サポートは、マルチマシン ネットワーク間でテンソル データを交換するための MPI のようなインターフェイスを提供する torch.distributed ライブラリによって提供されます。いくつかの異なるバックエンドと初期化方法をサポートしています。 DDP は、Ring-Reduce のデータ交換方式により通信効率を向上させ、複数のプロセスを起動することで Python GIL の制限を緩和することで、学習速度を向上させます。
2. DDP の実装手順
1. インポートが必要なパッケージ
このうち、dist はマルチスレッド通信を担当し、DDP はモデルの配信を担当します。
2. 通信プロセスの初期化
local_rank が -1 に設定されている場合
3. DistributedSampler を使用してデータをカプセル化する
4. モデルを cuda に配置し、カプセル化します。
5. トレーニング中にデータをデバイスに保存します
注文の実行:
python3 -m torch.distributed.launch --nproc_per_node=4 --master_port=60055 train.py --GPUS 4,5,6,7