ローカルLLMを常用できる状態にするまでの計画をまとめる。実行環境は本PCの実測値をそのまま前提とし、 「どのソフトウェアを使うか」「実行ファイルをどう入手するか」「どのモデルを使うか」「何を追加取得するか」の4つの選択について、 候補を並べたうえで採用案とその理由を示す。実際のインストール作業は本文書で合意が取れてから着手する。
| 項目 | 実測値 | LLM実行上の意味 |
|---|---|---|
| CPU | Intel Core i7-11370H(4コア8スレッド) | CPU推論のフォールバックとしては非力。4コアなのでCPUオフロードは速度が伸びない |
| RAM | 15.8 GB | OS・ブラウザを差し引くと実質10GB前後。CPU側に置ける重みは上限がある |
| GPU | NVIDIA GeForce RTX 3050 Ti Laptop | CUDA が使える。世代は Ampere で、GGUF の主要量子化はすべて対応 |
| VRAM | 4096 MiB(4 GB) | 最大の制約ここが計画全体を決める |
| ドライバ | 592.82 | 十分に新しい。CUDA 12.x 系のバイナリがそのまま動く |
| 内蔵GPU | Intel Iris Xe | 画面表示をこちらに寄せられれば、NVIDIA側のVRAMを推論にほぼ全部使える |
| 空き容量 | 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 での扱い | 計画時の予測 | 実測 |
|---|---|---|---|---|
| 3〜4B | 2.0〜2.6 GB | 全層GPUコンテキストも余裕をもって取れる | 25〜40 tok/s | 56 tok/s |
| 7〜8B | 4.5〜5.0 GB | 部分オフロード6〜7割をGPU、残りをCPU | 6〜10 tok/s | 8 tok/s |
| 12〜14B | 7.3〜9.0 GB | ほぼCPU実行GPUは3割程度しか担えない | 2〜3 tok/s | 未測定 |
| 30B級(密) | 18 GB 前後 | 不可RAM 16GB にも収まらない | — | — |
| 20B級(MoE) | 11 GB 前後 | エキスパートをCPUへRAMが律速になる | — | 5.9 tok/s |
ローカルでLLMを走らせる手段は大きく4系統ある。本PCの制約(VRAM 4GB・Windows・単一ユーザー)で現実的なものを並べる。
llama-server / llama-cli)GGUF形式の量子化モデルを実行するC++実装。GPUに載りきらない分をCPUに逃がす「部分オフロード」を層単位で制御できる。 公式リリースに Windows 向け CUDA ビルド済みバイナリがあり、コンパイルは不要。
-ngl)・KVキャッシュ量子化・コンテキスト長を細かく指定でき、4GBという厳しい枠に対して調整の余地が最も大きい
内部で llama.cpp を使いつつ、モデル取得・常駐サーバ・APIを一体化したツール。ollama run qwen3:4b の一行で動き出す。
本PCでは一度導入したうえで、LM Studio に置き換える判断が既に下されている。
ollama pull で完結するGUIアプリ。モデル検索・ダウンロード・チャット・ローカルAPIサーバまで画面上で完結する。 本PCでは Claude Code から LM Studio のローカルAPIに問い合わせる形で使った実績があり、外部ツールとの接続まで確認できている。
サーバ用途の高スループット推論エンジン。
| 観点 | llama.cpp | Ollama | LM Studio | vLLM 系 |
|---|---|---|---|---|
| 導入の手軽さ | 中(zip展開) | 高 | 高(導入済み) | 低 |
| 4GB VRAM での詰め | 高 | 中 | 中 | 不可 |
| 設定の再現性 | 高(コマンド行) | 中 | 低(GUI) | 高 |
| API提供 | OpenAI互換 | 独自+OpenAI互換 | OpenAI互換 | OpenAI互換 |
| 環境の汚れにくさ | 高(フォルダ完結) | 低(常駐サービス) | 中 | 低 |
| モデル入手 | 手動 | 自動 | GUI検索 | 手動 |
| 役割 | 採用するもの | 理由 |
|---|---|---|
| 本番の実行基盤 | llama.cpp(CUDAビルド済みバイナリ) | VRAM 4GB では「何層GPUに載せるか」の1〜2層の差が体感速度を左右する。そこを直接指定できるのが決め手 |
| モデルの下見 | LM Studio(導入済みを流用) | 候補モデルの日本語品質を短時間で比較するのに向く。GGUFの入手経路としても使える |
| バイナリの入手 | 公式配布のCUDAビルド (コンパイルは条件付きで後日) | 第4章で比較する。まずは追加インストールなしで動かし、必要が生じた時点でビルド環境を整える |
| Ollama | 再導入しない | llama.cpp と役割が重複する。過去に導入して LM Studio に置き換えた経緯があり、判断を覆す材料が今のところ無い |
4GBという枠では、7〜8Bモデルを「載る範囲だけGPUに置く」運用が現実的な選択肢になる。
llama.cpp は -ngl(GPUに載せる層数)を整数で指定でき、KVキャッシュ自体も量子化して容量を空けられる。
GUIのスライダーや自動判定に任せると、ここで数tok/sを取りこぼす。
起動オプションをそのまま .cmd ファイルに書けるので、「どの設定で何 tok/s 出たか」を文書と対応づけて記録できる。
第7章の検証計画は、この再現性があって初めて成立する。
バイナリ・モデル・起動スクリプトをすべてこのプロジェクト配下に置ける。 不要になったらフォルダごと消せばよく、システムに残るものがない。
20260824-local-llm-llama-cp/
├─ bin/
│ └─ llama.cpp/ … 公式配布のCUDAビルド一式を展開
├─ scripts/
│ ├─ run-server.cmd … llama-server の起動
│ └─ bench.cmd … llama-bench による速度計測
├─ docs/plan/ … 本文書
├─ etc/ … 補助スクリプト(git管理外)
└─ tmp/ … 一時ファイル(git管理外)
C:\AI_Models\ … GGUF の実体(LM Studio と共用・移動しない)
モデルは既に C:\AI_Models にあり、LM Studio と共用する。
プロジェクト配下に複製せず、起動スクリプトから絶対パスで参照する(第7章 Step 2)。
llama.cpp を使うと決めたうえで、実行ファイルをどう手に入れるかにさらに選択がある。 公式が Windows 向けのビルド済みバイナリを配布しているので、コンパイルは必須ではない。
| 必要なもの | 現状 | 役割 | 容量 |
|---|---|---|---|
| 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
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=ON | CUDAバックエンドを有効にする。これが無いとCPU専用バイナリになる |
-DCMAKE_CUDA_ARCHITECTURES=86 | RTX 3050 Ti(Ampere)の compute capability は 8.6。ここを絞らないと全世代向けにカーネルを吐き、ビルド時間が数倍になる |
-j 4 | 物理コア数に合わせる。8スレッドあるが、メモリを食うので4が無難 |
成果物は build\bin\Release\ に出る。所要時間は本PCの4コアで 30〜90分を見込む。
CUDAカーネルのコンパイルが支配的で、CPUが遅いほど伸びる。
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では優先度が低い |
実測の結果、1・2 はいずれも発動しなかった。当初は手持ちに新しい系列が多いことから アーキテクチャ未対応を懸念していたが、リリースの更新が追いついていた。 案Bは当面必要ない。
モデルは新規に選ぶのではなく、既に C:\AI_Models にあるものから選ぶ。
まずサイズ帯ごとの性格を押さえ、そのうえで手持ちを仕分ける。
C:\AI_Models に LM Studio 経由で取得済みのGGUFが 26ファイル・約 86.0 GB ある
(当初 30ファイル・98.5 GB あったが、後述のとおり重複分を整理した)。
新規ダウンロードを検討する前に、この中から選べるかを確認する。以下は本体モデル(mmproj を除く)の一覧。
| モデル | 量子化 | サイズ | 4GB VRAM での見込み |
|---|---|---|---|
| Ministral-3-3B-Instruct-2512 | Q4_K_M | 2.00 GB | 全層GPU最軽量。速度の上限を測る基準に使える |
| gemma-3-4b-it | Q4_K_M | 2.32 GB | 全層GPU安定して動く世代。比較の対照として有用 |
| Qwen3-4B-Instruct-2507 | Q4_K_M | 2.33 GB | 全層GPU第一候補。既に手元にある |
| Qwen3-4B-Thinking-2507 | Q4_K_M | 2.33 GB | 全層GPU思考過程を出す版。トークンを多く消費するため体感は遅くなる |
| NVIDIA-Nemotron-3-Nano-4B | Q4_K_M | 2.64 GB | 全層GPUここまでが余裕をもって載る範囲 |
| deepseek-coder-6.7b-instruct | Q3_K_S | 2.75 GB | 全層GPU載るが Q3_K_S は劣化が大きく、モデル自体も世代が古い |
| gemma-4-E2B-it | Q4_K_M | 3.19 GB | ほぼ載るコンテキストを短くすれば全層に届く |
| DeepSeek-R1-0528-Qwen3-8B | Q4_K_M | 4.68 GB | 部分オフロード推論特化。出力が長く、遅さが二重に効く |
| gemma-4-E4B-it | Q4_K_M | 4.97 GB | 実測 45.2 tok/sPLE の 2730 MiB が CPU に分離され、GPU には 2868 MiB しか載らない。この表の予想を覆した(第10章) |
| Qwen3.5-9B | Q4_K_M | 5.24 GB | 実測 8.1 tok/s-ngl 24 +KV量子化が最適点 |
| GLM-4.6V-Flash | Q4_K_M | 5.74 GB | 部分オフロード視覚モデル。テキスト用途なら選ぶ理由が薄い |
| gemma-4-12B-it-QAT | Q4_0 | 6.50 GB | 大半がCPUQAT版は同サイズで品質が高いが、速度が足りない |
| gemma-4-12B-it | Q4_K_M | 6.87 GB | 大半がCPU対話には遅すぎる |
| Ministral-3-14B-Reasoning-2512 | Q4_K_M | 7.67 GB | 大半がCPU推論特化+大型で、体感は最も遅い部類 |
| Qwen2.5-Coder-14B-Instruct | Q4_K_M | 8.37 GB | 大半がCPUコード用途としては魅力だが本PCでは待たされる |
| gpt-oss-20b | MXFP4 | 11.28 GB | MoEとして再評価総サイズは重いが active は 3.6B。第7章で --n-cpu-moe による実測対象にする |
手持ちに動かないモデルがあるとのことなので、原因を3つに分けて判別する。対処が全く違う。
上表で 大半がCPU 以下に該当するもの。
LM Studio が GPU に全部載せようとして失敗するか、載っても極端に遅い。
llama.cpp で -ngl を明示的に下げれば「動く」状態には持ち込める(速度は別問題)。
サイズと VRAM の引き算で事前に予測でき、原因としては最も分かりやすい。
手持ちには gemma-4・Qwen3.5・Ministral-3・GLM-4.6V・Nemotron-3 といった新しい系列が多い。
GGUF は同じ拡張子でも中のアーキテクチャ識別子が違い、ランタイムが未対応だと
読み込み時点で「unknown model architecture」等のエラーで即座に失敗する。
サイズが小さくても落ちるのが特徴で、原因1と区別できる。
mmproj-*.gguf は画像入力用の投影器で、単体では動かない。本体モデルとペアで指定して初めて機能する。
手持ちでは gemma-3-4b / gemma-4 系 / GLM-4.6V / Ministral-3 / Qwen3.5 に付属している。
--mmproj で明示的に指定する| 位置づけ | モデル | 採用理由 |
|---|---|---|
| 第一候補 | 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章で別途検討する。
棚卸しの過程で、同じモデルが gemma\ と lmstudio-community\ の2箇所に置かれているものが見つかった。
削除の前に、本当に同じものかを確かめた。結論から言うと、バイト単位では同一ではなかった。
| ファイル | gemma\ 側 | lmstudio-community\ 側 | 差 |
|---|---|---|---|
| gemma-4-12B-it-QAT-Q4_0.gguf | 6,975,878,560 B | 6,975,879,008 B | 448 B |
| mmproj-gemma-4-12B-it-QAT-BF16.gguf | 175,115,328 B | 175,115,328 B | 0 B |
| gemma-4-E4B-it-Q4_K_M.gguf | 5,335,289,664 B | 5,335,291,936 B | 2,272 B |
| mmproj-gemma-4-E4B-it-BF16.gguf | 991,551,840 B | 991,551,840 B | 0 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回取得していたことになる。
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 GB | 85.96 GB |
| ファイル数 | 30 | 26 |
| C: 空き容量 | 384.82 GB | 397.37 GB |
| LM Studio 認識モデル数 | 19 | 17 |
削除後、LM Studio の一覧では残った側の修飾が外れて gemma-4-12b-it-qat / gemma-4-e4b-it と表示されるようになった。
同名の競合が解消されたためで、モデル自体は引き続き両方とも使える。
| 量子化 | 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 GiB | 7.32 | 69.47 | — |
| Q8_0 | 8.14 GiB | 7.33 | 69.41 | −0.09% |
| Q6_K | 6.28 GiB | 7.35 | 69.23 | −0.35% |
| Q4_K_S | 4.47 GiB | 7.62 | 69.17 | −0.43% |
| Q3_K_M | — | — | 68.07 | −2.02% |
| Q3_K_S | 3.49 GiB | 8.96 | 65.49 | −5.73% |
Q2_K は上の評価には含まれていないが、別途 7B モデルで測った結果では perplexity の悪化が Q4_K_M の約16倍(+0.8698 対 +0.0535)。 3B クラスでは特定タスクが 0.0% になる報告もある。
IQ で始まる形式は、代表的なテキストで各重みの重要度を測った行列(imatrix)を使い、
効きの大きい重みにビットを厚く配る。同じビット数でも K-quant より品質が高くなる。
| 形式 | K-quant との関係 | 本PCでの用途 |
|---|---|---|
IQ4_XS | Q4_K_M と同等品質で約1割小さい | 有力9Bクラスを全層GPUに近づける |
IQ3_M / IQ3_XS | IQ3_XS ≒ Q3_K_M の品質でやや小さい | 条件付き全層GPU化と引き換えに品質を払う |
IQ2_M | 2bit帯では最良の部類 | MoE限定密モデルには使わない |
効き目が最も大きいのは Q2・Q3 の低ビット帯。均一な量子化が破綻し始める領域ほど、重要度による配分が生きる。 逆に言えば Q4 以上ではあまり差がつかない。
Q1_K のような K-quant は存在しない。1bit帯にあるのは I-quant と三値量子化で、いずれも本PCでは使い道がない。
| 形式 | bpw | 位置づけ |
|---|---|---|
IQ1_S | 1.56 | 70B以上の巨大モデルを無理やり載せる時のみ |
IQ1_M | 1.75 | 同上。IQ1_S よりやや余裕がある |
TQ1_0 | 1.69 | 三値(−1/0/+1)。BitNet系のように最初から三値で学習されたモデル専用 |
TQ2_0 | 2.06 | 同上 |
TQ系は通常のモデルを変換しても意味がなく、IQ1系を 4B や 9B に適用すれば完全に崩壊する。 本計画では対象外
KVキャッシュはコンテキスト長に比例してVRAMを食う。長さを倍にすればキャッシュも倍になる。 本PCでは以下を出発点とする。
| モデル | コンテキスト | 備考 |
|---|---|---|
| Qwen3-4B | 8192 | 実測で確定16384 にすると KV が VRAM を超えて 1.30 tok/s に崩壊する(第10章)。8192 が上限 |
| Qwen3.5-9B | 4096 | KVを削って重みを1層でも多くGPUに載せるほうが速い |
| gemma-4-E4B | 8192 | KVが 14 MiB しか要らない(SWA + shared_kv_layers=18)ため、この系列だけは余裕がある |
llama.cpp は KVキャッシュ自体を8bit量子化できる(--cache-type-k q8_0 --cache-type-v q8_0)。
キャッシュ容量がおよそ半分になるので、その分を重みのオフロードに回せる。
8Bモデルを載せる場合はこれを併用する前提で層数を決める。
第5章のとおり手持ちだけでも始められるが、手持ちの大半は Q4_K_M の密モデルに偏っている。
量子化形式とMoEアーキテクチャの2つの軸には、4GB VRAM という制約に対して効く選択肢が残っている。
容量は 385 GB 空いているので、取得コスト自体は低い。
形式ごとの品質・サイズの関係は第6章にまとめた。新規取得の観点で効くのは IQ4_XS で、
Q4_K_M と同等品質のまま約1割小さく、9Bクラスを全層GPUに近づけられる。
ここでは手持ちにある特殊な形式2つと、誤解しやすい QAT の位置づけを整理する。
手持ちの gemma-4-12B-it-QAT-Q4_0(6.50 GB)を見て
「QAT なら大きくても VRAM に載るのでは」と考えたくなるが、これは成り立たない。
Q4_0 形式そのもの。ファイルサイズは通常の Q4_0 と変わらない
そして gemma-4-12B-it-QAT は密モデルなので、次節の MoE のようなエキスパート退避も効かない。
毎トークン全パラメータが必要で、6.50 GB を 4 GB に収める方法がない。
4GB VRAM では動かない
| 形式 | 仕組み | 該当する手持ち |
|---|---|---|
Q4_0(QAT) | 量子化前提の再学習済み。同サイズで品質が高い | gemma-4-12B-it-QAT |
MXFP4 | 4bit浮動小数点。ブロック共有の指数を持つ | gpt-oss-20b |
MoE は総パラメータのうち一部の expert だけを毎トークン使う構造で、計算量は active パラメータで決まる。 密モデルなら 30B は本PCで論外だが、active 3B の MoE なら計算量は 4B クラスに近い。
制約はメモリ側にある。使わない expert も含めて全体を保持する必要があるため、
RAM 16GB がそのまま上限になる。ここで効くのが llama.cpp の --n-cpu-moe だ。
考え方は「毎トークン必ず使う部分を、いちばん速いハードウェアに置く」。
| 配置先 | 対象 | 理由 |
|---|---|---|
| GPU | attention、dense FFN、shared expert、埋め込み | 常時アクティブ。毎トークン確実に通るので、速いメモリに置く価値がある |
| CPU | routed expert(重みの大半) | 一部しか発火しない。gpt-oss-20b なら32エキスパート中トップ4のみ |
これが密モデルで成立しない理由もはっきりしている。密モデルは100%のパラメータが常時必要で、 CPUに逃がした分がそのまま毎トークンの転送コストになる。MoE では逃がした重みの大半が毎回は触られない。
--n-cpu-moe N は routed expert を CPU に戻す層数を指定する。
注意点として、層は最上位(いちばん番号の大きい層)から数える。
| VRAM | 30B級MoE(Q4)での開始値 | 調整方向 |
|---|---|---|
| 24 GB | 0 | そのまま載る |
| 16 GB | 20 | 下げると速くなる |
| 12 GB | 32 | 起動する範囲でゆっくり下げる |
| 4 GB(本PC) | ほぼ全層 | まず全エキスパートをCPUに置き、VRAMが余ったら下げる |
Nを大きくするほど VRAM 使用は減るが、CPU側の負担が増えて遅くなる。 参考として、6GB VRAM の環境で 35B-A3B クラスを約 30 tok/s で動かした報告がある。
| モデル | 総 / active | 量子化 | サイズ | 見込み |
|---|---|---|---|---|
| gpt-oss-20b | 21B / 3.6B | MXFP4 | 11.28 GB | 手持ちにあるダウンロード不要。まずこれを --n-cpu-moe で試す |
| Qwen3-30B-A3B-Instruct | 30B / 3B | IQ3_XXS 等 | 11〜13 GB | 要検証RAM 16GB に対してギリギリ。OS と合わせて逼迫する |
| Qwen3-30B-A3B-Instruct | 30B / 3B | Q4_K_M | 約 18 GB | 不可RAM に収まらない |
| 小型MoE 各種 | 〜10B / 1B級 | Q4_K_M | 3〜6 GB | 余裕密の4Bとの比較材料になる |
第6章では「密モデルで Q2 まで下げるのは損な取引」と結論づけた。 MoE はこの結論が当てはまらない、唯一の例外になる。
実例として、MoE向けの混合精度量子化は 21.3 GB で perplexity 6.552 / HellaSwag 83.5% を出しており、 45.3 GB の 8bit 版(6.536 / 82.5%)とほぼ同等の品質を半分以下のサイズで達成している。
| 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 に載せると余裕はほとんど残らない。
手持ちの gemma-4-E2B-it(3.19 GB)と gemma-4-E4B-it(4.97 GB)は、
MoE とは別の仕組みで「サイズの割に軽い」可能性がある系列。
| モデル | effective | total | 差分の正体 |
|---|---|---|---|
| gemma-4-E2B | 2.3B | 5.1B | Per-Layer Embeddings(各デコーダ層が持つ埋め込みテーブル) |
| gemma-4-E4B | 4.5B | 8B |
名前の E は effective(実効)の意味。PLE のテーブルは大きいがルックアップ専用で、 行列積には参加しない。設計上は低速なメモリ側に置ける性質を持つ。
第5章の表では総サイズだけを見て 実行困難 と分類したが、
これは MoE であることを考慮していない判定だった。
active 3.6B なので、--n-cpu-moe で expert をCPUに逃がせば、生成速度は 20B の密モデルとは別物になる。
新規ダウンロードを検討する前に、まずこれを実測する。
| 優先度 | やること | 取得量 | 狙い |
|---|---|---|---|
| 1 | 手持ちの gpt-oss-20b を --n-cpu-moe で実測(軸2・軸3) | 0 GB | MoEが本PCで実用になるかを、コストゼロで判定する。ここが優先度3の前提になる |
| 1' | 手持ちの gemma-4-E4B-it の実速度を測る(軸4) | 0 GB | PLE が効いて 4.5B 相当で動くか、8B 相当に留まるかを確認する |
| 2 | Qwen3.5-9B の IQ4_XS 版を取得 | 約 4.5 GB | 第二候補を Q4_K_M から置き換え、全層GPUに届くかを見る |
| 3 | Qwen3-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\ という既存の規約に合わせて置く。
各ステップは独立して確認できる単位に分けている。1つ終えるごとに動作を確かめてから次へ進む。
第4章で採用した案A(配布バイナリ)に沿って進める。公式リリースページから Windows 向けの CUDA ビルド一式を取得する。必要なのは2つのzip。
llama-b<番号>-bin-win-cuda-<版>-x64.zip … 本体cudart-llama-bin-win-cuda-<版>-x64.zip … CUDAランタイムDLL両方を 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 が出れば成功。
第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\ は作らない。
scripts\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 8080
pause
| オプション | 意味 |
|---|---|
-ngl 99 | GPUに載せる層数。実際の層数より大きい値を指定すれば「全層」の意味になる |
-c 8192 | コンテキスト長 |
--host 127.0.0.1 | ローカルのみ受け付ける。外部公開しない |
--port 8080 | APIとWebUIの待ち受けポート |
起動後、ブラウザで http://127.0.0.1:8080 を開くと同梱のチャットUIが出る。日本語で数往復して応答を確認する。
第二候補の 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)を足すと、この上限が数層伸びる。
-ngl をどう振っても直らないので、リリースの更新を確認し、それでも駄目なら第4章の案Bに切り替える。
llama-server は OpenAI 互換のエンドポイント
(http://127.0.0.1:8080/v1/chat/completions)を提供する。
LM Studio が提供していたものと同じ形式なので、これまで Claude Code から LM Studio に繋いでいた構成の接続先を差し替えるだけで済む。
127.0.0.1:8080 に切り替える1点だけllama-server 側が返すモデル識別子に合わせるLM Studio と llama.cpp のサーバはポートを分けて同時に立てられるので、 接続先を行き来させながら応答を比較でき、切り替えに失敗しても元に戻せる。
第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を超えると落ちる。
IQ2_M)へ進む
実行中は nvidia-smi と併せてタスクマネージャのメモリ使用量も見る。
コミット済みメモリが物理RAMを超えていれば、遅さの原因はCPU性能ではなくディスク読みにある。
第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 がどちら側に着地するかを見る。
| 指標 | 測り方 | 合格ライン |
|---|---|---|
| 生成速度 | llama-bench または llama-server のログに出る tok/s | 15 tok/s 以上 |
| 初回応答までの時間 | プロンプト投入から最初のトークンが出るまで | 2秒以内 |
| VRAM使用量 | nvidia-smi を推論中に実行 | 3.6 GB 以下 |
| 日本語の自然さ | 固定の質問セットを流して目視 | 不自然な語尾・中国語混入がない |
| 長文の破綻 | コンテキスト上限近くまで会話を続ける | 指示の取りこぼしがない |
1〜7 は手持ちのモデルだけで実施でき、追加取得を伴わない。8・9 は第7章の優先度2・3を実行した場合のみ。
| No | モデル | 量子化 | 配置 | コンテキスト | 狙い |
|---|---|---|---|---|---|
| 1 | Qwen3-4B-Instruct-2507 | Q4_K_M | -ngl 99 | 8192 | 基準となる構成 |
| 2 | Qwen3-4B-Instruct-2507 | Q4_K_M | -ngl 99 | 16384 | コンテキストを倍にした時の速度低下を見る |
| 3 | gemma-3-4b-it | Q4_K_M | -ngl 99 | 8192 | 同サイズ・別系列との対照。1 の評価がサイズ由来かモデル由来かを切り分ける |
| 4 | Qwen3.5-9B | Q4_K_M | -ngl 上限値 | 4096 | 部分オフロードが実用に耐えるか。併せて読み込み自体が通るか(第5章の原因2)も確認する |
| 5 | Qwen3.5-9B | Q4_K_M | -ngl 上限値 + KV量子化 | 4096 | 4 に KVキャッシュ量子化を足した効果 |
| 6 | gpt-oss-20b | MXFP4 | --n-cpu-moe | 4096 | MoEが本PCで実用になるか。第7章の優先度1 |
| 7 | gemma-4-E4B-it | Q4_K_M | -ngl 99 | 4096 | PLE が効いて 4.5B 相当で動くか、8B 相当に留まるか。第7章の優先度1' |
| 8 | Qwen3.5-9B 要取得 | IQ4_XS | -ngl 99 | 4096 | I-quant で全層GPUに届くか。4 と直接比較する |
| 9 | Qwen3-30B-A3B 要取得 | IQ2_M | --n-cpu-moe | 4096 | 6 で MoE に見込みがあった場合のみ。2bit帯のMoEが知識量で 4B を上回るか |
6・9 は RAM が律速になるため、他のアプリを閉じた状態で測る。 それ以外はVRAM側の勝負なので、画面表示を内蔵GPUに寄せた状態に揃える。
モデル間の比較を成立させるため、毎回同じ質問を同じ順で投げる。
| 結果 | 次の一手 |
|---|---|
| 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 の取得を省ける |
| どれも品質が不足 | 用途を絞るか、その用途についてはローカル実行を諦めてクラウドを使う |
第8章の Step 1〜3 を実施し、第9章の検証を llama-bench で測った。
使用ビルドは b10612(CUDA 12.4 / Windows x64 の配布バイナリ)。
| 項目 | 実測 | 計画時の想定との差 |
|---|---|---|
| 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(配布バイナリ)の手軽さは想定以上 |
| No | モデル | 配置 | pp512 | tg | 判定 |
|---|---|---|---|---|---|
| 1 | Qwen3-4B-Instruct-2507 | -ngl 99 | 1898 | 56.49 | 合格基準を大きく超えた |
| 2 | Qwen3-4B @深さ 4096 | -ngl 99 | — | 47.36 | 合格−16% |
| 2 | Qwen3-4B @深さ 8192 | -ngl 99 | — | 41.59 | 合格−26%。実用上限 |
| 2 | Qwen3-4B @深さ 16384 | -ngl 99 | — | 1.30 | 崩壊KVがVRAMを超過 |
| 3 | gemma-3-4b-it | -ngl 99 | 2314 | 56.25 | 合格No1 とほぼ同値 |
| 7 | gemma-4-E4B-it | -ngl 99 | 1149 | 45.23 | 合格PLE が効いた。想定外の good news |
| 4 | Qwen3.5-9B | -ngl 99 | 37 | 1.55 | VRAM超過共有メモリに落ちた |
| 4 | Qwen3.5-9B | -ngl 16 | — | 6.08 | 不足 |
| 4 | Qwen3.5-9B | -ngl 20 | — | 7.97 | 実用下限KV量子化なしのピーク |
| 4 | Qwen3.5-9B | -ngl 24 | — | 7.87 | 同等 |
| 4 | Qwen3.5-9B | -ngl 28 | — | 2.53 | 崖ここで超過する |
| 5 | Qwen3.5-9B +KV q8_0 +fa | -ngl 24 | — | 8.12 | 最良9Bクラスの上限 |
| 6 | gpt-oss-20b(MoE) | -ncmoe 24 | — | 3.63 | 遅い全エキスパートCPU |
| 6 | gpt-oss-20b(MoE) | -ncmoe 18 | — | 5.89 | MoEの上限ばらつき ±2.0 |
| 6 | gpt-oss-20b(MoE) | -ncmoe 14 | — | 3.10 | 崖VRAM超過 |
pp512・tg の単位は tok/s。tg は No1・No3・No7 が tg128、それ以外は tg64。
Qwen3-4B(56.49)と gemma-3-4b(56.25)が誤差の範囲で一致した。 モデル固有の性質ではなく、このGPUのメモリ帯域が決めている上限と考えてよい。 計画時の予測は 25〜40 tok/s だったので、実測が予測を4割上回った。
第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 を圧迫しにくい。
-ngl は「越えると崩れる」— 徐々に遅くなるのではない
Qwen3.5-9B で -ngl を振ると、20〜24 で 8 tok/s 前後を保ち、28 で 2.53 に落ちた。
-ngl 99 では 1.55 まで下がる。
-ngl を大きめに設定して「なぜか遅い」ときは、まずこれを疑う。
gpt-oss-20b は --n-cpu-moe で確かに動き、密モデルの20Bとしてはあり得ない速度が出た。
ただし最良でも 5.89 tok/s、しかも測定のばらつきが ±2.0 と大きい。
-ncmoe を下げるとGPU側が増えて速くなるが、14 まで下げると VRAM 超過で崩れる第7章の判断基準では「3〜10 tok/s:用途を限れば使える。優先度3の取得は保留」に該当する。
Qwen3-4B で会話の深さを変えて測ると、速度は素直には落ちず、ある点で崩壊した。
| 深さ | tg64 | 深さ0比 | 状態 |
|---|---|---|---|
| 0 | 56.16 | — | 全部VRAM内 |
| 4,096 | 47.36 | −16% | 順当な低下 |
| 8,192 | 41.59 | −26% | 実用上限 |
| 16,384 | 1.30 | −98% | 崩壊KVがVRAMからあふれた |
計画では「余裕があれば 16384 まで伸ばす」としていたが、その余裕は無かった。
モデル重み 2.32 GiB に対して空きが 3287 MiB しかないため、
16k 分の KV キャッシュを置くと超過する。-c 8192 を上限として運用する。
llama-server を起動し、OpenAI 互換エンドポイントに日本語で問い合わせた。
| 項目 | 結果 |
|---|---|
| 起動〜応答可能まで | 7.5 秒 |
/health | OK |
/v1/chat/completions | OKOpenAI 形式のまま応答 |
| 日本語の指示追従 | 合格「3つ・各30字以内・箇条書き」を正しく守った |
| API経由の実効速度 | 39.5 tok/s |
API 経由の 39.5 tok/s が llama-bench の 56.5 tok/s より低いのは、
HTTP のやり取りとプロンプト処理を含んだ実効値のため。体感速度としてはこちらが実態に近い。
127.0.0.1:8080 に向け替えるだけで、Claude Code から使える。
両者はポートが違うので、並べて立てて応答を比較できる。
第9章の質問セット5問を、Qwen3-4B と gemma-4-E4B の両方に同じ条件で投げた。 当初は3問だけで「速度と品質が逆転する」と結論づけたが、 残る2問(要約・長文読解)を加えると差が出る場面はもっと限定的だった。
| 設問 | 種類 | Qwen3-4B | gemma-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、いずれもモデル内部の知識に依存する設問である。
計画書の本文から抜き出した 413 字を素材にした。両者とも3行という指示を守り、内容も素材に忠実だった。
質としては E4B がわずかに勝るが、5.6 倍の時間を払う差ではない。
| モデル | 所要 | 応答の要旨 | 判定 |
|---|---|---|---|
| Qwen3-4B | 1.4 秒 | 「複雑な情報を小さな量子の状態で表現する技術」 | 誤り量子力学と混同している。日本語は自然なだけに気づきにくい |
| gemma-4-E4B | 13.9 秒 | 「32ビットから8ビット整数に丸めて圧縮し、サイズと計算量を削減する」 | 正確比喩も含めて過不足なし |
max_tokens=400 では回答本体に到達しなかった-Recurse が無く、「配下」という指定を満たしていない-Recurse 付き。サイズをMB換算し、パスも表示する実用的な形第7章の本文から 1970 字を素材にし、その文章にしか書かれていない情報を2つ問うた。 事前知識では答えられない設問である。
--n-cpu-moe の層の数え方の注意点は何か(正解: 最上位の層から数える)| モデル | 所要 | 結果 |
|---|---|---|
| Qwen3-4B | 6.6 秒 | 両問正解「最上位(いちばん番号の大きい層)から数える」と本文どおりに答え、理由も転送コストの観点まで説明した |
| gemma-4-E4B | 18.7 秒 | 両問正解思考 2174 字を経て、より簡潔に回答 |
1970字の文脈を保持し、そこから正確に答える能力は 4B でも十分にあった。 第2章で「小型帯では日本語の破綻が少ない」と見込んだ点は、読解でも裏付けられた形になる。
E4B が遅かった理由は速度ではなく出力量にあった。応答は2つのフィールドに分かれて返る。
| フィールド | 内容 |
|---|---|
reasoning_content | 思考過程。「ターゲット層は初心者」「字数制限は約150字」など、要件を分解してから答えを組み立てている |
content | 最終的な回答。ここだけがユーザーに見せる部分 |
生成 570 トークンのうち大半が思考で、生成速度自体は 41.1 tok/s と速い。
それでも 13.9 秒かかるのは、答えにたどり着くまでに書く量が多いためで、
この思考が Q2 の正答と Q4 の -Recurse を生んでいる。
max_tokens を大きめに取る。
400 では思考の途中で打ち切られ、応答が空で返る(Q3 がこれ)。
1500 程度を確保しておく。逆に短い応答を速く欲しい場面では Qwen3-4B を使う。
5問を通して見ると、分岐点は「対話か事実か」ではなく 「答えが渡した文章の中にあるか、モデルの中にあるか」だった。
| 答えの在り処 | 該当する作業 | 選ぶモデル | 理由 |
|---|---|---|---|
| 渡した文章の中 | 要約、翻訳、長文からの抽出、資料に基づく質疑、書き換え | Qwen3-4B | Q1・Q5 とも E4B と同じ正確さで、3〜6倍速い。品質を落とさずに速度を取れる |
| モデルの中 | 知識を問う説明、仕様の記憶に頼るコード生成 | gemma-4-E4B | Q2 で 4B は誤答し、Q4 では要件を落とした。ここだけは時間を払う価値がある |
| 形式が主 | 決まった書式での出力、箇条書き、整形 | Qwen3-4B | Q3 で指示を完全に満たした。E4B は思考が長く打ち切られた |
実運用では「モデルに思い出させるのではなく、資料を渡す」形に寄せるほど 4B で足りることになる。 E4B が要るのは、渡す資料が用意できない場面に絞られる。
| 項目 | 計画時の予測 | 実測 | 評価 |
|---|---|---|---|
| 4Bクラスの速度 | 25〜40 tok/s | 56 tok/s | 予測より良い4割上振れ |
| 9Bクラスの速度 | 6〜10 tok/s | 8.1 tok/s | 的中 |
| E4B の PLE | 効くか不明 | 効いた(45 tok/s) | 仮説が当たり |
| MoE の実用性 | 見込みあり | 5.9 tok/s | 部分的動くが RAM が律速 |
| 画面表示のVRAM | 0.4 GB | 0.79 GB | 想定より重い |
| コンテキスト 16384 | 余裕があれば可 | 不可 | 予測が外れ |
| アーキテクチャ未対応 | 起きうる | 起きなかった | 杞憂b10612 は全て対応済み |
| 導入の手軽さ(案A) | 5〜10分 | 約20秒 | 想定以上 |
| 4Bの長文読解 | 予測していなかった | 1970字を正確に処理 | 想定以上使い分けの基準が変わった |
| 位置づけ | モデルと設定 | 速度 | 用途 |
|---|---|---|---|
| 常用 | 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/s | 20B級の知識が要る場面のみ。他アプリを閉じて使う |
| 優先度 | 対象 | 判断 |
|---|---|---|
| 1 | gpt-oss-20b の実測 | 完了5.89 tok/s |
| 1' | gemma-4-E4B-it の実測 | 完了45.23 tok/s。PLE の効果を確認 |
| 2 | Qwen3.5-9B の IQ4_XS(約 4.5 GB) | 優先度を下げる全層GPU化できても E4B の 45 tok/s には届かない見込み。E4B が同じ役割を果たすため急がない |
| 3 | Qwen3-30B-A3B の IQ2_M(約 11 GB) | 見送り同じ 11 GB 級の gpt-oss-20b が 5.9 tok/s で RAM 律速。30B に替えても改善しない |
結局、追加ダウンロードは不要という結論になった。 手持ちの Qwen3-4B と gemma-4-E4B の2本で、速度側と品質側の両方が埋まっている。
第6章・第7章の数値と、--n-cpu-moe の挙動に関する記述はこれらに基づく。
--n-cpu-moe が数える向きUD-Q2_K_XL 系の位置づけ