Ainz Diary Blog

OllamaでHugging Faceの量子化モデルが500エラーで動かない話(Unsloth GGUFの互換性とllama.cppという選択肢)

最近、Ollama を使ってローカルLLMを動かして遊んでいます。クラウドのAPIを叩くのとは違って、手元のPCで完結するのが楽しくて、ついつい色々なモデルを試したくなってしまいます。

そんな中で「Hugging Faceから有名どころの量子化モデルを取ってくれば、もう少し快適に動くのでは?」と思って試したところ、500 Internal Server Error で見事につまずきました。今回はその顛末と、調べてわかった原因・対処法、そして最終的に思ったことをメモとして残しておきます。

きっかけ:コンテキストサイズを上げると精度は上がるが、遅い

Ollama公式サイトから取得したモデルで遊んでいて、まず気づいたのが「コンテキストサイズ(num_ctx)を大きくすると出力の精度は良くなるけれど、その分どんどん遅くなる」という現象でした。

最初は「なぜコンテキストを広げただけでこんなに遅くなるんだろう?」と不思議だったのですが、調べてみると、これはGPUのメモリ(VRAM)に乗り切っていないことが関係していそうだとわかりました。

仕組みとしては、こういうことのようです。

つまり「精度を上げようとコンテキストを広げる → KVキャッシュが膨らむ → VRAMからあふれる → CPUに逃がす → 激遅」という流れだったわけです。なるほど、と納得しました。

それなら量子化モデルだ、と思ったのですが……

VRAMに乗り切らないのが原因なら、もっと軽い(=メモリ消費の少ない)モデルを使えば良いはず。そう考えて、Hugging Faceにある有名どころの量子化モデル、特に Unsloth が公開しているGGUF形式の量子化モデルを試してみることにしました。量子化を強めれば、その分メモリにも収まりやすくなって処理も速くなるだろう、という期待です。

(途中で「LM Studio を使えばこのあたりは丸ごと解決しそうだな」とも思ったのですが、せっかくOllamaに慣れてきたところなので、まずはOllamaで粘ってみることにしました。)

ところが、いざ実行してみると、こうなりました。

ollama run hf.co/unsloth/gemma-4-E4B-it-GGUF:Q4_K_M
Error: 500 Internal Server Error: unable to load model:

モデルのダウンロード自体は成功しているのに、いざロードしようとすると 500 Internal Server Error で落ちてしまいます。

原因を調べてみる

ググってみると、まったく同じ現象に遭遇している人がたくさんいました。GitHubのIssueやHugging Faceのディスカッションでも報告が上がっていて、どうやらこれは自分の環境固有のミスというより、Ollama側の対応状況に起因する問題のようです。

要点だけ簡潔に知りたかったので Perplexity でも聞いてみたところ、整理された答えが返ってきました。それも踏まえてまとめると、原因はこういうことのようです。

要するに「Ollamaが、そのモデルの形式・構成にまだ追いついていない」状態ですね。自分の設定が悪いわけではなかったので、その点は少し安心しました。

解決策の候補

調べた範囲では、対処法としてはおおむね次の3つが挙がっていました。

1. Modelfileを手動で作り直す(テキストモードで動かす)

問題がビジョン用のmmprojまわりなら、その部分を取り除いてテキスト専用として動かしてしまえばよい、という発想です。

# 既存モデルのModelfileを書き出す
ollama show --modelfile hf.co/unsloth/gemma-4-E4B-it-GGUF:Q4_K_M > Modelfile.custom

# 書き出したModelfileから、ビジョン関連(mmprojなどの記述)を削除・コメントアウトする

# 加工したModelfileから新しいモデルを作成
ollama create custom-gemma4 -f Modelfile.custom

# 実行
ollama run custom-gemma4

2. 代替モデルを使う

そもそもOllama公式や、llama.cpp互換が確認できているGGUFを選ぶ、という素直な方法です。

# Ollama公式側で配布されているものを使う
ollama run gemma4:e4b

Unsloth以外の量子化版を探すか、後述するllama.cppで直接動かすのも手です。

3. Ollamaを更新する/入れ直す

そもそもバージョンが古くて未対応、というパターンもあります。実際、Ollama側でllama.cppの組み込みが更新されたバージョン以降は、テキスト専用版であればUnslothの量子化モデルが動くようになった、という報告もありました。

# Ollamaを最新版に更新したうえで、

# 一度モデルを削除して
ollama rm hf.co/unsloth/gemma-4-E4B-it-GGUF:Q4_K_M

# pullし直す
ollama pull hf.co/unsloth/gemma-4-E4B-it-GGUF:Q4_K_M

なお、どうしてもビジョン機能(画像入力)まで使いたい場合は、現状はOllamaよりllama.cppを直接使うほうが確実そうです。

「直せそうだけど、本末転倒かも」と思った話

解決策を眺めていて、正直に思ったのは「Modelfileを加工すれば直せそうだけど、なんだかなあ」ということでした。

理由は2つあります。

だったらllama.cppを直接使うほうが早いかも

ここまで来て思ったのは、「モデルを加工してまでOllamaにこだわるくらいなら、いっそ llama.cpp を直接使ったほうが早いのでは?」ということです。

そもそも今回エラーになったような「本体とビジョンが別ファイルに分かれたGGUF」や、新しいアーキテクチャのモデルは、llama.cpp側では先行して対応していることが多いです。Ollamaはそのllama.cppを内部で使いつつ、扱いやすくラップしてくれている存在なので、Ollamaが未対応のものは、大元のllama.cppを直に叩いたほうが動くケースがある、というのは理屈としても納得できます。

もちろん、llama.cppを直接使うと、Ollabaが提供してくれていた「モデルの一元管理」「サーバーの起動の手軽さ」といった快適さは手放すことになります。なので、

という使い分けに落ち着きそうだな、と今のところは考えています。

まとめ

今回は、OllamaでHugging Face(Unsloth)の量子化GGUFを動かそうとして 500 Internal Server Error に遭遇した話をまとめました。改めて整理すると、

という感じでした。

ローカルLLMは、動かすところまでが半分趣味みたいなところがあって、こういうエラーにぶつかるのも含めて結構楽しいです。次はllama.cppを直接触ってみて、Ollamaとの使い心地の違いも記事にできたらいいなと思っています。

参考文献

この記事は、以下の情報を参考に作成しました。より詳しい内容や最新情報は、各リンク先をご確認ください。