Qwen3.5-397B IQ4_NL実測:28回のランで平均22.5tok/s、ハイブリッドオフロード構成と400B級MoEの常用可能性
Qwen3.5-397B-A17B(397B総パラメータ/17B活性MoE)をIQ4_NL量子化でEPYC 9175F + GPU環境にハイブリッドデプロイ。28回の連続推論で平均TG 22.5tok/s、最大PP 372tok/s。マルチGPUテンソルオフロードとcpu-moe構成を含む実行設定を記録。
背景
Qwen3.5-397Bは総パラメータ397B、活性17BのMoEモデル。通常はH100複数枚が必要なクラスだが、IQ4_NL量子化 + cpu-moe + テンソルオフロードの組み合わせで、EPYC + コンシューマGPU環境でも動く。
問題は「動くだけ」なのか「常用できる速度」なのか。28回の連続推論で定量評価した。
目的
- IQ4_NL量子化での定常TG/PP速度を28回のランから統計的に把握
- ハイブリッドオフロード(cpu-moe / マルチGPUテンソルオフロード)の実行構成を記録
- コンテキスト長依存性と安定性を評価
- 400B級MoEの日常運用可能性を判定
実験環境
| 項目 | 仕様 |
|---|---|
| CPU | AMD EPYC 9175F(Zen 5, 16C, L3 512MB) |
| メモリ | DDR5-6400 768GB(12ch) |
| GPU | NVIDIA RTX PRO 6000(96GB VRAM) |
| OS | Ubuntu 24.04 LTS |
| Runtime | ik_llama.cpp(cpu-moe有効) |
| 量子化 | IQ4_NL |
| コンテキスト | 最大262,144 |
結果
スループット統計(28回のラン)
| 指標 | Prefill (PP) | Generation (TG) |
|---|---|---|
| 最大値 | 372.24 tok/s | 24.04 tok/s |
| 最小値 | 101.49 tok/s | 19.13 tok/s |
| 平均(定常時) | 約160 tok/s | 約22.5 tok/s |
代表的なラン
| # | PP(tok) | TG(tok) | PP速度(tok/s) | TG速度(tok/s) | 合計(s) |
|---|---|---|---|---|---|
| 1 | 4,699 | 13 | 314.22 | 21.95 | 15.5 |
| 3 | 1,125 | 2,048 | 161.67 | 20.81 | 105.4 |
| 8 | 1,124 | 2,048 | 154.76 | 23.82 | 93.3 |
| 14 | 15,866 | 2,048 | 372.24 | 22.98 | 131.7 |
| 16 | 550 | 520 | 117.78 | 22.91 | 27.4 |
Run #14: 15,866トークンの大規模入力を42.6秒で処理し、22.98 tok/sで生成開始。1.5万トークンのソースコード群を40秒強で読み込める。
コンテキスト依存性
- PP速度: 短いプロンプト(<1k)では100 tok/s台。長くなるほど並列効率が上がり300 tok/s超に加速
- TG速度: コンテキスト長によらず21-24 tok/sの範囲で極めて安定
ハイブリッドオフロード構成
単一GPU + cpu-moe構成
IMG=compute.home.arpa/ik_llama-cuda
MODEL=/models/.../IQ4_KSS/Qwen3.5-397B-A17B-IQ4_KSS-00001-of-00006.gguf
podman run --rm -it --device nvidia.com/gpu=all \
-p 8001:8080 --shm-size 16g --cap-add=SYS_NICE \
-v "$MO":/models:ro,Z "$IMG" \
--host 0.0.0.0 --port 8080 -m "$MODEL" \
-c 262144 --threads 13 --threads-batch 24 \
--jinja -b 2048 -ub 2048 -ngl 99 \
-fa on --no-mmap --cpu-moe
--cpu-moe: GPUに収まらないエキスパート計算をCPU側で処理。EPYC 9175Fの12ch DDR5帯域がアクティブなエキスパートを供給し、GPU側でAttention演算を加速するハイブリッド設計。
マルチGPUテンソルオフロード構成
2GPU環境では-otで正規表現ベースのレイヤー分散が可能:
./build/bin/llama-server \
--model "$model" \
-fa on --ctx-size 135168 \
-ctk q8_0 -ctv q8_0 \
-ub 2048 -b 2048 -ngl 999 \
-ot "blk\.(0|1|2|...|12)\.ffn_(gate|up|down)_exps.*=CUDA0,\
blk\.(47|48|...|60)\.ffn_(gate|up|down)_exps.*=CUDA1" \
--cpu-moe --threads 24 --no-mmap --jinja
初期レイヤー(0-12)をCUDA0、終盤レイヤー(47-60)をCUDA1に割り当て。中間レイヤーはcpu-moeが処理。VRAM消費を平滑化しつつ135kコンテキストを確保。
考察
なぜ397Bが22 tok/sで動くか
397Bという巨大な器を持ちながら、推論時に動くのは17B。IQ4_NL量子化でメモリ帯域負荷を1/4以下に圧縮。12チャネルDDR5帯域がアクティブエキスパートを供給し、GPU側でAttention演算を加速する分業体制が「17B級の速度」を実現している。
IQ4_NL量子化の選択
397Bクラスでは量子化なしのデプロイは非現実的。IQ4_NLは品質の低下を最小限に抑えつつ、メモリフットプリントを大幅削減。28回のランで品質の明らかな劣化は観測されなかった。
ウォームアップの必要性
初回数回は挙動が揺らぐ。安定したTG速度に入るまで2-3回のダミーリクエストが有効。常駐運用前提ならウォームアップスクリプトを組み込む。
感想
「400B級は実験用」という認識は変わりつつある。22.5 tok/sは人間がリアルタイムで対話するには十分で、非同期バッチでは高い処理能力を意味する。
TG速度がコンテキスト長によらず21-24 tok/sで安定している点が特に重要。15kトークンのソースコードを投げても速度が落ちない。これは複雑なリポジトリ全体を食わせるユースケースで活きる。
マルチGPUテンソルオフロードは「GPU2枚あるなら使うべき」構成。cpu-moeだけでも動くが、-otでの明示的なレイヤー分散はスループットを向上させる。
補足ノウハウ
KVキャッシュ量子化
135k-262kの広大なコンテキストではKVキャッシュが大量のメモリを消費する。-ctk q8_0 -ctv q8_0でKVキャッシュを量子化し、メモリ圧迫を抑制。品質への影響は体感では小さい。
サンプリングパラメータ
安定したコード生成には--temp 0.7 --repeat-penalty 1.2 --min-p 0.01 --top-p 0.95 --top-k 40が有効。temp 1.0では創造的だが冗長になりやすい。

