GGUF に保存

モデルを 16 ビットで GGUF に保存して、Ollama、Jan AI、Open WebUI などで使用できるようにする方法。

GGUF に保存するには、以下を使用してローカルに保存します:

model.save_pretrained_gguf("directory", tokenizer, quantization_method = "q4_k_m")
model.save_pretrained_gguf("directory", tokenizer, quantization_method = "q8_0")
model.save_pretrained_gguf("directory", tokenizer, quantization_method = "f16")

Hugging Face ハブにプッシュするには:

model.push_to_hub_gguf("hf_username/directory", tokenizer, quantization_method = "q4_k_m")
model.push_to_hub_gguf("hf_username/directory", tokenizer, quantization_method = "q8_0")

のすべてのサポートされている量子化オプションは quantization_method 以下に一覧されています:

# https://github.com/ggml-org/llama.cpp/blob/master/examples/quantize/quantize.cpp#L19
ALLOWED_QUANTS = \
{
    "not_quantized"  : "推奨。変換は高速。推論は遅く、ファイルは大きい。",
    "fast_quantized" : "推奨。変換は高速。推論はまずまず、ファイルサイズはまずまず。",
    "quantized"      : "推奨。変換は遅い。推論は高速、ファイルは小さい。",
    "f32"     : "推奨されません。100%の精度を保持しますが、非常に遅くメモリを大量に消費します。",
    "f16"     : "変換が最速かつ100%の精度を保持。推論は遅くメモリを多く消費します。",
    "q8_0"    : "変換が高速。リソース使用量は高いが概ね許容範囲。",
    "q4_k_m"  : "推奨。attention.wv と feed_forward.w2 の半分に Q6_K を使用し、その他は Q4_K を使用します",
    "q5_k_m"  : "推奨。attention.wv と feed_forward.w2 の半分に Q6_K を使用し、その他は Q5_K を使用します",
    "q2_k"    : "attention.vw と feed_forward.w2 には Q4_K を使用し、その他のテンソルには Q2_K を使用します。",
    "q3_k_l"  : "attention.wv、attention.wo、feed_forward.w2 に Q5_K を使用し、その他は Q3_K を使用します",
    "q3_k_m"  : "attention.wv、attention.wo、feed_forward.w2 に Q4_K を使用し、その他は Q3_K を使用します",
    "q3_k_s"  : "すべてのテンソルに Q3_K を使用します",
    "q4_0"    : "元の量子化方式、4ビット。",
    "q4_1"    : "q4_0 より精度は高いが q5_0 ほどではない。ただし q5 モデルより推論は速い。",
    "q4_k_s"  : "すべてのテンソルに Q4_K を使用します",
    "q4_k"    : "q4_k_m の別名",
    "q5_k"    : "q5_k_m の別名",
    "q5_0"    : "より高い精度、より高いリソース使用量、推論は遅い。",
    "q5_1"    : "さらに高い精度、リソース使用量、より遅い推論。",
    "q5_k_s"  : "すべてのテンソルに Q5_K を使用します",
    "q6_k"    : "すべてのテンソルに Q8_K を使用します",
    "iq2_xxs" : "2.06 bpw の量子化",
    "iq2_xs"  : "2.31 bpw の量子化",
    "iq3_xxs" : "3.06 bpw の量子化",
    "q3_k_xs" : "3ビットの超小型量子化",
}

Unsloth で実行するとよく動作するが、エクスポートして他のプラットフォームで実行すると結果が悪くなることがある

モデルが Unsloth では良好に動作しているのに、Ollama や vLLM のような別のプラットフォームで使用すると結果が悪くなったり、意味不明な出力や終わりのない生成(無限生成)が発生する問題に遭遇することがあります または 繰り返し出力.

  • このエラーの最も一般的な原因は、 不適切なチャットテンプレート. 重要なのは、Unsloth でモデルを訓練したときに使用したのと同じチャットテンプレートを、llama.cpp や Ollama のような他のフレームワークで実行する際にも使用することです。保存されたモデルから推論する場合、正しいテンプレートを適用することが重要です。

  • 正しい eos トークンを使用する必要があります。そうでないと、長い生成時に意味不明な出力が出ることがあります。

  • また、推論エンジンが不必要な「シーケンス開始」トークンを追加している(逆に不足している)可能性もあるため、両方の仮説を確認してください!

  • 会話用ノートブックを使用してチャットテンプレートを強制してください — これでほとんどの問題が解決します。

GGUF / vLLM 16bit に保存するとクラッシュする

保存中の最大 GPU 使用量を下げるには、次を変更してみてください maximum_memory_usage.

デフォルトは model.save_pretrained(..., maximum_memory_usage = 0.75)です。50% の GPU ピークメモリ使用量を使うには 0.5 に下げるなどしてください。これにより保存中の OOM クラッシュを減らせます。

GGUF に手動で保存するにはどうすればよいですか?

まず以下でモデルを 16bit に保存します:

以下のようにソースから llama.cpp をコンパイルします:

次に、モデルを F16 に保存します:

最終更新

役に立ちましたか?