第4部 モデル形式と保存形式第5章

GGUFを重点的に理解する

ローカルLLMの事実上の標準ファイル、GGUF。1つのファイルの中に何が入っているのか、Q4_K_M や IQ3_XXS といった呪文のような名前は何を意味するのかを、仕様書と実測値で読み解きます。

約17分で読めます2026年10月改訂

このページの内容(9項目)
  1. GGUFとは:ローカル実行のための全部入りファイル
  2. ファイルの中身をのぞく
  3. 量子化の名前を読む
  4. 実測値で比べる:サイズと品質
  5. ファイル名の読み方
  6. 分割ファイル、mmproj、mtp
  7. GGUFを作る・動かす
  8. さらに深く学ぶ
  9. 出典・参考

GGUFのリポジトリを開いたら、ファイルが30個。どれを落とせばいいの?

たとえば unsloth/gemma-4-E2B-it-GGUF には、Q3_K_S、Q4_K_M、IQ4_XS、UD-Q4_K_XL、Q8_0、BF16…と、同じモデルのGGUFが20種類以上並び、さらに mmproj-F16.gguf や mtp-…gguf といったファイルもあります2026年10月時点。

この名前は、慣れると「サイズと品質のトレードオフの表」に見えてきます。この章を読み終えるころには、自分のPCに合う1つを選べるようになっているはずです。

GGUFとは:ローカル実行のための全部入りファイル

ひとことで言うと

GGUFは、llama.cppの土台であるggmlのためのモデルファイル形式。重み・設定・トークナイザ・チャットテンプレートを1つのファイルに詰め、すばやく読み込めるように設計されています。

GGUFは、それ以前に使われていたGGML、GGMF、GGJTという形式の後継です。古い形式は設定値を「型のない数値の列」として並べていたため、新しい項目を足すたびに互換性が壊れていました。GGUFは設定を「キーと値」の組で持つようにして、項目を足しても古いファイルが読めなくならないようにしています。

仕様書には、設計の目標が次のように挙げられています。

  • 1ファイルで完結 — 外部のファイルなしで配布・読み込みできる。
  • 拡張できる — 互換性を壊さずに新しい情報を追加できる。
  • mmap対応 — ファイルをメモリに直接対応づけて、高速に読み込める。
  • 使いやすい — 外部ライブラリなしの少ないコードで読み書きできる。

llama.cppやggml、GGUFを作ってきたggml.aiのチームは、2026年2月にHugging Faceへ合流しました(第3章)。llama.cppはMITライセンスのオープンソースとして開発が続いています。

ファイルの中身をのぞく

GGUFファイルは、先頭から次の順番で並んでいます。

flowchart TD
  A["ヘッダー
GGUF の4文字・版数 3
テンソル数・メタデータ数"] --> B["メタデータ
キーと値の組"] B --> C["テンソル情報
名前・形・型・位置"] C --> D["パディング
境界をそろえる"] D --> E["テンソルデータ
重みの本体"]
図: GGUFファイルの構造(仕様 v3)

ファイルの最初の4バイトは文字どおり GGUF(0x47 0x47 0x55 0x46)で、続いて形式の版数が入ります。現在の版は3で、ビッグエンディアンへの対応が加わった版です。テンソルデータは決まったバイト境界(general.alignment、指定がなければ32バイト)にそろえて置かれるので、mmapで効率よく読めます。

メタデータ:設定・トークナイザ・テンプレート

メタデータは「general.architecture = llama」のような、ドットで区切った名前のキーと、その値の組です。値には整数、小数、真偽値、文字列、配列が使えます。代表的なキーを並べます。

キー中身
general.architectureアーキテクチャ名(必須)。ほかのキーの接頭辞にもなる
general.name / general.licenseモデル名、ライセンス
general.quantization_version量子化形式の版(量子化テンソルがあれば必須)
[arch].context_length学習時の文脈長。例: llama.context_length
tokenizer.ggml.model / tokens / mergesトークナイザの種類、語彙、BPEの結合規則
tokenizer.chat_templateチャットテンプレート(Jinja)

これがGGUFの「全部入り」の正体です。safetensorsでは config.json や tokenizer.json に分かれていた情報(第4章)が、ここにまとめて入っています。

テンソル情報

テンソルごとに、名前、次元、型(どの量子化か)、データ部分の中での位置が記録されます。名前には標準の付け方があり、token_embd.weight(埋め込み)、blk.0.attn_q.weight(0番目のブロックのアテンションのQ)、blk.0.ffn_down.weight(フィードフォワード層)、output.weight(出力層)のようになります。テンソルごとに型を変えられるのがポイントで、これが後で出てくる _M や _L の正体につながります。

ためしてみよう

Hugging FaceのGGUFファイルのページでは、ブラウザ上でメタデータとテンソルの一覧(名前・形・型)を表示できます。手元のファイルなら、pip install gguf で入る gguf-dump コマンドで中身を表示できます。

pip install gguf
gguf-dump Qwen3.5-0.8B-Q4_0.gguf | head -40

量子化の名前を読む

GGUFの中のテンソルは、たいてい量子化されています。量子化とは、重みを少ないビット数で近似して小さくすることです(基本は第10章)。名前は大きく4つの系統に分かれます。

従来型(legacy): Q4_0、Q4_1、Q5_0、Q8_0 きゅーよん・ぜろ など

32個の重みを1ブロックにまとめ、ブロックごとに1つのスケール(倍率)を持つシンプルな方式。_0 はスケールだけ、_1 はスケールと最小値を持ちます。Q8_0は品質の劣化がごくわずかで、今もよく使われます。

K-quants: Q2_K〜Q6_K、Q4_K_M など けー・くおんつ

256個の重みを「スーパーブロック」にまとめ、その中の小さなブロックごとのスケールもさらに量子化して節約する方式。Q4_Kはおよそ4.5bit/重みです。末尾の _S・_M・_L は「Small・Medium・Large」で、品質に効きやすいテンソルにどれだけ高いビット数を割り当てるかの混ぜ方の違いです。たとえばQ4_K_Mは、基本はQ4_Kで、attn_v や ffn_down の一部の層だけをQ6_Kにします。

I-quants: IQ1_S〜IQ4_XS、IQ4_NL あい・くおんつ

格子状のコードブックや非線形の値の割り当てを使い、特に2〜3bit台でK-quantsより品質を保ちやすくした方式。XXS・XS・S・M はサイズの段階です。低ビットのI-quantsでは、次に説明するimatrixを使うのが前提です。

浮動小数点・三値など: F16、BF16、MXFP4、TQ1_0、TQ2_0

F16・BF16は量子化していない16bit。MXFP4 は32個の4bit浮動小数点値が8bitの共通スケールを持つ形式(約4.25bit/重み)で、OpenAIのgpt-ossがこの形式で配布されたことで広まりました。TQ1_0・TQ2_0は、重みが -1・0・+1 の三値のモデル(第11章)向けです。

imatrix(重要度行列)

imatrix(importance matrix)は、「どの重みが出力に強く効いているか」を、実際の文章をモデルに流して測ったデータです。量子化のときにこれを使うと、重要な重みの誤差を優先して小さくできます。llama-imatrix でサンプルの文章から作り、llama-quantize --imatrix に渡します。量子化したGGUFの配布ページに「imatrix」と書かれていたら、この方法で作られたものです。

実測値で比べる:サイズと品質

llama.cppの量子化ツールの説明書には、Llama 3.1 8Bを各形式に量子化した実測値が載っています。ここから代表的なものを抜き出しました(ppl増加は別のモデル Llama 3 8B での値で、ツール内の説明文から)。

型bit/重みサイズppl増加
F1616.0014.96 GiB—(基準)
Q8_08.507.95 GiB+0.0026
Q6_K6.566.14 GiB+0.0217
Q5_K_M5.705.33 GiB+0.0569
Q4_K_M4.894.58 GiB+0.1754
Q4_0——+0.4685
IQ4_XS4.464.17 GiB—
Q3_K_M4.003.74 GiB+0.6569
Q2_K3.162.95 GiB+3.5199
IQ2_XXS2.382.23 GiB—

ppl(パープレキシティ)は「次の単語をどれだけ迷うか」の指標で、増加が小さいほど元に近い。—は資料に記載なし。

表から読み取れる傾向は3つです。第一に、Q8_0〜Q5_K_Mでは劣化がごくわずか。第二に、Q4_K_Mあたりから劣化が目に見え始めるものの、サイズは16bitの3分の1以下。第三に、3bitを切ると劣化が急に大きくなります。名前の「4」や「2」は目安で、実際のbit/重みはそれより大きいことにも注目してください(スケールなどの付加情報があるため)。

下の計算機で、パラメータ数と量子化の種類から重みのサイズを見積もってみましょう。

どれを選べばいい?

迷ったら Q4_K_M から始めるのが定番です。llama.cppで -hf オプションを使ってHugging Faceから取得するときも、量子化を指定しなければQ4_K_Mが既定で選ばれます2026年10月時点。

  • メモリに余裕がある → Q5_K_M、Q6_K、Q8_0 と上げていく。
  • どうしても入らない → IQ4_XS、Q3_K_M、さらに IQ3/IQ2 系(imatrix付き)へ。小さなモデルの高ビットより、大きなモデルの低ビットの方が良いこともあるので試す価値あり。
  • 重みのほかに、KVキャッシュ(第15章)と作業用のメモリが必要。重みがメモリの9割を超えるなら厳しいと考える。

ファイル名の読み方

GGUFの仕様書には、ファイル名の命名規則もあります。

[補助ファイル-]ベース名-サイズ[-微調整][-版][-エンコーディング][-種類][-分割].gguf

Mixtral-8x7B-v0.1-KQ2.gguf
Grok-100B-v1.0-Q4_0-00003-of-00009.gguf
mmproj-Qwen2-VL-7B-v1.0-F16.gguf

サイズの 8x7B は「7B規模の専門家(エキスパート)が8つ」というMoEの書き方です。エンコーディングの位置に量子化の種類が入ります。ただし実際の配布ファイルは、この規則どおりでないことも多いです。たとえば ggml-org/Qwen3.5-0.8B-GGUF のファイルは Qwen3.5-0.8B-Q4_0.gguf で、版の部分がありません。Unslothのリポジトリでよく見る UD-Q4_K_XL の UD- は、同社が層ごとに型を調整した独自の量子化(Unsloth Dynamic)を示す接頭辞で、GGUFの仕様で決まった名前ではありません。

手元のファイル名を下に貼り付けて、どこが何を表しているか確かめてみましょう。

分割ファイル、mmproj、mtp

分割ファイル

巨大なモデルのGGUFは、…-00001-of-00003.gguf のように分割されて配布されます。llama.cppでは、最初のファイル(00001)を指定するだけで、同じフォルダにある残りのファイルも自動で読み込まれます。分割や結合は llama-gguf-split で行えます。

# 2GBごとに分割
llama-gguf-split --split --split-max-size 2G model.gguf model-split
# 1つに結合(最初のファイルを指定)
llama-gguf-split --merge model-split-00001-of-00005.gguf model-merged.gguf

mmproj:画像や音声を読むための別ファイル

画像や音声を入力できるモデル(第29章)のGGUFには、mmproj-…gguf というファイルが付いてきます。mmprojは「multimedia projector」の略で、画像・音声のエンコーダーと、その出力をLLMが読める形に変換する層が入っています。本体のGGUFだけでも文章のやりとりはできますが、画像を読ませるにはこのファイルも必要です。

mmprojは本体よりずっと小さく、品質が入力の質に直結するため、BF16やQ8_0のような高い精度のまま使うのが普通です。llama.cppで -hf を使うと、リポジトリにmmprojがあれば自動でダウンロードされます。手動なら --mmproj で指定します。

最近は、投機的デコーディング(第16章)用の下書きモジュールを別ファイルにした mtp-(Multi-Token Prediction)という補助ファイルも、命名規則に加わっています2026年10月時点。

GGUFを作る・動かす

Hugging Faceのモデル(safetensors)からGGUFを作るのは2段階です。

flowchart TD
  A["Hugging Face のモデル
safetensors"] --> B["convert_hf_to_gguf.py
BF16 の GGUF に変換"] B --> C["llama-quantize
Q4_K_M などに量子化"] D["llama-imatrix
重要度を測る"] -.-> C C --> E["llama.cpp などで実行"]
図: GGUFの作り方。imatrixは任意
# 1. 変換(llama.cpp リポジトリのスクリプト)
python convert_hf_to_gguf.py --outfile gemma-4-E2B-it-bf16.gguf \
  --outtype bf16 --remote google/gemma-4-E2B-it
# 2. 量子化
llama-quantize gemma-4-E2B-it-bf16.gguf gemma-4-E2B-it-Q4_K_M.gguf Q4_K_M

自分のPCで変換したくなければ、Hugging FaceのSpace「GGUF-my-repo」でブラウザから変換・量子化することもできます。

できあがったGGUFを動かすコマンドは、ツールによってこうなります。llama.cppは最近 llama cli / llama serve という1つのコマンドにまとめた入口を用意しています(従来の llama-cli、llama-server も含め、くわしくは第7章)2026年10月時点。

# llama.cpp: Hugging Face から取得して対話(量子化は :Q4_K_M のように指定可)
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF

# Ollama: Hugging Face の GGUF リポジトリを直接指定
ollama run hf.co/bartowski/Llama-3.2-3B-Instruct-GGUF:IQ3_M

よくある誤解

GGUFは量子化の方式の名前だ

GGUFはファイル形式(箱)。Q4_K_MやIQ4_XSが量子化の方式(中身)。F16やBF16の量子化していないGGUFもある

Q4_K_Mは、すべての重みが4bit

実測は約4.9bit/重み。スケールなどの付加情報があり、さらに一部のテンソルは高いビット数で保存される(_M の混ぜ方)

GGUFならどんなソフトでも同じように動く

新しいアーキテクチャや新しい量子化型は、対応したバージョンのllama.cppなどが必要。古いツールでは「unknown architecture」などのエラーになる

確認クイズ

Q1. GGUFファイルの先頭4バイトは?

  • PK(ZIPと同じ)
  • GGUF の4文字
  • JSON の「{」

マジックナンバーとして文字どおり「GGUF」(0x47 0x47 0x55 0x46)が入っています。「{」で始まるのはsafetensorsのヘッダーです(その前に長さの8バイトがあります)。

Q2. Llama 3.1 8B を Q4_K_M にすると、重みはおよそ?

  • 約1.5GiB
  • 約4.6GiB
  • 約15GiB

llama.cppの実測で4.58GiB(約4.89bit/重み)。F16の14.96GiBの3分の1以下です。

Q3. 画像を読めるモデルのGGUFで、本体と別に必要なファイルは?

mmproj(multimedia projector)のGGUFです。画像・音声のエンコーダーと変換層が入っています。

Q4. imatrix は何のため?

実際の文章を流して「どの重みが出力に効いているか」を測ったデータで、量子化の誤差を重要な重みほど小さくするために使います。特に3bit以下のI-quantsで重要です。

この章のまとめ

  • GGUFは「ヘッダー+メタデータ+テンソル情報+データ」の1ファイル。設定・トークナイザ・テンプレートも入る。
  • 量子化名は4系統: 従来型(Q8_0)、K-quants(Q4_K_M)、I-quants(IQ3_XXS)、浮動小数点・三値(BF16、MXFP4、TQ1_0)。
  • 迷ったらQ4_K_M。実測で約4.9bit/重み、8Bで約4.6GiB。3bitを切ると劣化が急に増える。
  • 分割ファイルは最初の1つを指定すればよい。画像入力には mmproj が別に必要。
  • 作り方は convert_hf_to_gguf.py → llama-quantize(必要なら imatrix)。

さらに深く学ぶ

この章の内容をもう一歩掘り下げるための原典です。

第5章の論文・資料をすべて見る →

出典・参考

  1. GGUF 仕様(ggml-org/ggml docs/gguf.md) — 設計目標、ファイル構造、型の一覧、標準メタデータ、テンソル名、命名規則(mmproj・mtp を含む)、版の履歴(2026年10月確認)
  2. llama.cpp tools/quantize/README.md — 変換と量子化の手順、Llama 3.1 8B での bit/重み・サイズの実測値、mmproj の扱い(2026年10月確認)
  3. llama.cpp tools/quantize/quantize.cpp — 量子化型ごとのppl増加(Llama 3 8B)の説明文(2026年10月確認)
  4. llama.cpp src/llama-quant.cpp — Q4_K_M などで一部のテンソルに高いビット数を割り当てる規則
  5. ggml src/ggml-common.h — Q4_0(32個)・K-quants(256個)・MXFP4(32個+E8M0スケール)のブロック定義
  6. llama.cpp tools/imatrix/README.md と tools/gguf-split/README.md
  7. llama.cpp src/llama-model-loader.cpp — 分割ファイルの自動読み込み
  8. llama.cpp tools/cli/README.md と llama.cpp README — -hf の既定(Q4_K_M、mmproj自動取得)、llama cli の例(2026年10月確認)
  9. llama.cpp docs/multimodal.md — --mmproj の使い方
  10. gguf-py(PyPI: gguf) — gguf-dump などのスクリプト
  11. GGUF(Hugging Face Hub ドキュメント) — Hub上のビューアー、量子化型の説明
  12. Use Ollama with any GGUF Model on Hugging Face Hub — ollama run hf.co/…:量子化
  13. unsloth/gemma-4-E2B-it-GGUF、ggml-org/Qwen3.5-0.8B-GGUF — 実際のファイル名の例(2026年10月確認)
  14. Unsloth Dynamic 2.0 GGUFs(Unsloth ドキュメント) — 層ごとに型を調整する独自量子化
  15. GGML and llama.cpp join HF…(Hugging Face Blog, 2026年2月20日)