12GBに収まったのにQwen3:14bなどが遅くなっていく?〜Intel Arc B580ローカルLLM 第4話

本ページは広告(アフィリエイトプログラム)を含みます。詳しくはプライバシーポリシーをご覧ください。
第3話で Intel Arc B580 のサイズ別速度を測ったとき、1つだけ説明のつかない結果が残りました。本体が12GBに収まるはずの14Bモデルが、より大きい12Bモデルより3倍以上も遅かったのです。 本記事では、その原因を追いました。結論を先に書きます。原因はモデル本体の大きさではなく「文脈の長さ(一度に扱える入力の量)」でした。文脈を長く設定すると、その作業メモリがVRAMを食い潰し、あふれた分がCPUに落ちて急激に遅くなります。しかもこの起きやすさはモデルによって大きく違いました。 測定は デスクトップPCの PCIe スロットに直挿しした B580 のみを使い(比較用の RTX 3090 はこの実験では一切使っていません)、Vulkan と Ollama で計測しました。2026年7月時点の実測です。 前回の記事はこちら

使用した機器の概要

使用したデスクトップは、下記のとおりです。このPCにIntel Arc B580を追加しました。
CPURyzen 9 3950X
マザーボードX570
メモリー64GB
GPURTX 3090、Intel Arc B580(今回追加)
OSUbuntu
スポンサーリンク

目的:収まっているのに遅い謎を解く

第3話の測定で、qwen3:14b(本体のVRAM使用量 5.9GB)の decode(文章を生成する速さ)が 9.14 tok/s しか出ませんでした。同じ表で gemma4-12b(6.9GB)は 29.95 tok/s です。より小さくVRAMに収まっているはずの14Bが、大きい12Bの3分の1以下という、順序の逆転が起きていました。 このときの配置検証は「RTX 3090 側に載っていないこと」しか確認できておらず、CPUへのあふれを見ていませんでした。そこで、あふれを直接観測できる形で測り直しました。

実験内容:文脈長を変えて速度と配分を見る

Ollama の num_ctx(一度に扱える文脈の長さ)を 2048 から 32768 まで4段階で変え、それぞれで次を測りました。
  • decode(tok/s)… 文章生成の速さ
  • GPU と CPU の処理配分(Ollama が報告する割合)… どれだけCPUに落ちたか
あふれ先を確実にCPUに限定するため、Ollama に B580 だけを見せ、RTX 3090 は完全に隠しました(環境変数で Vulkan と CUDA の両方から 3090 を除外)。これで、あふれた処理は 3090 ではなくCPUへ行きます。実験中、3090 のVRAM使用量は最初から最後まで 285MB のまま動かず、意図どおり不使用でした。 比較対象として、第3話で素直な結果だった gemma4-12b も同じ条件で測りました。
スポンサーリンク

結果:qwen3:14b は文脈長とともにCPUへ落ちた

モデル文脈長decodeGPU / CPU 配分
qwen3:14b
(本体5.9GB)
2,04836.11100% GPU
8,19228.6493% GPU / 7% CPU
16,38413.8382% GPU / 18% CPU
32,7689.0067% GPU / 33% CPU
gemma4-12b
(本体6.9GB・対照)
2,04830.54100% GPU
8,19230.51100% GPU
16,38430.50100% GPU
32,76830.57100% GPU
Intel Arc B580・Vulkan(Mesa 26.1.5)・Ollama・デスクトップPCに直挿し・B580のみ使用。2026年7月時点の実測。

qwen3:14b の decode 速度(文脈長を上げるほど遅くなる・tok/s)

文脈2,048(100% GPU)
36.11 tok/s
文脈8,192(7% CPU)
28.64 tok/s
文脈16,384(18% CPU)
13.83 tok/s
文脈32,768(33% CPU)
9 tok/s

文脈長を上げるとKVキャッシュがVRAMを圧迫しCPUへあふれる。gemma4-12bは全文脈長で100%GPU・約30.5 tok/s一定。

はっきり分かれました。qwen3:14b は文脈長を上げるほどCPUの割合が増え、36 → 9 tok/s まで落ちます。文脈32,768での 9.00 tok/s は、第3話で出た 9.14 tok/s とほぼ一致しました。あの遅さは、モデルが大きいからではなく、既定の文脈長が大きくてCPUにあふれていたためだったと確定します。 【追記 2026-07-31】この記事で測ったのは文脈長32,768までです。その後さらに伸ばして測り直したところ、32,768を超えると落ち続けず、頭打ちになりました。B580では65,536で7.86、131,072で8.03 tok/s。別のGPU(RTX 3060をThunderboltで接続)でも同じ形で、32,768で20.09、65,536で17.87、131,072で18.07 tok/s でした。CPUへ回る割合が飽和するためで、伸ばすほど際限なく遅くなるわけではありません。 注目すべきは、文脈を短く(2,048)すればフルにGPUへ載り、36 tok/s と gemma4-12b(30.5)を上回った点です。14Bモデルが12Bより速いこと自体は、収まってさえいれば普通に起こります。 対照の gemma4-12b は、文脈を32,768まで上げても 100% GPU のまま 30.5 tok/s で一定でした。同じ12GBのカードでも、モデルによってあふれやすさがまったく違います。

考察:12GBは「本体サイズ」だけでは語れない

VRAMを使うのはモデル本体だけではありません。文章を読み進めるほど増えていく作業メモリ(KVキャッシュと呼ばれる、これまで読んだ内容を覚えておく領域)も、文脈が長いほど大きくなります。
12GBのVRAMの中身
モデル本体(固定)+ 作業メモリ=KVキャッシュ(文脈長に比例して増える) + 計算用の余白
本体が5.9GBでも、長い文脈のKVキャッシュを足すと12GBを超える → あふれた分がCPUへ
qwen3:14b と gemma4-12b で差が出たのは、モデルごとにこの作業メモリの太さが違うためです。gemma4 系は作業メモリを小さく保つ設計(近い範囲だけを見る仕組みなどを持つ)で、長い文脈でも溢れませんでした。qwen3:14b は作業メモリが太く、文脈を伸ばすと早々に12GBを超えます。 この作業メモリを圧縮すれば解決するのか、も試しました。結果を先に書くと、Ollama 0.30系では設定が効きませんでしたOLLAMA_KV_CACHE_TYPE を f16 / q8_0 / q4_0 と変えても速度が完全に一致し、内部のログを見ると指定が llama-server 側へ渡っていませんでした。圧縮が効かないのではなく、設定そのものが無視されています。試すなら llama.cpp を直接動かして --cache-type-k / --cache-type-v を指定する必要があります。 あふれ方には2種類あることも分かりました。1つは今回の文脈であふれる型。もう1つは、そもそも本体が12GBに入らない本体であふれる型です。第3話で測った nemotron-3-nano:30b は後者で、本体が入りきらず大半がCPUに載っても 14 tok/s を保ちました。これは実際に働く部分だけを小さく持つ設計(MoE)のおかげで、あふれても実用速度が残る例でした。
スポンサーリンク

まとめ

Intel Arc B580 のような12GBのカードでローカルLLMを選ぶときは、モデル本体のサイズだけを見ても足りません。実際に使う文脈の長さと、そのモデルの作業メモリの太さ次第で、収まるはずのモデルがCPUにあふれて何倍も遅くなります。 実用上の対策はシンプルです。Ollama なら num_ctx を必要な長さまで絞れば、あふれずにGPUへ載ることがあります。今回の qwen3:14b も、文脈を 2,048 にすれば 36 tok/s で快適に動きました。長い文脈がどうしても要る用途では、gemma4 系のように作業メモリを小さく保つモデルを選ぶ、という判断もできます。 本記事の数値は2026年7月時点・当環境(B580直挿し・Mesa 26.1.5・Ollama)のものです。

参考にしたサイト

検証に使用した機材

Intel Arc B580

¥48,410 (2026-07-24時点)

スポンサーリンク