HyperAIHyperAI

Command Palette

Search for a command to run...

複数GPUでのAI計算:ホストとデバイスの仕組みを理解する

AIを複数のGPUで実行する際の「ホストとデバイス」の仕組みを理解するための概要です。この記事は、CPU(ホスト)とGPU(デバイス)がどのように協働するかを高レベルで解説しており、特にAI開発で広く使われるNVIDIA GPUに焦点を当てています。Apple Siliconのような統合GPUは対象外です。 プログラムは常にCPU上で開始され、GPUに処理を任せたい場合、CPUは命令とデータをGPUに送信します。このやり取りは「CUDAストリーム」と呼ばれるキューを通じて行われます。CPUは処理の完了を待たずに次の命令を実行できるため、非同期実行が可能になり、性能向上につながります。たとえば、GPUがデータ処理中の間にCPUは次のデータを準備できます。 CUDAストリームは、GPUで実行される操作の順序を管理するキューです。同じストリーム内では処理が順番に実行されますが、異なるストリーム間では並列実行が可能です。これにより、計算とデータ転送を重ねて行うパイプライン処理が実現できます。たとえば、GPUがバッチ0を処理している間に、CPUはバッチ1のデータをGPUに転送できます。PyTorchではtorch.cuda.Stream()を使ってストリームを明示的に管理でき、non_blocking=Trueを指定することでCPUがブロックされずに転送を非同期で実行できます。 ストリーム間の依存関係を管理するには、torch.cuda.synchronize()やCUDAイベントを使います。イベントを使うと、特定の処理が終わるまで待つ必要があり、CPUは他の処理を続けられるため、より効率的です。 PyTorchのテンソルは、メタデータ(形状や型)と実際のデータに分かれます。メタデータはCPUのRAMに、実データはGPUのVRAMに保存されます。print(t.shape)はメタデータなので即時出力可能ですが、print(t)はGPUのデータをCPUに読み込む必要があり、ホスト-デバイス同期が発生します。これは性能の大きなボトルネックになるため、可能な限り避けるべきです。 また、torch.randn(100, 100, device='cuda')のようにGPU上でテンソルを作成する方法が、CPUで作ってから転送するよりも効率的です。 大規模なモデル(例:大規模言語モデル)を学習するには複数GPUが必要になります。この際、「ランク(Rank)」という概念が登場します。複数のGPUを持つマシンでは、1つのマシン上で複数のPythonプロセス(ランク)を起動し、それぞれが異なるGPU(例:cuda:0, cuda:1)を担当します。各ランクは同じコードを実行しますが、ランクIDを使ってデータの分割処理などに利用できます。 この仕組みを理解することで、AIモデルの分散学習や性能チューニングの基礎が築けます。次回は、点対点通信や集約操作といった、複数GPU間の協調処理の仕組みについて解説します。

関連リンク