VRAMに“熱いエキスパート”を! llama.cppのダイナミック・エキスパートキャッシュにより、レイヤー単位の単一GPUによる部分オフロードと比べてQwen3.5-122B-A10BでCPU+GPUトークン生成が27%高速化

Reddit r/LocalLLaMA / 2026/4/15

💬 オピニオンDeveloper Stack & InfrastructureIdeas & Deep AnalysisTools & Practical Usage

要点

  • 本記事では、トークン生成時のCPU↔GPU転送オーバーヘッドを削減するために、頻繁にルーティングされるMoEエキスパートのテンソルをVRAM上に動的に保持する「ホット・エキスパート・キャッシュ」手法を紹介する。
  • RTX 4090(24GB)+Ryzen 9 7950X(96GB)でQwen3.5-122B-A10Bを使用した場合、著者は「ホット・エキスパート・キャッシュあり」で22.67 tok/s、「すべてのエキスパートをCPUで実行」で15.65 tok/s(+44.8%)、さらに「レイヤーベースの部分オフロード」で17.87 tok/s(+26.8%)を報告している。
  • プロンプト処理性能は概ね同等であり、ホット・エキスパート・キャッシュはおおむねニュートラル〜わずかに混在する結果。一方、レイヤー単位のオフロードは、同程度のVRAM使用量でもプロンプト処理で軽い低下が見られる。
  • この方法は、最近のウィンドウにおけるエキスパートのルーティングを追跡(リバランス間隔やバイパス設定)し、一定周期で次の生成セグメントに向けてVRAM上でホットに保持するエキスパートを「リベット(再ベット)」することで実現する。
  • さらなる詳細のためのリポジトリリンクが提示されている(コードは共有されているが、バイナリは未提供)。本変更は完成版リリースというより、実験的な最適化として位置付けられている。

Claudeはコードで調理していましたが、私はこの投稿を自分で、原始人スタイルで書きました。Qwen3.5-122Bで遊びたかったのですが、統一されたメモリシステムがないので対応できず、15 tok/sはかなりきつかったです。23 tok/sもまだ厳しいものの、ストリーミング応答では正直かなり目に見えて速くなります。

Tl;dr:

  • 過去Nトークンの間に、どのエキスパートが最も頻繁にルーティングされるかを追跡します。これらの「頻繁にルーティングされる」エキスパートをVRAMにロードすることで得られる処理速度の向上が、システムRAM(コールド)からVRAM(ホット)へエキスパートテンソルを転送する際のレイテンシ増加を上回るだろう、という賭けをします。Nトークンごとに繰り返し、同じことを行います。

まず結果です:

  • 全CPUエキスパートのベースラインに対して:
    • +44.8% トークン生成(15.65 tok/s -> 22.67 tok/s)
    • プロンプト処理の回帰なし
  • 同等のVRAMコミット量に対する、層ベースのオフロードに対して:
    • +26.8% トークン生成(17.87 tok/s -> 22.67 tok/s)
    • プロンプト処理がごくわずかに遅い

ベースライン:すべてのエキスパートをCPUへオフロード(LLAMA_ARG_OVERRIDE_TENSOR=exps=CPU)

  • プロンプト処理(tok/s, n=2928):514.93、534.64、531.26
  • トークン生成(tok/s, n=約300):15.60、15.67、15.69

部分層オフロード(22.6 GB VRAM使用):GPUに8層をロード(LLAMA_ARG_N_CPU_MOE = 40)

  • プロンプト処理(tok/s, n=2929):556.42、581.73、618.08
  • トークン生成(tok/s, n=約300):17.93、17.81、17.87

ホットエキスパートキャッシュ(22.2 GB VRAM使用):VRAMキャッシュに44エキスパート枠(LLAMA_ARG_MOE_HOT_K = 44、LLAMA_ARG_MOE_HOT_REBALANCE_INTERVAL=60、LLAMA_MOE_HOT_PP_BYPASS_N_TOKENS=64)

  • プロンプト処理(tok/s, n=2929):557.18、542.76、546.77
  • トークン生成(tok/s, n=約300):22.26、22.97、22.77

セットアップ:

  • RTX 4090 24GB + Ryzen 9 7950X 96GB
  • bartowskiのQwen3.5-122B-A10B Q4_K_L + bf16 vision mmproj
  • KV Cache 131Kトークン @ Q8_0/Q8_0
  • プロンプト処理のために、ubatch=3072 & batch=3072

詳細はこのリポジトリへ(現時点ではコードのみ、バイナリはまだ調理中):https://github.com/ParmesanParty/llama.cpp

submitted by /u/TriWrite
[link] [comments]