From c93dfd74e6ff8b3d530f1653f4b94981df594b65 Mon Sep 17 00:00:00 2001 From: Harrison King Saturley-Hall Date: Thu, 17 Sep 2026 14:13:51 -0400 Subject: [PATCH 1/3] build(deps): bump AISimulate to 0.12.0 Signed-off-by: Harrison King Saturley-Hall --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- benchmarks/pyproject.toml | 2 +- container/deps/requirements.aisimulate.txt | 2 +- lib/bindings/kvbm/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.lock | 4 ++-- lib/bindings/python/Cargo.toml | 2 +- pyproject.toml | 2 +- tests/dependencies/test_aiconfigurator_consistency.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9e4d32066c7..bd01a7f29f05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/Cargo.toml b/Cargo.toml index b48ce0627275..a6562434b27f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,7 @@ keywords = ["llm", "genai", "inference", "nvidia", "distributed"] [workspace.dependencies] # Published separately by https://github.com/ai-dynamo/aisimulate. -aisimulate-core = { version = "=0.12.0-dev.2" } +aisimulate-core = { version = "=0.12.0" } # Local crates dynamo-runtime = { path = "lib/runtime", version = "1.5.0" } diff --git a/benchmarks/pyproject.toml b/benchmarks/pyproject.toml index 4fa3cd742c05..612b122a3011 100644 --- a/benchmarks/pyproject.toml +++ b/benchmarks/pyproject.toml @@ -39,7 +39,7 @@ classifiers = [ ] dependencies = [ - "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0; python_version >= '3.11' and python_version < '3.14'", "aiperf==0.12.0", "matplotlib", "networkx", diff --git a/container/deps/requirements.aisimulate.txt b/container/deps/requirements.aisimulate.txt index b6e21613076e..53ccc2c1cd6d 100644 --- a/container/deps/requirements.aisimulate.txt +++ b/container/deps/requirements.aisimulate.txt @@ -2,4 +2,4 @@ # SPDX-License-Identifier: Apache-2.0 # Published AISimulate wheel staged into planner and framework runtime wheelhouses. -aisimulate==0.12.0.dev2 +aisimulate==0.12.0 diff --git a/lib/bindings/kvbm/Cargo.lock b/lib/bindings/kvbm/Cargo.lock index ecb50844c826..98fe092b284f 100644 --- a/lib/bindings/kvbm/Cargo.lock +++ b/lib/bindings/kvbm/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.lock b/lib/bindings/python/Cargo.lock index fe3b163c7f0c..0872f2ccab1a 100644 --- a/lib/bindings/python/Cargo.lock +++ b/lib/bindings/python/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "aisimulate-core" -version = "0.12.0-dev.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec87377a578ece6834d384b93bfba15f5809c754f5495efa452fe985cdb0edd5" +checksum = "7d266db788afdb866421aad39f8fbc7096dba9517105ff7d770ee83ad70f82bb" dependencies = [ "anyhow", "bincode 1.3.3", diff --git a/lib/bindings/python/Cargo.toml b/lib/bindings/python/Cargo.toml index cab947a905ea..ff24d9e9218d 100644 --- a/lib/bindings/python/Cargo.toml +++ b/lib/bindings/python/Cargo.toml @@ -60,7 +60,7 @@ request-trace-s3 = ["dynamo-llm/request-trace-s3"] # former AIC crate surface. The `python` feature is required for # AicEngineBuilder; this extension supplies the interpreter, so the dependency # must not enable `extension-module`. -aisimulate-core = { version = "=0.12.0-dev.2", optional = true, features = ["python"] } +aisimulate-core = { version = "=0.12.0", optional = true, features = ["python"] } dynamo-runtime = { path = "../../runtime" } dynamo-mocker = { path = "../../mocker" } dynamo-parsers = { version = "8.1.0" } diff --git a/pyproject.toml b/pyproject.toml index ee0647c633ef..067a6feb56e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ "ai-dynamo-runtime==1.5.0", - "aisimulate==0.12.0.dev2; python_version >= '3.11' and python_version < '3.14'", + "aisimulate==0.12.0; python_version >= '3.11' and python_version < '3.14'", "aiohttp>=3.14.3,<4.0", "transformers>=4.56.0", "kubernetes>=32.0.1,<33.0.0", diff --git a/tests/dependencies/test_aiconfigurator_consistency.py b/tests/dependencies/test_aiconfigurator_consistency.py index daf90295d456..d00eb35ae749 100644 --- a/tests/dependencies/test_aiconfigurator_consistency.py +++ b/tests/dependencies/test_aiconfigurator_consistency.py @@ -93,7 +93,7 @@ def test_no_manifest_installs_retired_aic_distributions() -> None: assert all(package["name"] != "aiconfigurator-core" for package in packages) assert features["aic-forward-pass"] == ["dep:aisimulate-core"] assert dependencies["aisimulate-core"] == { - "version": "=0.12.0-dev.2", + "version": "=0.12.0", "optional": True, "features": ["python"], } From 720af5699d247c000777aac158a50689076cab17 Mon Sep 17 00:00:00 2001 From: Harrison King Saturley-Hall Date: Thu, 17 Sep 2026 16:21:14 -0400 Subject: [PATCH 2/3] fix(container): fetch AISimulate wheel from NVIDIA index Signed-off-by: Harrison King Saturley-Hall --- container/templates/wheel_builder.Dockerfile | 11 +++++++---- tests/dependencies/test_aisimulate_consistency.py | 3 +++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/container/templates/wheel_builder.Dockerfile b/container/templates/wheel_builder.Dockerfile index c81a67297659..17e03383fda7 100644 --- a/container/templates/wheel_builder.Dockerfile +++ b/container/templates/wheel_builder.Dockerfile @@ -635,16 +635,19 @@ COPY deploy/inference-gateway/sidecar/ /opt/dynamo/deploy/inference-gateway/side {% if target == "planner" or (target == "runtime" and framework in ("vllm", "sglang", "trtllm")) %} COPY container/deps/requirements.aisimulate.txt /opt/dynamo/container/deps/requirements.aisimulate.txt -# AI Simulate is released separately as an abi3 wheel. Stage the exact published -# wheel consumed by ai-dynamo instead of rebuilding it from vendored source. -# Download only this distribution; runtime images own dependency installation -# through their requirements files and local wheels. +# AI Simulate is released separately as an abi3 wheel. Its public PyPI artifact +# is a small resolver sdist because the full wheel is too large for that registry; +# stage the actual wheel directly from NVIDIA's package index. Download only this +# distribution; runtime images own dependency installation through their +# requirements files and local wheels. RUN --mount=type=cache,id=uv-root-{{ context.dynamo.uv_version }},target=/root/.cache/uv,sharing=shared \ export UV_CACHE_DIR=/root/.cache/uv && \ source ${VIRTUAL_ENV}/bin/activate && \ python -m pip download \ --only-binary=:all: \ --no-deps \ + --no-index \ + --find-links https://pypi.nvidia.com/aisimulate/ \ --dest /opt/dynamo/dist \ --requirement /opt/dynamo/container/deps/requirements.aisimulate.txt {% endif %} diff --git a/tests/dependencies/test_aisimulate_consistency.py b/tests/dependencies/test_aisimulate_consistency.py index 44609300f4fe..f3fa00f26f15 100644 --- a/tests/dependencies/test_aisimulate_consistency.py +++ b/tests/dependencies/test_aisimulate_consistency.py @@ -145,7 +145,10 @@ def test_container_stages_the_published_aisimulate_wheel() -> None: "--requirement /opt/dynamo/container/deps/requirements.aisimulate.txt" in wheel_builder ) + assert "--only-binary=:all:" in wheel_builder assert "--no-deps" in wheel_builder + assert "--no-index" in wheel_builder + assert "--find-links https://pypi.nvidia.com/aisimulate/" in wheel_builder assert "COPY aisimulate" not in wheel_builder assert "/opt/dynamo/aisimulate" not in wheel_builder assert not (ROOT / "aisimulate").exists() From a50038afcc3a126beb0e18f61629bc444312c6b8 Mon Sep 17 00:00:00 2001 From: Harrison King Saturley-Hall Date: Thu, 17 Sep 2026 17:04:36 -0400 Subject: [PATCH 3/3] docs(aisimulate): update version guidance Signed-off-by: Harrison King Saturley-Hall --- .../sizing-with-aiconfigurator.mdx | 2 +- .../aiconfigurator-reference.md | 2 +- .../ai-simulate-experimental/overview.md | 6 +++--- .../sweeper-experimental/dynamo-integration.md | 6 +++--- .../sweeper-experimental/glm-5-fp8-pareto-sweep.md | 3 ++- .../planner-goodput-per-gpu-sweep.md | 14 ++++++++------ .../sweeper-experimental/quickstart.md | 2 +- .../router-end-to-end-latency-sweep.md | 13 +++++++------ .../sizing-with-aiconfigurator.mdx | 2 +- 9 files changed, 27 insertions(+), 23 deletions(-) diff --git a/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx b/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx index 79ee395f7e6e..0f987974e3da 100644 --- a/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx +++ b/docs/fern/pages/cli/disaggregated-serving/sizing-with-aiconfigurator.mdx @@ -22,7 +22,7 @@ Use Python 3.11 through 3.13. Install AISimulate, which provides the retained `a sizing command: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" ``` Collect: diff --git a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md index c02bf5604485..71684c0841f3 100644 --- a/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md +++ b/docs/fern/pages/developer-guide/additional-resources/aiconfigurator-reference.md @@ -71,7 +71,7 @@ Use Python 3.11 through 3.13. ```bash # Install the distribution that provides the compatibility command -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" # Optional: check whether the model/system/backend is covered aiconfigurator cli support \ diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md index 954ab41ad645..730cb7223d61 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/overview.md @@ -42,15 +42,15 @@ path. They have no adapter migration. AISimulate requires Python 3.11 through 3.13. Dynamo itself still supports Python 3.10, but the `aisimulate` dependency and its CLI are not installed in a Python 3.10 environment. -The `dynamo-planner` image installs the published `aisimulate==0.1.0.dev2` wheel from its local -wheelhouse. Dynamo builds `aisimulate-core==0.1.0-dev.2` from crates.io instead of vendoring the +The `dynamo-planner` image installs the published `aisimulate==0.12.0` wheel from its local +wheelhouse. Dynamo builds `aisimulate-core==0.12.0` from crates.io instead of vendoring the AISimulate source tree. For Dynamo source development, install the published AISimulate wheel, Dynamo, and the Planner dependencies from the Dynamo repository root: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" python3 -m pip install --no-deps -e . python3 -m pip install -r container/deps/requirements.planner.txt ``` diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md index 669ed1643aa8..228f0f1738f2 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/dynamo-integration.md @@ -18,8 +18,8 @@ AISimulate requires Python 3.11 through 3.13. The `ai-dynamo` package remains in 3.10, but the AISimulate dependency and CLI are not installed there. The supported prebuilt environment is the `dynamo-planner` image. The image stages and installs the -published `aisimulate==0.1.0.dev2` wheel alongside the Dynamo wheels. Dynamo's Rust workspace -resolves `aisimulate-core==0.1.0-dev.2` from crates.io. +published `aisimulate==0.12.0` wheel alongside the Dynamo wheels. Dynamo's Rust workspace +resolves `aisimulate-core==0.12.0` from crates.io. For Dynamo source development, install the published AISimulate wheel and build the matching Dynamo bindings: @@ -30,7 +30,7 @@ cd lib/bindings/python maturin develop --uv --release --features aic-forward-pass cd ../../.. python3 -m pip install --no-deps -e . -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" python3 -m pip install -r container/deps/requirements.planner.txt ``` diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md index 275dc77cc22e..bf4227d6a182 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/glm-5-fp8-pareto-sweep.md @@ -65,7 +65,8 @@ provide one config as a strict pin or several configs as a custom projection poo ## Configuration -Use this reference configuration: +The experiment used the following configuration shape. It documents the retired +`aisimulate==0.1.0.dev1` API and is not accepted by AISimulate 0.12.0: ```yaml search_space: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md index 63a8920d371c..44a7df9950d0 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/planner-goodput-per-gpu-sweep.md @@ -10,10 +10,10 @@ subtitle: Experimental Sweeper search over Planner policies for MiniMax-M2.5 on > treat them as production capacity guidance or a performance commitment. Sweeper's search behavior > and output may change without a standard deprecation period. -Enable the planner (SLA mode) on the same deployment as the -[router experiment](router-end-to-end-latency-sweep.md), then use Sweeper's smart sweep to **find the -planner configuration that maximizes goodput-per-GPU** on the Mooncake toolagent trace, and -compare against the static deployment and the default planner. +This experiment enabled the planner (SLA mode) on the same deployment as the +[router experiment](router-end-to-end-latency-sweep.md), then used Sweeper's smart sweep to find the +planner configuration that maximized goodput-per-GPU on the Mooncake toolagent trace and compared +it against the static deployment and the default planner. ## Setup @@ -50,8 +50,10 @@ scales the fleet to an average of ~13.5 GPUs instead of pinning 32. ## Sweep config -`Sweeper.run`, `goal.target = goodput_per_gpu`. Deployment + router + workload + SLA -fixed; only the planner knobs swept (full trace, open-loop): +The experiment used `Sweeper.run` with `goal.target = goodput_per_gpu`. It fixed the deployment, +router, workload, and SLA, and swept only the planner settings using the full open-loop trace. The +configuration below documents the retired `aisimulate==0.1.0.dev1` API and is not accepted by +AISimulate 0.12.0: ```yaml search_space: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md index 7b6683b1f4cf..abf8c99a2109 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/quickstart.md @@ -12,7 +12,7 @@ subtitle: Run a backend-neutral sweep with an injected replay runtime Install AISimulate: ```bash -python3 -m pip install "aisimulate==0.1.0.dev2" +python3 -m pip install "aisimulate==0.12.0" ``` Sweeper requires a `RunnerFactory` supplied by the application that owns replay execution: diff --git a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md index 2dd2e6277969..536bbcdf6be1 100644 --- a/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md +++ b/docs/fern/pages/developer-guide/knowledge-base/modular-components/ai-simulate-experimental/sweeper-experimental/router-end-to-end-latency-sweep.md @@ -10,9 +10,9 @@ subtitle: Experimental Sweeper search over KV router settings for MiniMax-M2.5 o > treat them as production capacity guidance or a performance commitment. Sweeper's search behavior > and output may change without a standard deprecation period. -Reproduce the DynoSim router experiment, then use Sweeper's smart sweep to **find the -KV-router configuration that minimizes mean end-to-end latency** on the Mooncake toolagent -trace, and validate the winner against the default-router baseline on the full trace. +This experiment reproduced the DynoSim router experiment, then used Sweeper's smart sweep to find +the KV-router configuration that minimized mean end-to-end latency on the Mooncake toolagent trace +and validated the winner against the default-router baseline on the full trace. ## Setup @@ -32,9 +32,10 @@ concurrency) so any change in e2e latency is attributable to the **router** alon ## Sweep config -Searched with `Sweeper.run` (Vizier GP-bandit), `goal.target = e2e_latency`. Search -runs on a 2k-request subset (fast, representative — same long-context mix); the winner is -then validated on the full trace. +The experiment searched with `Sweeper.run` (Vizier GP-bandit) and +`goal.target = e2e_latency`. It ran on a 2k-request subset with the same long-context mix, then +validated the winner on the full trace. The configuration below documents the retired +`aisimulate==0.1.0.dev1` API and is not accepted by AISimulate 0.12.0. ```yaml search_space: diff --git a/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx b/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx index f4fc7dfef015..11216c3c8338 100644 --- a/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx +++ b/docs/fern/pages/kubernetes/disaggregated-serving/sizing-with-aiconfigurator.mdx @@ -27,7 +27,7 @@ forward-pass timing model. retained `aiconfigurator` sizing command: ```bash - python3 -m pip install "aisimulate==0.1.0.dev2" + python3 -m pip install "aisimulate==0.12.0" ``` - Your checkpoint's HuggingFace ID, GPU system (for example `h200_sxm`), backend (`vllm`, `sglang`, or `trtllm`), the total GPUs you can allocate, and your SLA: Time To First Token (TTFT), Time Per Output Token (TPOT), and typical input/output sequence lengths (ISL/OSL).