DataParallelによるマルチGPU学習
nn.DataParallel、GPUメモリの均衡化、帯域幅のボトルネック、DDPが適している場面について学習します。
「DataParallelによるマルチGPU学習」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
複数のGPUを使う理由
現代のモデルやバッチは、1つのGPUのメモリ容量や計算能力では足りなくなることがあります。複数のGPUを使うと、より大きなモデルを学習したり、より大きなバッチを短い実時間で処理したりできます。PyTorchにはこれを実現する方法がいくつかありますが、最も簡単なのはDataParallelです。
データ並列化
データ並列化では、各GPUにモデルを複製し、入力バッチをGPU間で分割します。各GPUが割り当てられたデータで計算を行い、その後、すべての複製モデルが同期した状態を保てるように勾配を統合します。
nn.DataParallel
nn.DataParallelを使うと、1行でモデルをラップできます。使用するGPUのIDを渡せば、PyTorchが入力の分散と出力の集約を自動的に処理します。
import torch
import torch.nn as nn
model = MyModel().cuda()
model = nn.DataParallel(model, device_ids=[0, 1])バッチの自動分割
フォワードパス中、DataParallelはバッチを次元0に沿って、指定したGPU間で分割します。2つのGPUでバッチサイズ64を処理する場合、32個ずつのサブバッチになります。各GPUは、割り当てられたサブバッチに対して同じモデルを並列に実行します。
# batch of 64 with device_ids=[0, 1]
# GPU 0 processes samples 0..31
# GPU 1 processes samples 32..63勾配の平均化
バックワードパスでは、GPUごとの勾配がプライマリデバイスに集約され、平均化されます(実質的には加算してスケーリングします)。これにより、モデルの更新がバッチ全体を反映するようになります。その後、次のステップに向けて複製モデルが再同期されます。
通常の学習ループ
最も便利な点は、学習ループをほとんど変更する必要がないことです。データをプライマリGPUに移動し、ラップしたモデルを通常どおり呼び出すだけで、DataParallelが内部で分散処理を行います。
for x, y in loader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
out = model(x) # auto-split across GPUs
loss = criterion(out, y)
loss.backward() # gradients averaged
optimizer.step()GPU 0の負荷偏り
DataParallelにはよく知られた弱点があります。プライマリGPU(通常はGPU 0)がすべての出力を集約して損失を計算するため、メモリと計算の負荷が余分にかかります。GPUが多い場合、GPU 0がボトルネックになり、他のGPUより先にメモリ不足になることがあります。
単一プロセス、多数のスレッド
DataParallelは単一のPythonプロセスで動作し、スレッドを使ってGPUを制御します。Pythonのグローバルインタープリターロックと分散・集約のオーバーヘッドにより、特にGPUが2〜4台を超えるとスケーリング効率が制限されます。
DDPが推奨される理由
これらの理由から、本格的なマルチGPU処理にはDistributedDataParallel(DDP)が推奨されます。DDPはGPUごとに1つのプロセスを実行し、効率的なオールリデュースで勾配を同期します。また、GPU 0のボトルネックを避けられるため、ほぼ線形にスケーリングできます。
DataParallelでも問題ない場合
DataParallelは、2台のGPUを搭載した単一マシンでの簡単な実験には適しています。この場合は、1行で使える簡便さが非効率性を上回ることがあります。複数ノードでの学習や多数のGPUを使う場合は、代わりにDDPを使用してください。
よくある落とし穴:保存
ラップされたモデルのstate dictにはmodule.というプレフィックスが付きます。クリーンなチェックポイントを保存するにはmodel.module.state_dict()を保存してください。後でラップされていないモデルに正しく読み込めるようになります。
torch.save(model.module.state_dict(), "model.pt")確認テスト
DataParallelの理解度を確認しましょう。
まとめ
DataParallelを使ったマルチGPU学習について学びました。
nn.DataParallel(model, device_ids=[0, 1])はモデルを複製し、バッチを分割します- 各ステップでGPU間の勾配が平均化されます
- GPU 0の負荷偏りと単一プロセス設計により、スケーリングが制限されます
- 多数のGPUや複数ノードでの学習にはDDPを優先してください
よくある質問
「DataParallelによるマルチGPU学習」レッスンは無料ですか?
はい。「DataParallelによるマルチGPU学習」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「DataParallelによるマルチGPU学習」で何を学びますか?
nn.DataParallel、GPUメモリの均衡化、帯域幅のボトルネック、DDPが適している場面について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「DataParallelによるマルチGPU学習」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DataParallelによるマルチGPU学習
- DistributedDataParallel(DDP)
- AMPによる混合精度学習
- Hugging Face Accelerateによる効率的な学習