Skip to content

deepseek4: expert_used_count の override をハッシュルーティング層と両立させる - #13

Merged
ishikawa merged 2 commits into
my-llamafrom
fix/dsv4-expert-used-override
Aug 2, 2026
Merged

ishikawa merged 2 commits into
my-llamafrom
fix/dsv4-expert-used-override

Conversation

@ishikawa

@ishikawa ishikawa commented Aug 2, 2026 •

Copy link
Copy Markdown
Owner

deepseek v4 flash の decode 高速化の一環です。--override-kv deepseek4.expert_used_count=int:N で routed 層の使用 expert 数を減らせるようにします (実測 N=5 で +21%、N=4 で +34%)。

  • ハッシュルーティング層 (最初の 3 層) は GGUF 固定幅のトークン→expert 表を使うため削減の対象外とし、表の実幅で動かします
  • override なしの動作は不変です (greedy 出力の bit 一致を確認済み)

ハッシュ層のトークン→expert 表 (ffn_gate_tid2eid) の幅は GGUF 固定で、
expert_used_count を override すると形状検証がロードで落ちる。表の実幅で
ロードし、ハッシュ層の build_moe_ffn には表の幅を渡すことで、routed 層だけ
使用 expert 数を減らせるようにする。override なしの動作は変わらない

@ishikawa ishikawa left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

変更点の補足です。

Comment thread src/models/deepseek4.cpp
const ggml_tensor * tid2eid_meta = ml->get_tensor_meta(tn(LLM_TENSOR_FFN_GATE_TID2EID, "weight", i).str().c_str());
const int64_t n_hash_used = tid2eid_meta ? tid2eid_meta->ne[0] : n_expert_used;
layer.ffn_gate_tid2eid = create_tensor(tn(LLM_TENSOR_FFN_GATE_TID2EID, "weight", i), {n_hash_used, n_vocab}, 0);
} else {

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

表の幅は override 後の n_expert_used とは無関係なので、テンソルメタの実寸でロードします。meta が取れない異常系は従来どおり n_expert_used に落として形状検証に任せます

Comment thread src/models/deepseek4.cpp
@@ -1154,7 +1163,7 @@ llama_model_deepseek4::graph::graph(const llama_model & model, const llm_graph_p
layer.ffn_gate_exps,

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

build_moe_ffn は selected_experts を渡した場合も n_expert_used 引数で weights を reshape するため、ハッシュ層には表の実幅を渡す必要があります

@github-actions github-actions Bot added the model label Aug 2, 2026
- build_moe_ffn の最終集約が hparams.n_expert_used 固定で、ハッシュ層の
  実計算幅 (表幅) と食い違うと一部の expert 出力が合算されない (Codex 指摘)。
  warmup 時のみ hparams 幅に抑制し、通常時は引数幅で集約する
- metadata-only ロード経路で表幅が読めない場合に警告を出す (Codex 指摘)
- n_expert_used_layer を int64_t にする (Gemini 指摘)
@ishikawa

ishikawa commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

3 視点レビューの結果と対応です。

  • Codex (Critical、採用): build_moe_ffn の最終集約ループが引数でなく hparams.n_expert_used を参照するため (upstream graph : avoid huge warm-up graphs for MoE models ggml-org/llama.cpp#14753 の warmup 対策由来)、override 時にハッシュ層で表幅 6 のうち override 数しか合算されない。→ warmup 時のみ hparams 幅に抑制し通常時は引数幅で集約するよう修正。override なしの greedy 出力が修正前後で bit 一致することを確認済み
  • Codex (Major、採用): llama_model_init_from_user 経由 (weights_map なし) では表幅が読めず黙ってフォールバックする。→ 警告ログを追加
  • Gemini (採用): n_expert_used_layer の型を build_moe_ffn の引数型に合わせ int64_t に変更
  • Gemini (不採用): meta null フォールバックが形状不一致クラッシュを招くという指摘は、通常ロードでは直後の create_tensor が missing tensor で fail-fast するため誤り
  • 品質面の注意 (再正規化ドリフト、タスク別の崖的劣化) は override 運用の品質評価項目として ishikawa/local-llm#87 に引き継ぐ

修正後の検証: override なし bit 一致 / used=5 で run 間決定論・出力一貫を確認。

@ishikawa
ishikawa merged commit c40b49c into my-llama Aug 2, 2026
9 of 24 checks passed
@ishikawa
ishikawa deleted the fix/dsv4-expert-used-override branch August 2, 2026 21:55
ishikawa added a commit that referenced this pull request Aug 9, 2026
#13 (c40b49c) で追加した「--override-kv deepseek4.expert_used_count
でハッシュルーティング層 (blk.0-2) の実 expert 数を保つ」対応を廃止する。

local-llm#93 で used=5 への削減は品質リスクに見合わないとして本番
(既定の used=6) に戻すことが決定済みで、本番起動構成は override を
使わない。現行 K128/K144 GGUF は `ffn_gate_tid2eid` の幅が常に
`expert_used_count` と一致する (GGUFReader で実測確認済み) ため、
override なしではこの revert によるロード・生成挙動の変化はない。

override を使った使い捨ての計測・較正セッションで必要になった場合は
このコミット (および直前の 4aa7f3c revert) を履歴から復元する。

コンフリクト解消: src/models/deepseek4.cpp は #13 直後に追加された
`flags` 引数 (nextn/mtp 対応、本 revert と無関係) を維持しつつ、
tid2eid テンソル幅の決定ロジックのみ #13 以前の `n_expert_used` 直読
みに戻した。

This reverts commit c40b49c.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant