3枚RTX4090 48GBで176B NVFP4 MoEを動作させるvLLMレシピの公開
30秒でわかる内容解説
GitHubユーザー chenxin199305が、約176BパラメータのQwen3.8-Flash-Next NVFP4 MoEモデルを3枚のRTX 4090 48GBで動作させるvLLMレシピを2026年10月26日に公開した。従来の2枚組やカード追加を避け、独自のパラメータ分割と8bit浮動小数点変換でVRAMを節約している。524Kの文脈長に対応しながら約101万トークンのKVキャッシュプールを実現し、ローカルPC環境で超大規模モデルを動かす新たな選択肢を示している。
176BクラスのMoEモデルを3枚の48GBカードで分割動作させる仕組み
公開されたレシピの核心は、TP3とEP3を組み合わせた並列計算構成にある。TP3はアテンション層を3つのGPUに分割し、EP3は専門家モジュール型アーキテクチャ(MoE)の専門家モジュールをGPUごとに完結させる。これにより、中間層サイズのパディングが不要になり、カードあたり約4.5ギガバイトのVRAMを節約できた。
モデル重みの読み込み量はカードあたり約28ギガバイトに収まり、従来の24GBカードでは起動できなかった。8bit浮動小数点(FP8)形式への変換もVRAM圧縮に寄与している。側面層とMulti-Token Prediction(MTP)専門家の一部をFP8化し、キーバリュー(KV)キャッシュもFP8形式で保存する。
これにより524Kの文脈長設定で、約101万トークン分のKVプールが確保される。単一の524Kリクエストに対して約1.93倍の並列処理が可能になる。環境構築にはvLLM 0.30.0とCUDA 12.8が必須だ。
バージョン固有のパッチを適用することで、MARLIN行列演算カーネルの計算誤差を修正し、プレフィックスキャッシュの挙動を安定させている。CPUメモリは256ギガバイトを推奨し、n-gram埋め込みテーブル(PLE)をホストメモリに固定する。
24GBカードの限界とパディング回避で導かれた最適構成
ローカルPCで170Bクラス以上のMoEモデルを動かす際、従来の手法は2枚構成に落ち込むか、4枚目のGPUを追加するケースが大半だった。3枚構成でTP3を適用すると、MoEの中間層サイズ640が3で割り切れないため、768にパディングする必要がある。このパディングはVRAM消費を増加させるだけでなく、モデル精度の低下リスクも伴う。
chenxin199305はEP3を採用することで、各GPUに171、171、170個の専門家モジュールを完全な状態で配置した。パディングを廃した結果、VRAM使用量がカードあたり約4.5ギガバイト削減された。同時に、MARLINカーネル内のtop-k乗算処理を修正し、相対誤差を0.47から0.0016に収めた。
YaRN位置埋め込み拡張スケーリング因子2.0を適用し、ropeパラメータを直接指定する方式に切り替えた。これにより、vLLMの新しいバージョンで削除されたフラグが原因で文脈長が262Kに制限される事態を回避した。PLEテーブルは51.2ギガバイトと大きいため、GPUメモリに載せるとOOMする。
これをVLLM_PLE_CPU_OFFLOAD=1でホストメモリに固定し、UVA経由で8回/トークンの参照を実現した。QSAバックエンドではMTPのドラフトメタデータ再構築がボトルネックだったため、upstreamのPRをポートして解決している。
単一ストリームから並列処理まで測定されたスループット数値
参考ホストでの性能測定では、単一ストリームで約124トークン/秒、16ストリームの並列処理で約635トークン/秒を記録した。 FP8 MTPを適用した場合、BF16版と比較してスループットはほぼ同等だが、KVプールが約5万2千トークン増加している。MTPの深さをK=2に設定したデフォルト構成が、単一処理速度と並列処理能力のバランスが取れている。
構成の微調整により用途に合わせたプロファイルが選べる。 測定条件は出力256トークン固定で、Server-Sent Events(SSE)チャンク数ではなく実際の完成トークン数を計測している。同一ホストでの単一実行結果であり、環境によって数値は変動する可能性がある。
| プロファイル | MTP | 用途 |
|---|---|---|
| balanced | 2 | デフォルト |
| capacity | 0 | 最長文脈・最大KV |
| throughput | 2 | 並列エージェントセッション |
検証済みのテキスト生成と今後のビジョン機能テスト
現在検証されているのはテキスト生成機能のみである。ビジョン機能やマルチモーダル処理については、このレシピではテストされていない。また、FP8 MTPの検証はK=2の構成に限定されており、K=0や1、3の組み合わせは再検証されていない。
systemdシステム管理デーモンユーザーユニットファイルは提供されているが、参考ホストではvalidateされていないため、start.shとstop.shスクリプト経由での起動が確実な運用パスとなる。パッチの適用はvLLM 0.30.0の特定のコミットに固定されている。バージョンがずれると`--check`コマンドが失敗するため、更新には注意が必要だ。
モデル重みファイルはリポジトリに含まれておらず、公開元のライセンスに従って取得する必要がある。PyPI版はドライバー570でCUDA 13のリンクエラーが出るため、ソースビルドかコンテナ利用が推奨される。今後はビジョン機能の検証結果と、異なるCUDAドライバー環境での動作報告が期待される。
2026年10月26日の公開以降、コミュニティからのパッチ修正や構成例の追加が進む見込みだ。