Phase 3 — バックボーンのエキスパート RAM オフロード (M0)

MoE エキスパート FFN を VRAM でなく CPU RAM からストリーミングすれば、64 GB のコーディネータ 1 台が 122B を収める——グラフ手術なしで。

エキスパート FFN が VRAM に住む必要はない。CPU RAM からストリーミングすれば、エキスパートが VRAM を超えるモデルをコーディネータ 1 台が収められる——弱いノードが大型 MoE に参加できるようにする土台だ。

プランナー検証 · 実 122B GGUF

122B が単一の 64 GB コーディネータに収まる

以前のリングは重みを VRAM のみに配置したため、122B(77.6 GB)は 64 GB GCD で infeasible だった。エキスパートオフロード規則を使うと、dry-run は feasible で返る:

feasible
122B リングプラン
62.6
VRAM GiB (≤ 64)
14.2
RAM GiB (エキスパート)
10
オフロードされたレイヤー
A coordinator siphoning expert tiles from VRAM into a RAM reservoir, stamped feasible

プランナー出力——推論エンジン の -ot 規則形式。

node 0  layers [0,48]  vram=62.6  ram=14.2  ot_rules=10
sample: blk\.38\.ffn_(up|down|gate)_(ch|)exps=CPU   # inference engine -ot format
何を配線したか · 純 Python、C++ 再ビルドなし

プランナーのオフロード規則を実ロードまで運ぶ

  • planner — 各 placement に既に ot(カンマ結合の -ot 規則)を生成。
  • protocol.py — StageStartRequest.ot フィールドを追加。
  • runtime.py — placement の ot をステージリクエストへ転送。
  • stage_service.py — コーディネータが --override-tensor で起動。
  • linkcpp-server は未知の引数を素の llama-server へ転送するため、-ot はそのまま効く。
# stage_service.py — coordinator branch
if request.ot:
    command += ["--override-tensor", request.ot]

ot プロトコルの往復テストと、コーディネータコマンドが --override-tensor を出力する確認で検証し、hub は回帰なく再デプロイされた。当時の残り:完全な 2 ノード 77 GB ロード(オフロード付きコーディネータ + 約 1.5 GB の 1 レイヤーウィンドウを持つスマートフォン)で、サーバー可用性待ち。M0 の核心——弱いノードが大型 MoE に参加できるようにするバックボーンオフロード——はコードとプランナーのレベルで完結した。