ローカルLLM 実行計画

RTX 3050 Ti Laptop(VRAM 4GB)/RAM 32GB のノートPCで動かすための、ソフトウェア選定・入手方法・モデル選定・導入手順
📅 作成: 2026-08-24 / 更新: 2026-10-10

目次

  1. 前提 — このPCで何がどこまで動くか
  2. 実行ソフトウェアの候補と比較
  3. 選択 — llama.cpp を主軸にする
  4. 入手方法 — 配布バイナリか自前コンパイルか
  5. モデルの選択 — 手持ち資産の棚卸し
  6. 量子化・VRAM配分・コンテキスト長
  7. 新規ダウンロードの検討 — 最新量子化とMoE
  8. 導入手順(ステップ計画)
  9. 検証計画と評価基準
  10. 実測結果 — 2026-08-25

この文書の位置づけ

ローカルLLMを常用できる状態にするまでの計画をまとめる。実行環境は本PCの実測値をそのまま前提とし、 「どのソフトウェアを使うか」「実行ファイルをどう入手するか」「どのモデルを使うか」「何を追加取得するか」の4つの選択について、 候補を並べたうえで採用案とその理由を示す。実際のインストール作業は本文書で合意が取れてから着手する。

前提 — このPCで何がどこまで動くか

実測したハードウェア構成

項目実測値LLM実行上の意味
CPUIntel Core i7-11370H(4コア8スレッド)CPU推論のフォールバックとしては非力。4コアなのでCPUオフロードは速度が伸びない
RAM15.8 GB → 31.8 GB当初は 15.8 GB で、第10章の実測はこの状態で行った。その後 32GB に増設。CPU 側に重みや KV キャッシュを置く余裕が増えた
GPUNVIDIA GeForce RTX 3050 Ti LaptopCUDA が使える。世代は Ampere で、GGUF の主要量子化はすべて対応
VRAM4096 MiB(4 GB)最大の制約ここが計画全体を決める
ドライバ592.82十分に新しい。CUDA 12.x 系のバイナリがそのまま動く
内蔵GPUIntel Iris Xe画面表示はこちらに任せる。NVIDIA 側の VRAM をほぼ全部 LLM に使える
空き容量C: 約 385 GBモデルを何本置いても問題にならない
既存環境LM Studio 導入済みlms コマンドが存在する
Ollama導入後アンインストール済み一度使ったうえで LM Studio に置き換えた経緯がある。再導入しない前提
利用実績Claude Code → LM Studioローカルの OpenAI 互換API に Claude Code から問い合わせる形で使用した経験がある。接続方式が既に確立している
ビルド環境Visual Studio・CUDA Toolkit・CMake いずれも未導入自前コンパイルには追加インストールが要る(第4章)。Git は導入済み

結論としての実行可能ライン

VRAM 4GB は「小型モデルなら完全にGPUに載る/中型モデルは載らない」の境目にあたる。 4bit量子化での目安は次のとおり。

パラメータ数Q4_K_M の重み4GB VRAM での扱い計画時の予測実測
RAM 16GB
実測
RAM 32GB
3〜4B2.0〜2.6 GB全層GPUコンテキストも余裕をもって取れる25〜40 tok/s56 tok/s59 tok/s
7〜8B4.5〜5.0 GB部分オフロード6〜7割をGPU、残りをCPU6〜10 tok/s8 tok/s15 tok/s
12〜14B7.3〜9.0 GBほぼCPU実行GPUは3割程度しか担えない2〜3 tok/s未測定未測定
30B級(密)18 GB 前後不可RAM 16GB には収まらない。32GB なら RAM には載る——未測定
20B級(MoE)11 GB 前後エキスパートをCPUへRAM 16GB では RAM が律速になる—5.9 tok/s19 tok/s
この表の「パラメータ数」による仕分けには例外がある。 Per-Layer Embeddings を持つ Gemma の E系(E2B / E4B)は、 パラメータ数の割に GPU に載る量が少なく、上の分類より1段速い側に着地する。 実測では 7.52B の E4B が 45 tok/s と、4Bクラスに近い速度で動いた(第10章)。

実行ソフトウェアの候補と比較

ローカルでLLMを走らせる手段は大きく4系統ある。本PCの制約(VRAM 4GB・Windows・単一ユーザー)で現実的なものを並べる。

候補A — llama.cpp(llama-server / llama-cli)

GGUF形式の量子化モデルを実行するC++実装。GPUに載りきらない分をCPUに逃がす「部分オフロード」を層単位で制御できる。 公式リリースに Windows 向け CUDA ビルド済みバイナリがあり、コンパイルは不要。

候補B — Ollama 評価済み・不採用

内部で llama.cpp を使いつつ、モデル取得・常駐サーバ・APIを一体化したツール。ollama run qwen3:4b の一行で動き出す。 本PCでは一度導入したうえで、LM Studio に置き換える判断が既に下されている。

候補C — LM Studio 導入済み・使用実績あり

GUIアプリ。モデル検索・ダウンロード・チャット・ローカルAPIサーバまで画面上で完結する。 本PCでは Claude Code から LM Studio のローカルAPIに問い合わせる形で使った実績があり、外部ツールとの接続まで確認できている。

候補D — vLLM / TGI / TensorRT-LLM

サーバ用途の高スループット推論エンジン。

比較表

観点llama.cppOllamaLM StudiovLLM 系
導入の手軽さ中(zip展開)高高(導入済み)低
4GB VRAM での詰め高中中不可
設定の再現性高(コマンド行)中低(GUI)高
API提供OpenAI互換独自+OpenAI互換OpenAI互換OpenAI互換
環境の汚れにくさ高(フォルダ完結)低(常駐サービス)中低
モデル入手手動自動GUI検索手動

選択 — llama.cpp を主軸にする

採用案

役割採用するもの理由
本番の実行基盤llama.cpp(CUDAビルド済みバイナリ)VRAM 4GB では「何層GPUに載せるか」の1〜2層の差が体感速度を左右する。そこを直接指定できるのが決め手
モデルの下見LM Studio(導入済みを流用)候補モデルの日本語品質を短時間で比較するのに向く。GGUFの入手経路としても使える
バイナリの入手公式配布のCUDAビルド
(コンパイルは条件付きで後日)
第4章で比較する。まずは追加インストールなしで動かし、必要が生じた時点でビルド環境を整える
Ollama再導入しないllama.cpp と役割が重複する。過去に導入して LM Studio に置き換えた経緯があり、判断を覆す材料が今のところ無い

llama.cpp を主軸に置く理由

1. 制約が厳しいほど、細かい制御が効く

4GBという枠では、7〜8Bモデルを「載る範囲だけGPUに置く」運用が現実的な選択肢になる。 llama.cpp は -ngl(GPUに載せる層数)を整数で指定でき、KVキャッシュ自体も量子化して容量を空けられる。 GUIのスライダーや自動判定に任せると、ここで数tok/sを取りこぼす。

2. 設定が一行のコマンドとして残る

起動オプションをそのまま .cmd ファイルに書けるので、「どの設定で何 tok/s 出たか」を文書と対応づけて記録できる。 第7章の検証計画は、この再現性があって初めて成立する。

3. プロジェクトフォルダで完結する

バイナリ・モデル・起動スクリプトをすべてこのプロジェクト配下に置ける。 不要になったらフォルダごと消せばよく、システムに残るものがない。

想定するフォルダ構成

20260824-local-llm-llama-cp/
├─ bin/
│   └─ llama.cpp/          … 公式配布のCUDAビルド一式を展開
├─ tools/50_run/
│   ├─ run-server.cmd       … llama-server の起動
│   └─ bench.cmd            … llama-bench による速度計測
├─ notes/10_plan/           … 本文書
├─ etc/                     … 補助スクリプト(git管理外)
└─ tmp/                     … 一時ファイル(git管理外)

C:\AI-models\                … GGUF の実体(LM Studio と共用・移動しない)

モデルは既に C:\AI-models にあり、LM Studio と共用する。 プロジェクト配下に複製せず、起動スクリプトから絶対パスで参照する(第7章 Step 2)。

LM Studio を残す狙いはモデル選定の高速化にある。 第4章の候補は最終的に1〜2本に絞るが、その判断は実際に日本語で数往復させてみないと下せない。 llama.cpp で毎回コマンドを組み立てるより、GUIで切り替えたほうが試行回数を稼げる。

入手方法 — 配布バイナリか自前コンパイルか

llama.cpp を使うと決めたうえで、実行ファイルをどう手に入れるかにさらに選択がある。 公式が Windows 向けのビルド済みバイナリを配布しているので、コンパイルは必須ではない。

準備コストの比較

案A — 配布バイナリを展開する zip 追加で入れるもの: なし / ダウンロード 約 200 MB / 所要 5〜10 分 GPUドライバ(導入済み 592.82)だけで動く 案B — 自分でコンパイルする(CUDA) VS 2022 Build Tools 約 8 GB・未導入 CUDA Toolkit 12.x 約 5 GB・未導入 CMake 0.1 GB ソース 合計 約 13 GB のインストール + ビルド 30〜90 分(4コアCPU) + 更新のたびに再ビルド ※ 推論速度そのものは案Aと案Bで変わらない。同じCUDAカーネルが動く

案A — 公式配布のビルド済みバイナリ

案B — 自分でコンパイルする(CUDAバックエンド)

必要な準備(本PCの現状を実測)

必要なもの現状役割容量
Visual Studio 2022 Build Tools
(C++によるデスクトップ開発)
未導入MSVCコンパイラ・Windows SDK。CUDAのホスト側コンパイラとして必須約 8 GB
CUDA Toolkit 12.x未導入
(nvcc なし)
GPUカーネルをコンパイルする nvcc と cuBLAS約 5 GB
CMake未導入ビルド構成の生成約 100 MB
Git導入済みソースの取得と更新—
Ninja(任意)未導入MSBuild より並列ビルドが速い。無くてもよい数 MB

導入コマンド(順序が重要)

REM 1) まず CMake
winget install Kitware.CMake

REM 2) 次に Visual Studio Build Tools(C++ワークロードを明示的に選ぶ)
winget install Microsoft.VisualStudio.2022.BuildTools

REM 3) 最後に CUDA Toolkit
winget install Nvidia.CUDA
CUDA Toolkit は Visual Studio より後に入れる。 CUDAのインストーラは既存のVisual Studioを検出してビルド統合を書き込む。 順序を逆にすると統合が入らず、CMakeがCUDAコンパイラを見つけられない。入れ直しになるので最初から順序を守る。

Build Tools は winget で入れた後、Visual Studio Installer を開いて 「C++によるデスクトップ開発」ワークロードにチェックが入っているか確認する。 既定では最小構成しか入らず、MSVCコンパイラ本体が欠けることがある。

ビルド手順

git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=86
cmake --build build --config Release -j 4
オプション意味
-DGGML_CUDA=ONCUDAバックエンドを有効にする。これが無いとCPU専用バイナリになる
-DCMAKE_CUDA_ARCHITECTURES=86RTX 3050 Ti(Ampere)の compute capability は 8.6。ここを絞らないと全世代向けにカーネルを吐き、ビルド時間が数倍になる
-j 4物理コア数に合わせる。8スレッドあるが、メモリを食うので4が無難

成果物は build\bin\Release\ に出る。所要時間は本PCの4コアで 30〜90分を見込む。 CUDAカーネルのコンパイルが支配的で、CPUが遅いほど伸びる。

利点と欠点

案C — 自分でコンパイルする(Vulkanバックエンド)

CUDAの代わりに Vulkan を使うビルド。-DGGML_VULKAN=ON を指定する。 CUDA Toolkit(5GB)が不要になり、代わりに Vulkan SDK(約 1GB)だけで済む。

Vulkan は「NVIDIAが使えない環境に持っていく」場合の逃げ道として覚えておく位置づけにとどめる。

採用案

時期採用理由
実施済み初期構築案A(配布バイナリ)
b10612 / CUDA 12.4
本計画の目的は「動く環境を作ってモデルを評価する」ことにあり、ビルド環境の構築はその前提ではない。実際の所要は約20秒(ダウンロード12秒+展開8秒)で、13GBと数時間を先払いせずに済んだ
条件付き後日案B(CUDAコンパイル)下のトリガーのどれかを踏んだ時点で着手する
保留案C(Vulkan)CUDAが使える本PCでは優先度が低い

案Bに切り替えるトリガー

  1. 使いたいモデルの対応が最新コミットにしか入っておらず、リリースを待てない
    未発動b10612 で gemma-4 / Qwen3.5 / Ministral-3 / Nemotron-3 すべて読み込めた
  2. 配布バイナリが本PCで起動しない、または特定の量子化で不正な出力が出る
    未発動CUDA 12.4 版がそのまま動作
  3. llama.cpp のコード自体に手を入れて試したいことが出てきた
  4. ビルド環境が他の用途(C++開発)でも必要になり、13GBが本計画だけの負担でなくなった

実測の結果、1・2 はいずれも発動しなかった。当初は手持ちに新しい系列が多いことから アーキテクチャ未対応を懸念していたが、リリースの更新が追いついていた。 案Bは当面必要ない。

ディスクは足りている。制約は時間のほう。 C: の空きは約 385 GB あるので、13 GB の追加インストール自体は問題にならない。 案Bを後回しにする判断は容量ではなく、「ビルド環境の整備がモデル評価を始めるまでの時間を数時間押し下げる」ことによる。

モデルの選択 — 手持ち資産の棚卸し

モデルは新規に選ぶのではなく、既に C:\AI-models にあるものから選ぶ。 まずサイズ帯ごとの性格を押さえ、そのうえで手持ちを仕分ける。

サイズ帯ごとの性格

3〜4B クラス 重み 約 2.0〜2.6 GB 全層がVRAMに載る 25〜40 tok/s ◎ 日常使いの本命 7〜8B クラス 重み 約 4.5〜5.0 GB 6〜7割をGPUに載せる 6〜10 tok/s ○ 品質重視の予備 12〜14B クラス 重み 約 7.3〜9.0 GB 大半がCPU側に残る 2〜3 tok/s △ 対話には遅すぎる VRAM 4GB・Q4_K_M 量子化を前提とした比較

手持ちのモデル資産

C:\AI-models に LM Studio 経由で取得済みのGGUFが 26ファイル・約 86.0 GB ある (当初 30ファイル・98.5 GB あったが、後述のとおり重複分を整理した)。 新規ダウンロードを検討する前に、この中から選べるかを確認する。以下は本体モデル(mmproj を除く)の一覧。

モデル量子化サイズ4GB VRAM での見込み
Ministral-3-3B-Instruct-2512Q4_K_M2.00 GB全層GPU最軽量。速度の上限を測る基準に使える
gemma-3-4b-itQ4_K_M2.32 GB全層GPU安定して動く世代。比較の対照として有用
Qwen3-4B-Instruct-2507Q4_K_M2.33 GB全層GPU第一候補。既に手元にある
Qwen3-4B-Thinking-2507Q4_K_M2.33 GB全層GPU思考過程を出す版。トークンを多く消費するため体感は遅くなる
NVIDIA-Nemotron-3-Nano-4BQ4_K_M2.64 GB全層GPUここまでが余裕をもって載る範囲
deepseek-coder-6.7b-instructQ3_K_S2.75 GB全層GPU載るが Q3_K_S は劣化が大きく、モデル自体も世代が古い
gemma-4-E2B-itQ4_K_M3.19 GBほぼ載るコンテキストを短くすれば全層に届く
DeepSeek-R1-0528-Qwen3-8BQ4_K_M4.68 GB部分オフロード推論特化。出力が長く、遅さが二重に効く
gemma-4-E4B-itQ4_K_M4.97 GB実測 45.2 tok/sPLE の 2730 MiB が CPU に分離され、GPU には 2868 MiB しか載らない。この表の予想を覆した(第10章)
Qwen3.5-9BQ4_K_M5.24 GB実測 8.1 tok/s-ngl 24 +KV量子化が最適点
GLM-4.6V-FlashQ4_K_M5.74 GB部分オフロード視覚モデル。テキスト用途なら選ぶ理由が薄い
gemma-4-12B-it-QATQ4_06.50 GB大半がCPUQAT版は同サイズで品質が高いが、速度が足りない
gemma-4-12B-itQ4_K_M6.87 GB大半がCPU対話には遅すぎる
Ministral-3-14B-Reasoning-2512Q4_K_M7.67 GB大半がCPU推論特化+大型で、体感は最も遅い部類
Qwen2.5-Coder-14B-InstructQ4_K_M8.37 GB大半がCPUコード用途としては魅力だが本PCでは待たされる
gpt-oss-20bMXFP411.28 GBMoEとして再評価総サイズは重いが active は 3.6B。第7章で --n-cpu-moe による実測対象にする

「動くもの/動かないもの」の切り分け

手持ちに動かないモデルがあるとのことなので、原因を3つに分けて判別する。対処が全く違う。

原因1 — メモリ超過(サイズで判別できる)

上表で 大半がCPU 以下に該当するもの。 LM Studio が GPU に全部載せようとして失敗するか、載っても極端に遅い。 llama.cpp で -ngl を明示的に下げれば「動く」状態には持ち込める(速度は別問題)。 サイズと VRAM の引き算で事前に予測でき、原因としては最も分かりやすい。

原因2 — ランタイムがアーキテクチャに未対応

手持ちには gemma-4・Qwen3.5・Ministral-3・GLM-4.6V・Nemotron-3 といった新しい系列が多い。 GGUF は同じ拡張子でも中のアーキテクチャ識別子が違い、ランタイムが未対応だと 読み込み時点で「unknown model architecture」等のエラーで即座に失敗する。 サイズが小さくても落ちるのが特徴で、原因1と区別できる。

原因3 — mmproj(視覚アダプタ)の扱い

mmproj-*.gguf は画像入力用の投影器で、単体では動かない。本体モデルとペアで指定して初めて機能する。 手持ちでは gemma-3-4b / gemma-4 系 / GLM-4.6V / Ministral-3 / Qwen3.5 に付属している。

判別は「落ちるまでの速さ」で見当がつく。 読み込み開始直後にエラーで止まるなら原因2、進捗が進んでからメモリ関連で落ちるなら原因1。 起動はするが画像を渡すと失敗するなら原因3。

採用案

位置づけモデル採用理由
第一候補Qwen3-4B-Instruct-2507
(Q4_K_M・2.33 GB)
全層をVRAMに載せてなお余裕があり、コンテキストを長く取れる。小型帯では日本語の破綻が少ない。既に手元にありダウンロード不要。実測 56.5 tok/s で確定
第二候補
(実測後に昇格)
gemma-4-E4B-it
(Q4_K_M・4.97 GB)
当初は「部分オフロード枠」と見ていたが、実測 45.2 tok/s。7.52B の品質を 4B クラスの速度で使えるため、品質重視の枠はこちらに置き換わった
用途限定
(当初の第二候補)
Qwen3.5-9B
(Q4_K_M・5.24 GB)
実測 8.1 tok/s。対話には遅く、E4B に役割を譲った。バッチ処理など待てる作業向け
対照gemma-3-4b-it
(Q4_K_M・2.32 GB)
同じサイズ帯で系列の異なるモデル。Qwen3-4B の評価が「このサイズの限界」なのか「このモデルの癖」なのかを切り分ける
保留Qwen2.5-Coder-14Bコード用途は魅力だが 8.37 GB は本PCに重い。必要になれば同系列の 7B を新規取得する
別枠gpt-oss-20b
(MXFP4・11.28 GB)
MoEなので密モデルの尺度では測れない。第7章で --n-cpu-moe による実測にかける
対象外12B以上の密モデル対話に耐える速度が出ない。保管はしておくが今回の検証からは外す

初期構築に新規ダウンロードは要らない。第8章の Step 2 は「取得」ではなく「手持ちからの選定」になる。 そのうえで、最新の量子化形式とMoEには手持ちに無い伸びしろがあるため、第7章で別途検討する。

重複の整理 2026-08-25 実施済み

棚卸しの過程で、同じモデルが gemma\ と lmstudio-community\ の2箇所に置かれているものが見つかった。

同一性の検証

削除の前に、本当に同じものかを確かめた。結論から言うと、バイト単位では同一ではなかった。

ファイルgemma\ 側lmstudio-community\ 側差
gemma-4-12B-it-QAT-Q4_0.gguf6,975,878,560 B6,975,879,008 B448 B
mmproj-gemma-4-12B-it-QAT-BF16.gguf175,115,328 B175,115,328 B0 B
gemma-4-E4B-it-Q4_K_M.gguf5,335,289,664 B5,335,291,936 B2,272 B
mmproj-gemma-4-E4B-it-BF16.gguf991,551,840 B991,551,840 B0 B

最初に異なるバイトは先頭から 244 バイト目、つまり GGUF のメタデータ領域にあった。中身を読むと差は変換元リポジトリ名だけだった。

gemma\ 側            : general.name     = "Gg Hf Qat_Gemma 4 12B It Qat Q4_0 Unquantized"
                       general.basename = "gg-hf-qat_gemma-4"
lmstudio-community\ 側: general.name     = "Google_Gemma 4 12B It Qat Q4_0 Unquantized"
                       general.basename = "google_gemma-4"

テンソルデータ側は、末尾から 5GB / 2GB / 0.5GB の3地点で 8MB ずつハッシュを取って照合し、すべて一致した。 同じ量子化結果を、変換元リポジトリ名だけ違う形で2回取得していたことになる。

LM Studio 側の見え方

lms ls で確認すると、LM Studio は両方を別モデルとして認識していた。

gemma/gemma-4-12b-it-qat            12B    gemma4    7.15 GB
google/gemma-4-12b-qat (1 variant)  12B    gemma4    7.15 GB   ← lmstudio-community\ 側
gemma/gemma-4-e4b-it                7.5B   gemma4    6.33 GB
google/gemma-4-e4b (1 variant)      7.5B   gemma4    6.33 GB   ← lmstudio-community\ 側

同じモデルが一覧に2回並ぶ状態で、片方を消しても残った方は認識され続ける関係にあった。

実施した内容と結果

lmstudio-community\ 側の4ファイルを削除し、空になったフォルダも併せて片付けた。

項目実施前実施後
GGUF 総量98.51 GB85.96 GB
ファイル数3026
C: 空き容量384.82 GB397.37 GB
LM Studio 認識モデル数1917

削除後、LM Studio の一覧では残った側の修飾が外れて gemma-4-12b-it-qat / gemma-4-e4b-it と表示されるようになった。 同名の競合が解消されたためで、モデル自体は引き続き両方とも使える。

「サイズが同じだから重複」で消すと危ない。 今回は GB 単位に丸めた表示が一致していただけで、実際には数百〜数千バイトの差があった。 差がメタデータだけと確認できたから削除できたのであって、 テンソル側に差があれば別リビジョンとして両方残す判断になっていた。

量子化・VRAM配分・コンテキスト長

量子化レベルの選び方

量子化1パラメータ
あたり
品質判断
Q8_0約 8.5 bitほぼ無損失重すぎ4Bでも 4.3GB で枠に入らない
Q6_K約 6.6 bit劣化がほぼ分からない3Bまで4Bだと 3.3GB でコンテキストを圧迫
Q5_K_M約 5.7 bitわずかに劣化4Bの上振れ案約 2.9GB。速度に余裕があれば試す
Q4_K_M約 4.8 bit実用上の標準既定容量と品質の釣り合いが最も良い
Q3_K_M約 3.9 bit劣化するが踏みとどまる条件付き大きいモデルを載せる時の選択肢。Q3_K_S とは別物として扱う
Q3_K_S約 3.5 bit明確に崩れる避ける同じ3bitでも Q3_K_M より大きく落ちる
Q2_K約 3.0 bit破綻が目立つ密モデルでは使わないMoEでは例外(第7章)

実測データ — どこで品質が落ちるか

Llama-3.1-8B-Instruct に対して13種類の量子化を横並びで評価した結果がある。 下表の「ベンチ平均」は GSM8K・HellaSwag・IFEval・MMLU・TruthfulQA の非加重平均。

形式サイズPerplexity
(WikiText-2)
ベンチ平均F16比
F16(基準)15.3 GiB7.3269.47—
Q8_08.14 GiB7.3369.41−0.09%
Q6_K6.28 GiB7.3569.23−0.35%
Q4_K_S4.47 GiB7.6269.17−0.43%
Q3_K_M——68.07−2.02%
Q3_K_S3.49 GiB8.9665.49−5.73%

読み取れること

Q2_K は上の評価には含まれていないが、別途 7B モデルで測った結果では perplexity の悪化が Q4_K_M の約16倍(+0.8698 対 +0.0535)。 3B クラスでは特定タスクが 0.0% になる報告もある。

同じファイルサイズなら、小さいモデルの Q4 が大きいモデルの Q2 に勝つ。 Q2 の劣化がモデルサイズの利得を食い潰すため。ただしこれは Q2 まで落とした場合の話で、 Q4 同士なら大きいモデルが有利になる(「Q4 と F16 の差は、同系列の 7B と 14B の差より小さい」)。 密モデルで 4GB に押し込むために Q2 まで下げるのは、ほぼ確実に損な取引になる。

I-quant(imatrix)という選択肢

IQ で始まる形式は、代表的なテキストで各重みの重要度を測った行列(imatrix)を使い、 効きの大きい重みにビットを厚く配る。同じビット数でも K-quant より品質が高くなる。

形式K-quant との関係本PCでの用途
IQ4_XSQ4_K_M と同等品質で約1割小さい有力9Bクラスを全層GPUに近づける
IQ3_M / IQ3_XSIQ3_XS ≒ Q3_K_M の品質でやや小さい条件付き全層GPU化と引き換えに品質を払う
IQ2_M2bit帯では最良の部類MoE限定密モデルには使わない

効き目が最も大きいのは Q2・Q3 の低ビット帯。均一な量子化が破綻し始める領域ほど、重要度による配分が生きる。 逆に言えば Q4 以上ではあまり差がつかない。

imatrix の質に依存する。 キャリブレーションが不適切な I-quant は、同ビットの K-quant より劣ることがある。 配布元が imatrix を明示しているものを選ぶ。また I-quant は復号の計算が K-quant より重く、 CPUオフロード比率が高い構成では「小さいのに遅い」ことがある。

1bit帯は選択肢に入らない

Q1_K のような K-quant は存在しない。1bit帯にあるのは I-quant と三値量子化で、いずれも本PCでは使い道がない。

形式bpw位置づけ
IQ1_S1.5670B以上の巨大モデルを無理やり載せる時のみ
IQ1_M1.75同上。IQ1_S よりやや余裕がある
TQ1_01.69三値(−1/0/+1)。BitNet系のように最初から三値で学習されたモデル専用
TQ2_02.06同上

TQ系は通常のモデルを変換しても意味がなく、IQ1系を 4B や 9B に適用すれば完全に崩壊する。 本計画では対象外

4GB をどう配分するか

Qwen3-4B Q4_K_M — 全層がGPUに載る。実測 56.5 tok/s モデル重み 2.32 GiB 全層をGPUへ(-ngl 99) KV+計算 約 0.5 GB 画面表示など 808 MiB(実測) 空き Qwen3.5-9B Q4_K_M — 重みが枠を超えるため、一部の層はCPU側に残る。実測 8.1 tok/s GPUに載せる重み 約 2.4 GB -ngl 24(これ以上は超過する) KV q8_0 画面表示など 808 MiB(実測) CPU側(RAM)に残る重み 約 2.8 GB ← 速度低下の原因 この比率が、そのまま tok/s の落ち込みになる ← 横幅全体が VRAM 4095 MiB。うち 808 MiB は起動前から使われている →

コンテキスト長の設定

KVキャッシュはコンテキスト長に比例してVRAMを食う。長さを倍にすればキャッシュも倍になる。 本PCでは以下を出発点とする。

モデルコンテキスト備考
Qwen3-4B8192実測で確定画面表示が VRAM を使っていた状態では、16384 にすると KV が VRAM を超えて 1.30 tok/s に崩壊した(第10章)。画面表示を内蔵GPU に任せ、KV を q8_0 にすれば 16384 で 27 tok/s(第10章の再測定)
Qwen3.5-9B4096KVを削って重みを1層でも多くGPUに載せるほうが速い
gemma-4-E4B8192KVが 14 MiB しか要らない(SWA + shared_kv_layers=18)ため、この系列だけは余裕がある

KVキャッシュ量子化という手

llama.cpp は KVキャッシュ自体を8bit量子化できる(--cache-type-k q8_0 --cache-type-v q8_0)。 キャッシュ容量がおよそ半分になるので、その分を重みのオフロードに回せる。 8Bモデルを載せる場合はこれを併用する前提で層数を決める。

画面表示を内蔵GPUに逃がすと 0.3〜0.5GB 取り戻せる。 Windowsの「グラフィックスの設定」でブラウザやエディタを省電力(Iris Xe)側に割り当てると、 NVIDIA側のVRAMが空く。8Bモデルでは、この差がオフロード1〜2層分に相当する。

新規ダウンロードの検討 — 最新量子化とMoE

第5章のとおり手持ちだけでも始められるが、手持ちの大半は Q4_K_M の密モデルに偏っている。 量子化形式とMoEアーキテクチャの2つの軸には、4GB VRAM という制約に対して効く選択肢が残っている。 容量は 385 GB 空いているので、取得コスト自体は低い。

軸1 — 量子化形式

形式ごとの品質・サイズの関係は第6章にまとめた。新規取得の観点で効くのは IQ4_XS で、 Q4_K_M と同等品質のまま約1割小さく、9Bクラスを全層GPUに近づけられる。 ここでは手持ちにある特殊な形式2つと、誤解しやすい QAT の位置づけを整理する。

QAT はサイズを減らす技術ではない

手持ちの gemma-4-12B-it-QAT-Q4_0(6.50 GB)を見て 「QAT なら大きくても VRAM に載るのでは」と考えたくなるが、これは成り立たない。

そして gemma-4-12B-it-QAT は密モデルなので、次節の MoE のようなエキスパート退避も効かない。 毎トークン全パラメータが必要で、6.50 GB を 4 GB に収める方法がない。 4GB VRAM では動かない

手持ちにある特殊な形式

形式仕組み該当する手持ち
Q4_0(QAT)量子化前提の再学習済み。同サイズで品質が高いgemma-4-12B-it-QAT
MXFP44bit浮動小数点。ブロック共有の指数を持つgpt-oss-20b

軸2 — MoE(Mixture of Experts)

密モデル(例: 9B)— 毎トークン、全パラメータを計算する 9B すべてを計算 メモリ 5.2 GB / 計算量 9B 相当 メモリも計算量も同じ大きさ MoEモデル(例: 30B-A3B)— 全部を持つが、毎トークン使うのは一部の expert だけ メモリには 30B 分を置く必要がある(約 12 GB)← RAM 16GB が上限を決める 3B 実際に計算するのはこれだけ = 4Bクラスの速度で 30B の知識を引ける llama.cpp の --n-cpu-moe で「expert 層だけCPU、attention 等はGPU」に分けられる ← 4GB VRAM でも分担が成立する

MoE は総パラメータのうち一部の expert だけを毎トークン使う構造で、計算量は active パラメータで決まる。 密モデルなら 30B は本PCで論外だが、active 3B の MoE なら計算量は 4B クラスに近い。

制約はメモリ側にある。使わない expert も含めて全体を保持する必要があるため、 RAM 16GB がそのまま上限になる。ここで効くのが llama.cpp の --n-cpu-moe だ。

何がGPUに残り、何がCPUに行くのか

考え方は「毎トークン必ず使う部分を、いちばん速いハードウェアに置く」。

配置先対象理由
GPUattention、dense FFN、shared expert、埋め込み常時アクティブ。毎トークン確実に通るので、速いメモリに置く価値がある
CPUrouted expert(重みの大半)一部しか発火しない。gpt-oss-20b なら32エキスパート中トップ4のみ

これが密モデルで成立しない理由もはっきりしている。密モデルは100%のパラメータが常時必要で、 CPUに逃がした分がそのまま毎トークンの転送コストになる。MoE では逃がした重みの大半が毎回は触られない。

値の決め方

--n-cpu-moe N は routed expert を CPU に戻す層数を指定する。 注意点として、層は最上位(いちばん番号の大きい層)から数える。

VRAM30B級MoE(Q4)での開始値調整方向
24 GB0そのまま載る
16 GB20下げると速くなる
12 GB32起動する範囲でゆっくり下げる
4 GB(本PC)ほぼ全層まず全エキスパートをCPUに置き、VRAMが余ったら下げる

Nを大きくするほど VRAM 使用は減るが、CPU側の負担が増えて遅くなる。 参考として、6GB VRAM の環境で 35B-A3B クラスを約 30 tok/s で動かした報告がある。

MoE候補

モデル総 / active量子化サイズ見込み
gpt-oss-20b21B / 3.6BMXFP411.28 GB手持ちにあるダウンロード不要。まずこれを --n-cpu-moe で試す
Qwen3-30B-A3B-Instruct30B / 3BIQ3_XXS 等11〜13 GB要検証RAM 16GB に対してギリギリ。OS と合わせて逼迫する
Qwen3-30B-A3B-Instruct30B / 3BQ4_K_M約 18 GB不可RAM に収まらない
小型MoE 各種〜10B / 1B級Q4_K_M3〜6 GB余裕密の4Bとの比較材料になる
RAM を超えた瞬間に性能が崖から落ちる。 llama.cpp は mmap でモデルを読むため、RAM に収まらない分はディスクから読み直される。 「動くには動くが 1 tok/s を下回る」状態になり、実用にならない。 11〜13 GB のモデルを試すときは、ブラウザなど他のアプリを閉じた状態で測る。

軸3 — MoE でだけ低ビット量子化が意味を持つ

第6章では「密モデルで Q2 まで下げるのは損な取引」と結論づけた。 MoE はこの結論が当てはまらない、唯一の例外になる。

なぜ MoE は低ビットに強いのか

実例として、MoE向けの混合精度量子化は 21.3 GB で perplexity 6.552 / HellaSwag 83.5% を出しており、 45.3 GB の 8bit 版(6.536 / 82.5%)とほぼ同等の品質を半分以下のサイズで達成している。

本PCにとっての意味

Qwen3-30B-A3B の量子化サイズRAM 16GB での可否
Q4_K_M約 18 GB不可そもそも載らない
IQ3_XXS約 12.8 GB際どいOSと合わせて逼迫する
IQ2_M / UD-Q2_K_XL約 11 GB現実的な線密モデルなら却下する帯域だが、MoEでは唯一の突破口

つまり「密モデルでは切り捨てる 2bit 帯が、MoE では 30B クラスに手を届かせる手段になる」という構図になっている。 ただし 11 GB を RAM 16GB に載せると余裕はほとんど残らない。

軸4 — Gemma E2B/E4B の Per-Layer Embeddings

手持ちの gemma-4-E2B-it(3.19 GB)と gemma-4-E4B-it(4.97 GB)は、 MoE とは別の仕組みで「サイズの割に軽い」可能性がある系列。

モデルeffectivetotal差分の正体
gemma-4-E2B2.3B5.1BPer-Layer Embeddings(各デコーダ層が持つ埋め込みテーブル)
gemma-4-E4B4.5B8B

名前の E は effective(実効)の意味。PLE のテーブルは大きいがルックアップ専用で、 行列積には参加しない。設計上は低速なメモリ側に置ける性質を持つ。

ただし llama.cpp が PLE を分離してオフロードするかは確認できていない。 GGUF が PLE テーブルを他のテンソルと同列に扱っているなら、この利点は出ずに 5 GB 弱の重みとして素直に載るだけになる。 期待値を織り込まず、実測項目として扱う。E4B が 4.5B 相当の速度で動けば当たり、8B 相当なら外れ。

手持ちの gpt-oss-20b は評価し直す

第5章の表では総サイズだけを見て 実行困難 と分類したが、 これは MoE であることを考慮していない判定だった。 active 3.6B なので、--n-cpu-moe で expert をCPUに逃がせば、生成速度は 20B の密モデルとは別物になる。 新規ダウンロードを検討する前に、まずこれを実測する。

採用案

優先度やること取得量狙い
1手持ちの gpt-oss-20b を --n-cpu-moe で実測(軸2・軸3)0 GBMoEが本PCで実用になるかを、コストゼロで判定する。ここが優先度3の前提になる
1'手持ちの gemma-4-E4B-it の実速度を測る(軸4)0 GBPLE が効いて 4.5B 相当で動くか、8B 相当に留まるかを確認する
2Qwen3.5-9B の IQ4_XS 版を取得約 4.5 GB第二候補を Q4_K_M から置き換え、全層GPUに届くかを見る
3Qwen3-30B-A3B の IQ2_M / UD-Q2_K_XLを取得約 11 GB優先度1で MoE に見込みがあった場合のみ。密モデルなら選ばない帯域だが、MoEでは知識量の上限を引き上げられる
見送りQ6_K / Q8_0 の高ビット版—4GB VRAM に載らず、得るものがない
見送り14B以上の密モデル、密モデルの Q3_K_S / Q2_K—前者は手持ちで遅さが確認できる帯域。後者は第6章のとおり品質が崖から落ちる
対象外IQ1系 / TQ系(1bit帯)—70B超向け、または三値学習済みモデル専用。本PCの規模では崩壊する

優先度1は追加取得ゼロで済むので、これを先に回してから優先度2以降の要否を決める。 MoEが期待外れなら優先度3は不要になり、13 GB の取得を省ける。

取得時の置き場

LM Studio の検索から落とせば C:\AI-models 配下の既存の系列フォルダに入り、 llama.cpp からも同じ絶対パスで参照できる。Hugging Face から直接取得する場合も、 <配布元>\<モデル名>-GGUF\ という既存の規約に合わせて置く。

増やしすぎると棚卸しが破綻する。 既に 98.5 GB・30ファイルあり、そのうち 12.6 GB は重複していた(第5章)。 取得のたびに第5章の表へ1行足し、動いたか動かなかったかを併せて記録する運用にする。

導入手順(ステップ計画)

各ステップは独立して確認できる単位に分けている。1つ終えるごとに動作を確かめてから次へ進む。

Step 1 — llama.cpp のバイナリを配置

第4章で採用した案A(配布バイナリ)に沿って進める。公式リリースページから Windows 向けの CUDA ビルド一式を取得する。必要なのは2つのzip。

両方を bin\llama.cpp\ の同じ階層に展開する。DLLが本体と別フォルダにあると起動時に読み込めない。

bin\llama.cpp\
  llama-server.exe
  llama-cli.exe
  llama-bench.exe
  ggml-cuda.dll
  cudart64_*.dll   ← cudart 側のzipから
  ...

確認

.\bin\llama.cpp\llama-server.exe --version

バージョンが表示され、ログに CUDA デバイスとして RTX 3050 Ti が出れば成功。

Step 2 — 手持ちモデルの参照方法を決める

第5章のとおり新規ダウンロードは不要で、C:\AI-models の Qwen3-4B-Instruct-2507 をそのまま使う。 ただし 98.5 GB あるモデル群をプロジェクト配下にコピーするのは無駄なので、参照方法を選ぶ。

案やり方評価
推奨絶対パス指定-m "C:\AI-models\qwen\...\Qwen3-4B-Instruct-2507-Q4_K_M.gguf"追加作業ゼロ。起動スクリプトを見れば実体がどこか分かる
ジャンクションmklink /J models C:\AI-modelsパスが短くなるが、実体が別ドライブにあることが見えにくくなる
不採用コピーmodels\ に実ファイルを複製数GB単位で二重に持つことになり、LM Studio 側との更新のずれも生む

本計画では絶対パス指定で進める。プロジェクト配下に models\ は作らない。

Step 3 — 起動スクリプトを用意

tools\50_run\run-server.cmd として、以下を出発点にする。

@echo off
"%~dp0..\..\bin\llama.cpp\llama-server.exe" ^
  -m "C:\AI-models\qwen\Qwen3-4B-Instruct-2507-GGUF\Qwen3-4B-Instruct-2507-Q4_K_M.gguf" ^
  -ngl 99 ^
  -c 8192 ^
  --host 127.0.0.1 ^
  --port 11434
pause
オプション意味
-ngl 99GPUに載せる層数。実際の層数より大きい値を指定すれば「全層」の意味になる
-c 8192コンテキスト長
--host 127.0.0.1ローカルのみ受け付ける。外部公開しない
--port 11434APIとWebUIの待ち受けポート

確認

起動後、ブラウザで http://127.0.0.1:11434 を開くと同梱のチャットUIが出る。日本語で数往復して応答を確認する。

Step 4 — 大きいモデルの部分オフロード設定を詰める

第二候補の Qwen3.5-9B(5.24 GB)を指定し、-ngl を変えながら「VRAMに収まる最大の層数」を探す。 起動ログに実際のVRAM使用量が出るので、それと nvidia-smi を突き合わせる。

-ngl 18 → 起動する / 速度は?
-ngl 21 → 起動する / 速度は?
-ngl 24 → メモリ不足で落ちる → 21 が上限

KVキャッシュ量子化(--cache-type-k q8_0 --cache-type-v q8_0)を足すと、この上限が数層伸びる。

ここで「読み込み直後にエラーで落ちる」なら、原因はメモリではない。 Qwen3.5 系はアーキテクチャが新しいため、配布バイナリのリリースが対応していない可能性がある(第5章の原因2)。 その場合は -ngl をどう振っても直らないので、リリースの更新を確認し、それでも駄目なら第4章の案Bに切り替える。

Step 5 — Claude Code からの接続に切り替える

llama-server は OpenAI 互換のエンドポイントに加えて、Anthropic 形式の http://127.0.0.1:11434/v1/messages にも応答する。 Claude Code は Anthropic 形式で話すため、変換の層を挟まず、環境変数で接続先を向けるだけで繋がる。

コンテキストは 65536 が要る

Claude Code は最初の要求だけで約 63,000 トークンある(システムプロンプトとツール定義)。 常用の -c 8192 では「request (63484 tokens) exceeds the available context size (8192 tokens)」 (要求が使えるコンテキストを超えている)で拒否される。

65536 の KV キャッシュは VRAM 4GB に載らないため、RAM 側に置く(-nkvo)。 q8_0 に量子化し、スロットは1つ(-np 1)にする。サーバの RAM 使用は約 7.6 GB。

要求読み込んだトークン所要
サーバ起動後の1回目63,416157 秒
2回目1,98514 秒

2回目は、共通部分の KV キャッシュが再利用され、差分だけを読み込む。 サーバを起動したままにしておけば、待たされるのは最初の1回だけになる。

LM Studio と llama.cpp のサーバはポートを分けて同時に立てられるので、 接続先を行き来させながら応答を比較でき、切り替えに失敗しても元に戻せる。

その後の試験で分かったこと(2026-09-30)

上の 63,000 トークンのうち、利用者の共通ルールだけで約 41,000 トークンあった。 ホームを空のフォルダに替えて読ませないと約 20,000 トークンに減り、思考も切ると、20GB 以下の 20 本中 15 本がファイルの読み書きに合格した。 いまの run-server-cc.cmd と cc1.cmd は、この設定(gemma-4-E4B・--reasoning off・ホーム W:\temp\cc1-home)で作り直してある。 詳細は ローカルLLM で AI エージェントを使う — 試験結果、使い方は 使う・試す手順。

Step 6 — MoEモデル(gpt-oss-20b)を試す

第7章の優先度1にあたる。手持ちの gpt-oss-20b を、expert 層だけCPUに逃がす指定で起動する。

llama-server.exe ^
  -m "C:\AI-models\OpenAI\gpt-oss-20b-GGUF\gpt-oss-20b-MXFP4.gguf" ^
  -ngl 99 ^
  --n-cpu-moe 24 ^
  -c 4096 ^
  --host 127.0.0.1 --port 8080
オプション意味
-ngl 99まず全層をGPU扱いにする。ここを削らないのがMoEの場合の要点
--n-cpu-moe 24そのうち最上位24層分の routed expert テンソルだけをCPUに戻す。attention・dense FFN・shared expert・埋め込みはGPUに残る
数える向きに注意。 --n-cpu-moe はいちばん番号の大きい層から数える。 「先頭N層」ではないので、層の前半に dense FFN を置くモデルでは、意図した層と実際にCPUへ送られる層がずれることがある。 層を細かく指定したい場合は -ot(--override-tensor)で正規表現による割り当てを使う。

本PCの VRAM 4GB ではまず全層のエキスパートをCPUに置くところから始め、 VRAMが余っていれば値を下げていく。小さいほどエキスパートがGPUに残って速くなるが、VRAMを超えると落ちる。

判断

実行中は nvidia-smi と併せてタスクマネージャのメモリ使用量も見る。 コミット済みメモリが物理RAMを超えていれば、遅さの原因はCPU性能ではなくディスク読みにある。

Step 7 — gemma-4-E4B-it で PLE の効果を測る

第7章の優先度1'。手持ちの gemma-4-E4B-it(4.97 GB)は total 8B / effective 4.5B で、 差分の Per-Layer Embeddings がオフロードされるかどうかで結果が変わる。これも追加取得ゼロで判定できる。

llama-server.exe ^
  -m "C:\AI-models\gemma\gemma-4-E4B-it-GGUF\gemma-4-E4B-it-Q4_K_M.gguf" ^
  -ngl 99 ^
  -c 4096 ^
  --host 127.0.0.1 --port 8080

まず -ngl 99 で試し、VRAM不足で落ちるなら Step 4 と同じ要領で上限を探す。

判断

比較の基準は Step 3 の Qwen3-4B(25〜40 tok/s)と Step 4 の Qwen3.5-9B。 この2つに挟んで、E4B がどちら側に着地するかを見る。

CUDA Toolkit のインストールは不要。 配布バイナリに必要なランタイムDLLが同梱されているため、開発用のToolkit(数GB)を入れる必要はない。 必要なのはGPUドライバだけで、本PCの 592.82 は条件を満たしている。

検証計画と評価基準

測る項目

指標測り方合格ライン
生成速度llama-bench または llama-server のログに出る tok/s15 tok/s 以上
初回応答までの時間プロンプト投入から最初のトークンが出るまで2秒以内
VRAM使用量nvidia-smi を推論中に実行3.6 GB 以下
日本語の自然さ固定の質問セットを流して目視不自然な語尾・中国語混入がない
長文の破綻コンテキスト上限近くまで会話を続ける指示の取りこぼしがない

比較する組み合わせ

1〜7 は手持ちのモデルだけで実施でき、追加取得を伴わない。8・9 は第7章の優先度2・3を実行した場合のみ。

Noモデル量子化配置コンテキスト狙い
1Qwen3-4B-Instruct-2507Q4_K_M-ngl 998192基準となる構成
2Qwen3-4B-Instruct-2507Q4_K_M-ngl 9916384コンテキストを倍にした時の速度低下を見る
3gemma-3-4b-itQ4_K_M-ngl 998192同サイズ・別系列との対照。1 の評価がサイズ由来かモデル由来かを切り分ける
4Qwen3.5-9BQ4_K_M-ngl 上限値4096部分オフロードが実用に耐えるか。併せて読み込み自体が通るか(第5章の原因2)も確認する
5Qwen3.5-9BQ4_K_M-ngl 上限値
+ KV量子化
40964 に KVキャッシュ量子化を足した効果
6gpt-oss-20bMXFP4--n-cpu-moe4096MoEが本PCで実用になるか。第7章の優先度1
7gemma-4-E4B-itQ4_K_M-ngl 994096PLE が効いて 4.5B 相当で動くか、8B 相当に留まるか。第7章の優先度1'
8Qwen3.5-9B
要取得
IQ4_XS-ngl 994096I-quant で全層GPUに届くか。4 と直接比較する
9Qwen3-30B-A3B
要取得
IQ2_M--n-cpu-moe40966 で MoE に見込みがあった場合のみ。2bit帯のMoEが知識量で 4B を上回るか

6・9 は RAM が律速になるため、他のアプリを閉じた状態で測る。 それ以外はVRAM側の勝負なので、画面表示を内蔵GPUに寄せた状態に揃える。

質問セット(固定)

モデル間の比較を成立させるため、毎回同じ質問を同じ順で投げる。

  1. 日本語での要約 — 400字程度の文章を3行にまとめさせる
  2. 日本語での説明 — 技術用語をひとつ、初心者向けに説明させる
  3. 指示追従 — 「箇条書き5項目、各20字以内」のような形式制約を守れるか
  4. 簡単なコード生成 — PowerShellで指定した処理を書かせる
  5. 長文の読解 — 2000字程度を貼り、特定箇所について質問する

結果を受けての判断

結果次の一手
4Bが十分速く品質も足りるQwen3-4B を常用に固定する。第7章の追加取得は不要になる
4Bは速いが品質が足りない第7章の優先度2(IQ4_XS の 9B)を取得して No8 を実施する
MoE(No6)が 10 tok/s 以上出る第7章の優先度3へ進み、Qwen3-30B-A3B の IQ2_M を取得して No9 を実施する
E4B(No7)が 20 tok/s 前後で動くPLE が効いている。4Bクラスの枠に E4B を加え、品質面の選択肢を1つ増やす
9Bが読み込めないアーキテクチャ未対応(第5章の原因2)。リリースを更新し、駄目なら第4章の案B(自前コンパイル)に着手する
MoE(No6)が RAM 不足で崩れるMoE路線を打ち切る。優先度3の 11 GB の取得を省ける
どれも品質が不足用途を絞るか、その用途についてはローカル実行を諦めてクラウドを使う

この計画で決めていないこと

実測結果 — 2026-08-25

第8章の Step 1〜3 を実施し、第9章の検証を llama-bench で測った。 使用ビルドは b10612(CUDA 12.4 / Windows x64 の配布バイナリ)。

この章の数値は、RAM 16GB(15.8 GB)で、画面表示が VRAM を 808 MiB 使っていた状態で測ったもの。 32GB への増設と画面表示を内蔵GPU に任せたあとの測り直しは、章末の「32GB での再測定」に追記した。

環境の実測値

項目実測計画時の想定との差
CUDA デバイスCUDA0: RTX 3050 Ti Laptop、compute capability 8.6想定どおり(Ampere / sm_86)
VRAM 総量4095 MiB想定どおり
VRAM 空き3287 MiB想定より厳しい808 MiB が画面表示等で先に取られている。計画では 0.4 GB 想定だった
導入所要ダウンロード 612 MB / 12.4 秒、展開 7.8 秒案A(配布バイナリ)の手軽さは想定以上

生成速度(tg)の比較

横幅は tok/s に比例(最大 56.5) Qwen3-4B-Instruct −ngl 99 56.49 tok/s gemma-3-4b-it −ngl 99 56.25 tok/s gemma-4-E4B-it −ngl 99 45.23 tok/s Qwen3.5-9B −ngl 24 +KV量子化 8.12 tok/s gpt-oss-20b −ncmoe 18 5.89 tok/s Qwen3.5-9B −ngl 99(超過) 1.55 tok/s 合格ライン 15 tok/s ← ここより左は対話に使える速度に届かない

測定結果の一覧

Noモデル配置pp512tg判定
1Qwen3-4B-Instruct-2507-ngl 99189856.49合格基準を大きく超えた
2Qwen3-4B @深さ 4096-ngl 99—47.36合格−16%
2Qwen3-4B @深さ 8192-ngl 99—41.59合格−26%。実用上限
2Qwen3-4B @深さ 16384-ngl 99—1.30崩壊KVがVRAMを超過
3gemma-3-4b-it-ngl 99231456.25合格No1 とほぼ同値
7gemma-4-E4B-it-ngl 99114945.23合格PLE が効いた。想定外の good news
4Qwen3.5-9B-ngl 99371.55VRAM超過共有メモリに落ちた
4Qwen3.5-9B-ngl 16—6.08不足
4Qwen3.5-9B-ngl 20—7.97実用下限KV量子化なしのピーク
4Qwen3.5-9B-ngl 24—7.87同等
4Qwen3.5-9B-ngl 28—2.53崖ここで超過する
5Qwen3.5-9B +KV q8_0 +fa-ngl 24—8.12最良9Bクラスの上限
6gpt-oss-20b(MoE)-ncmoe 24—3.63遅い全エキスパートCPU
6gpt-oss-20b(MoE)-ncmoe 18—5.89MoEの上限ばらつき ±2.0
6gpt-oss-20b(MoE)-ncmoe 14—3.10崖VRAM超過

pp512・tg の単位は tok/s。tg は No1・No3・No7 が tg128、それ以外は tg64。

分かったこと

1. 4Bクラスは 56 tok/s で頭打ち — 系列によらない

Qwen3-4B(56.49)と gemma-3-4b(56.25)が誤差の範囲で一致した。 モデル固有の性質ではなく、このGPUのメモリ帯域が決めている上限と考えてよい。 計画時の予測は 25〜40 tok/s だったので、実測が予測を4割上回った。

2. E4B の PLE は本当に分離される 仮説が的中

第7章の軸4で「llama.cpp が PLE をオフロードするか未確認」としていた点に、明確な答えが出た。

load_tensors: offloading 41 repeating layers to GPU
load_tensors:   CPU_Mapped model buffer size =  2730.00 MiB   ← PLE テーブル
load_tensors:        CUDA0 model buffer size =  2868.05 MiB   ← 計算に使う重み

ファイルは 4.95 GiB あるが、GPUに載るのは 2868 MiB だけ。残り 2730 MiB の PLE は CPU 側に置かれる。 その結果 7.52B のモデルが 45 tok/s で動く。9Bクラスの 8 tok/s とは桁が違う。

KVキャッシュも 14 MiB しか使わない。shared_kv_layers = 18 と sliding window attention の組み合わせによるもので、コンテキストを伸ばしても VRAM を圧迫しにくい。

3. -ngl は「越えると崩れる」— 徐々に遅くなるのではない

Qwen3.5-9B で -ngl を振ると、20〜24 で 8 tok/s 前後を保ち、28 で 2.53 に落ちた。 -ngl 99 では 1.55 まで下がる。

VRAMを超えても「エラーで止まらない」のが厄介。 NVIDIAドライバが共有GPUメモリ(システムRAM)に自動で逃がすため、 動いてはいるが5倍遅いという状態になる。落ちてくれた方が気づきやすい。 -ngl を大きめに設定して「なぜか遅い」ときは、まずこれを疑う。

4. MoE は動いたが、RAM が律速で伸びない(RAM 16GB 時)

gpt-oss-20b は --n-cpu-moe で確かに動き、密モデルの20Bとしてはあり得ない速度が出た。 ただし最良でも 5.89 tok/s、しかも測定のばらつきが ±2.0 と大きい。

第7章の判断基準では「3〜10 tok/s:用途を限れば使える。優先度3の取得は保留」に該当する。

5. コンテキストは 8192 が上限 — 16384 は崩れる(画面表示が VRAM を使っていた時)

Qwen3-4B で会話の深さを変えて測ると、速度は素直には落ちず、ある点で崩壊した。

深さtg64深さ0比状態
056.16—全部VRAM内
4,09647.36−16%順当な低下
8,19241.59−26%実用上限
16,3841.30−98%崩壊KVがVRAMからあふれた

計画では「余裕があれば 16384 まで伸ばす」としていたが、その余裕は無かった。 モデル重み 2.32 GiB に対して空きが 3287 MiB しかないため、 16k 分の KV キャッシュを置くと超過する。-c 8192 を上限として運用する。

ここでも「エラーにならず遅くなる」形で現れる。 16384 でも生成自体は続くので、長い会話を続けているうちに突然 40 倍遅くなる、という壊れ方をする。 コンテキスト長は最初から安全側に固定しておく方がよい。

サーバとしての動作確認

llama-server を起動し、OpenAI 互換エンドポイントに日本語で問い合わせた。

項目結果
起動〜応答可能まで7.5 秒
/healthOK
/v1/chat/completionsOKOpenAI 形式のまま応答
日本語の指示追従合格「3つ・各30字以内・箇条書き」を正しく守った
API経由の実効速度39.5 tok/s

API 経由の 39.5 tok/s が llama-bench の 56.5 tok/s より低いのは、 HTTP のやり取りとプロンプト処理を含んだ実効値のため。体感速度としてはこちらが実態に近い。

Claude Code からは Anthropic 形式の /v1/messages で繋がる。 変換の層は要らない。ただし Claude Code の要求は約 63,000 トークンあり、専用の設定でサーバを起動する(第8章 Step 5)。

品質評価 — 差が出るのは知識を問うときだけ

第9章の質問セット5問を、Qwen3-4B と gemma-4-E4B の両方に同じ条件で投げた。 当初は3問だけで「速度と品質が逆転する」と結論づけたが、 残る2問(要約・長文読解)を加えると差が出る場面はもっと限定的だった。

設問種類Qwen3-4Bgemma-4-E4B
Q1 要約与えられた文章を縮める正確3.2 秒正確17.9 秒
Q2 説明知識から答える誤答1.4 秒正確13.9 秒
Q3 指示追従形式を守る合格0.9 秒未完思考で溢れた
Q4 コード生成知識+要件の充足惜しい0.6 秒正確2.0 秒
Q5 長文読解与えられた文章から答える正確6.6 秒正確18.7 秒

Q1 と Q5——文章が手元にある課題では、両者に差がつかなかった。 差が出たのは Q2 と Q4、いずれもモデル内部の知識に依存する設問である。

Q1「413字の文章をちょうど3行に要約」

計画書の本文から抜き出した 413 字を素材にした。両者とも3行という指示を守り、内容も素材に忠実だった。

質としては E4B がわずかに勝るが、5.6 倍の時間を払う差ではない。

Q2「量子化を初心者向けに150字で説明」

モデル所要応答の要旨判定
Qwen3-4B1.4 秒「複雑な情報を小さな量子の状態で表現する技術」誤り量子力学と混同している。日本語は自然なだけに気づきにくい
gemma-4-E4B13.9 秒「32ビットから8ビット整数に丸めて圧縮し、サイズと計算量を削減する」正確比喩も含めて過不足なし

Q3「注意点を5項目・各20字以内」

Q4「PowerShell で .gguf をサイズ降順に一覧」

Q5「1970字の文章を読み、2点を答える」

第7章の本文から 1970 字を素材にし、その文章にしか書かれていない情報を2つ問うた。 事前知識では答えられない設問である。

  1. --n-cpu-moe の層の数え方の注意点は何か(正解: 最上位の層から数える)
  2. CPUオフロードが密モデルで成立せず MoE で成立する理由は何か
モデル所要結果
Qwen3-4B6.6 秒両問正解「最上位(いちばん番号の大きい層)から数える」と本文どおりに答え、理由も転送コストの観点まで説明した
gemma-4-E4B18.7 秒両問正解思考 2174 字を経て、より簡潔に回答

1970字の文脈を保持し、そこから正確に答える能力は 4B でも十分にあった。 第2章で「小型帯では日本語の破綻が少ない」と見込んだ点は、読解でも裏付けられた形になる。

E4B は reasoning モデルだった

E4B が遅かった理由は速度ではなく出力量にあった。応答は2つのフィールドに分かれて返る。

フィールド内容
reasoning_content思考過程。「ターゲット層は初心者」「字数制限は約150字」など、要件を分解してから答えを組み立てている
content最終的な回答。ここだけがユーザーに見せる部分

生成 570 トークンのうち大半が思考で、生成速度自体は 41.1 tok/s と速い。 それでも 13.9 秒かかるのは、答えにたどり着くまでに書く量が多いためで、 この思考が Q2 の正答と Q4 の -Recurse を生んでいる。

E4B を使うなら max_tokens を大きめに取る。 400 では思考の途中で打ち切られ、応答が空で返る(Q3 がこれ)。 1500 程度を確保しておく。逆に短い応答を速く欲しい場面では Qwen3-4B を使う。

使い分けの結論

5問を通して見ると、分岐点は「対話か事実か」ではなく 「答えが渡した文章の中にあるか、モデルの中にあるか」だった。

答えの在り処該当する作業選ぶモデル理由
渡した文章の中要約、翻訳、長文からの抽出、資料に基づく質疑、書き換えQwen3-4BQ1・Q5 とも E4B と同じ正確さで、3〜6倍速い。品質を落とさずに速度を取れる
モデルの中知識を問う説明、仕様の記憶に頼るコード生成gemma-4-E4BQ2 で 4B は誤答し、Q4 では要件を落とした。ここだけは時間を払う価値がある
形式が主決まった書式での出力、箇条書き、整形Qwen3-4BQ3 で指示を完全に満たした。E4B は思考が長く打ち切られた
当初の見立ては修正が必要だった。 3問だけ実施した時点では「速度で選ぶと精度を失う」と結論づけたが、 Q1・Q5 を加えるとその心配は知識を問う場面に限られると分かった。 資料を渡して読ませる使い方——実務で多いのはむしろこちら——では、Qwen3-4B で速度も品質も取れる。

実運用では「モデルに思い出させるのではなく、資料を渡す」形に寄せるほど 4B で足りることになる。 E4B が要るのは、渡す資料が用意できない場面に絞られる。

計画時の予測と実測の対比

項目計画時の予測実測評価
4Bクラスの速度25〜40 tok/s56 tok/s予測より良い4割上振れ
9Bクラスの速度6〜10 tok/s8.1 tok/s的中
E4B の PLE効くか不明効いた(45 tok/s)仮説が当たり
MoE の実用性見込みあり5.9 tok/s部分的動くが RAM が律速
画面表示のVRAM0.4 GB0.79 GB想定より重い
コンテキスト 16384余裕があれば可不可予測が外れ
アーキテクチャ未対応起きうる起きなかった杞憂b10612 は全て対応済み
導入の手軽さ(案A)5〜10分約20秒想定以上
4Bの長文読解予測していなかった1970字を正確に処理想定以上使い分けの基準が変わった

結論と方針(RAM 16GB)

位置づけモデルと設定速度用途
常用Qwen3-4B-Instruct-2507
-ngl 99 -c 8192
56 tok/s
(1〜7秒で返る)
資料を渡す作業のすべて——要約・長文からの抽出・資料に基づく質疑・整形。1970字の読解でも E4B と同じ正確さだった
知識を問う時gemma-4-E4B-it
-ngl 99/max_tokens は 1500 以上
41 tok/s
(10〜20秒)
渡す資料が用意できない場面に限る。知識を問う説明とコード生成では 4B が誤る
用途限定Qwen3.5-9B
-ngl 24 -ctk q8_0 -ctv q8_0 -fa
8 tok/s待てる作業(バッチ要約・翻訳)のみ
用途限定gpt-oss-20b
-ngl 99 --n-cpu-moe 18
5.9 tok/s20B級の知識が要る場面のみ。他アプリを閉じて使う

第7章の追加取得の判断

優先度対象判断
1gpt-oss-20b の実測完了5.89 tok/s
1'gemma-4-E4B-it の実測完了45.23 tok/s。PLE の効果を確認
2Qwen3.5-9B の IQ4_XS(約 4.5 GB)優先度を下げる全層GPU化できても E4B の 45 tok/s には届かない見込み。E4B が同じ役割を果たすため急がない
3Qwen3-30B-A3B の IQ2_M(約 11 GB)見送り同じ 11 GB 級の gpt-oss-20b が 5.9 tok/s で RAM 律速。30B に替えても改善しない

結局、追加ダウンロードは不要という結論になった。 手持ちの Qwen3-4B と gemma-4-E4B の2本で、速度側と品質側の両方が埋まっている。

最大の収穫は E4B だった。 計画段階では「total 8B なので 9B クラス扱い」と見なして対象外に近い位置づけだったが、 PLE の分離が効いて 4B クラスの速度で動いた。 ファイルサイズだけでモデルを仕分けると、この種のアーキテクチャを取りこぼす。

32GB での再測定

RAM を 32GB に増設し、画面表示を内蔵GPU に任せたあとで、RAM と VRAM に左右されるものを測り直した。 ブラウザなどを閉じ、空き RAM 19.1 GB・VRAM 空き 3962 MiB の状態で、1つずつ順番に測っている。

項目上の測定再測定
RAM16GB × 1枚(15.8 GB)と推定16GB × 2枚(31.8 GB)・3200 MT/s
VRAM 空き3287 MiB3962 MiB
画面表示NVIDIA 側が 808 MiB 使用内蔵GPU(NVIDIA 側は 0 MiB)

結果

モデル配置上の測定再測定倍率
Qwen3-4B-ngl 9956.4958.911.04
gemma-4-E4B-ngl 9945.2346.871.04
gemma-4-E4B(pp512)-ngl 99114918431.60
Qwen3.5-9B +KV q8_0-ngl 248.1214.641.80
Qwen3.5-9B +KV q8_0-ngl 281.873.67—
gpt-oss-20b-ncmoe 243.6315.314.22
gpt-oss-20b-ncmoe 205.1916.123.11
gpt-oss-20b-ncmoe 185.8918.983.22
gpt-oss-20b-ncmoe 165.5211.67—
gpt-oss-20b-ncmoe 143.107.77—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 48—13.68—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 44—14.80—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 42—15.74—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 40—16.60—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 39—13.54—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 38—7.10—
Qwen3-30B-A3B(UD-Q4_K_XL)-ncmoe 36—9.84—
Qwen3-30B-A3B +KV q8_0 @深さ 16384-ncmoe 40—0.35—
Qwen3-30B-A3B +KV q8_0 @深さ 16384-ncmoe 44—12.92—
Qwen3-30B-A3B +KV q8_0 @深さ 16384-ncmoe 48—12.99—
Qwen3-30B-A3B +KV q8_0(RAM 側)@深さ 16384-ncmoe 40 -nkvo—4.37—
Qwen3-30B-A3B +KV q8_0(RAM 側)@深さ 65536-ncmoe 40 -nkvo—1.27—
Qwen3-4B +KV q8_0 @深さ 8192-ngl 99—37.06—
Qwen3-4B +KV q8_0 @深さ 16384-ngl 99止まったまま20分以上26.96—

単位は tok/s(tg)。Qwen3-4B の基準と gemma-4-E4B は tg128、それ以外は tg64。「pp512」の行はプロンプトを読む速さ。

分かったこと

結論と方針(RAM 32GB)

上の「結論と方針(RAM 16GB)」は RAM 16GB での測定に基づく。再測定の結果を受けて、次のとおり改める。 現在の構成(RAM 32GB・画面表示は内蔵GPU)では、こちらを正とする。

位置づけモデルと設定速度用途
常用Qwen3-4B-Instruct-2507
-ngl 99 -c 8192
59 tok/s資料を渡す作業のすべて。変更なし
長い入力Qwen3-4B-Instruct-2507
-ngl 99 -c 16384 -ctk q8_0 -ctv q8_0 -fa on
27 tok/s
(深さ 16384)
8192 に収まらない資料を渡すとき。KV を q8_0 にした分、8192 のときより遅い
知識を問う時gemma-4-E4B-it
-ngl 99/max_tokens は 1500 以上
47 tok/s変更なし。生成は 16GB のときとほぼ同じ
対話に使えるgpt-oss-20b
-ngl 99 --n-cpu-moe 18
19 tok/s20B級の知識が要る場面。合格ライン(15 tok/s)を超えたので「用途限定」から上げる。回答の品質はまだ評価していない
対話に使えるQwen3-30B-A3B-Instruct-2507(UD-Q4_K_XL)
-ngl 99 --n-cpu-moe 40
17 tok/s
(深さ 0)
gpt-oss-20b と同じ枠の候補。文脈を 16384 まで使うなら --n-cpu-moe 44 -ctk q8_0 -ctv q8_0 -fa on で 13 tok/s。65536 は 1.3 tok/s で使えない。回答の品質はまだ評価していない
用途限定Qwen3.5-9B
-ngl 24 -ctk q8_0 -ctv q8_0 -fa on
15 tok/s合格ラインの手前。同じ速さで gpt-oss-20b が使えるため、優先しない

第7章の追加取得の判断(見直し)

優先度対象判断
2Qwen3.5-9B の IQ4_XS(約 4.5 GB)変更なし急がない
3Qwen3-30B-A3B候補に戻す見送った理由は「RAM 律速」だったが、同じ MoE の gpt-oss-20b が 3.2 倍になり、理由がなくなった。 RAM に余裕ができたので IQ2_M(約 11 GB)に限らず Q4 も対象にできる。2026-09-29 に UD-Q4_K_XL(16.5 GB)を取得し、Claude Code の読み書きの試験に合格した。生成は -ncmoe 40 で 16.6 tok/s(「32GB での再測定」)

コンテキストの上限は「8192」から「KV を q8_0 にすれば 16384」に改める。 Claude Code のように 6 万トークンを超える要求は、KV を RAM 側に置く -nkvo で扱う(第8章 Step 5)。

参考資料

第6章・第7章の数値と、--n-cpu-moe の挙動に関する記述はこれらに基づく。

量子化の品質評価

MoE とエキスパートのオフロード

QAT と Per-Layer Embeddings

数値は出典の測定環境のもの。 第6章の品質データは Llama-3.1-8B での測定であり、モデル系列が変われば崖の位置も動く。 速度の実測例も CPU とメモリ帯域に強く依存する。本PCの数値は第9章の検証で置き換える。