125BのQwen3.8-Flash-Nextを2bitに落としてRTX 3060で動かす:VRAM 12GB・メモリ32GB・SSDで毎秒16トークン

社内の検証マシン「DQN」(GeForce RTX 3060 12GB、メモリ32GB)で、Qwenの大型モデル「Qwen3.8-Flash-Next」を動かしてみました。パラメータ数は125B(1,250億)で、ふつうに考えればVRAM 12GBのPCで動かす大きさではありません。2bit相当(Q2_0)まで量子化し、そのうえで必要な部分だけをSSDから読み込む「Strata」というエンジンを使って、無理やり載せています。
文章を書く速さ(生成)は毎秒約16.7トークン(中央値)、長いプロンプトを読み込む速さは毎秒約200トークンでした。短い質問なら2秒ほどで答え始めます。ただ、2万トークン級のプロンプトだと読み込むだけで1分半から2分かかります。コーディングエージェント(pi、OpenCode)にツールを使わせる簡単なテストは、どちらも通りました。
構築日:2026年10月11日(日本時間)。速度は、同日から10月12日までにDQNが処理した51件のリクエストの記録から集計しました。公式情報の確認日は2026年10月13日です。
Qwen3.8-Flash-Nextとは
Qwen3.8-Flash-Nextは、Qwenチームが次の世代(Qwen4)に向けた構造の試作として公開した、オープンウェイトのモデルです。出典:公式モデルカード。
| 項目 | 公式モデルカードの情報 |
|---|---|
| 規模 | 125B。1トークンの計算で動くのはそのうち6B。ほかにn-gram埋め込み51B、MTP(先読み用の層)4B |
| 構造 | MoE(Mixture of Experts)。48層、各層に512個のエキスパートがあり、1トークンごとに10個(+共有の1個)だけを使う |
| 注意機構 | Gated DeltaNetとQwen Sparse Attention(QSA)の組み合わせ |
| コンテキスト長 | 262,144トークン(最大100万トークンまで拡張可) |
| 入力 | 文章と画像(今回は文章だけを試した) |
| ライセンス表記 | qwen-community-1.0 |
元の精度(BF16)のままだと、ファイルは354GBあります。
2bit版(GSQ-RCO Q2_0)
使ったのは、オーストリア科学技術研究所の研究室(ISTA DASLab)が公開している量子化版です。GSQとRCOという手法で、重みのテンソルごとに精度を割り振っています。大きさは4種類あり、いちばん小さいQ2_0は平均2.40bit、ファイルは合計66.4GBです。
| 版 | 平均bit | 合計サイズ | AIME25 | GPQA-Diamond | LiveCodeBench v6 | 3つの平均 |
|---|---|---|---|---|---|---|
| BF16(元の精度) | 16 | 354GB | 100.00 | 91.92 | 87.43 | 93.12 |
| IQ3_S | 3.50 | 83.6GB | 100.00 | 92.93 | 86.86 | 93.26 |
| IQ3_XXS | 3.00 | 75.8GB | 100.00 | 91.41 | 86.29 | 92.57 |
| Q2_0(今回) | 2.40 | 66.4GB | 96.67 | 89.39 | 81.14 | 89.07 |
上の値はISTAのモデルカードの報告で、本稿では再現していません。Q2_0は3bit版より平均で3.5ポイントほど低いかわりに、読み込みと生成が速くなる形式だと説明されています。
ファイルは2つに分かれていて、2つ目(28.8GB)はn-gram埋め込みの表です。1トークンにつき1行しか読まないので、SSDに置いたままでよいとされています。
実際に入れたのは「abliterated」版
手本にした構築手順(後述)がこの版を使っていたため、DQNに入れたのは、ISTAの量子化版をもとにしたSC117/Qwen3.8-Flash-Next-GSQ-RCO-abliterated-GGUFのQ2_0です。これは、依頼を断る働きを取り除いた(abliterated)版です。モデルカード自身も「組み込みの安全策がほぼ働かないので、利用者の前に出すなら自前の安全対策を用意すること」と注意しています。
DQNでは、社内VPNの中からだけ使える形にしています。手本の説明によると、同じ手順はISTAの通常版でもそのまま使えます。ふつうの用途なら、通常版を選ぶほうが無難です。
検証環境
| 項目 | DQN |
|---|---|
| GPU | GeForce RTX 3060(VRAM 12GB)、ドライバー 580.178.04 |
| CPU | Core i5-12400(6コア12スレッド。AVX-512なし) |
| メモリ | 32GB(OSから見て30GiB)+スワップ7GiB |
| SSD | NVMe 1TB(Phison E27T、DRAMなし) |
| OS・CUDA | Ubuntu 24.04.4 LTS、CUDA 12.9 |
| エンジン | Strata(bodhi37/strataのorca-portブランチ、コミット b90510c) |
| モデル | SC117 abliterated Q2_0(リビジョン eec4e10)+MTP用ファイル mtp-q2_0.gguf |
手本の構成は、Ryzen 9 9900X、RTX 4070 SUPER 12GB、メモリ30GiB(+zram 30GiB)です。Q2_0の生成速度は、短い文脈で毎秒39〜44トークンと報告されています。DQNはGPUが1世代前で、CPUのコア数も半分、メモリに置ける量も少なめです。
なぜVRAM 12GBで動くのか
Q2_0でも、エキスパートの部分だけで31.6GiBあります。VRAM 12GBにはもちろん、ほかのサービスも動くメモリ32GBにも収まりません。Strataは、MoEが1トークンで使うエキスパートが少ないことを利用して、次のように置き場所を分けています。
- 1トークンで使うエキスパートは、48層×10個=480個だけです。Q2_0では1個が約1.38MBなので、1トークンにつき約660MB分を読めば計算できます
- エキスパート全体(31.6GiB)はSSD上のファイルに置きます。よく使うものだけを、メモリ(DQNでは8GiB)とVRAM(3,000個、約3.9GiB)に置いておきます
- どのエキスパートがよく使われるかは、配布されている利用回数の記録(プロファイル)から決めます
- 会話の記憶(KVキャッシュ)は4bit(q4_0)に縮めます
- MTP(モデルに組み込まれた先読み)と、文中の繰り返しを使った先読みで、1回の計算で複数のトークンを進めます
以前の記事「12GB VRAM で Qwen3.6-35B-A3B を高速に動かす」では、モデル全体をVRAMとメモリに収めていました。今回は、メモリにも入りきらない分をSSDから読むところが違います。
セットアップの手順
手本にしたのは、bodhi37さんが公開している構築手順「Qwen3.8-Flash-12GBRAM-32GBVRAM-SSD-Recipe」です。DQNでは次の順に進めました。モデルのダウンロード開始からAPIが最初に答えるまで、約16分でした。
1. モデルをダウンロードする
from huggingface_hub import snapshot_download
snapshot_download(
repo_id="SC117/Qwen3.8-Flash-Next-GSQ-RCO-abliterated-GGUF",
revision="eec4e10a2c29b440a2ae85591fa11569ce752963",
allow_patterns=["Q2_0/*", "mtp-q2_0.gguf"],
local_dir="/home/kiyo/models/qwen38-sc117",
max_workers=2)
Q2_0の2ファイル(38.0GB+28.8GB)とMTP用のファイル(0.89GB)で、約10分かかりました。
2. Strataをビルドする
手本はCUDA 13.3とRTX 4070 SUPER(sm_89)向けです。DQNでは、入っているCUDA 12.9と、RTX 3060のsm_86に変えてビルドしました。Strataが使うggmlは、llama.cppの決まったコミット(3cf0325)のソースを third_party/llama.cpp に展開しています。
cmake -G Ninja -S . -B build-dqn -DCMAKE_BUILD_TYPE=Release \
-DSTRATA_ENABLE_CUDA=ON -DSTRATA_BUILD_TESTS=OFF -DSTRATA_WERROR=OFF \
-DCMAKE_CUDA_ARCHITECTURES=86 \
-DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.9/bin/nvcc \
-DSTRATA_GGML_DIR=$PWD/third_party/llama.cpp \
-DSTRATA_NATIVE_EXPERTS=ON
cmake --build build-dqn --target strata -j 4
3. Strata用にファイルを詰め直す
StrataはエキスパートをGGUFから直接読まないので、1回だけ専用の形式に変換します。
Q2=/home/kiyo/models/qwen38-sc117
.venv/bin/python tools/iq_pack.py \
--gguf $Q2/Q2_0/Qwen3.8-Flash-Next-GSQ-RCO-abliterated-Q2_0-00001-of-00002.gguf \
--out $Q2/pack-q2
.venv/bin/python tools/make_native_head.py \
--arch-shard $Q2/Q2_0/...-00001-of-00002.gguf \
--tensor-shard $Q2/Q2_0/...-00001-of-00002.gguf \
--out $Q2/head-q2.gguf
.venv/bin/python tools/mtp_rt.py --gguf $Q2/mtp-q2_0.gguf --out $Q2/mtp-runtime
.venv/bin/python tools/make_profile_from_counts.py \
data/counts-sc117-r1.strc dqn/profile-sc117-r1.bin --blob-bytes 1382400
ここでエキスパート以外の重み(1.5GB)と、エキスパートの目録ができます。エキスパート本体のファイル(34GB)は、初めて起動したときに組み立てられます。手本が使っている新しいプロファイル(r2)は、指定のコミットに入っていませんでした。そこで、同梱されている利用回数の記録(r1)からDQN用のプロファイルを作りました。r1の記録では、使われた回数の多い2,000個(2.6GB)で全体の利用の54%、8,000個(10.3GB)で94%をまかなえます。
4. 設定をDQNに合わせて縮める
| 設定 | 手本(Q2_0) | DQN |
|---|---|---|
--hot-ram-gib(メモリに置くエキスパート) | 21.0 | 8.0 |
--expert-cache(VRAMに置くエキスパートの数) | 3000 | 3000 |
--pool-workers(CPUの作業スレッド) | 12 | 6 |
--prefill(読み込みの区切り) | 16384 | 1024 |
--spec(先読みの最大数) | 6 | 4 |
--max-context | 131072 | 32768(最初は8192) |
--prompt-cache(保存する会話の数) | 6 | 1 |
メモリに置く量を8GiBまで減らしたのは、DQNのメモリが32GBで、ほかのサービスも動いているからです。CPUの作業スレッドは、コア数に合わせて6にしました。
StrataにはOpenAI互換のAPIサーバーが付いています。これをsystemdのサービスにして、それまでDQNで動かしていたローカルLLM(ik_llama.cpp)と入れ替えました。2つを同時に動かすとVRAMが足りないので、サービスの設定に Conflicts=ik-llama.service を書いて同時に起動しないようにしています。メモリも MemoryHigh=18G、MemoryMax=20G で上限を決めました。
結果
起動とメモリ
初めての起動では、GGUFからエキスパートのファイル(31.64GiB)を組み立てるため、APIが使えるようになるまで約4分かかりました。2回目からはできたファイルをそのまま使うので、約20秒で立ち上がります。起動後のVRAMの使用量は約9.9GB(空き約2.9GB)、メモリは約17〜18GBでした。
速さ
| 場面 | 結果 |
|---|---|
| 短い日本語の質問(入力35トークン、出力28トークン) | 答え始めまで1.96秒、全体で3.7秒 |
| Pythonのコードを書かせる(入力56トークン、出力357トークン) | 全体で22.8秒、生成は毎秒17.3トークン |
| 生成の速さ(出力50トークン以上の45件) | 中央値 毎秒16.7トークン(最小14.1、最大20.3) |
| 長いプロンプトの読み込み(1,000〜27,000トークン) | 毎秒約120〜210トークン。27,180トークンで約2分15秒 |
| 同じ会話の続き | 前の内容を覚えていれば、新しく足した部分だけを読む |
生成の速さは、手本の報告(毎秒39〜44トークン)の半分以下です。ログを見ると、使ったエキスパートの13〜22%ほどが、メモリにもVRAMにもなくSSDから読まれていました。コードを書かせた357トークンの例では、SSDから43.1GB(毎秒約2.1GB)を読んでいて、1トークンあたり約120MBになります。メモリに置ける量(8GiB)が手本(21GiB)よりかなり少ないことが効いていると考えられますが、設定を変えての比較はしていません。
先読み(MTP)は効いていて、コードの例では1回の計算で平均2.2トークン進みました。
回答の中身
「あなたは何ができますか?箇条書きで3つ挙げてください」と聞いた答えは、次のとおりです。
- 質問への回答や情報整理
- 文章の作成、翻訳、要約
- 論理的思考や計算
リストから重複を取り除く関数を書かせると、元の順序を保ったまま重複を除く正しいコードと、計算量の説明を返しました。ただ、説明文に「長数」(正しくは「長さ」)、「保われる」(正しくは「保たれる」)という日本語の誤りが2か所ありました。2bitにした影響かどうかは、ほかの版と比べていないのでわかりません。
コーディングエージェントから使う
piとOpenCodeに「probe.txt を読んで、中に書いてある値だけを答えて」と頼みました。どちらもファイルを読むツールを使い、正しい値を返しました。
OpenCodeは最初に渡す指示文が約1万トークンあり、最初の応答まで約85秒かかりました(うち読み込みが約75秒)。2回目は前の内容を覚えていたので、約5秒で返っています。piは指示文が約1,700トークンと短く、待ち時間は少なめでした。
つまずいた点
- CUDAとGPUの世代:手本はCUDA 13.3、sm_89向けでした。DQNのCUDA 12.9、sm_86に変えてビルドし、問題なく通りました
- プロファイルがない:手本が使うプロファイル(r2)が、指定のコミットに入っていませんでした。同梱の記録(r1)から作り直しました
- コンテキストが足りない:最初の8,192トークンでは、OpenCodeの指示文(約1万トークン)が入りません。32,768トークンに広げました
- 再起動でポートが空いていない:10月12日の再起動では「ポート8080が使用中」で起動に10回失敗し、約50秒後に自動の再起動で立ち上がりました。何がポートを使っていたかは記録に残っていません
この検証でわかること・わからないこと
- 速さは、実際に使ったリクエスト51件の記録から集計したものです。条件をそろえたベンチマークではありません
- 回答の正しさは、短い質問、コード1問、ツールを使う課題2件を見ただけです。公式の点数は再現していません
- 3bit版(IQ3_S)や通常版との比較、設定を変えての比較はしていません
- 使ったのはabliterated版なので、断るべき依頼への反応は通常版と違います。安全面の評価はしていません
- 画像の入力は試していません
- 10月11日から12日まで約26時間続けて動かし、その間にメモリの上限(20GB)で止まることはありませんでした
まとめ
125Bのモデルでも、MoEで1トークンに使う部分が小さければ、VRAM 12GB・メモリ32GBのPCで「動く」ところまでは持っていけました。毎秒16トークン前後なら、チャットとしては十分に読める速さです。
一方で、長いプロンプトの読み込みは毎秒200トークンほどです。大きなファイルを何度も読ませるエージェントの用途では、待ち時間が長くなります。同じDQNで動かしていたOrnith 1.5(35B、生成は毎秒約57トークン)と比べると、速さは3分の1以下です。大きなモデルの賢さを取るか、小さなモデルの速さを取るかで、使い分けることになりそうです。
参照資料
Qwen3.8-Flash-Next 公式モデルカード / ISTA DASLab GSQ-RCO GGUF / SC117 abliterated GGUF / 構築手順(bodhi37) / Strata(bodhi37のフォーク) / GSQの論文 / RCOの論文。情報は2026年10月13日に確認。
