GPU
GPU選定で見るべき指標は「メモリ容量」「メモリ帯域」「演算性能」の3つで、それぞれ効く先が違います。容量はモデルが載るかを決め、帯域は生成速度を決め、演算性能はTTFTを決めます。大容量でも帯域が低いGPUは、大きなモデルが載るだけで速くはありません。
30秒で分かる
- GPUを見るときは 容量(GB)・帯域(GB/s)・演算性能(FLOPS) の3つを別々に見ます
- 容量が足りなければ、そもそもモデルが載りません(OOM)
- 帯域が生成速度(tok/s)の上限を決めます。デコードはメモリ読み出しが律速だからです
- 演算性能がTTFT(初回応答)を決めます。プリフィルは計算量が律速だからです
- 「大容量=高性能」ではありません。容量が大きくても帯域が低いGPUは存在します
仕組み
3つの指標が、それぞれ別のものを決める
GPU
│
┌──────────┼──────────┐
↓ ↓ ↓
容量 帯域 演算性能
(GB) (GB/s) (FLOPS)
│ │ │
↓ ↓ ↓
載るか? tok/s TTFT
この対応関係が、GPU選定の骨格です。要件のうちどれが厳しいかによって、優先すべき指標が変わります。
なぜデコードは帯域律速なのか
1トークンを生成するたびに、モデルの重みをメモリから演算器へ読み出す必要があります。ところが1トークン分の計算量はごくわずかです。
1トークンの生成
重みを読む:数十GB ← 時間がかかる
計算する :わずか ← すぐ終わる
→ 演算器は、データ待ちで遊んでいる(memory-bound)
そのため、単一リクエストのデコード速度はおおよそ次式で上限が決まります。
デコード速度の理論上限(tok/s) = メモリ帯域 ÷ 1トークンで読む重みのバイト数
たとえば重み30GB・帯域273GB/sなら、理論上限は約9 tok/sです。実装をどれだけ改善しても、この値を超えることはありません。
バッチ処理が効く理由
複数リクエストをまとめて処理すると、1回の重み読み出しで複数トークンを生成できます。読み出しコストが分散されるため、合計スループット(aggregate tok/s)は大きく伸びます。
ただし1ユーザーあたりの体感速度は速くなりません。バッチはスループットを改善する技術であり、レイテンシを改善する技術ではありません。この区別はLevel 3の推論サーバー選定で重要になります。
なぜプリフィルは演算律速なのか
入力トークンはまとめて処理できるため、重みを1回読み出す間に大量の計算を行えます。計算量はおおよそ次のとおりです。
プリフィルの計算量 ≒ 2 × パラメータ数 × 入力トークン数
例:30B・4,000トークン入力
= 2 × 30 × 10^9 × 4,000
≈ 2.4 × 10^14 FLOPs
これを実効FLOPSで割った値が、TTFTの下限です。帯域を増やしてもTTFTは縮まりません。
メモリの種類
| 種類 | 特徴 | 向いている用途 |
|---|---|---|
| HBM | 容量は控えめだが帯域が極めて高い | 本番の高スループット推論 |
| Unified Memory | 大容量を確保しやすいが帯域は低め | 大きなモデルの検証、開発機 |
| GDDR(コンシューマ) | 中程度。容量が小さい | 小規模モデルの検証 |
容量と帯域を混同しない
「121GBあるから70Bモデルが載る」は正しくても、「だから実用的な速度で動く」は導けません。帯域が273GB/s程度であれば、70B FP8(70GB)の理論デコード速度は4 tok/s以下です。
大容量・低帯域の機体は、載せて動作を確認する用途には最適ですが、本番のスループットを出す用途には向きません。PoC機と本番機を分けて考える理由がここにあります(Level 9)。
複数GPUと通信
1台に載らない場合、モデルを分割して複数GPUで動かします。分割方式によって通信量が変わり、GPU間の接続帯域(NVLinkかPCIeか)が性能を左右します。
| 方式 | 分け方 | 通信の重さ |
|---|---|---|
| Tensor Parallel | 1レイヤを複数GPUで分担 | 重い(毎レイヤ同期) |
| Pipeline Parallel | レイヤ群をGPUごとに分担 | 軽いが待ちが生じる |
| データ並列(レプリカ) | モデル全体を各GPUに複製 | なし |
モデルが1台に載るなら、レプリカを並べるのが最も単純で速いというのが基本方針です。分割は「載らないから仕方なく行う」ものです。
設計に効く数字と落とし穴
見積もりに使う式
必要メモリ = 重み + KV Cache + 上乗せ(10〜20%)
デコード上限 = メモリ帯域 ÷ 1トークンで読む重み
TTFT下限 = (2 × パラメータ数 × 入力トークン数) ÷ 実効FLOPS
必要な重み量 = メモリ帯域 ÷ 目標tok/s ← 逆算で使う
最後の逆算式が実務では効きます。「この帯域でこの速度を出すには、重みを何GBまで減らす必要があるか」が即座に分かるためです。
落とし穴
- 公称FLOPSは条件付き:疎行列前提や特定精度での値が併記されることがあります。BF16/FP8のどの値かを必ず確認します
- 実効値は公称値を下回る:帯域もFLOPSも、実測では公称の6〜8割程度になることが珍しくありません。理論値は上限であり、達成値ではありません
- メモリは100%使えない:ランタイム、断片化、CUDAコンテキストで1〜2割は消えます
- 消費電力と設置環境:本番でGPUを複数台並べる場合、電源容量と冷却が先に限界へ達することがあります
- 調達リードタイム:性能要件を満たすGPUが、必要な時期に入手できるとは限りません。サイジングと同時に確認すべき項目です