Qwen3.8-27Bを速くしたい!量子化4種+MoE版をガチ比較したら意外な結果に

きっかけ:Qwen3.8-27Bをもっと速く動かしたい

うちのB580(VRAM 12GB)×2枚構成、単体だと厳しいけど2枚合わせれば27B級のモデルもギリギリ載る。実際Qwen3.8-27Bはチェック工程の候補として何度か試してきたんだけど、正直「速いとは言えない」感触があった。

じゃあ量子化レベルを変えたらどれくらい速度が変わるのか、逆に「アクティブパラメータが少ないMoE構成」なら速くなるんじゃないか——という2つの仮説を検証すべく、同じQwen3.8-27B系統で量子化違い4種+MoE版1種、計5モデルをガチンコ比較してみた。

対象モデルとテスト内容

モデル実体サイズ
UD-Q4_K_M(基準)hf.co/unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M17.4GB
UD-IQ4_XShf.co/unsloth/Qwen3.8-27B-GGUF:UD-IQ4_XS15GB
UD-IQ3_XXShf.co/unsloth/Qwen3.8-27B-GGUF:UD-IQ3_XXS11GB
UD-Q5_K_Mhf.co/unsloth/Qwen3.8-27B-GGUF:UD-Q5_K_M20GB
Whittle-MoE-A17.8Bhf.co/logic65/Qwen3.8-Whittle-MoE-27B-A17.8B-GGUF:Q4_K_M18.3GB

前半4つは同じunsloth配布の量子化違い(UD-IQ3_XXSは単体GPU(12GB)にほぼ収まるサイズ)。最後の1つだけ「アクティブパラメータ17.8B」を謳うMoE構成で、アーキテクチャそのものが違う。

テスト項目は3つ。①「ローカルLLMを自宅PCで動かすメリット」について400字程度の日本語生成、②固定の日本語3文を英訳、③「テキストファイルから最頻出単語TOP5を表示するプログラム」を書かせて実際に実行。加えて生成速度(tokens/秒)とVRAM使用量も計測してる。各モデルの切り替え時は、前回の記事で直した「Ollamaのアンロード完了をポーリング確認」の仕組みをそのまま使ってるので、GPU競合による事故は今回は起きてない。

生成速度:量子化を下げても思ったほど速くならない、上げると激遅になる

タスク別生成速度の比較グラフ

正直、一番意外だったのがこれ。「量子化を下げればVRAM消費が減って速くなるはず」という予想に反して、UD-Q4_K_M(11.6〜12.0 tok/s)→UD-IQ4_XS(10.5〜12.7 tok/s)→UD-IQ3_XXS(9.1〜12.7 tok/s)と、量子化を下げてもほぼ横ばい。VRAMは17.4GB→16.1GB→12.8GBときっちり減ってるのに、速度にはほぼ反映されない。

一方でUD-Q5_K_Mは3.6〜3.7 tok/sと、基準のUD-Q4_K_Mの約1/3以下まで速度が落ちた。VRAM使用量は19.4GBで、2枚合計24GBの範囲には収まっているはずなんだけど、体感速度はほぼ「壊れた」レベル。Whittle-MoE-A17.8Bも3.3 tok/sとほぼ同水準で遅く、しかも日本語生成タスクは600秒のタイムアウトまで応答が返ってこなかった。

「アクティブパラメータが少ないMoEなら速いはず」という仮説は、少なくとも今回のOllama+GGUF環境では見事に外れた格好。量子化サイズが大きい(=VRAM消費が大きい)モデルほど、B580×2枚のVulkanバックエンドでの層分割やメモリ確保のオーバーヘッドが顕在化して、速度が一気に落ち込むんだと思う。

VRAM使用量:狙い通りに減るが、速度とは別問題

VRAM使用量の比較グラフ

VRAM使用量そのものは量子化レベルに素直に比例していて、UD-IQ3_XXSは12.8GBとGPU1枚分にほぼ収まるサイズまで削減できてる。ただし前述の通り、VRAMが減っても速度は改善しない。今回の環境では「速度」と「VRAM消費」は別軸の問題で、量子化を下げる主な効果は「省VRAM化」であって「高速化」ではない、というのが実測での結論。

品質チェック:量子化が進むと文章に論理矛盾が紛れ込む

日本語生成の内容を見比べると、地味に見過ごせない問題が見つかった。UD-IQ4_XSとUD-Q5_K_Mの出力に、どちらも同じパターンの論理矛盾が入っていた。

UD-IQ4_XS: 「入力した個人情報や機密資料が外部サーバーに送信されるため、情報漏洩のリスクをゼロに近づけられます

これ、文脈的には「送信されないため」が正しいはず。「送信される」のに「リスクがゼロに近づく」という真逆の主張になってしまっている。UD-Q5_K_Mの出力にもほぼ同じ構造の矛盾があった。一方で基準のUD-Q4_K_MとUD-IQ3_XXSは、同じテーマで否定形を正しく使えていて、この手の破綻は見られなかった。

サンプル数は1回ずつなので断定はできないけど、「量子化を上げても下げても、基準のQ4_K_Mより品質が安定して良くなるわけではない」というのは実感として持てた。

コーディング課題:MoE版だけ存在しないメソッドを使ってクラッシュ

コード実行検証では、量子化違いの4モデルは全て正解(the:7, fox:7, quick:5, is:5, dog:4)を出力して問題なく動いた。ところがWhittle-MoE版だけ、生成したコードがこんな感じだった。

words = text.split()
count = Counter(words)
top5 = count.top_n(5)  # ← Counterにこのメソッドは存在しない

Counterオブジェクトにtop_n()というメソッドは存在しない(正しくはmost_common(5))。実行するとAttributeErrorで即クラッシュ。パッと見はそれらしいコードに見えるだけに、実行して初めて気づけるタイプの不具合だった。日本語生成のタイムアウトと合わせて、この特定のMoE量子化ファイルには何かしら不安定さがありそう。

結論

  1. 実用上のベストはUD-Q4_K_MかUD-IQ4_XS — 速度・品質ともに横並びで良好。VRAMに余裕を持たせたいならIQ4_XS、実績重視ならQ4_K_M
  2. 量子化を下げても速度は上がらない — UD-IQ3_XXSはVRAMを12.8GBまで削減できるが、速度はQ4_K_Mとほぼ同じ。「速くしたい」が目的なら量子化ダウンは解決策にならない
  3. 量子化を上げると逆に大きく遅くなる — UD-Q5_K_Mは速度が基準の1/3以下(3.6 tok/s)まで低下。VRAM総量には収まっていても、この環境では明確に非効率
  4. MoE(アクティブパラメータ少)だから速いとは限らない — Whittle-MoE-A17.8Bは今回の環境では最も遅く、かつ不安定(タイムアウト・コード生成の破綻)だった
  5. 量子化違いでも文章の論理矛盾は発生する — UD-IQ4_XSとUD-Q5_K_Mで否定形の脱落による意味の逆転が見つかった。量子化レベルと品質の関係は単純な比例関係ではない

「27Bを速くしたい」という当初の目的に対する答えは、量子化レベルをいじることではなく、結局「基準のUD-Q4_K_M(かIQ4_XS)をそのまま使うのが一番現実的」という、拍子抜けするような結論に落ち着いた。次はプロンプト側の工夫(コンテキスト長の削減、出力トークン数の制限)で速度を稼ぐ方向を試してみたい。