Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ae912f8
feat(model_engine): return per-request MoE routed experts from genera…
sudhu2k Sep 16, 2026
0dd2de0
feat(model_engine): harden routed-experts capture for PP, CUDA graphs…
sudhu2k Sep 16, 2026
c94c0b2
feat(model_engine): harden routed-experts return against disagg/topol…
sudhu2k Sep 16, 2026
fe8c0b9
feat(model_engine): harden routed-experts return against DP-attention…
sudhu2k Sep 16, 2026
ed12c55
feat(model_engine): move routed-experts export to a CPU slot buffer w…
sudhu2k Sep 17, 2026
6a8d086
docs(model_engine): revise routed-experts CPU store_step docstring to…
sudhu2k Sep 17, 2026
ec8239d
Apply ruff and black formatter fixes
sudhu2k Sep 17, 2026
e6a574b
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Sep 17, 2026
62332e6
Black formatting fix
sudhu2k Sep 17, 2026
6586c2c
fix(rollout/model): reset routed-experts capturer on KV cache release
sudhu2k Sep 17, 2026
96fbcf2
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Sep 23, 2026
888abcd
feat(moe): incremental routed-expert export and deferred async storage
sudhu2k Sep 30, 2026
52cb3d2
fix(moe): fence async routed-expert D2H copies and record source streams
sudhu2k Oct 1, 2026
51bcc30
fix(moe): snapshot slot_mapping before async routed-expert D2H reuse
sudhu2k Oct 1, 2026
57cd818
fix(moe): cache per-forward dest slots and avoid full block-table cop…
sudhu2k Oct 1, 2026
3372d12
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Oct 1, 2026
10added
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Oct 5, 2026
a1850df
Revert request dataclass
sudhu2k Oct 6, 2026
b340b8f
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Oct 14, 2026
49144bc
Formatter fixes
sudhu2k Oct 14, 2026
ab2bb23
fix(routed_experts): return routes in batch token order with prefix-c…
sudhu2k Oct 14, 2026
ce4b61d
fix(routed_experts): move route ownership from capturer ticket to bat…
sudhu2k Oct 14, 2026
53f46b7
fix(routed_experts): gate capture on attention metadata slot support …
sudhu2k Oct 15, 2026
95a7e6b
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Oct 16, 2026
1696e67
test(mono): add `enable_return_routed_experts=False` to GLM-5.2 and K…
sudhu2k Oct 16, 2026
b542967
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Oct 27, 2026
18430bb
fix formatting
sudhu2k Oct 27, 2026
c271f13
fix(routed-experts): harden capture ownership, prefix routing, and pl…
sudhu2k Oct 28, 2026
ecac39b
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Oct 28, 2026
9606dcd
fix(model_runner): reorder imports to satisfy linter/dependency const…
sudhu2k Oct 28, 2026
b02deb7
fix(scheduler): always clamp routed_forwarded_end to delivered rows
sudhu2k Oct 28, 2026
af142eb
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Nov 2, 2026
0e63603
Address PR comments
sudhu2k Nov 3, 2026
cddc323
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 3, 2026
329b855
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 3, 2026
9a12cc8
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Nov 4, 2026
fc666e6
fix(routed-experts): support DP attention, Qwen4Exp, and middle-chunk…
sudhu2k Nov 4, 2026
ad10b75
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 4, 2026
9d4242c
fix(routed-experts): update help text to state plugin mode restrictio…
sudhu2k Nov 4, 2026
dbd0631
fix(routed-experts): fix dummy prefill route patching, clean up impor…
sudhu2k Nov 4, 2026
c9e710c
ci: retrigger unit tests
sudhu2k Nov 5, 2026
e12acf1
fix(routed-experts): silently drop routed expert rows for requests no…
sudhu2k Nov 5, 2026
3cdd10b
fix(routed-experts): per-runner capture lifecycle and unified routing…
sudhu2k Nov 5, 2026
daeaaf7
fix(routed-experts): replace global capturer singleton with per-runne…
sudhu2k Nov 5, 2026
f869895
fix(routed-experts): remove DP-attention restriction and rename captu…
sudhu2k Nov 5, 2026
1105f69
fix(routed-experts): model-specific mono refusals, live route views, …
sudhu2k Nov 5, 2026
b79d1c1
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 5, 2026
e61a333
fix(routed-experts): add missing _return_routed_experts flag to sched…
sudhu2k Nov 5, 2026
a5ff585
Merge remote-tracking branch 'origin/main' into sudhu/enable_rollout_…
sudhu2k Nov 5, 2026
6d1929c
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 6, 2026
078cfc5
Merge branch 'main' into sudhu/enable_rollout_router_replay
sudhu2k Nov 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions atom/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2012,6 +2012,43 @@ def indexer_cp_unsupported_reason(
return None


def check_return_routed_experts(config: "Config") -> None:
"""Refuse topologies that cannot assemble a full [seq_len-1] route tensor."""
if not config.enable_return_routed_experts:
return
plugin = config.plugin_config
if (plugin is not None and plugin.is_plugin_mode) or is_plugin_mode():
raise ValueError(
"enable_return_routed_experts is not supported in plugin mode: "
"capture lives in ATOM's ModelRunner, which a host framework does "
"not run"
)
if (
config.decode_context_parallel_size != 1
or config.prefill_context_parallel_size != 1
):
raise ValueError(
"enable_return_routed_experts requires decode_context_parallel_size "
"== 1 and prefill_context_parallel_size == 1"
)
if config.pipeline_parallel_size != 1:
raise ValueError(
"enable_return_routed_experts requires pipeline_parallel_size == 1"
)
if config.kv_transfer_config:
raise ValueError(
"enable_return_routed_experts does not support KV transfer "
"(prefill/decode disaggregation or KV offload); routed-expert "
"metadata is not moved with KV blocks"
)
if config.enable_rapidserve:
raise ValueError(
"enable_return_routed_experts does not support RapidServe "
"prefill/decode disaggregation; decode skips KV allocation and "
"never initializes the process-local capture buffer"
)


@dataclass
class Config:
model: str
Expand Down Expand Up @@ -2100,6 +2137,14 @@ class Config:
kv_cache_dtype: str = "bf16"
index_cache_dtype: str | None = None
enable_prefix_caching: bool = True
# Return per-request MoE routes from generate() as int16
# [seq_len - 1, num_layers, top_k]. Scatter is CUDA-graph-safe (device
# write inside fused MoE). Refused here: DCP/PCP/PP != 1, plugin mode, KV
# transfer / offload, RapidServe P/D. Refused after weight load: a model
# without FusedMoE, an attention backend without per-token slots
# (DeepSeek-V4 / V4.1). Mono decode turns off for models whose kernels
# route in-kernel. Prefix cache stays on.
enable_return_routed_experts: bool = False
Comment thread
Copilot marked this conversation as resolved.
Resolved

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[15] Not in docs/configuration_guide.md (Config / EngineArgs tables) or docs/scheduling_kv_cache_guide.md. This comment and the CLI help list only the config-time refusals; dense models, V4/V4.1 builders and "mono turns off" are found only after weight load.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Added docs.

enable_chunked_prefill: bool = True
enable_log_stats: bool = True
enable_request_context_metrics: bool = False
Expand Down Expand Up @@ -2626,6 +2671,8 @@ def __post_init__(self):
self._resolve_dynamic_chunking()
self._check_pp_support()

check_return_routed_experts(self)

if self.speculative_config is not None:
num_spec = self.speculative_config.num_speculative_tokens
is_dspark = getattr(self.speculative_config, "use_dspark", lambda: False)()
Expand Down
12 changes: 12 additions & 0 deletions atom/model_engine/arg_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class EngineArgs:
data_parallel_base_port: int | None = None
enforce_eager: bool = False
enable_prefix_caching: bool = True
enable_return_routed_experts: bool = False
port: int = 8006
kv_cache_dtype: str = "bf16"
index_cache_dtype: str | None = None
Expand Down Expand Up @@ -299,6 +300,17 @@ def add_cli_args(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
help="Enable prefix caching (default: enabled). "
"Use --no-enable_prefix_caching to disable.",
)
parser.add_argument(
"--enable-return-routed-experts",
dest="enable_return_routed_experts",
action="store_true",
help="Return per-request MoE expert ids on generate() as "
"routed_experts int16 [seq_len-1, num_layers, top_k]. "
"Requires DCP=PCP=PP=1, no plugin mode, and no KV transfer, "
"offload, or RapidServe; after weight load, a MoE model whose "
"attention supplies per-token KV slots (not DeepSeek-V4 / V4.1). "
"Mono decode turns off for models that route in-kernel.",
)
parser.add_argument(
"--port",
type=int,
Expand Down
3 changes: 3 additions & 0 deletions atom/model_engine/llm_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,9 @@ def postprocess(self, reqs: list[Sequence]):
"ttft": ttft, # Time to first token in seconds
"tpot": tpot, # Time per output token in seconds
}
routed_experts = req.routed_experts
if routed_experts is not None:
outputs[req.id]["routed_experts"] = routed_experts
return outputs

def has_pending_requests(self):
Expand Down
Loading
Loading