Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
93ed4ea
refactor(replay): delegate Weka ingestion to AISimulate
Harrilee Sep 4, 2026
d1e1e51
fix(replay): align Weka model projection
Harrilee Sep 7, 2026
1b24cdf
test(replay): use AgenticNode output accessor
Harrilee Sep 7, 2026
6db1a12
chore(replay): refresh public AISimulate pin
Harrilee Sep 14, 2026
4c6f1fa
ci(replay): drop removed Weka bench checks
Harrilee Sep 14, 2026
ef9f899
fix(mocker): drop stale data-gen dependency
Harrilee Sep 14, 2026
5f126ca
fix(replay): reconcile latest AISimulate adapter
Harrilee Sep 14, 2026
9d307cb
build(replay): stage AISimulate review wheel
Harrilee Sep 14, 2026
675f840
build(replay): resolve staged AISimulate wheel
Harrilee Sep 14, 2026
256e83a
fix(container): stage aisimulate wheel for all runtime targets
Harrilee Sep 14, 2026
083c493
fix(replay): align public AISimulate integration
Harrilee Sep 15, 2026
e5c8925
fix(replay): preserve Dynamo trace block metadata
Harrilee Sep 15, 2026
74e1ea6
build(replay): separate AISimulate source and wheel pins
Harrilee Sep 15, 2026
ac93036
fix(replay): address review feedback
Harrilee Sep 15, 2026
af72dc2
chore(replay): remove internal dependency references
Harrilee Sep 15, 2026
c04a6db
Merge branch 'main' into feat/harrli/dynamo-weka-aisimulate-adapter
Harrilee Sep 15, 2026
5c2501c
fix(replay): preserve explicit Weka timestamp basis
Harrilee Sep 15, 2026
e205c8d
test(replay): account for parent completion in Weka timing
Harrilee Sep 15, 2026
5910d2b
fix(replay): retain resolved Weka timestamp evidence
Harrilee Sep 16, 2026
50c58c4
merge: sync main into Weka ingestion adapter
Harrilee Sep 16, 2026
da8eb75
refactor(replay): trim Weka adapter to existing execution paths
Harrilee Sep 16, 2026
0455422
fix(replay): align AISimulate pins with published nightly
Harrilee Sep 21, 2026
9db72a3
Merge branch 'main' into feat/harrli/dynamo-weka-aisimulate-adapter
Harrilee Sep 23, 2026
b352ab6
test(mocker): compare cancellation retirement identities
Harrilee Sep 23, 2026
da2bdd0
fix(replay): align nightly engine arguments and SGLang TTFT expectations
Harrilee Sep 23, 2026
5b60196
fix(replay): migrate Dynamo to latest AISimulate nightly APIs
Harrilee Sep 24, 2026
8a5fbad
fix(replay): retain materialized capacity for canonical AIC timing
Harrilee Sep 24, 2026
ab14ca4
Merge branch 'main' into feat/harrli/dynamo-weka-aisimulate-adapter
Harrilee Sep 24, 2026
1767452
Merge remote-tracking branch 'origin/main' into feat/harrli/dynamo-we…
Harrilee Sep 29, 2026
7f57532
fix(replay): address round-7 review findings
Harrilee Sep 29, 2026
191d5f2
Merge remote-tracking branch 'origin/main' into feat/harrli/dynamo-we…
Harrilee Sep 29, 2026
6e6f877
fix(replay): forward execution_model through the mocker wrapper
Harrilee Sep 29, 2026
d083fdc
Merge branch 'main' into feat/harrli/dynamo-weka-aisimulate-adapter
Harrilee Sep 30, 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
6 changes: 0 additions & 6 deletions .github/workflows/pre-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,6 @@ jobs:
compile_bench multiturn --bench multiturn_bench
compile_bench satf --bin request_trace_to_satf
compile_bench request-trace-to-mooncake --bin request_trace_to_mooncake
compile_bench weka-to-agentic-mooncake --bin weka_to_agentic_mooncake
compile_bench offline-replay --bench offline_replay_bench
compile_bench mooncake --bench mooncake_bench
compile_bench active-sequences --bench active_sequences_bench
Expand All @@ -477,9 +476,6 @@ jobs:
cargo test --locked --no-default-features -p dynamo-bench \
--features request-trace-to-mooncake --test request_trace_to_mooncake

cargo test --locked --no-default-features -p dynamo-bench \
--features weka-to-agentic-mooncake --test weka_to_agentic_mooncake

cargo test --locked -p dynamo-llm --no-default-features \
--features kv-router-stress --bench kv_router_bench --no-run

Expand Down Expand Up @@ -551,8 +547,6 @@ jobs:
lint_bench multiturn --bench multiturn_bench
lint_bench satf --bin request_trace_to_satf
lint_bench request-trace-to-mooncake --bin request_trace_to_mooncake
lint_bench weka-to-agentic-mooncake --bin weka_to_agentic_mooncake
lint_bench weka-to-agentic-mooncake --test weka_to_agentic_mooncake
lint_bench offline-replay --bench offline_replay_bench
lint_bench mooncake --bench mooncake_bench
lint_bench active-sequences --bench active_sequences_bench
Expand Down
9 changes: 5 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@ repository = "https://github.com/ai-dynamo/dynamo.git"
keywords = ["llm", "genai", "inference", "nvidia", "distributed"]

[workspace.dependencies]
# Published separately by https://github.com/ai-dynamo/aisimulate.
aisimulate-core = { version = "=0.12.0-dev.1" }
# TODO: replace this public review revision with the matching exact crates.io
# release once it exports the Weka graph-loading API.
aisimulate-core = { git = "https://github.com/ai-dynamo/aisimulate.git", rev = "d71203e489541bc98c5f4a616dcec3b225b8fb72" }
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved

# Local crates
dynamo-runtime = { path = "lib/runtime", version = "1.5.0" }
Expand Down
4 changes: 3 additions & 1 deletion benchmarks/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ classifiers = [
]

dependencies = [
"aisimulate==0.12.0.dev1; python_version >= '3.11' and python_version < '3.14'",
# TODO: replace this public review revision with the matching exact PyPI
# release once it exports the Weka graph-loading API.
"aisimulate @ git+https://github.com/ai-dynamo/aisimulate.git@d71203e489541bc98c5f4a616dcec3b225b8fb72#subdirectory=python/aisimulate ; python_version >= '3.11' and python_version < '3.14'",
"aiperf==0.12.0",
"matplotlib",
"networkx",
Expand Down
6 changes: 4 additions & 2 deletions components/src/dynamo/planner/core/perf_model/engine_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,9 +218,11 @@ def best_available(
attention_dp_size: int,
) -> AicCoreEnginePerfModel:
if aic_config is None:
model = AicForwardPassPerfModel.from_regression(options)
model = AicForwardPassPerfModel.from_regression(worker_type, options)
else:
model = AicForwardPassPerfModel.best_available(aic_config, options)
model = AicForwardPassPerfModel.best_available(
aic_config, worker_type, options
)
return cls(
model=model,
worker_type=worker_type,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,13 @@ def test_best_available_uses_aic_core_wheel_facade(monkeypatch):

class _FakeAicFacade:
last_config = None
last_worker_type = None
last_options = None

@classmethod
def best_available(cls, config, options):
def best_available(cls, config, worker_type, options):
cls.last_config = config
cls.last_worker_type = worker_type
cls.last_options = options
return sentinel

Expand All @@ -122,6 +124,7 @@ def best_available(cls, config, options):
)

assert _FakeAicFacade.last_config is config
assert _FakeAicFacade.last_worker_type == "prefill"
assert _FakeAicFacade.last_options is options
assert model.diagnostics()["readiness"] == "ready"

Expand Down
59 changes: 57 additions & 2 deletions components/src/dynamo/replay/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
from dynamo._core import run_mocker_trace_replay as _run_mocker_trace_replay
from dynamo.replay.report import PlannerReplayDetails, ReplayReport

_AGENTIC_MODEL_PROJECTION_POLICY = "project_to_configured_target"


def _planner_replay_adapter():
"""Load Planner replay lazily to break the replay.api/mocker import cycle.
Expand Down Expand Up @@ -55,6 +57,7 @@ class _CommonReplayOptions(TypedDict, total=False):

class _TraceReplayOptions(_CommonReplayOptions, total=False):
agentic_lanes: int | None
execution_model: str | None
trace_block_size: int | None
trace_format: str
trace_shared_prefix_ratio: float
Expand Down Expand Up @@ -91,15 +94,57 @@ def _materialize_offline_report(
native,
*,
planner: PlannerReplayDetails | None,
execution_model: str | None = None,
) -> ReplayReport:
summary = dict(native.summary)
_add_agentic_model_projection(summary, execution_model)
return ReplayReport(
summary=native.summary,
summary=summary,
per_request=native.per_request,
coverage=native.coverage,
planner=planner,
)


def _normalize_execution_model(
trace_format: str, execution_model: str | None
) -> str | None:
if execution_model is not None:
if not isinstance(execution_model, str):
raise TypeError("execution_model must be a string or None")
execution_model = execution_model.strip()
if not execution_model:
raise ValueError("execution_model must be non-empty")
if (
trace_format in {"weka", "agentic_mooncake", "agentic-mooncake"}
and execution_model is None
):
raise ValueError("agentic execution requires a configured target model")
return execution_model


def _add_agentic_model_projection(
summary: dict[str, Any], execution_model: str | None
) -> None:
graph = summary.get("agentic_graph")
if not isinstance(graph, dict):
return
if execution_model is None:
raise ValueError(
"agentic execution did not declare its configured target model"
)
source_models = graph.get("source_models")
if not isinstance(source_models, list) or not all(
isinstance(model, str) and model for model in source_models
):
raise ValueError("agentic graph did not report valid source_models")
summary["agentic_model_projection"] = {
"policy": _AGENTIC_MODEL_PROJECTION_POLICY,
"source_models": source_models,
"target_model": execution_model,
}


@overload
def run_trace_replay(
trace_files,
Expand Down Expand Up @@ -161,6 +206,7 @@ def run_trace_replay(
benchmark_granularity=8,
capture_per_request=False,
capture_planner_details=True,
execution_model=None,
) -> ReplayReport | dict[str, Any]:
"""Run trace replay.

Expand All @@ -171,6 +217,7 @@ def run_trace_replay(
agentic_lanes is not None and not isinstance(agentic_lanes, int)
):
raise TypeError("agentic_lanes must be an integer or None")
execution_model = _normalize_execution_model(trace_format, execution_model)
trace_files = _normalize_trace_files(trace_files)
replay_kwargs = {
"extra_engine_args": extra_engine_args,
Expand All @@ -193,6 +240,7 @@ def run_trace_replay(
"report_jsonl_path": report_jsonl_path,
"max_sim_time_ms": max_sim_time_ms,
"model_name": model_name,
"execution_model": execution_model,
"sla_ttft_ms": sla_ttft_ms,
"sla_itl_ms": sla_itl_ms,
"sla_e2e_ms": sla_e2e_ms,
Expand Down Expand Up @@ -249,15 +297,22 @@ def run_trace_replay(
return _materialize_offline_report(
native,
planner=adapter.finalize(native.lifecycle_operations),
execution_model=execution_model,
)
result = _run_mocker_trace_replay(
trace_files,
**replay_kwargs,
scaling_policy=None,
)
if replay_mode == "online":
if isinstance(result, dict):
_add_agentic_model_projection(result, execution_model)
return result
return _materialize_offline_report(result, planner=None)
return _materialize_offline_report(
result,
planner=None,
execution_model=execution_model,
)


@overload
Expand Down
Loading
Loading