基礎●●○○○

GPU

GPU ・ じーぴーゆー

大量の単純計算を並列実行するプロセッサ。描画専用から機械学習の主役へと役割を広げた。

✦ 30秒で試す — 航海ゲームの画面を描くための部品が、AIの計算の主役になった先に終わるのはどっち?予想してみる

概要

GPU(Graphics Processing Unit)は、大量の単純な計算を同時に実行することに特化したプロセッサです。もともとは3Dゲームの画面描画のために生まれましたが、「同じ計算を膨大なデータに一斉に適用する」という得意技が機械学習の計算とぴったり重なったことで、いまやAI時代の計算基盤の主役になりました。

CPUが「少数の賢いコアで複雑な処理を順にこなす」プロセッサだとすれば、GPUは「数千個の単純なコアで同じ処理を一斉にこなす」プロセッサです。汎用の何でも屋であるCPUに対し、GPUは特定の形の仕事だけを圧倒的な物量で片付ける専門家であり、両者は置き換えではなく分業の関係にあります。

なぜ生まれたか

3Dグラフィックスの描画は、画面上の何百万ものピクセルそれぞれについて「この点は何色か」を計算する仕事です。ピクセル同士の計算はほぼ独立していて、順番に処理する必要がありません。1990年代、ゲームの3D化が進むとCPUだけでは描画が追いつかなくなり、この「独立した同種の計算を大量に」という性質に特化した専用チップとしてGPUが登場しました。少数の高性能コアを磨くのではなく、単純なコアを可能な限り敷き詰めるという、CPUとは正反対の設計思想です。

転機は2006〜2007年頃、NVIDIAがCUDAという開発環境を公開し、GPUを描画以外の汎用計算に使う道(GPGPU)を開いたことです。そして2012年、画像認識コンテスト(ILSVRC)でGPUで学習させたニューラルネットワーク(AlexNet)が圧勝すると、深層学習の計算 — 実体はほぼ行列の掛け算 — がGPUの得意技そのものだったことが決定的になりました。ゲーム用の周辺機器だったGPUは、こうしてデータセンターの争奪戦の的へと変わったのです。

詳細

CPUとGPU — 設計思想の対比

CPUのコアは、分岐予測や大きなCPUキャッシュ、命令の追い越し実行など「一つの流れをできるだけ速く進める」ための仕掛けにシリコンの多くを割いています。OSのスケジューラやアプリのロジックのように、分岐が多く前の結果に次が依存する処理はCPUの領分です。対してGPUは、それらの仕掛けを小さくしてでも演算ユニットを数千個並べ、同じ命令を大量のデータに一斉に適用します。CPUのスレッドが数個〜数十個の世界なのに対し、GPUは数万のスレッドを同時に抱えることを前提に設計されています。並行と並列の言葉でいえば、GPUは「並列」を極端まで押し進めた機械です。

CPU — 少数の賢いコア制御・分岐予測・追い越し実行コアコアコアコア大きなキャッシュ(L2・L3)GPU — 小さなコアを敷き詰めるSMSMSMSM小さめのキャッシュ(L2)主記憶(DRAM)VRAM(HBM・GDDR)PCIe で転送行きと帰りが必要分岐が多く、前の結果に次が依存する処理(逐次処理・制御)が得意同じ計算を大量のデータへ一斉に適用(行列演算・描画)が得意。実際のコアは数千個
CPUとGPUの設計思想 — CPUは制御とキャッシュに面積を割いた少数のコア、GPUは小さなコアを敷き詰めたSMの集まり。両者のメモリはPCIeでつながり、データはそこを行き来する

GPUのコアは、SM(Streaming Multiprocessor)と呼ばれる単位にまとめられています。NVIDIA の実行モデルでは、プログラマは「1スレッドが1ピクセル(1要素)を担当する」カーネル(GPUで動く関数)を書き、スレッドをブロック(たとえば 8×8 = 64 本)に、ブロックをグリッドにまとめて起動します。各スレッドは自分の番号(blockIdx と threadIdx)から担当する要素を計算します。ハードウェアはブロックを空いたSMに配り、SMの中では32本のスレッドを「ワープ」という組にして、同じ命令を32本で同時に実行します。この方式を SIMT(Single Instruction, Multiple Threads)と呼びます。

SIMT には弱点があります。ワープの中で if の結果がスレッドごとに分かれると(divergence)、ハードウェアは両方の道を順番に実行し、自分の道でない側のスレッドはその間なにもせずに待ちます。分岐が多いほど、並べたコアが遊ぶのです。

CPUとの協調と転送の壁

実際のプログラムでは両者が協調します。CPU上のプロセスがデータを準備してGPUのメモリ(VRAM)へ転送し、カーネルを起動し、結果を回収する — GPUはあくまでCPUから仕事を委託される「アクセラレータ(加速装置)」です。CPUとGPUのメモリは PCIe というバスでつながっていますが、その帯域はGPUの内部のメモリ帯域より1桁以上細く、「計算は速いのに転送で台無し」はGPUプログラミングの典型的な落とし穴です。小さな仕事を何度もGPUに投げると転送と起動の固定費ばかりがかさむため、データはできるだけGPU側に置いたまま、まとめて計算させるのが定石です。

下の部品では、同じ画像処理を CPU の大きなコア4つと GPU の小さなスレッド256本で競争させます。画像の大きさと仕事の形を変えて、GPU が勝つ場面と負ける場面を確かめてください。GPU の画像のマスを指すと、そのピクセルを担当するスレッドの番号も分かります。

⚡ 体験: 同じ画像処理を CPU と GPU で競争させる
仕事
CPU — 大きなコア4つGPU — 小さなスレッド256本が同時にGPU のマスを指すと…金の枠 = 1ブロック(8×8 = 64スレッド)CPU のコア: 1マスに 1GPU のスレッド: 1マスに 3(遅い)そのかわり 256 本が同時に走る時間の帯(同じ目盛り)CPU コア転送 CPU→GPUGPU 計算転送 GPU→CPU050100時間(目盛り)
CPU のコアが計算GPU の計算(高さ = 動いているスレッドの割合)転送(PCIe)
画像24×24CPU…GPU…GPU のうち転送17

左の CPU(コア4つ)と右の GPU(256本のスレッドが同時に走る)が、同じ画像を処理します。GPU の画像の右下の角をつかんで大きさを変えてみてください。離すと競争が始まります。

機械学習の主役になった理由

深層学習(ニューラルネットワークを何層も重ねる手法)の学習も推論も、計算の中身はほぼ行列の掛け算です。行列積は「独立した掛け算と足し算の膨大な集まり」であり、GPUの並列実行モデルにこれ以上ないほど適合します。CPUで数週間かかる学習がGPUでは数日に縮む — この速度差は単なる快適さの問題ではなく、「試せる実験の回数」の差となってモデルの品質を直接左右します。

近年のGPUは行列演算専用の回路(NVIDIAのTensor Coreなど)を積み、しかもそれは 32ビットの浮動小数点ではなく、16ビットの fp16・bf16、さらに8ビット以下の低精度な数値で最も速く動くように作られています。深層学習は多少の丸め誤差に強いため、精度を落として速さとメモリを稼ぐ混合精度の学習や、推論時にモデルの数値を小さな型に詰める量子化が当たり前になりました。同様の発想の専用チップ(GoogleのTPUなど)も登場していますが、CUDAを中心としたソフトウェア資産の厚みがNVIDIA製GPUの優位を支えています。

学習だけでなく推論でもGPUは重要です。LLMのような巨大モデルは、応答一回の計算量が膨大なうえ、モデル自体がGPUメモリ(VRAM)に収まるかどうかが動かせるか否かの分かれ目になります。LLM の推論はしばしば計算よりもメモリの読み出し速度で頭打ちになるため、データセンター向けGPUは HBM という帯域の広いメモリを積んでいます。「このモデルはVRAM何GBで動くか」は、LLM時代のインフラ選定の最初の質問です。

実務事情 — クラウドGPUとコスト

GPUサーバは高価で、最新のデータセンター向けGPUは1枚数百万円、電力と冷却の要求も桁違いです。そのため実務ではクラウドのGPUインスタンスを時間借りするのが基本形になっています。ただしGPUインスタンスは通常の仮想マシンの数倍〜数十倍の単価で、しかも需要過熱で「借りたくても空きがない」ことさえ珍しくありません。学習ジョブは中断可能な安価枠(スポットインスタンス)で回す、推論は使った分だけ課金されるサーバレス型のGPUサービスに寄せる、複数ジョブでGPUを分け合うために Kubernetes で割り当てを管理する、といったコストの工夫が定番です。

もう一つの実務知識は「GPUを使えば何でも速くなるわけではない」ことです。恩恵があるのは、分岐が少なく同種の計算が大量にある処理 — 機械学習、画像・動画処理、物理シミュレーションなどの科学技術計算 — に限られます(かつて代表例だった暗号資産のマイニングは、専用チップ ASIC への移行や、計算競争をやめた Proof of Stake への移行で、いまはGPUの主な用途ではありません)。Webアプリのビジネスロジックのような分岐だらけの処理や、前の結果に次が依存する処理はCPUのほうが速く、GPUに載せても遊ばせるだけです。「仕事の形がGPU向きか」を見極めることが、GPUという道具を使いこなす出発点になります。

試問

同じ画像処理を、左の CPU(速いコア4つ)と右の GPU(遅めのスレッド256本が同時に走る)で競争させます。GPU は計算の前後に、画像をメモリ間で転送します。GPU の画像の右下の角をつかんで大きさ(4×4〜32×32)を変えると、離したときに競争が始まり、仕事の種類(明るさを変える・分岐が多い・累積=前のピクセルの結果を使う)も切り替えられます。

✦ 命題挑戦中

GPU が CPU に負ける競争を、「各ピクセルが独立な仕事」と「24×24 以上の大きな画像」の2通りで起こせ

  • 各ピクセルが独立な仕事(明るさ・分岐)で、CPU が勝つ
  • 画像が 24×24 以上の大きさで、CPU が勝つ
⚡ 体験: GPU が負ける競争を2通り起こす
仕事
CPU — 大きなコア4つGPU — 小さなスレッド256本が同時にGPU のマスを指すと…金の枠 = 1ブロック(8×8 = 64スレッド)CPU のコア: 1マスに 1GPU のスレッド: 1マスに 3(遅い)そのかわり 256 本が同時に走る時間の帯(同じ目盛り)CPU コア転送 CPU→GPUGPU 計算転送 GPU→CPU050100時間(目盛り)
CPU のコアが計算GPU の計算(高さ = 動いているスレッドの割合)転送(PCIe)
画像24×24CPU…GPU…GPU のうち転送17

左の CPU(コア4つ)と右の GPU(256本のスレッドが同時に走る)が、同じ画像を処理します。GPU の画像の右下の角をつかんで大きさを変えてみてください。離すと競争が始まります。