ci: add vLLM/SGLang NIXL disaggregation sanity testing - #1777
Conversation
|
👋 Hi NirWolfer! Thank you for contributing to ai-dynamo/nixl. Your PR reviewers will review your contribution then trigger the CI to test your changes. 🚀 |
1ab463a to
4a09a8a
Compare
5737720 to
2208da3
Compare
2208da3 to
ffd64ec
Compare
ffd64ec to
cbde7bf
Compare
b5c0e2f to
ea63be2
Compare
|
/build |
|
👀 Investigating |
|
🤖 CI Triage Agent — This confirms the nixlbench branch in my log passed all its DRAM tests and skipped VRAM ("Worker without GPU, skipping VRAM tests") because I've now thoroughly reviewed the one log I could fetch. The captured branch — including the full C++ gtest suite, the shell test binaries, I must not speculate about a branch whose log I don't have. Here is what the evidence supports: Summary: A parallel branch of the Root cause: Not determinable from the available log. The branch present in the fetched console (SLURM job 1483397, the "master"/DL nixlbench + C++ tests branch) ran to completion with all tests passing — every gtest case passed, Implicated commit: unknown (the failing branch's log was not retrievable; the CUDA-init anomaly, if it proves fatal in the other branch, would point to a base-image/CUDA-driver mismatch rather than a specific NIXL source commit). File: unknown — the failing branch's step/log is not in the fetched output. Suggested fix: Retrieve the console log for the failing parallel branch specifically (the sibling SLURM job 1483396 / the non-"master" branch of build #1360) — e.g. open the branch's "Restart from stage" / branch-specific log in Blue Ocean, or the Related: #1869 (Switch CI base image to pytorch + CUDA 13.3), #1893 (CI: pin CUDA-ambiguous LLM base image defaults) — both concern CUDA base-image init issues that could explain the GPU-init anomaly seen in the captured log. |
…deps (#1870) ## What? Add a wheel_base Docker build target covering all dependency compilation (hwloc, OpenSSL, Abseil, gRPC, AWS/Azure SDKs, Rust, DOCA, libfabric, UCX, etc.). The wheel stage starts FROM wheel_base and only runs the NIXL build and wheel creation steps. In CI the wheel_base image is built and pushed to Artifactory by ci-demo when Dockerfile.manylinux changes (via the new runs_on_dockers entry). The build-wheel pipeline then passes --wheel-base-image to build-container.sh which pulls the cached image and runs --target wheel, skipping the expensive dep compilation on every PR. Local docker builds are unaffected: wheel_base ARG defaults to the local stage name so docker build ./contrib/Dockerfile.manylinux builds the full image as before. Also removes the now-redundant manylinux matrix axis (was single-valued 2_28, hardcoded in the image name and wheel-base arg), and wires cidemo-init.sh to enforce a CI_IMAGE_TAG bump in build-wheel-matrix.yaml whenever Dockerfile.manylinux changes. ## Why? Lower nixl-ci-build-wheel pipeline times, and to justify adding #1777 later on which adds time to this pipeline <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Wheel builds now use a single cached wheel-base (manylinux_2_28) and support selecting a prebuilt dependencies image, alongside optional Torch version selection. * The wheel build matrix is simplified to vary only by Python version and architecture for more consistent builds. * **Bug Fixes** * CI validation now more reliably enforces required image tag updates for both standard CI changes and wheel Dockerfile changes, with clearer guidance when updates are missing. * **Documentation** * Updated CI docs to reflect the new cached wheel-base flow and how to refresh it via the wheel cache image tag. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Nir Wolfson <nwolfer@nvidia.com> Signed-off-by: NirWolfer <nwolfer@nvidia.com>
Gate every PR with a 1-prefill/1-decode NIXL KV-transfer sanity for vLLM and
SGLang, folded into the existing nixl-ci-build-wheel job so wheels aren't built
twice for it. Runs on the gb200nvl72_ci dlcluster SLURM partition (Grace-Blackwell
= aarch64) over SSH.
Structure: x86_64 wheels build in the upstream manylinux runner (wheel-only). Each
framework sanity runs as its own aarch64 branch (build_helper_vllm /
build_helper_sglang): build the aarch64 wheels (reusing the cached wheel_base),
layer them onto a pinned vLLM/SGLang base image (.ci/dockerfiles/Dockerfile.{vllm,
sglang}-base, built as category: tool by ci-demo), then bring up prefill+decode
wired through NIXL and assert a completion comes back through the transfer. SGLang
additionally asserts a gsm8k accuracy floor on Qwen/Qwen3-8B. The aarch64 wheels
are built once per framework branch so the two flows stay separate, readable
branches in the Jenkins UI (nested step parallelism renders as an unlabeled blob,
JENKINS-54010).
The test model weights are pulled at runtime (not baked) to keep image pulls fast;
GPU memory fraction and TCP port range are pinned so servers start on shared nodes
and SGLang's derived ports stay within range. ci-overview documents the new gate.
Signed-off-by: NirWolfer <nwolfer@nvidia.com>
ea63be2 to
72666e3
Compare
|
/build |
|
🤖 CI Triage Agent — TL;DR: The "Allocate DL EP Environment" stage failed because a Slurm Full analysisSummary: Stage 245 ("Allocate DL EP Environment", master-UCX variant) failed at the Slurm resource-allocation step; the NIXL build, EP compile, and Docker image all succeeded beforehand. Root cause: Implicated commit: none — the failure is in CI infrastructure/cluster scheduling, not in commit 8aa1f4d (PR #1777). All build/compile/install steps passed. File: n/a (CI Slurm allocation step: Suggested fix: Retry the build when the Related: none |
…deps (ai-dynamo#1870) ## What? Add a wheel_base Docker build target covering all dependency compilation (hwloc, OpenSSL, Abseil, gRPC, AWS/Azure SDKs, Rust, DOCA, libfabric, UCX, etc.). The wheel stage starts FROM wheel_base and only runs the NIXL build and wheel creation steps. In CI the wheel_base image is built and pushed to Artifactory by ci-demo when Dockerfile.manylinux changes (via the new runs_on_dockers entry). The build-wheel pipeline then passes --wheel-base-image to build-container.sh which pulls the cached image and runs --target wheel, skipping the expensive dep compilation on every PR. Local docker builds are unaffected: wheel_base ARG defaults to the local stage name so docker build ./contrib/Dockerfile.manylinux builds the full image as before. Also removes the now-redundant manylinux matrix axis (was single-valued 2_28, hardcoded in the image name and wheel-base arg), and wires cidemo-init.sh to enforce a CI_IMAGE_TAG bump in build-wheel-matrix.yaml whenever Dockerfile.manylinux changes. ## Why? Lower nixl-ci-build-wheel pipeline times, and to justify adding ai-dynamo#1777 later on which adds time to this pipeline <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Wheel builds now use a single cached wheel-base (manylinux_2_28) and support selecting a prebuilt dependencies image, alongside optional Torch version selection. * The wheel build matrix is simplified to vary only by Python version and architecture for more consistent builds. * **Bug Fixes** * CI validation now more reliably enforces required image tag updates for both standard CI changes and wheel Dockerfile changes, with clearer guidance when updates are missing. * **Documentation** * Updated CI docs to reflect the new cached wheel-base flow and how to refresh it via the wheel cache image tag. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Nir Wolfson <nwolfer@nvidia.com> Signed-off-by: NirWolfer <nwolfer@nvidia.com>
…deps (ai-dynamo#1870) ## What? Add a wheel_base Docker build target covering all dependency compilation (hwloc, OpenSSL, Abseil, gRPC, AWS/Azure SDKs, Rust, DOCA, libfabric, UCX, etc.). The wheel stage starts FROM wheel_base and only runs the NIXL build and wheel creation steps. In CI the wheel_base image is built and pushed to Artifactory by ci-demo when Dockerfile.manylinux changes (via the new runs_on_dockers entry). The build-wheel pipeline then passes --wheel-base-image to build-container.sh which pulls the cached image and runs --target wheel, skipping the expensive dep compilation on every PR. Local docker builds are unaffected: wheel_base ARG defaults to the local stage name so docker build ./contrib/Dockerfile.manylinux builds the full image as before. Also removes the now-redundant manylinux matrix axis (was single-valued 2_28, hardcoded in the image name and wheel-base arg), and wires cidemo-init.sh to enforce a CI_IMAGE_TAG bump in build-wheel-matrix.yaml whenever Dockerfile.manylinux changes. ## Why? Lower nixl-ci-build-wheel pipeline times, and to justify adding ai-dynamo#1777 later on which adds time to this pipeline <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Wheel builds now use a single cached wheel-base (manylinux_2_28) and support selecting a prebuilt dependencies image, alongside optional Torch version selection. * The wheel build matrix is simplified to vary only by Python version and architecture for more consistent builds. * **Bug Fixes** * CI validation now more reliably enforces required image tag updates for both standard CI changes and wheel Dockerfile changes, with clearer guidance when updates are missing. * **Documentation** * Updated CI docs to reflect the new cached wheel-base flow and how to refresh it via the wheel cache image tag. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Nir Wolfson <nwolfer@nvidia.com> Signed-off-by: NirWolfer <nwolfer@nvidia.com>
…ing to release/1.4.0 (#1968) ## What Backports the wheel-build and CI infrastructure from `main` to `release/1.4.0` — six commits, cherry-picked in main's chronological order: 1. **#1870** — split `Dockerfile.manylinux` into `wheel_base`/`wheel` stages so CI caches the expensive deps image; adds `--wheel-base-image` to `build-container.sh` 2. **#1933** — auto-derive `CI_IMAGE_TAG` in `cidemo-init.sh` (matrix YAMLs carry a `CI_MANAGED` placeholder patched at CI time; no manual tag bumps) 3. **#1941** — `--build-infinia`: bundle the Infinia DDN plugin (`libplugin_INFINIA.so`) into the wheel (opt-in) 4. **#1918** — `--build-ucx-spcx-plugin`: build and bundle the UCX spcx external plugin (`libuct_ib_mlx5_ext.so`) into the wheel (opt-in) 5. **#1956** — rename `BUILD_TARGET` → `DOCKER_BUILD_TARGET` in `build-container.sh` (Jenkins exports a `BUILD_TARGET` job param that leaked into the docker command line) 6. **#1863** — add the per-PR container-build pipeline (`nixl-ci-build-container-pr`) and dispatcher fan-out After this PR, `Jenkinsfile.dispatcher`, `cidemo-init.sh`, `build-container.sh`, `Dockerfile.manylinux`, and `build-container-pr-matrix.yaml` are byte-identical to `main`. Conflict resolutions (all mechanical): - Matrix YAMLs: release-branch hardcoded `CI_IMAGE_TAG` values replaced by the `CI_MANAGED` placeholder (#1933) - `ci-overview.md`: kept release-accurate wording where main's text references features not backported (vLLM/SGLang sanity #1777, cleanup job #1785) Intentionally **not** backported (not needed for release CI): vLLM/SGLang sanity testing (#1777), Artifactory cleanup job (#1785, #1964), CI timeout right-sizing (#1932), LLM base image pins (#1893), port pool cap (#1685). ## Why Needed for the 1.4.0 release: internal wheels must bundle the UCX spcx and Infinia plugins, and the release-branch CI needs the same wheel-build pipeline as `main` to build them. Both plugin features are opt-in (off by default); default builds are byte-identical to the current release branch. --------- Signed-off-by: Nir Wolfson <nwolfer@nvidia.com> Signed-off-by: NirWolfer <nwolfer@nvidia.com> Co-authored-by: Alexey Rivkin <57558538+Alexey-Rivkin@users.noreply.github.com>
Add vLLM / SGLang NIXL disaggregation sanity to the build-wheel pipeline
What
Adds a per-PR GPU sanity test that proves a freshly-built NIXL wheel performs a real prefill → decode KV transfer inside the vLLM and SGLang runtime images. It is folded into the existing
nixl-ci-build-wheeljob and runs on x86_64 / the mizu SLURM cluster, reusing the wheels that job already builds (no second wheel build).Why
Until now the wheels were only smoke-tested for import/version. This validates that the wheel actually works end-to-end in the disaggregated inference path that consumes NIXL.
HPCINFRA-4419
How it works
Everything runs sequentially in the single
podmancontainer (ci-demo runs eachruns_on_dockersentry as a parallel branch with no cross-branch ordering, so a split would race):scctl(dedicated x86_64-only step, scoped to the sanity).All sanity steps are gated to x86_64 via
containerSelector.Components
contrib/Dockerfile.{vllm,sglang}-base= pinned upstream image (docker.io/...) + baked-in test model (Qwen/Qwen3-1.7B) +iproute2. Built by the ci-demoruns_on_dockersmechanic (category: tool), rebuilt only when the Dockerfile changes orCI_IMAGE_TAGis bumped.sglang-basealso installssglang-routerand bakes the GSM8K test set, so nothing is fetched at test time..ci/scripts/common.share baked in and the image is tagged by commit SHA so the SLURM run pulls the exact image..gitlab/test_vllm_sglang_sanity.sh:toy_proxy_serverand asserts a completion comes back.sglang-routerand asserts gsm8k accuracy ≥GSM8K_MIN_ACCURACY(default 0.55); a broken transfer collapses accuracy toward 0.get_next_tcp_port, so concurrent jobs sharing a node (8 GPUs, host networking) don't collide.Other changes
cidemo-init.shtracks the new base Dockerfiles.CI_IMAGE_TAGbumped across the matrices so the bases rebuild.Notes for reviewers
SANITY_MODEL_ID,GSM8K_MIN_ACCURACY,GSM8K_NUM_QUESTIONS).Summary by CodeRabbit