build: move Python AIConfigurator onto the published aisimulate 0.1.0.dev2 wheel - #13721
thaihuynhxyz wants to merge 5 commits into
Conversation
main still pins the 2026-07-28 AIC pre-release across all five Python requirement sites and the aic-forward-pass crate, so every nightly built from main ships it. 0.11.0 has been published since 2026-08-17 and release/1.4.0 already moved to it in ai-dynamo#13280; forward-port that pin so main and the release line agree. The stale wheel keeps the aggregated planner's AIC readiness gate shut: aiconfigurator_core.sdk reports readiness=insufficient_data for the same observation set that 0.11.0 accepts, so throughput scaling never arms on a nightly-based deployment. Co-authored-by: Claude Signed-off-by: Thai Huynh VN <thaih@nvidia.com>
|
👋 Hi thaihuynhxyz! Thank you for contributing to ai-dynamo/dynamo. Just a reminder: The 🚀 |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (5)
Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review. WalkthroughThe pull request replaces dated ChangesDependency pin updates
Estimated code review effort: 1 (Trivial) | ~3 minutes Merge Risk: ⚪ Minimal · up to This PR updates the Aiconfigurator dependency pins to the published 0.11.0 release without code changes; no actionable merge-blocking risk remains beyond normal CI and review checks. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Full details: Docstring CoverageExplanation No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (5 skipped: 5 unsupported.) Full details: Title checkExplanation The title is concise and describes the migration of Python AIConfigurator dependencies to the published Full details: Description checkExplanation The description is complete and includes the required Overview, Details, reviewer guidance, and Related Issues sections. It provides dependency, Rust, testing, compatibility, and scope details. The issue reference uses a full URL instead of the template's Comment |
| # Keep both layers on the same published AIC dev release. | ||
| aiconfigurator==0.11.0.dev20260728 | ||
| # Keep both layers on the same published AIC release. | ||
| aiconfigurator==0.11.0 |
There was a problem hiding this comment.
This exact aiconfigurator==0.11.0 pin conflicts with the still-staged aisimulate==0.1.0.dev1 wheel, whose metadata requires aiconfigurator==0.11.0.dev20260728, so planner image dependency resolution can fail. Fix: update the staged aisimulate release to one built against AIC 0.11.0, or keep the AIC pins aligned with the current aisimulate wheel.
🤖 AI Fix
In container/deps/requirements.aisimulate.txt and pyproject.toml, replace aisimulate==0.1.0.dev1 with a published aisimulate version whose Requires-Dist pins aiconfigurator==0.11.0 and aiconfigurator-core==0.11.0; if no such wheel exists, revert the AIC pins in container/deps/requirements.planner.txt, container/deps/requirements.frontend.txt, benchmarks/pyproject.toml, pyproject.toml, and lib/bindings/python/Cargo.toml to the 0.11.0.dev20260728 release family.
There was a problem hiding this comment.
Confirmed, and it is the second half of your fix that applies — no such wheel exists.
aisimulate 0.1.0.dev1 is the only release on either index (pypi.org and pypi.nvidia.com), and it is the last artifact cut before AIConfigurator was merged into AISimulate, which is why its metadata still pins the pre-release:
| when | what |
|---|---|
| 2026-08-14 | aisimulate 0.1.0.dev1 wheels uploaded to PyPI |
| 2026-08-17 | AISimulate merges full AIConfigurator into its own package |
| 2026-08-19 | #13478 stages that wheel here |
Reproduced the conflict exactly as you describe:
Because aisimulate==0.1.0.dev1 depends on aiconfigurator==0.11.0.dev20260728
and you require aiconfigurator==0.11.0, we can conclude that your requirements
and aisimulate==0.1.0.dev1 are incompatible.
One correction worth recording for whoever picks this up next: the first half of your suggested fix will not become available either. Current AISimulate already ships aiconfigurator and aiconfigurator_core as its own packages rather than depending on them, so no future release will pin AIC at all. Once a release publishes, the right change here is to drop the standalone aiconfigurator / aiconfigurator-core requirements and take both packages from aisimulate — not to bump this pin. I have asked the AISimulate owners to cut a release from main.
So I am taking your second option and holding this PR rather than merging it.
Leaving the motivation on the record, since the problem outlives the pin: on a main-built nightly the aggregated planner's AIC readiness gate returns insufficient_data for an observation set that 0.11.0 accepts, so it never arms scaling — the A/B is in the description. Deployments on released images are unaffected, since v1.4.0 and v1.4.1 both carry AIC 0.11.0.
There was a problem hiding this comment.
Unheld — the release published, and it confirms the second path.
aisimulate 0.1.0.dev2 went to PyPI on 2026-08-27, the day after the comment
above. Its metadata carries no aiconfigurator requirement at all, as expected:
it now ships aiconfigurator and aiconfigurator_core inside its own wheel.
So this PR no longer bumps the pin. It drops the standalone aiconfigurator /
aiconfigurator-core requirements from all five Python sites and takes both
packages from aisimulate. The title and description are updated to match.
A second effect worth recording, since it is not visible from this line alone:
main cannot resolve ai-dynamo[trtllm] today on Python 3.11–3.13. The AIC
vendored in dev1 needs numpy>=1.26.4,<1.27, while TensorRT-LLM 1.3.0rc24
needs numpy>=2.0,<2.4. dev2 needs numpy>=2.1,<3 and resolves at
numpy==2.3.5, so this change fixes that conflict as a side effect.
One regression to flag: dev2 requires Python >=3.11,<3.14, so 3.10 loses
access to AIConfigurator. The version-by-version table and the open
support-policy question are in the description.
0.1.0.dev2 vendors aiconfigurator / aiconfigurator_core. Pinning AIC 0.11.0 next to it does not resolve (numpy 2 vs 1.26). The planner image installs both requirement files in one uv pip install. Co-authored-by: Cursor Signed-off-by: Thai Huynh VN <thaih@nvidia.com>
Match the Rust crate to the aisimulate wheel the Python side pins. Regenerated on Linux under the 1.96.1 toolchain in rust-toolchain.toml. Cargo drops six kvbm-* entries from lib/bindings/python/Cargo.lock: nothing in that workspace reaches them, so the lock had been carrying dead entries. That crate's only relevant dependency is dynamo-llm, whose block-manager feature pulls nixl-sys, cudarc, nix and aligned-vec and no kvbm crate. The root lock keeps all seven as real workspace members. cargo metadata --locked passes in all three workspaces. Co-authored-by: Cursor Signed-off-by: Thai Huynh VN <thaih@nvidia.com>
The mocker extra only ever carried aiconfigurator-core, which now ships inside aisimulate as a core dependency, so the extra installs nothing. Its two [tool.uv] conflict entries go with it: both described a NumPy clash against trtllm and vllm that 0.1.0.dev2 no longer has. aisimulate 0.1.0.dev2 requires Python >=3.11, so the marker gains a lower bound. Without it a 3.10 resolve fails on missing wheels instead of skipping the dependency. Dynamo still declares 3.10 support, so AIC is unavailable there; the estimator error now names the 3.11-3.13 window rather than an extra that no longer exists. test_aiconfigurator_consistency.py asserted that nine AIC pins agreed with each other. Seven of those sites are gone, so it now asserts their absence and that aiconfigurator and aiconfigurator_core import from the aisimulate wheel. Co-authored-by: Cursor Signed-off-by: Thai Huynh VN <thaih@nvidia.com>
CI builds the merge of this branch into main, not the branch alone. Git merged my regenerated lockfiles with main's textually and cleanly, but the result was never produced by cargo, so `cargo metadata --locked` rejected it and rust-clippy (lib/bindings/kvbm) failed. Resolved by discarding the auto-merged lockfiles, taking main's, and re-running `cargo update -p aisimulate-core --precise 0.1.0-dev.2` on Linux under the pinned 1.96.1 toolchain. All three locks are cargo-generated and `cargo metadata --locked` passes in all three workspaces. The diff is now purely additive: main has since pruned the six unreachable kvbm-* entries from lib/bindings/python/Cargo.lock on its own, so nothing is removed. Co-authored-by: Cursor Signed-off-by: Thai Huynh VN <thaih@nvidia.com>
|
Closing this in favour of #13665, which covers everything here and more. After the review comment above I moved this branch off
Splitting the two halves is not an option either: the crate vendors AIC as well #13665 already ports all three affected files and carries the same Python pins, Two findings from this branch that #13665 may want, since neither is in its 1. It also fixes
2. Python 3.10 loses AIConfigurator. AI assistance was used for this investigation. |
Overview:
mainpins the 2026-07-28 AIConfigurator pre-release,0.11.0.dev20260728, atfive Python declaration sites. AIConfigurator has since been folded into
aisimulate: the publishedaisimulatewheel vendors bothaiconfiguratorandaiconfigurator_coreand declares no AIConfigurator dependency of its own.This moves the Python side onto
aisimulate==0.1.0.dev2and drops the fivestandalone AIConfigurator pins, which that single wheel now supplies.
Why the original approach was wrong
The first version of this PR pinned
aiconfigurator==0.11.0. That isunsatisfiable.
aisimulateis a hard dependency ofai-dynamo, and thepublished
0.1.0.dev1wheel requires exactlyaiconfigurator==0.11.0.dev20260728.The planner image resolves
requirements.planner.txtwith no AIConfiguratoroverride, so pinning
0.11.0breaks the image build. The review bot flaggedthis correctly.
This also unblocks
ai-dynamo[trtllm]maincannot currently resolveai-dynamo[trtllm]on Python 3.11–3.13.Resolved with
uv pip compileforx86_64-unknown-linux-gnu, Python 3.12:aisimulate==0.1.0.dev1+tensorrt-llm==1.3.0rc24numpy>=1.26.4,<1.27, TensorRT-LLM requiresnumpy>=2.0,<2.4aisimulate==0.1.0.dev2+tensorrt-llm==1.3.0rc24numpy==2.3.50.1.0.dev2requiresnumpy>=2.1,<3, which intersects TensorRT-LLM's range.Details:
Python dependency sites
pyproject.toml— bump the coreaisimulatepin to0.1.0.dev2and narrowits marker to
python_version >= '3.11' and python_version < '3.14', matchingthe wheel's
requires_pythonof>=3.11,<3.14. Without the lower bound a3.10 resolve fails on missing wheels instead of skipping the dependency.
pyproject.toml— remove themockerextra. It held onlyaiconfigurator-core, which the coreaisimulatedependency now provides, sothe extra installs nothing.
pyproject.toml— remove the two[tool.uv] conflictsentries that existedsolely to keep the
mockerextra away fromtrtllmandvllmover NumPy.benchmarks/pyproject.toml,container/deps/requirements.planner.txt,container/deps/requirements.frontend.txt— drop the standaloneaiconfigurator/aiconfigurator-corepins. The planner file keeps itsplotext<6pin, which stays correct:aisimulaterequiresplotext>=5.3.2,<6itself, so the two agree.container/deps/requirements.aisimulate.txt— bump the staged wheel to0.1.0.dev2.Rust
Cargo.toml— bumpaisimulate-coreto=0.1.0-dev.2so the crate matchesthe wheel.
tests/dependencies/test_aisimulate_consistency.pyenforces thatequality.
0.1.0-dev.2pulls inparquet 55(withthrift,snap,zstd,integer-encoding,twox-hash,seq-macro), pluspep440_rs,quick_cacheandunscanny. Root gains 12packages,
lib/bindings/kvbm15, andlib/bindings/python3 — the last oneonly needs
pep440_rs,quick_cacheandunscannybecause it already hadthe rest.
The lockfile diff is purely additive — no package is removed from any of the
three locks. Each was regenerated by
cargo update -p aisimulate-core --precise 0.1.0-dev.2on Linux under the toolchain pinned inrust-toolchain.toml, andcargo metadata --lockedpasses in all three workspaces.Tests and docs
tests/dependencies/test_aiconfigurator_consistency.pyis rewritten. It usedto assert that nine AIConfigurator pins agreed with each other; seven of those
sites no longer exist. It now asserts that no standalone pin remains and that
aiconfiguratorandaiconfigurator_coreimport from theaisimulatewheel.lib/bindings/python/src/dynamo/_internal/aic.py,lib/bindings/python/tests/test_aic_capacity.py,tests/wheels/smoke_install.py,benchmarks/mocker/README.md— updated forthe removed extra.
Known gap for maintainers to rule on: Python 3.10
aisimulate 0.1.0.dev2dropped Python 3.10 (requires_python: >=3.11,<3.14),while this project still declares 3.10 supported in three places:
requires-python = ">=3.10", aProgramming Language :: Python :: 3.10classifier, and an abi3
cp310ai-dynamo-runtimewheel.aisimulate 0.1.0.dev1dependencymockerextra added nothingaisimulate, so themockerextra was the only sourceSo 3.13 improves and 3.10 regresses. On 3.10 the mocker and replay backends now
raise from
dynamo._internal.aic.estimate_num_gpu_blocks; that error message isupdated to name the supported 3.11–3.13 window rather than point at an extra
that no longer exists. CI is unaffected: the matrix runs 3.11, 3.12 and 3.13,
and
test_mocker_extra_install_clean_roomusessys.executable.Deliberately not resolved here. Raising
requires-pythonto>=3.11anddropping the 3.10 classifier is a support-policy decision, not a build fix.
Happy to fold it into this PR if maintainers prefer.
Where should the reviewer start?
pyproject.toml— the core pin, its marker, and the removedmockerextra.This is the whole change in miniature.
Cargo.toml— the crate bump. The three lockfiles carry most of the diffbut are machine-generated and additive, so they need no line-by-line read.
tests/dependencies/test_aiconfigurator_consistency.py— the rewrite. Worthconfirming the new assertions are the ones you want, since the old ones
cannot survive this change.
Validation
uv pip compileresolution matrix above (Linux, Python 3.12).aisimulate 0.1.0.dev2theaggregated planner's AIC gate reports
readiness=readyon an observation setwhere
0.11.0.dev20260728reportsinsufficient_data. This is the originalmotivation for the change. The input came from an internal benchmark run that
is not public, so treat it as context rather than something reproducible from
this branch. Nothing in the diff depends on it.
aiconfigurator-corealone resolves to 9 packages, all astrict subset of the 77 pulled by
aisimulate 0.1.0.dev2, so removing themockerextra changes no resolved install on 3.11–3.13.rust-toolchain.toml1.96.1toolchain.
cargo metadata --lockedpasses in all three workspaces. Thebranch is merged up to date with
main, and the locks were regenerated ontop of that merge rather than merged textually — a text-merged lockfile is
not a valid lockfile, which is what an earlier push got wrong.
pytest tests/dependencies/— theaisimulateandaiconfiguratorconsistency suites pass. The two
test_kvbm_imports.pyfailures arecontainer-only (
/opt/dynamo/wheelhouse/) and reproduce identically on anunmodified checkout.
Related Issues
That DEP defines the AIConfigurator repository and artifact transition to
AISimulate. This PR is the Dynamo-side consumer of it. Cross-referenced from
#13920, which states the AIC artifact transition remains defined by AIC #1517.
Not a duplicate of #13280. That one pins AIC
0.11.0on the release branch;this one moves
mainonto the post-migrationaisimulatewheel.AI assistance
AI assistance was used for dependency-resolution analysis and for drafting this
description. Every resolution claim above was produced by running
uv pip compileorcargo metadataand was reviewed line by line before submission.