3行でいうと

  • GGUFは「ファイルの形式」で、AWQ・GPTQは「重みを4ビット前後に丸める方法」です。同じ並びの選択肢ではありません。
  • llama.cppの表では、Llama-3.1-8BのQ4_K_Mは4.58GiB、F16は14.96GiBです。
  • FP8の重み・活性化の両方を8ビットにする方式は、vLLMの文書ではAda世代以降のGPUが前提です。
  • NVFP4は16個ごとに8ビットの倍率を持ち、NVIDIAの説明では1値あたり4.5ビットです。

この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。

先に結論

量子化の名前が並ぶと、同じ種類の選択肢に見えます。でも実際には、次の三つの層が混ざっています。

  1. 入れ物(ファイル形式):GGUF。重みとメタデータ(モデルの付属情報)を一つのファイルにまとめる形式です。
  2. 丸め方(重みをどう小さくするか):AWQ、GPTQ、llama.cppのk-quant(Q4_K_Mなど)。
  3. 計算の数の形(実行時にどんな数で掛け算するか):FP8、FP4(NVFP4、MXFP4)。

見立てです。「どれが一番よいか」ではなく、「自分の道具(推論エンジン)とGPUが、どの形式を読めるか」から決めるのが、現実的な入り口だと思います。理由は、後の表で見るとおり、エンジンとGPUの世代によって、動く形式が違うからです。

前提:量子化とは何か

丸め方を比べる:GGUFのk-quant、GPTQ、AWQ

GGUF(入れ物)と、中のk-quant

GGUFの仕様書には、推論用にモデルを保存する二進数のファイル形式で、読み込みと保存が速く、読みやすいように作られた、とあります。以前のGGML、GGMF、GGJTの後継です。ファイルは「ヘッダー、テンソル情報、パディング、テンソルの本体」の順に並びます。ここでテンソルとは、重みの表のことです。

Hugging Faceの文書は、safetensors(テンソルだけを入れる形式)と違って、GGUFはテンソルと標準化されたメタデータの両方を持つ、と説明しています。作ったのは、llama.cppの開発者のggerganov氏とされています。

GGUFの中には、さまざまな量子化の種類を入れられます。Hugging Faceの文書の表では、次のようなものが挙がっていました(1個あたりのビット数は表の値)。

古いQ4_0、Q5_0、Q8_0などは「今はあまり使われていない」と同じ文書にあります。ただし、llama.cppの量子化READMEの表にはQ8_0の行があります。

llama.cppのREADMEが載せている、Llama-3.1-8Bの数字は次のとおりです。

種類 1重みあたりのビット数 サイズ(GiB)
Q4_K_M 4.8944 4.58
Q5_K_M 5.7036 5.33
Q8_0 8.5008 7.95
F16 16.0005 14.96

見立てです。Hugging Faceの表ではQ4_Kが4.5ビット、READMEの実測ではQ4_K_Mが4.89ビットと、数字が違います。READMEは名前の中身(_Mが何か)を説明していなかったので、理由は確認できていません。モデルの部位ごとに種類を混ぜているためかもしれませんが、これは推測です。ファイルの大きさを知りたいときは、表の「ビット数」ではなく、実際のファイルの大きさを見るのが確実です。

llama.cppのREADMEにある、サイズと速度の表(抜粋)と、大きいモデルの数字

READMEには、Llama-3.1-8Bについて、1秒あたりのトークン数(t/s)も載っています。プロンプトを読み込む速さ(512トークン時)と、文章を書く速さ(128トークン時)です。

種類 サイズ(GiB) 読み込み t/s 生成 t/s
Q2_K 2.95 784.45 79.85
Q4_K_S 4.36 818.55 76.71
Q4_K_M 4.58 821.81 71.93
Q6_K 6.14 812.01 58.67
Q8_0 7.95 865.09 50.93
F16 14.96 923.49 29.17

読み取れることは、小さい形式ほど、文章を書く速さが速い、ということです。F16の29.17に対して、Q4_K_Mは71.93です。理由は、文章を1トークン書くたびに重みを読み出すので、重みが小さいほど読み出しが速いからです(見立てです。READMEにこの説明はありません)。測定したハードウェアは、取得した文書の範囲では確認できませんでした。数字は「その環境での例」として読んでください。

大きいモデルの例(Llama 3.1、GB単位)もあります。

モデル 元のサイズ Q4_K_M
8B 32.1GB 4.9GB
70B 280.9GB 43.1GB
405B 1,625.1GB 249.1GB

僕らの計算です。8Bも70Bも、Q4_K_Mは元のサイズの約15.3%でした(4.9÷32.1、43.1÷280.9)。

READMEには、imatrix(importance matrix、重要度行列)という仕組みもあります。サンプル文章から「どの重みが答えに効くか」を調べたファイルで、--imatrix で渡すと、量子化による質の低下を減らせる、と書かれています。

GPTQ(論文:2022年)

GPTQは、Frantarら(2022年10月、arXiv:2210.17323)が提案した「ワンショット」の重み量子化です。ワンショットとは、モデルを再学習せず、一回の処理で丸めるという意味です。二次の情報(近似した曲率)を使って、丸めによる誤差が小さくなるように、重みを順に調整します。

論文の要約によると、1750億パラメータのGPT系モデルを、約4GPU時間で3ビットまたは4ビットに圧縮でき、精度の低下は小さいとのことです。1枚のGPUで1750億パラメータのモデルを動かせるようにした、とも書いています。FP16と比べた推論の速さは、A100で約3.25倍、A6000で約4.5倍と報告されています。

AWQ(論文:2023年)

AWQ(Activation-aware Weight Quantization)は、Linら(2023年6月提出、arXiv:2306.00978)の、重みだけを4ビット前後に丸める方法です。「全部の重みが同じように大切なわけではない」という観察から出発します。論文は、重要な重みの約1%を守るだけで、丸めの誤差が大きく減ると報告しています。どの重みが重要かは、重みの値ではなく、活性化(途中の計算で流れる値)の分布から決めます。

論文の要約では、逆伝播(再学習の計算)も再構成も使わないので、キャリブレーションの文章に合わせすぎる問題を避けられる、とあります。論文の著者らは、デスクトップとモバイルのGPUで、Hugging FaceのFP16実装の3倍以上の速さだと述べています。

現場での位置づけ(vLLMの文書から)

数の形を比べる:FP8とFP4

AWQやGPTQは、おもに「重みを小さく持つ」工夫です。FP8やFP4は、GPUの計算ユニットが直接扱う「数の形」の話で、重みだけでなく活性化も小さい数で計算することを含みます。

FP8

FP8は、1個の数を8ビットで表す浮動小数点です。2022年の論文(Micikeviciusら、arXiv:2209.05433)が、E4M3(指数4ビット、仮数3ビット)とE5M2(指数5ビット、仮数2ビット)の2種類を提案しています。論文は、FP8での学習が16ビットの学習と同等の品質になったと述べています。

vLLMの文書によると、E4M3の最大値は448、E5M2は57344です。重みと活性化の両方を8ビットにする方式(W8A8)は、Ada、Hopper、Blackwell(演算能力8.9以上)のGPUが必要です。TuringとAmpereでは、重みだけ8ビットのW8A16を、FP8 Marlinカーネルで動かせるとあります。メモリは「2倍減」、スループットは「最大1.6倍」と文書は述べていますが、これは文書の数字で、この記事では測っていません。

FP4:MXFP4とNVFP4

FP4は、1個の数を4ビットで表します。形はE2M1(符号1、指数2、仮数1)で、表せる大きさは0、0.5、1、1.5、2、3、4、6だけです。粗すぎるので、数個ごとに「倍率」を付けて使います。この仕組みを、ここではマイクロスケーリングと呼びます。

形式 倍率を共有する数 倍率の形 出典
MXFP4(OCPの仕様) 32個 E8M0(2の累乗だけ) Open Compute Projectの仕様
NVFP4(NVIDIA) 16個 FP8のE4M3(小数も可)+テンソルごとにFP32が1つ NVIDIAの技術ブログ

NVIDIAのブログは、NVFP4を「4ビットの値+16個ごとに8ビットの倍率で、1値あたり4.5ビット」と説明しています。僕らの計算です。4+8÷16=4.5で、一致します。FP16と比べてメモリが約3.5倍、FP8と比べて約1.8倍減る、とブログは述べています(16÷4.5は約3.6で、ブログの「約3.5倍」と近い値です)。

ブログのDeepSeek-R1-0528の比較では、FP8とNVFP4で、MMLU-PROが85%と84%、GPQA Diamondが81%と80%、AIME 2024が89%と91%でした。NVIDIAは「主要な言語タスクで1%以下の低下」と述べています。これはNVIDIA自身の発表で、第三者の確認は読んでいません。

ハードウェアは、NVFP4がBlackwell世代のGPU向けです。vLLMの表ではMarlin(GPTQ/AWQ/FP8/FP4)の行があり、Turingでは「MXFP4はMarlinで非対応」と注記されていました。

vLLMの量子化対応表(公式文書の表を書き直したもの)

文書の注意書きでは、この表は「変更されることがある」とされています。〇は対応、×は非対応です。

方式 Volta Turing Ampere Ada Hopper AMD GPU Intel GPU x86 CPU Arm CPU
AWQ × 〇 〇 〇 〇 × 〇 〇 ×
GPTQ 〇 〇 〇 〇 〇 × 〇 〇 ×
Marlin(GPTQ/AWQ/FP8/FP4) × 〇* 〇 〇 〇 × × × ×
FP8(W8A8) × × × 〇 〇 〇 × × ×
GGUF 〇 〇 〇 〇 〇 〇 × × ×

*TuringはMXFP4のMarlinに非対応。

GPUの世代は、Voltaが演算能力7.0、Turingが7.5、Ampereが8.0/8.6、Adaが8.9、Hopperが9.0と書かれています。この表はvLLMの対応状況で、llama.cppや他のエンジンの対応とは別です。

使い分けの目安

見立てです。ここまでの資料から、次のように整理できると思います。

やりたいこと 候補 根拠
手元のPCやMacで、一つのファイルで動かす GGUF(Q4_K_MやQ5_K_M) GGUFはllama.cpp系の形式で、LM StudioやOllamaも対応(Hugging Faceの文書)
自社のGPUサーバーで、多人数に提供する vLLM + FP8(Ada以降)やAWQ/GPTQ vLLMの対応表と文書
最新のBlackwell GPUで、さらにメモリを減らす NVFP4 NVIDIAのブログ(精度は同社の報告)
古いGPU(Volta・Turing)で動かす GPTQ(Voltaも対応)など vLLMの対応表

よくあるつまずき

気をつけること

出典

更新履歴