🎓 レベル:標準 | 重要度:B(推奨)
📎 前提:レイテンシとスループットのトレードオフ | 関連:クラウド・インフラ/SRE・DevOps 全体目次(クラウド)
要点(BLUF)
- 推論を「速く・安く」回すには、ハードウェア選択(CPU/GPU)とスケーリング(垂直/水平/オート)を要件で決めます。
- CPU vs GPU:GPU は大きなバッチの並列演算で真価を発揮します。小バッチ・低トラフィックでは GPU は遊んで割高になり、CPU の方が安いことも多い。「バッチ並列が活きるか」で選びます(レイテンシとスループットのトレードオフ)。
- スケール:1台を強くする垂直より、台数を増やす水平+負荷追従のオートスケールが基本。ただしコールドスタート(起動の遅さ)とスケール遅延を見込んで設計します。汎用のオートスケール・k8s 基盤はクラウド分野へ wikilink します。
1. CPU と GPU の使い分け
| 観点 | CPU | GPU |
|---|---|---|
| 得意 | 小バッチ・分岐の多い処理・低トラフィック | 大バッチの行列演算・深層モデル |
| コスト | 安い(遊んでも痛くない) | 高い(遊ばせると割高) |
| 向くモデル | 勾配ブースティング・線形・小NN | 大規模NN・LLM(LLMの推論サービングと最適化基盤) |
GPU は「まとめて大量に計算する」ほど元が取れます。小さなバッチをぽつぽつ処理するだけなら、高価な GPU は稼働率が低く割高になります。バッチング(レイテンシとスループットのトレードオフ)で GPU を埋められるかが分岐点です。
2. 垂直・水平・オートスケール
flowchart TB V["垂直スケール:1台を強く(CPU増/GPU化)"] --> L1["上限あり・単一障害点"] H["水平スケール:台数を増やす"] --> L2["上限が高い・冗長性あり"] A["オートスケール:負荷に応じて台数を増減"] --> L3["コスト最適・ただしスケール遅延"]
- 垂直:1台のスペックを上げる。手軽だが上限があり、1台が落ちると全滅。
- 水平:同じサービングを複数台並べてロードバランス。冗長性が生まれ上限が高い(オンライン推論サービングはステートレスなので水平に向く)。
- オートスケール:負荷(QPS・CPU使用率・キュー長)に応じて台数を自動増減。アイドル時のコストを抑える。
3. 動く最小例:負荷から必要インスタンス数を見積もる
「ピーク QPS を、目標稼働率を超えない範囲で捌くには何台要るか」を見積もる最小キャパシティ計算です。
import math
def required_instances(peak_qps, per_instance_qps, target_utilization=0.7,
min_instances=2):
"""ピーク負荷を target_utilization 以下で捌くのに必要な台数。
余裕(ヘッドルーム)と最小冗長台数を考慮する。"""
raw = peak_qps / (per_instance_qps * target_utilization)
n = max(min_instances, math.ceil(raw))
actual_util = peak_qps / (n * per_instance_qps)
return n, actual_util
# 1台が安全に捌けるのは 200 QPS、ピークは 1500 QPS
for peak in [300, 1500, 5000]:
n, util = required_instances(peak, per_instance_qps=200)
print(f"ピーク {peak:>4} QPS -> 必要 {n:>2} 台 "
f"(稼働率 {util*100:.0f}%・目標70%以下)")
出力:
ピーク 300 QPS -> 必要 3 台 (稼働率 50%・目標70%以下)
ピーク 1500 QPS -> 必要 11 台 (稼働率 68%・目標70%以下)
ピーク 5000 QPS -> 必要 36 台 (稼働率 69%・目標70%以下)
出力の意味:1台が安全に 200 QPS 捌けるとき、ピーク 1500 QPS には 11 台必要です(稼働率68%で目標70%以下に収まる)。ポイントは稼働率に余裕(ヘッドルーム)を持たせること——100%稼働で設計すると、わずかな急増やスケール遅延で破綻します。目標稼働率70%は「急増・コールドスタートの吸収代」です。オートスケールはこの台数を負荷に応じて自動調整しますが、**コールドスタート(新インスタンスが温まる時間)**を見込むため、しきい値は余裕を持って早めに発火させます。
4. 運用の勘所
- 稼働率にヘッドルームを残す:100%設計は破綻のもと。目標70%程度にし、急増・スケール遅延を吸収する。
- コールドスタートを見込む:新インスタンスはモデルロードや JIT で温まりに時間がかかる。スケールしきい値を早めに、最小台数を確保する。
- オートスケールの指標を選ぶ:CPU 使用率より、キュー長・p99 レイテンシなど「ユーザー体験に直結する指標」で発火させる方が良いことが多い。
- GPU は稼働率で正当化する:バッチングで埋められないなら CPU の方が安い。GPU の高コストは高稼働で初めて報われる。
- 汎用のスケール基盤はクラウドへ:k8s の HPA・ノードオートスケーラ・スポット活用などはクラウド・インフラ/SRE・DevOps 全体目次の領域。
なぜそうするのか
スケーリングを「水平+オートスケール+ヘッドルーム」で設計するのは、負荷は変動し、ハードは即座には増えないからです。垂直スケールは上限と単一障害点を抱え、急増に弱い。水平+オートスケールなら冗長性とコスト最適性を両立できますが、新インスタンスが温まるまでの遅延(コールドスタート)があるため、100%稼働を狙うと急増を吸収できません。だから稼働率に余裕を残し、しきい値を早めに発火させる——「変動とスケール遅延に耐える設計」がキャパシティ計画の本質です。
⚠️ よくある落とし穴
- 100%稼働で設計する:わずかな急増やスケール遅延で即破綻。ヘッドルームを残す。
- コールドスタートを無視する:スケールアウトが間に合わず、急増時にエラー・遅延が出る。最小台数と早めの発火で備える。
- GPU を稼働率を見ずに使う:埋まらない GPU は割高。バッチングで稼働率を上げられるか確認する。
- CPU 使用率だけでオートスケールする:ユーザー体験(p99・キュー長)と乖離することがある。体験指標で発火させる。
対応 lab
- なし(概念ノート)。キャパシティ計算は本文 §3 に同梱。水平スケール対象のステートレスサービングは オンライン推論サービング の lab。
関連ノート
- レイテンシとスループットのトレードオフ(GPU を埋めるバッチング)
- オンライン推論サービング(水平スケールに向くステートレス設計)
- モデル軽量化(量子化・蒸留・枝刈り)(計算量そのものを減らす)
- 本番モデルの監視(稼働率・遅延の監視)
- クラウド・インフラ/SRE・DevOps 全体目次(汎用オートスケール基盤)
- 第5章 推論の最適化 目次
- MLOps・AI基盤 全体目次