メインコンテンツへスキップ
友田 陽大
量子化LLM・セルフホスト
生成AI
LLM
vLLM
セルフホスト
コスト最適化
型安全

量子化のサービング経済学:AWQ vs FP8、KVキャッシュとVRAM予算で本番コストは決まる

LLMの量子化(AWQ / GPTQ / FP8 / GGUF)の選定は『精度』だけで語られがちですが、本番サービングのコストは『単一GPUのVRAM予算を、モデルの重みとKVキャッシュにどう配分するか』で決まります。量子化が重みを縮め、その分を同時実行・長文脈に回せる——この本質を、VRAM予算の試算コードと、T4 GPUで量子化モデルを本番運用した経験から、サービング経済学として解説します。

公開日
読了時間
10分
著者
友田 陽大
シェア

最初に結論を述べます。LLMの量子化(AWQ / GPTQ / FP8 / GGUF)の本番選定は、「どれが一番精度が落ちないか」ではなく、「単一GPUのVRAM予算を、モデルの重みとKVキャッシュにどう配分するか」というサービング経済学で決まります。 量子化の本質は、重み(weights)を圧縮して空いたVRAMをKVキャッシュ——すなわち同時実行数と文脈長——に回せることにあります。これが、1枚のGPUで捌けるリクエスト数、ひいてはトークンあたりの原価を直接左右します。精度の議論だけで量子化方式を選ぶと、本番のコスト効率を見誤ります。

本記事は、私がQwen3-8B-AWQ を Tesla T4 GPU 上の vLLM で本番運用した経験をもとに、量子化を「サービング経済学」として捉え直し、VRAM予算の試算コードとともに解説します。量子化方式そのものの精度比較はQwen3の量子化比較(AWQ/GPTQ/FP8/GGUF)を、API vs 自前の損益分岐は生成AIのコストと損益分岐を参照してください。


1. GPUのVRAMは「重み」と「KVキャッシュ」で奪い合う

LLMをGPUで動かすとき、VRAM(GPUメモリ)は主に2つに使われます。

VRAMの用途内容大きさの決まり方
モデルの重み(weights)モデルのパラメータそのものパラメータ数 × ビット数
KVキャッシュ生成中の文脈を保持する作業領域文脈長 × 同時実行数 × モデル構成

この2つは、限られたVRAMを奪い合います。重みが大きければ、KVキャッシュに使える残りが減り、同時に捌けるリクエスト数や扱える文脈長が小さくなる。逆に、量子化で重みを縮めれば、その分をKVキャッシュに回せて、同時実行数を増やせる=スループットが上がる=トークン単価が下がる

ここが「サービング経済学」の核心です。量子化は単なる「省メモリ技術」ではなく、GPUという固定費を、どれだけ多くのトークン処理に変換できるかを決めるレバーなのです。


2. VRAM予算を試算する

この奪い合いを、数字で見える化します。前提を明示した純粋関数で、VRAM予算を「重み」と「KVキャッシュ」に分解します。

/**
 * 単一GPUのVRAM予算を「重み」と「KVキャッシュ」に分け、
 * 量子化が同時実行・文脈長にどれだけ余地を生むかを試算する純粋関数。
 * 前提(ビット数・KV単価・オーバーヘッド)はすべて引数で受け取る(再現可能・テスト容易)。
 */
interface VramBudgetInputs {
  readonly paramsBillions: number;        // パラメータ数(B)
  readonly weightBitsPerParam: number;    // 量子化ビット数(AWQ=4, FP8=8, FP16=16)
  readonly gpuVramGiB: number;            // GPU搭載VRAM(例: T4=16, L4=24, H100=80)
  readonly kvBytesPerToken: number;       // 1トークンあたりKVキャッシュのバイト数(モデル構成依存)
  readonly runtimeOverheadGiB: number;    // ランタイム・アクティベーションの固定オーバーヘッド
}

interface VramBudget {
  readonly weightGiB: number;
  readonly kvBudgetGiB: number;           // KVキャッシュに使える残り
  readonly maxKvTokens: number;           // 収容できる総トークン(≒ 文脈長 × 同時実行数)
  readonly fits: boolean;                 // そもそも重みが載るか
}

const BYTES_PER_GIB = 1024 ** 3;

export function estimateVramBudget(input: VramBudgetInputs): VramBudget {
  const weightBytes = input.paramsBillions * 1e9 * (input.weightBitsPerParam / 8);
  const weightGiB = weightBytes / BYTES_PER_GIB;

  const kvBudgetGiB = input.gpuVramGiB - weightGiB - input.runtimeOverheadGiB;
  const maxKvTokens =
    kvBudgetGiB > 0 ? Math.floor((kvBudgetGiB * BYTES_PER_GIB) / input.kvBytesPerToken) : 0;

  return {
    weightGiB,
    kvBudgetGiB: Math.max(0, kvBudgetGiB),
    maxKvTokens,
    fits: kvBudgetGiB > 0,
  };
}

この試算が示すのは、たとえば8BのモデルをFP16(16bit)で載せると重みだけで約16GiBを占め、16GBクラスのGPU(T4)には実質載らない——という現実です。ところがAWQ(4bit)にすれば重みは約1/4に縮み、同じGPUにモデルが載るうえ、KVキャッシュにも余地が生まれます。私がT4でQwenをAWQ(4bit量子化)で動かしたのは、まさにこの「16GBのGPUに、思考できる規模のモデルを載せて、固定費で回す」ためでした(T4はFP8非対応のため、注意機構のバックエンドにも配慮が要ります)。

注意: 上の試算は重みとKVキャッシュの第一次近似です。実際にはアクティベーション・予約メモリ・KVキャッシュ量子化の有無で変動します。kvBytesPerToken はモデルの層数・隠れ次元・注意ヘッド構成(GQA等)で大きく変わるため、必ず対象モデルの実測値で較正してください。


3. AWQ vs FP8 vs GGUF:サービングの観点で選ぶ

量子化方式を「精度」ではなく「サービング経済学」の観点で並べると、こう整理できます。

方式重みの圧縮計算スループットハード要件向くサービング
AWQ(4bit weight-only)大(約1/4 vs FP16)デコードのメモリ帯域削減に効く旧世代GPU(T4等)でも可VRAMが厳しい・旧GPU・大きいモデルを1枚に載せたい
GPTQ(4bit weight-only)AWQと同系統旧世代GPUでも可AWQと同様(較正手法が異なる)
FP8(8bit)中(約1/2 vs FP16)高い(ネイティブFP8演算)Hopper/Ada世代以降が必要新世代GPUで精度を保ちつつ高スループット
GGUF(llama.cpp系)可変(多ビット幅)vLLM比で低めになりがちCPU+GPUオフロードに強いローカル・エッジ・GPUなし/小VRAM

実務的な指針はこうです。

  • VRAMが厳しい/旧世代GPU(T4等)/大きいモデルを1枚に載せたいAWQ(または GPTQ)。4bitで重みを大きく縮め、KVキャッシュの余地を最大化する。
  • 新世代GPU(L4 / L40S / H100 等)で、精度劣化を抑えつつ高スループットFP8。ネイティブ演算が速く、精度の落ち方も緩やか。ただし重みの圧縮はAWQほどではないので、VRAMがギリギリの構成には不利なこともある。
  • GPUを持たない/エッジ/個人利用GGUF(llama.cpp)。CPUとGPUにまたがってオフロードでき、柔軟。ただしサーバ用途の最大スループットでは vLLM + AWQ/FP8 に劣りがち。

「どのGPU世代を使うか」で、最適な量子化方式は変わります。 FP8非対応のT4でFP8を選んでも意味がなく、H100でわざわざ4bit weight-onlyにすると、せっかくの計算性能を活かしきれないこともあります。


4. デコードは「メモリ帯域律速」——だから量子化が速度に効く

量子化が「省メモリ」だけでなく「高速化」にも効く理由を、最後に押さえます。LLMの推論は、

  • プレフィル(入力の処理)——計算律速になりやすい。
  • デコード(1トークンずつ生成)——メモリ帯域律速になりやすい。

デコードでは、トークンを1つ生成するたびにモデルの重みをVRAMから読み出します。つまり**「重みのバイト数」がデコード速度のボトルネック**になりがちです。量子化で重みのバイト数を減らせば、読み出すデータ量が減り、デコードが速くなる。これが、量子化が「メモリ節約」と「スループット向上」を同時にもたらすメカニズムです。

サービングのトークン単価は、おおまかに GPUの時間あたりコスト ÷ スループット(トークン/秒) で決まります。量子化は、(1) 重みを縮めてKVキャッシュ=同時実行を増やし、(2) デコードのメモリ帯域を削って1リクエストを速くする——この両面でスループットを押し上げ、トークン単価を下げます。「精度が少し落ちるが、コストが大きく下がる」というトレードオフを、ワークロードの精度許容度に照らして選ぶのが、サービング経済学の判断です。


よくある質問(FAQ)

Q. 量子化方式は、何を基準に選べばいいですか?

「精度」だけでなく「サービング経済学」で選びます。具体的には、GPU世代 × ワークロード(同時実行数・文脈長)× 精度許容度の3軸です。VRAMが厳しい・旧世代GPU(T4等)ならAWQ(4bit)、新世代GPU(H100等)で精度を保ちたいならFP8、GPUなし・エッジならGGUF、が基本線です。量子化は重みを縮めてKVキャッシュ(同時実行・文脈長)に余地を生み、トークン単価を下げるレバーです。

Q. AWQとFP8は、どちらが良いですか?

ハードウェアとワークロード次第です。AWQ(4bit weight-only)は重みの圧縮が大きく、FP8非対応の旧GPU(T4等)でも大きいモデルを1枚に載せられます。FP8は精度劣化が小さく計算スループットが高い一方、ネイティブ対応はHopper/Ada世代以降で、重みの圧縮はAWQほどではありません。VRAMが厳しいならAWQ、新世代GPUで精度重視ならFP8、が目安です。

Q. KVキャッシュとは何ですか?なぜ重要ですか?

KVキャッシュは、生成中の文脈を保持する作業領域で、文脈長 × 同時実行数に比例してVRAMを消費します。モデルの重みとVRAMを奪い合うため、重みが大きいとKVキャッシュに使える残りが減り、同時に捌けるリクエスト数や扱える文脈長が小さくなります。量子化で重みを縮めれば、その分をKVキャッシュに回せて同時実行数を増やせる——これがスループットとコストを左右します。

Q. なぜ量子化すると推論が速くなるのですか?

LLMのデコード(1トークンずつ生成する処理)は、トークンごとに重みをVRAMから読み出すため、メモリ帯域律速になりがちです。量子化で重みのバイト数を減らせば、読み出すデータ量が減り、デコードが速くなります。つまり量子化は「省メモリ」と「高速化」を同時にもたらします。サービングのトークン単価はGPU時間 ÷ スループットで決まるため、これが直接コストに効きます。

Q. 16GBのGPU(T4)で、8BのLLMは動きますか?

FP16(16bit)では重みだけで約16GiBを占め、実質的に載りません。しかしAWQ(4bit)にすれば重みは約1/4に縮み、モデルが載るうえKVキャッシュにも余地が生まれます。実際にQwen3-8B-AWQをT4で本番運用した実績があります。ただしT4はFP8非対応のため、注意機構のバックエンドなど構成面の配慮が必要です。


まとめ:量子化はVRAM予算の配分問題

LLMの量子化を本番サービングで正しく選ぶために、押さえるべきは次の通りです。

  1. 本番選定は「精度」ではなく「サービング経済学」——VRAM予算を重みとKVキャッシュにどう配分するか。
  2. 量子化は重みを縮め、KVキャッシュ(同時実行・文脈長)に余地を生む——これがトークン単価を左右する。
  3. AWQ(4bit)はVRAM削減が大きく、旧世代GPU(T4等)でも大きいモデルを載せられる
  4. FP8は精度劣化が小さく高スループットだが、Hopper/Ada世代以降が必要
  5. デコードはメモリ帯域律速——量子化が省メモリと高速化を同時にもたらす。

「自前GPUでLLMを動かしたいが、どのGPUに・どの量子化で載せれば採算が合うか」——その見極めは、VRAM予算とワークロードの分析で解けます。量子化方式の選定からvLLMでの本番サービング、コスト最適化まで、本番運用品質でお引き受けします。

友田

友田 陽大

経済産業大臣賞 受賞プロダクト開発者。TypeScript + Python + AWS で、SaaS・業界DX・ 実用レベルの生成AI(RAG)を、要件定義からインフラ・運用まで一人で完遂します。

この記事で解説した技術の適用事例

AI動画ローカライズ基盤(Qwen3-8B-AWQをT4 GPUで本番運用)

ケーススタディを見る