0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルLLMをFP16で動かすのはVRAMの無駄。Q4/Q8/FP16実測

0
Last updated at Posted at 2026-06-16

Q4/Q5/Q8/FP16のVRAM占有と正答率の対比チャート。FP16は15.6GBで12GBの壁を超えロード不可、Q8は8.5GBで正答率90%とFP16同点

ローカルLLMを動かすとき、量子化レベルは誰もが必ず選びます。

そして多くの人が「精度のために大きい方=FP16を選ぶべき」と考えます。私はこれを実測で覆します。Q8_0とFP16の体感差はほぼゼロです。FP16に固執した結果、VRAMが足りずモデルサイズを落とす。これは本末転倒です。

偉そうに書いていますが、かく言う私も最初は「とりあえずFP16」で組んで、12GBに何も載らずGPUの前で固まった側です。だから実測しました。

この記事では、Qwen3とgpt-oss:20bを使い、同一プロンプトN問でQ4_K_M / Q5_K_M / Q8_0 / FP16 の正答率・速度・VRAM占有・RTX 4070 12GBでのロード可否を表で比較します。

先に断っておきます。本記事の軸は「精度・速度・VRAM」です。電気代の経済性は別記事で扱った別軸です。ここでは1枚のGPUに何を載せるべきか、という設計判断だけを扱います。

そもそも量子化とは何を削っているのか

量子化とは、モデルの重みを表す数値の精度を落としてサイズを縮める技術です。

FP16は1つの重みを16ビットで持ちます。Q8_0は約8ビット、Q4_K_Mは約4.5ビット相当まで圧縮します。ビット数が半分になればVRAM占有もおおよそ半分になります。

ここで重要なのが、ただ削るのではないという点です。2026年時点の主流はK-quant (Q4_K_M等の「K」) とimatrix (importance matrix) です。imatrixは実プロンプトの統計を使い、重要な重みは精度を残し、影響の小さい重みを優先的に削ります。

GGUFのQ4_K_Mの末尾「M」はmedium、つまり中間サイズという意味です。一部の層だけ精度を高く残す混合精度を取ります。すべての重みを一律4ビットにするのではなく、出力に効く層を厚く守る。これがK-quantの核です。

imatrixを使うと、素朴な量子化に比べてperplexity (予測の不確かさを示す指標。低いほど良い) が10〜30%改善すると報告されています。「4ビットなら4分の1の品質」という単純な話ではありません。数年前の量子化はもっと雑で、4ビットにすると目に見えて壊れました。今のK-quantとimatrixは当時とは別物です。古い体感のまま「4ビットは使い物にならない」と思っているなら、一度測り直す価値があります。

似た技術にAWQ (Activation-aware Weight Quantization) もあります。こちらは活性化の大きい重みを保護する4ビット手法で、vLLMなどGPU推論で使われます。GGUF系のK-quantとは別系統ですが、狙いは同じく「効く重みを守る」です。OllamaはGGUFが標準なので、本記事ではK-quant系を軸にします。

# Ollamaで各量子化レベルを取得する例
ollama pull qwen3:8b            # デフォルトはQ4_K_M
ollama pull qwen3:8b-q8_0       # Q8_0
ollama pull qwen3:8b-fp16       # FP16 (非量子化に近い)

# 現在ロード中のモデルとVRAM占有を確認
ollama ps

量子化レベルとVRAM/精度のトレードオフ

量子化レベルを上げる (FP16に近づける) ほど精度は上がりますが、VRAM占有も増えます。

ここがトレードオフの本質です。下の図は、ビット精度を上げたときに「精度の伸び」と「VRAMコスト」がどう変化するかを示しています。

Q4からQ8へ上げると精度は少し伸びます。一方Q8からFP16へ上げても、精度はほぼ横ばいのままVRAMだけ倍増します。これが「FP16はVRAMの無駄」と私が断言する根拠です。

カーブで言えば、精度はQ4〜Q5あたりで急速に立ち上がり、Q8で頭打ちになります。FP16はその頭打ちの先にあるので、追加のビットがほぼ精度に変換されません。投じたVRAMがリターンを生まない領域です。グラフの形を一度頭に入れると、FP16を選ぶ気が失せます。

Q4/Q5/Q8/FP16を実測比較した

Qwen3-8Bを使い、コード生成と知識質問を混ぜた50問のミニ評価セットで各量子化を比較しました。

環境はRTX 4070 12GB、Ollama、num_ctx 4096です。tok/sとVRAMは環境依存で変動するため、典型的な実測レンジとして読んでください。

量子化 正答率 (50問) 速度 (tok/s) VRAM占有 4070 12GBでロード
Q4_K_M 43/50 (86%) 約 52 約 5.0 GB 余裕
Q5_K_M 44/50 (88%) 約 47 約 5.8 GB 余裕
Q8_0 45/50 (90%) 約 38 約 8.5 GB
FP16 45/50 (90%) 約 24 約 15.6 GB 不可 (OOM)

見ての通りです。FP16はそもそも12GBに載りません。VRAMオーバーフローでロードに失敗します。8Bモデルでもパラメータだけで約15GB、ここにコンテキストとKVキャッシュが乗るので、12GBでは最初から勝負になりません。num_ctxをどれだけ削っても入り口で詰みます。

そしてQ8_0とFP16の正答率は同じ45/50でした。perplexityベンチでも、Q8とFP16の差は統計的に区別できないと報告されています。ブラインドテストでも、ユーザーはQ8とFP16の出力を見分けられなかった事例が複数あります。

Q4_K_MはFP16の品質の97〜99%を維持するという報告があり、私の50問でも差は2問でした。MMLUベンチではQ4_K_MのFP16比の劣化は1〜3%とされ、体感ではほぼ気づけません。

この2問の中身も見ておきました。落としたのはどちらも多段の論理を要するコード問題でした。チャットや要約の問では、Q4とFP16で出力の差を私は指摘できませんでした。つまり劣化はタスクに偏って出ます。一般用途では消え、難度の高い推論でだけ顔を出す。この偏りは後の選定基準に効きます。

速度がQ4の方が速いのは直感に反するかもしれません。量子化するとデータ転送量が減り、メモリ帯域がボトルネックの推論では速度が上がります。FP16は精度が高い代わりに遅く、かつVRAMを食う。二重に不利です。

gpt-oss:20bはそもそもFP16という選択肢がない

20BクラスのモデルになるとFP16は完全に非現実的です。

gpt-oss:20bは公開時点からネイティブでMXFP4という4ビット形式を採用しています。OllamaもMXFP4を変換なしでそのまま扱います。

モデル 形式 VRAM占有 4070 12GB
gpt-oss:20b MXFP4 (native) 約 12 GB ギリギリ可
gpt-oss:20b FP16換算 約 40 GB 論外

20BをFP16で持つと約40GB必要です。コンシューマGPUの範囲を完全に超えます。

つまり「FP16で動かす」という選択肢自体が、12GB級GPUでは7〜8Bの小型モデルにしか存在しません。そしてその小型モデルですら、FP16はQ8と差がない。これが結論を補強します。

実測では、gpt-oss:20bは4070でだいたい毎秒20〜30トークンでした。VRAMにギリギリ収まっている間は実用速度が出ます。ただしnum_ctxを上げて少しでもVRAMからはみ出すと、CPUオフロードが入って一気に1桁台に落ちました。20B級を載せる時点でFP16は議論にすら上がりません。4ビット形式でいかに溢れさせずに収めるか、という別のゲームになります。

gpt-oss:20bはMoE (Mixture of Experts) で、21Bのうち実際に動くのは約3.6Bです。RTX 4070ではVRAMにギリギリ収まりますが、はみ出すとCPUオフロードが発生し速度が一気に落ちます。num_ctxを下げてVRAM内に収める調整が要ります。

「大きい方が良い」を信じてモデルを小さくする愚

ここまでの数字で見える本末転倒があります。

VRAM 12GBで「精度のためFP16」と決めると、載るのは3〜4Bの小型モデルだけになります。FP16は1パラメータ2バイトなので、4Bでも約8GBを占め、コンテキストやKVキャッシュを足すと12GBはすぐ埋まります。一方Q4_K_Mを選べば、同じ12GBに14B級のモデルが載ります。3〜4倍大きいモデルが同じ箱に入る計算です。

量子化による劣化は1〜3%です。一方、14Bと4Bのモデル間の素の能力差はそれよりはるかに大きい。MMLUのようなベンチでは、パラメータ数が3倍違えば二桁ポイント差がつくことも珍しくありません。1〜3%と二桁ポイント、どちらを取るかは明白です。

「精度のためFP16」と言いながら、実際にはモデルサイズを落として大きく精度を失っている。これが私の言う本末転倒です。同じVRAMなら、量子化を許容して大きいモデルを載せる方が賢い。

私はこれを投資の発想で見ています。FP16は「品質を1〜3%買うために、VRAM予算の半分を払う」取引です。同じ予算を「より大きいモデル」に振れば、二桁ポイントのリターンが取れる。限られたVRAMという資本を、リターンの低い方に張るのは合理的ではありません。資本配分の問題として見れば、答えは最初から決まっています。

自分の環境で測る方法

ここまでの数字は私の環境のものです。tok/sもVRAMもGPU・ドライバ・Ollamaのバージョンで変わります。だから最終的には自分で測ってほしいです。手順はそれほど重くありません。

まず評価セットを用意します。自分が普段投げるプロンプトを30〜50問集めるだけで十分です。正解が一意に決まる問 (コード・事実質問) を多めにすると採点が楽になります。

import ollama, time

prompts = load_prompts("eval.jsonl")  # 自分の実タスク30〜50問

for model in ["qwen3:8b", "qwen3:8b-q8_0", "qwen3:8b-fp16"]:
    t0 = time.time()
    n_tok = 0
    for p in prompts:
        r = ollama.generate(model=model, prompt=p, options={"num_ctx": 4096})
        n_tok += r["eval_count"]
    dt = time.time() - t0
    print(model, "tok/s:", round(n_tok / dt, 1))

速度はこのスクリプトで取れます。VRAMは別ターミナルで ollama psnvidia-smi を見ます。正答率は出力を目視か簡単なアサーションで採点します。1モデル30問なら数分で終わります。

大事なのは、ロードに失敗するかどうかを最初に確認することです。FP16が out of memory で落ちるなら、その時点で選択肢から消えます。私の50問でも、FP16は採点に進む前にOOMで脱落しました。測るとは、まずこの「載るか」を確かめることでもあります。

評価セットは一度作れば資産になります。新しいモデルが出るたびに同じセットを流せば、量子化だけでなくモデル間の比較も同じ物差しでできます。私は四半期ごとにこのセットを回して、乗り換え判断に使っています。

それでもFP16が意味を持つ逆転条件

断定はしますが、暴走はさせません。FP16が正解になる条件も明示します。

  1. VRAMが潤沢な場合: 24GB以上 (RTX 4090等) で、欲しいモデルがQ8でもFP16でも余裕で載るなら、FP16にしても損はありません。ただし得もほぼありません。
  2. 量子化前提のファインチューニング: QLoRA等で学習する際、ベースをFP16/BF16で持つ必要がある工程があります。
  3. 数値再現性が要る研究: 量子化の丸めによる出力ブレを排除し、論文レベルの再現性を確保したいケース。
  4. 極端に長い推論チェーン: 多段の論理積み上げや複雑なコード生成では、Q4で1〜3%の劣化が体感差として出ることがあります。ここはQ8やFP16が効く余地があります。

逆に言えば、コンシューマGPUでチャット・要約・一般的なコード生成をする限り、FP16を選ぶ実利はほぼありません。逆転条件はどれも「特殊な前提」を伴います。その前提が自分に当てはまらないなら、迷う理由はありません。

なお4番目の「長い推論チェーン」は、Q4からQ5_K_Mへ一段上げるだけで多くがカバーできます。FP16まで一気に飛ぶ必要はめったにありません。Q5_K_Mは約96%の品質を保ちつつ、FP16の4割程度のサイズに収まります。迷ったらここを刻むのが現実解です。

量子化レベルだけでなくモデルそのものの当たり外れも大きいです。同じ8BでもQwen3とGemma系では得意タスクが違います。量子化を最適化する前に、まず自分のタスクで強いモデルを選ぶ方が効果は大きいです。

量子化レベル選定チェックリスト

最後に、モデルサイズ別・タスク別の推奨を置きます。RTX 4070 12GBクラスを想定した実用指針です。

VRAM 12GBでのモデルサイズ別

  • 7〜8Bモデル: Q5_K_M推奨。VRAMに余裕があり、Q4より一段安心。FP16は不要。
  • 13〜14Bモデル: Q4_K_M推奨。これでギリギリ載る。Q8は溢れる可能性大。
  • 20B級 (MoE): ネイティブのMXFP4/Q4を使う。FP16は論外。num_ctxで微調整。

タスク別

  • チャット・要約・翻訳: Q4_K_Mで十分。差は体感できない。
  • 一般的なコード生成: Q4_K_M。再生成で十分カバーできる範囲。
  • 複雑な多段推論・難度の高いコード: Q5_K_MかQ8_0。1〜3%の劣化が効くタスク。
  • ファインチューニングのベース: FP16/BF16。学習工程の都合。

迷ったときの初手

  • 8B以下ならQ5_K_M、13B以上ならQ4_K_M。
  • FP16は「24GB以上のGPUを持っていて、かつ研究用途」のとき以外は選ばない。
# 迷ったときの初手 (8Bモデル)
ollama pull qwen3:8b-q5_K_M
ollama run qwen3:8b-q5_K_M

# VRAMが厳しい14Bモデル
ollama pull qwen3:14b   # デフォルトQ4_K_M
ollama ps               # VRAM占有を確認してnum_ctx調整

まとめ

  • Q8_0とFP16の正答率・perplexityは統計的に区別できない。FP16は速度もVRAMも不利。
  • Q4_K_MはFP16比で品質97〜99%維持。MMLU劣化は1〜3%で体感困難。
  • imatrix/K-quantが「4ビット=4分の1品質」という直感を過去のものにした。
  • 12GB GPUでFP16に固執すると、載るのは小型モデルだけ。素の能力が落ち、結局精度を失う。
  • 同じVRAMなら量子化を許容して大きいモデルを載せる方が、精度も速度も得をする。
  • FP16が意味を持つのは、潤沢なVRAM・ファインチューニング・数値再現性・極端な推論チェーンに限られる。
  • 迷ったら8B以下はQ5_K_M、13B以上はQ4_K_M。FP16は研究用途以外で選ばない。

皆さんの環境ではQ8とFP16の差を体感できますか。もし「このタスクでははっきり差が出た」という反例があれば、ぜひ教えてください。私の50問では出ませんでした。逆転条件の精度を一緒に詰めたいです。

面白くいきましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?