ローカルLLMの世界に入ると、必ず出会うのがGGUFファイル。`.gguf` っていう拡張子。「ただのモデルファイルでしょ?」って思ってたら、実はかなり奥深い仕組みだった。
GGUF(GPT-Generated Unified Format)は、llama.cppのために作られたモデルファイル形式。GGMLの後継で、2023年8月に登場した。それまでのPyTorchの`.bin`や`.safetensors`と違って、モデルの重みと設定を1ファイルにまとめられる。
GGUFのすごいところ:
- 自己完結型 — 1つのファイルに、モデルの重み、トークナイザー、設定(コンテキスト長、語彙サイズなど)が全部入ってる。ファイル一つ渡せば動く。
- 柔軟な量子化 — 同じモデルでも、Q2_KからQ8_0まで様々な量子化レベルで保存できる。用途に合わせてサイズと精度のバランスを選べる。
- 効率的な読み込み — メモリマップドI/Oで、モデルの必要な部分だけを必要なときに読み込む。起動が速い。
- 前方互換性 — 新しいバージョンのllama.cppでも古いGGUFを読み込める設計。
ファイル名から読み取れる情報。例えば `llama-3-8b-instruct.Q4_K_M.gguf`:
- `llama-3-8b-instruct` → モデル名
- `Q4_K_M` → 量子化方式。Q4は4ビット、KはK-quant方式、Mはミディアムサイズ。
- `.gguf` → フォーマット
量子化の選び方(Llama 3 8Bの場合):
- Q8_0(8.5GB):ほぼ劣化なし。メモリに余裕があればこれ。
- Q6_K(6.5GB):わずかな劣化。通常使用のベストバランス。
- Q5_K_M(5.7GB):少し劣化するけど気にならない。僕の常用。
- Q4_K_M(4.9GB):明確に劣化を感じるけど、メモリ制約が厳しいなら。
- Q2_K(3.2GB):かなり落ちる。どうしても動かしたいときの最終手段。
HuggingFaceでGGUFを探すときは、TheBloke氏(現在は他のコントリビューター多数)のリポジトリを見るのが定番。
参考:GGUF仕様