🎓 レベル:標準 | 重要度:A(必須) 📎 前提:ローカルLLMのエコシステム地図 | 原理:LLMの全体像(機械学習)
要点(結論先出し)
- safetensors=重みを安全・高速に読み書きする「素の」入れ物。主に**学習・GPU推論(フル精度や高精度)**で使う。
- GGUF=llama.cpp系のための入れ物。量子化された重み+トークナイザ+メタデータを1ファイルに同梱し、CPU/GPU混在のローカル推論に最適(要最新確認)。
- ざっくり:HuggingFaceから来る生重み=safetensors、手元でサクッと動かす配布版=GGUF。
概念 ── 形式は「誰のための入れ物か」で分かれる
重みはただの数値の塊ですが、保存形式はそれを「誰がどう読むか」で設計が変わります。safetensors は Pickle の任意コード実行リスクを避けた安全な保存形式で、テンソルを高速にメモリマップできます。学習フレームワークやGPU推論(vLLM等)が直接読みます。
GGUF は llama.cpp 系専用で、量子化済みの重み・トークナイザ・チャットテンプレート・各種メタデータを1ファイルに詰め込みます。だから「このGGUFを置いて実行」だけで動く。ローカル配布の定番です(要最新確認)。
仕組み ── 変換の流れ
flowchart LR HF["配布元の生重み(safetensors)"] --> CONV["変換スクリプト(convert)"] CONV --> F16["高精度GGUF(F16・BF16)"] F16 --> Q["量子化(llama-quantize)"] Q --> GGUF["量子化GGUF(Q4_K_M等)"] GGUF --> RUN["llama.cpp・Ollamaで実行"]
典型は safetensors → 高精度GGUFへ変換 → 量子化GGUFへ圧縮。多くの人は他人が量子化済みのGGUFを落とすだけで済みます(が、ライセンスは元モデルに従う → オープンウェイトモデルとライセンス)。
中身の違い(要点)
- safetensors:テンソルのみ+最小限のヘッダ。トークナイザ等は別ファイル。安全・高速ロード。
- GGUF:テンソル+豊富なメタデータ(語彙・テンプレート・量子化種別)を内包。自己完結。
- どちらも重みの中身(モデルそのもの)は同じ。違うのは入れ物と量子化の有無。
なぜそうするか
ローカル推論で GGUF が好まれるのは、1ファイルで再現性が高く、CPUオフロードや混在実行に向くから。学習・高精度GPU推論で safetensors が使われるのは、フレームワークが直接読め、安全で速いから。目的が違うから形式が違うだけで、優劣ではありません。
⚠️ よくある落とし穴
- 拡張子で安心しない:
.bin/.pt(Pickle系)は任意コード実行リスク。可能なら safetensors を選ぶ。 - GGUFなら何でも速いと思う:速度は量子化種別とエンジン次第(→ 量子化方式(k-quantsとGPTQとAWQ))。
- トークナイザの取り違え:safetensors運用ではトークナイザを別途揃える。GGUFは同梱なので事故が少ない。
- 量子化版のライセンス未確認:入れ物が変わっても元モデルの利用条件は不変。
対応lab
- GGUFを直接実行する手順は llama.cpp の lab(
local-llm-study/labs/)。
関連
- 圧縮の中身へ → 量子化の仕組み(ビット数と精度)
- 方式の比較へ → 量子化方式(k-quantsとGPTQとAWQ)
- 微調整後の形式変換 → アダプタのマージとGGUF変換