270億パラメータのモデルを2ビット精度まで縮めても、16GBのグラフィックスカード1枚で実際の開発作業をこなせます。Qwen3.8 27Bの2ビット版であるQwen3.8-27B-Escha-W2は、重みに約10GBしか必要としません。9項目のテストでは、256kトークンのコンテキストに隠したパスキーを15回の試行すべてで見つけ、コーディング問題100問のうち75問に合格し、ほとんど手助けなしで動くWebアプリやゲームを作りました。一方で、2ビット量子化の代償も見えました。3Dアセットの仕上がりと、特定のフレームワークに依存するゲームコードの正確さです。控えめなハードウェアで大きなモデルをローカル実行したい人にとって、この結果が何を意味するのかを整理します。

2ビット化した27Bモデルの中身

量子化とは、モデルの重みの数値精度を下げてメモリ使用量を減らす手法です。Qwen3.8-27B-Escha-W2はQwen3.8 27Bを2ビットに量子化したファインチューニング版で、元の重みは10.15GBです。16GBや24GBの一般向けGPUに載せても、モデルが作業中に参照するテキストであるコンテキストのための空きが十分に残ります。

このモデルはHugging Faceで、推論エンジンllama.cppが使うファイル形式GGUFとして、2種類のビルドが公開されています。

ビルド ファイルサイズ 特徴
Q8_0 embed・head 10.31GB F16より2.38GB小さく、生成が3.4%速い
F16 embed・head 12.69GB 重みの丸め誤差はQ8_0との差がわずか約0.02%

精度の差はごくわずかなため、テストにはQ8_0ビルドを使いました。オプションとして2.93GBのMTP(マルチトークン予測)ドラフトモデルもあり、補助モデルが数トークン先を推測する投機的デコードで生成を速められます。ただし、16GBのうちできるだけ多くをコンテキストに回すため、今回は使っていません。

テスト環境と9つの課題

モデルはUbuntu Server 24.04.4上のllama.cppで動かし、CPUはAMD Ryzen 5700X、メモリはDDR4 32GBです。対象GPUは16GBのVRAMを備えたNVIDIA RTX 2000 Adaです。もう1枚のRTX 5090は、テストの自動化を速めるためだけに搭載しました。

9つの課題は4つのグループに分かれます。

  1. 性能:プロンプト処理と生成の素の速度
  2. 記憶:非常に長いコンテキストからの情報検索
  3. 問題解決:難易度別の推論問題とコーディング問題100問
  4. 開発:かんばんボードのWebアプリ、落下する砂の物理サンドボックス、ダンジョン探索ゲーム、そしてMCP(Model Context Protocol、AIモデルが外部ツールを使うための標準規格)でBlenderとGodotを操作する2つのエージェント課題

実験台に並ぶ9つのテスト台。それぞれ速度、記憶、推論、開発の課題を表す物が置かれている

▲ ローカルモデルの9つのテスト

速度を左右するのは主にカード

プリフィルはモデルがプロンプトを読み込む速さ、デコードは回答を書き出す速さです。

測定項目 結果
キャッシュなしのプリフィル 512トークンで毎秒235.1トークン、8kで295.1、32kで271.2
キャッシュありのプリフィル 512トークンで毎秒1,904.7トークン、32kで115,252
デコード 短い出力で毎秒11.6トークン、16kまでの平均で11.4

毎秒約11トークンというデコード速度は実用的ではあるものの速くはなく、主な原因はGPUにあるようです。RTX 2000 Adaは70ワットのワークステーション向けカードで、メモリ帯域幅は毎秒225〜250GBです。RTX 4080やRTX 4070 Ti SuperといったRTX 30、40、50シリーズの一般的な16GBデスクトップ向けカードは電力上限が高くメモリも速いため、同じモデルでもはるかに速くトークンを生成できるはずです。

長いコンテキストの記憶、推論、コーディングのスコア

記憶テストにはNeedle-in-a-Haystackの手法を使いました。コンテキストを256,608トークンまで広げ、テキストの0%、25%、50%、75%、100%の位置に秘密のパスキーを隠します。各位置で3回、合計15回の試行を56分36秒かけて行いました。モデルは毎回パスキーを見つけ、合格率は100%でした。回答には余分な思考過程やおしゃべりが付き、深い位置ほど少し長く雑然としましたが、抽出した答えは常に正確でした。

テスト 結果
推論48問 38問合格(79%)、1問あたり平均21,047ミリ秒
難易度別 易12問中12問、中12問中12問、難12問中10問、エキスパート12問中4問
HumanEval Remix 100問 75問合格(75%)、5問は無回答
回答した問題のみ 95問中75問合格(79%)

推論問題は論理、計画、確率を扱い、所要時間は16分50秒でした。HumanEval RemixはOpenAIのHumanEvalベンチマークを基にしたPythonの課題100問で、1時間8分かかり、平均応答時間は41,067ミリ秒でした。このサイズのモデルを2ビットまで圧縮したことを考えると、推論79%、コーディング75%は堅実な結果といえそうです。エキスパート難度で大きく落ち込む点は、難しい論理問題を任せる前に念頭に置いておく価値があります。

開発課題:アプリとゲームは得意、3Dはやや苦手

課題 追加の指示 使用したコンテキスト 結果
かんばんボードのWebアプリ 1回 57.3% ボタンのハンドラー漏れを1件修正
落下する砂のサンドボックス 0回 30.6% 初回で動作
ダンジョン探索ゲーム 0回 34.2% 初回で動作
Blenderのランタン 1回 89.7% 光が強すぎ、フックがずれる
Godotの3Dプラットフォーマー 3回 64.0% 操作の反転と衝突判定のエラーを修正

Webアプリとシミュレーション

かんばんボードは、To Do、In Progress、Doneの各列の間でのドラッグ・アンド・ドロップ、列の並べ替え、ダイアログでのカード編集、優先度ラベル、ダークテーマとライトテーマに対応しました。最初のビルドの唯一の欠陥は、Add Columnボタンにクリックリスナーが設定されていなかったことです。ボタンが反応しないと1回伝えると、モデルは漏れに気づいてJavaScriptファイルを修正しました。デフォルトの見た目は目を引くほどではないものの悪くなく、機能面のコードは高品質でした。

落下する砂のサンドボックスはセル・オートマトン、つまり各セルが単純な規則で更新されるグリッドです。砂が積もり、水が斜面を流れ落ち、酸が壁と砂の両方を溶かしました。ブラシサイズの変更、消しゴム、クリアボタンもすべて動作し、修正は不要でした。

手続き型生成のゲーム

ダンジョン探索ゲームではアルゴリズムの能力を試しました。モデルはマップを長方形に繰り返し分割するバイナリ空間分割を選び、つながった部屋と通路を配置しました。ブレゼンハムの直線アルゴリズムでプレイヤーから最大9マスまで視線を飛ばし、プレイヤーの移動に合わせてマップを明らかにしながら、未探索、探索済み、現在見えているマスをそれぞれ違う色で表示しました。スポーン地点を2回選んでしまう自らのバグにも気づいて修正しています。追加の指示は不要でした。

光の輪で少しずつ明らかになるダンジョンゲームと、内部が明るすぎる3Dランタン

▲ ゲームのロジックと3Dアセットの品質

MCPによるエージェント課題

MCPの課題では、2ビット精度の限界がよりはっきり表れました。Blenderでは、六角形のフレーム、とがった屋根、吊り下げ用のリング、内部の光源を備えたランタンを作り、4方向からレンダリングしました。内部の光は明るすぎ、上部のフックは取り付け用の球を回り込まずに食い込んでいました。モデルはシーンの保存とBlenderのヘッドレス実行を何度も繰り返して行き詰まり、スクリーンショットを直接求められてからようやく先に進みました。

最も難しい課題であるGodotのプラットフォーマーでは、集める鍵、動く障害物、ゴールが求められました。最初の版は両方向の操作が反転しており、穴をふさぐ物体には衝突判定がありませんでした。さらにGodot 4に存在しない衝突プロパティを使ったため崩れる足場のスクリプトが壊れましたが、コライダーのdisabledフラグに切り替えて修正しました。3回の修正指示と2回のコンテキスト圧縮を経て、ゲームは完全に遊べる状態になりました。

16GBで大きなモデルを動かす前に押さえたいこと

今回の結果からは、2ビット版はシステムメモリにあふれることなく、16GBのGPU1枚で27Bモデルを動かす現実的な方法といえそうです。長い文書からの検索や日常的なWeb開発では、品質の低下はほとんど感じられません。見た目の完成度が求められる3D作業や、特定のフレームワークの文法に厳密に従う必要があるコードでは、ハードウェアが許すならQ4やQ5の量子化のほうが明らかに優れています。

このようなモデルをローカルで動かすなら、次の点を確認しましょう。

  • 16GBのカードではF16よりQ8_0 embed・headビルドを選び、2GB以上のVRAMを節約する。
  • メモリに余裕がないときはMTPドラフトモデルを使わず、その分をコンテキストに回す。
  • 生成速度はカードのメモリ帯域幅でほぼ決まるため、まずそれを確認する。
  • 生成されたアプリに小さなバグがあれば、どのボタンが反応しないかなど症状を具体的に伝える。
  • MCPの作業中にモデルが同じコマンドを繰り返したら、中断して出力ファイルを直接求める。
  • Godot 4のようにバージョンによって仕様が違うツールのコードは、存在しないプロパティを使っていないか確認する。