ステータス:ドラフト(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. なぜ速くなるのか
- 2. vLLMの量子化マップ
- 3. 実際に測定してみる:オンラインFP8
- 3-1. 2026-10-27再測定:チャットモデル、および事前量子化されたチェックポイント
- 4. KVキャッシュ8ビット
- 5. 運用への示唆
- 6. 確認できなかったこと
- 参考
1. なぜ速くなるのか
デコードでは、リクエストごとにトークンを1つ生成するために重み全体をGPUメモリから1回読み込みます。0.6Bモデルの場合、bf16ではステップごとに1.2GBが往復します。これに比べて計算量は少ないため、ステップ時間は概ね「重みのバイト数 ÷ メモリ帯域幅」によって決まります。重みを8ビットに減らすと読み込むバイト数が半分になり、ステップが短くなります。
ここから2つのことが導き出されます。
- バッチが大きいほど利得が減少します。 1ステップあたりのリクエストが多い場合、重みの読み込みは同じままでKVの読み込みと計算が増加し、ステップ時間における重みの占める割合が小さくなります。
- 活性値まで8ビットで計算できる場合(W8A8)、計算も高速化されます。 FP8テンソルコアを搭載したGPU(Ada、Hopper以降)で可能です。重みのみを減らし計算を16ビットで行う方式(W4A16、W8A16)は、メモリ読み込みのみを削減します。
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チェックポイントを2回ロードしました。1回目はそのまま、2回目は
--quantization fp8. - 0.31.0はこのオプションに対して警告を出します。「
--quantization fp8はオンライン量子化に対して非推奨となったため、fp8_per_tensorを使用してください。」名称のみが変わり、動作は同じ方式(テンソルごとに1つのスケール)です。品質比較は新しい名称で再起動したサーバーで行いました。 - 負荷は第2編と同様です(入力256トークン、出力128トークン、同時実行数ごとに4セット中の最初のセットでウォームアップ)。
- 出力の比較:固定プロンプト12個(文章をそのままコピーする6個、ランダムな単語をつなぎ合わせる6個)を貪欲デコードで128トークン生成し、リクエストごとに出力のハッシュを比較しました。
- 品質の代理指標:自作の英語文章4編(計338トークン)のトークンごとの対数確率を取得し(
echo+logprobs)、パープレキシティを算出しました。
結果
| 項目 | 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%) |
- 重みが半分ではなく63%になった理由:このモデルは語彙数151,669 × 1,024の埋め込み(約0.3GB)が出力層と共有されており、この層と正規化層はbf16のまま残ります。モデルが小さいほどこの割合が大きくなり、量子化の効果が低下します。
- スループットの向上効果はバッチが大きいほど減少しました(1.36 → 1.24 → 1.08倍)。 第1節の説明の通りです。単一利用時にトークン間隔が5.6msから4.1msへと27%短縮されました。
- 出力は異なります。 コピーするプロンプト6個はbf16と文字まで一致し、ランダムな単語をつなぎ合わせる6個はすべて最初の数トークンから分岐しました。確率が近い候補が複数ある箇所では、わずかな数値の違いによって異なるトークンが選択されます。この違いがタスクの精度に与える影響については今回測定していません。
- パープレキシティは1.2%上昇しました(36.03 → 36.46)。 4編のうち2編はむしろわずかに低下し(54トークンの文章 228.5 → 223.5、55トークンの文章 19.07 → 18.80)、最も長い190トークンの文章で19.63 → 20.24へと上昇しました。338トークンは小さなサンプルであるため、1%強の違いは「大きく悪化はしなかった」程度に受け取るべきです。
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比です。
- GPTQ 8ビットとオンラインFP8は同等でした。 単一利用時はGPTQがわずかに速く(244.3対237.9)、同時実行数が高くなるにつれてFP8が上回りました(同時64で3,148対2,997)。GPTQは重みのみが8ビットで計算は16ビット(W8A16)である一方、このGPUのFP8は活性値まで8ビットで計算するためだと考えられます。いずれの場合も、vLLMはログにMarlinカーネルを選択したと記録していました(GPTQ)。
- 事前校正されたGPTQがパープレキシティで優位に立つことはありませんでした。 この文章4編において、FP8はむしろ1.4%低く、GPTQは1.6%高くなりました。338トークンの小さなサンプルであるため、「どちらもbf16と大きな差はない」程度に受け取るべきです。第4編および第5編の抽出・ツール呼び出しタスクでは、3つの方式すべてで18/18、36/36と同一の結果でした。
- AWQ 4ビットにより、8GBに4Bモデルを収めることができます。 bf16の場合、重みだけで約8GBとなるためこのGPUには載らないモデルです。その代わりKV領域が15,424トークンに減少し、同時64では最初のトークンの中央値が3.1秒まで増加しました(キューイング)。パープレキシティは0.6Bよりも低く(21.02)、第4編の抽出タスクでは強制なしでも18回すべて枠なしのJSONを出力しました。小さなモデルを大規模に動かすか、大きなモデルを4ビットで動かすかは、同時実行数と品質の要件によって決定されます。
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個 |
- KV の容量が正確に半分ではなく1.74倍になったのは、サーバーごとに KV に残るメモリが少しずつ異なっていたためと考えられます(このサーバーの「KV に使うメモリ」の行は記録できなかったため未確認)。1.7B で測定した以前の実測では、トークンあたりのバイト数は正確に半分でした。
- パープレキシティは、重み FP8 と同様に 1.3% 上昇しました。
- 貪欲出力は、プロンプトをコピーする6つのうち5つが bf16 と同じであり、1つは「The scheduler is a class with a method schedule() that …」と別の文章を書き始めました。重み FP8 ではコピーの6つがすべて同じだったため、今回のテストでは KV 側の方が出力をより多く変更しました。ランダムな単語をつなげた6つはすべて異なりました。
5. 運用における知見
- 同時実行数の低い対話型サービスほど、重み量子化の効果を実感しやすくなります。 同時1で1.36倍だった利得が、同時64では1.08倍になりました。大きなバッチでスループットを稼ぐバッチ処理であれば、量子化よりもバッチサイズと KV 容量が優先されます。
- 量子化はモデルを変更する作業です。 出力が変わるため、有効化の前後で自身のタスクの評価セットを実行する必要があります。パープレキシティは、あくまで素早い一次チェックに過ぎません。
- 事前に量子化されたチェックポイントを取得する際は、出典とフォーマットを確認します。 Python の pickle(
.bin,.pt) の重みは読み込み時にコードを実行できるため、safetensors 版を選び、ハッシュを記録しておきます。 - バージョンが変わると名前が変更されます。0.31.0 では
--quantization fp8は警告とともにfp8_per_tensorに移行中で、0.32.0 にはチェックポイントの量子化レイヤーを別の精度で再量子化する機能が追加されました(未実測)。
6. 未確認の項目
- GGUF や bitsandbytes はチェックポイントやパッケージを新しくダウンロードする必要があるため未実測です。GPTQ 4-bit、AWQ と同サイズの bf16 との比較(4B bf16 はこの GPU に収まらない)も未実測です。
- FP8 がタスクの精度(Q&A、コード生成など)に与える影響は未実測です。今回のモデルはリランカー用であり、一般的な評価には意味がありませんでした。
- 大規模モデルにおける利得(重みの占める割合が高いため、より大きな利得が予想される)は未実測です。
参考
- vLLM ドキュメント、Quantization、Online Quantization、Quantized KV Cache(0.31.0·0.32.0): https://docs.vllm.ai/en/latest/features/quantization/
- Micikevicius 他、「FP8 Formats for Deep Learning」、2022. https://arxiv.org/abs/2209.05433
- Lin 他、「AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration」、MLSys 2024. https://arxiv.org/abs/2306.00978
- Frantar 他、「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」、ICLR 2023. https://arxiv.org/abs/2210.17323
- 以前の実測:小型モデルで vLLM を直接再測定する