深層学習 単一マシン マルチカード/マルチマシン マルチカード トレーニング

1. 概念的な区別

分散: 複数のマシン上の複数の GPU、つまり複数のマシンと複数のカードを指します。

Parallel : マシン上の複数の GPU を指します。つまり、1 台のマシンに複数のカードが搭載されています。

同期更新: すべての GPU が勾配を計算した後、勾配を累積してパラメーター更新の平均値を計算し、次のラウンドに進むことを意味します。

Rank はグローバル プロセス番号を表し、local_rank はローカル サブマシンのプロセス番号を表します。world_size はグローバル プロセスの数を表します。

たとえば、3 台のマシンがあり、各マシンの 4 枚のカードすべてが使用されている場合、group=1、 world size=12、
machine 1 となります: node=0 Rank=0,1,2,3 local_rank=0,1 ,2 ,3 ここで、node=0、rank=0 はマスター
マシン 2 です:node=1 Rank=4,5,6,7 local_rank =0,1,2,3
マシン 3:node=2 Rank=8, 9、10、11 ローカルランク=0、1、2、3

2. DP と DDP (pytorch 内)

DP (DataParallel) モードは主に、単一マシン上の複数のカードをサポートします。1 つのプロセスと複数のスレッドがあります (グローバル インタプリタ ロックによって制限されます)。local_rank0 はマスター ノードであり、パラメータ サーバーに相当し、パラメータを他の GPU にブロードキャストします。バックプロパゲーションの後、各カードは勾配をマスター ノードに集中させ、平均化します。パラメータを更新してから、パラメータを他のカードに送信します。GPUS ノードとマスター ノードはトレーニング中に指定する必要があります。

DDP (分散データ並列) は、分散マルチマシンおよびマルチカード トレーニングをサポートするだけでなく、単一マシンおよびマルチカード トレーニングもサポートします。DP と比較して、並列トレーニング用の複数のプロセスがあり、グローバル インタプリタ ロックの制限がありません。同時に、モデル ブロードキャストは、DP のように各順方​​向伝播の前にブロードキャストするのではなく、初期化中に 1 回だけブロードキャストされます。DDP の各プロセスは独立したオプティマイザを持ち、独自の更新処理を行っており、勾配は通信により各プロセスに渡されるため、実行内容は同一です。

DDP と DP のもう 1 つの違いは、各プロセスがデータセットの一部のみを呼び出すように、データセットを処理するために DistributedSample を使用する必要があることです。異なるプロセス間でデータのやり取りは行われません。そうしないと、デフォルトの DP データ割り当て方法を使用すると、複数マシンの通信に問題が発生し、非常に時間がかかります。DP は、batch_size データを異なるカードに分割します。たとえば、batch_size30、2 つの GPU の場合、各 GPU の実際の bs は 15 になります。DDP の場合、batch_size は 30 です。これは、各カードの batch_size が 30 であることを意味します。

3. シンクBN

標準 BN はデータ並列処理 (DP) を使用し、単一カード上のサンプルのみを正規化するため、batch_size が非常に小さくなり、モデルの収束に影響します。一方、Syncbn は、順伝播 (複数のカードを備えた複数のマシン、複数のカードを備えた単一マシン) 中にグローバル データの平均と分散を見つけ、正規化操作のためにメッセージを各カードに渡します。これにより、batch_size が小さすぎて BN エラーが発生する問題を防ぐことができます。ここで、GPU 間の一般的な通信には、デフォルトで NCCL 通信フレームワークを使用していることを述べておきます。

おすすめ

転載: blog.csdn.net/slamer111/article/details/132716482