TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

量子化:重みを8ビットに減らすとデコードが速くなる理由とその代償

ステータス:ドラフト(2026-10-27)、FP8・GPTQ・AWQ実測、GGUF・bitsandbytes未実測。 8GBクラスのノートPC用GPU(Ada世代)1枚、vLLM 0.31.0、Qwen3-Reranker-0.6Bにより2026-10-27に測定しました。初回測定時は事前量子化されたチェックポイント(AWQ・GPTQ)を新たに取得する必要があったため測定せず、承認後の第3-1節で測定しました。KVキャッシュ8ビットの容量実測は「トスML/AI Infra準備」第14編にあります。 2026-10-27追加。 承認を得てvLLM 0.32.0イメージとQwen3-0.6B、Qwen3-0.6B-GPTQ-Int8、Qwen3-4B-AWQ(すべてApache-2.0、safetensors)を取得し、第3-1節を追加しました。前述の0.31.0の数値はそのまま残してあります。 執筆ルール:実測データを基本とし、測定できなかったものは「未実測」、確認できなかったものは「未確認」と表記します。

目次

1. なぜ速くなるのか

デコードでは、リクエストごとにトークンを1つ生成するために重み全体をGPUメモリから1回読み込みます。0.6Bモデルの場合、bf16ではステップごとに1.2GBが往復します。これに比べて計算量は少ないため、ステップ時間は概ね「重みのバイト数 ÷ メモリ帯域幅」によって決まります。重みを8ビットに減らすと読み込むバイト数が半分になり、ステップが短くなります。

ここから2つのことが導き出されます。

2. vLLMの量子化マップ

方式 削減対象 チェックポイント 原理(論文)
オンラインFP8(fp8_per_tensor, fp8_per_block) 重み・活性値8ビット bf16のまま、ロード時に変換 FP8フォーマット(Micikevicius他、2022):E4M3・E5M2
llm-compressor FP8 W8A8 重み・活性値8ビット 事前変換 同一フォーマット、校正データによるスケール決定
AWQ 重み4ビット 事前変換 活性値が大きいチャネルの重みを保護(Lin他、MLSys 2024)
GPTQ 重み3・4ビット 事前変換 2次情報により誤差を補正しながら列ごとに量子化(Frantar他、ICLR 2023)
Marlinカーネル GPTQ・AWQ・FP8・FP4の高速化 上記フォーマット 4ビット重みと16ビット活性値の積算カーネル
GGUF、bitsandbytes 重み 各フォーマット llama.cpp形式、読み込み時に量子化
KVキャッシュFP8(--kv-cache-dtype fp8) KV保存 無関係 同一メモリに2倍のトークン

公式ドキュメントのハードウェア表によると、FP8 W8A8はAda・Hopper以降でのみ動作し、AWQ・GPTQはTuring以降のほとんどで動作します。論文が報告している数値は条件がそれぞれ異なります。AWQは4ビット重みによりデスクトップ・モバイルGPUでHugging FaceのFP16実装よりも3倍以上速くなるとされ、GPTQは1,750億パラメータモデルを1枚のGPUに載せてA100でFP16と比較して約3.25倍、A6000で4.5倍を報告しています(いずれもアブストラクト基準)。

0.31.0のドキュメントでは、オンライン量子化の方法として fp8_per_tensor, fp8_per_block, mxfp8, mxfp4 を挙げています。MXFP8のW8A8はBlackwell(SM 100)以降でのみ動作し、その他のGPUでは重みのみが8ビットになるパスにフォールバックします。

3. 実際に測定してみる:オンラインFP8

方法

結果

項目 bf16 FP8(オンライン) 比
重みメモリ(ログ) 1.12GiB 0.71GiB 0.63
KV領域 40,208トークン 42,080トークン 1.05
スループット、同時1 174.2 tok/s 236.3 tok/s 1.36
トークン間隔中央値、同時1 5.6ms 4.1ms 0.73
スループット、同時16 1,683.1 tok/s 2,085.8 tok/s 1.24
スループット、同時64 2,899.3 tok/s 3,143.3 tok/s 1.08
貪欲出力がbf16と一致したリクエスト 基準 12個中6個
パープレキシティ(文章4編) 36.03 36.46(+1.2%)

3-1. 2026-10-27再測定:チャットモデル、および事前量子化されたチェックポイント

vLLM 0.32.0公式コンテナにおいて、チャット用Qwen3-0.6Bを基準にオンラインFP8とGPTQ 8ビット版を比較し、同じGPUに4BモデルをAWQ 4ビットでロードしてみました。負荷とパープレキシティの測定方法は前述と同様です。

モデル・方式 重みメモリ KV領域 スループット 同時1 同時16 同時64 パープレキシティ
Qwen3-0.6B bf16 1.12GiB 38,224トークン 174.1 1,678.0 2,898.7 30.29
Qwen3-0.6B オンラインFP8(fp8_per_tensor) 0.71GiB 42,080トークン 237.9(1.37倍) 2,094.5(1.25倍) 3,148.2(1.09倍) 29.88(-1.4%)
Qwen3-0.6B GPTQ 8ビット(Marlin) 0.74GiB 42,048トークン 244.3(1.40倍) 2,023.0(1.21倍) 2,996.5(1.03倍) 30.78(+1.6%)
Qwen3-4B AWQ 4ビット(Marlin) 2.5GiB 15,424トークン 80.0 651.9 736.4 21.02

スループットの単位はtok/sであり、括弧内はbf16比です。

4. KVキャッシュ8ビット

--kv-cache-dtype fp8 は重みではなくKVを8ビットで保存します。同一GPU上で1.7Bモデルにより測定した以前の実測では、KV領域が22,048トークンから41,920トークンに増加し(トークンあたりのバイト数が正確に半分)、長い入力でKVが不足しキューイングが発生していた地点が後ろにずれ込みました(第14編)。今回は同一のパープレキシティテストと貪欲出力の比較のみを追加しました。

項目 KV bf16(デフォルト) KV FP8
KV領域(ログ) 40,208トークン 69,920トークン(1.74倍)
パープレキシティ(同一の文章4編、338トークン) 36.03 36.50(+1.3%)
貪欲出力が bf16 KV と同じリクエスト 基準 12個中5個

5. 運用における知見

6. 未確認の項目

参考

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます