Skip to content

feat(vllm-omni): bump to 0.28.0 - #6680

Merged
Yadan-Wei merged 16 commits into
mainfrom
bump/vllm-omni-0.28.0
Sep 18, 2026
Merged

Yadan-Wei merged 16 commits into
mainfrom
bump/vllm-omni-0.28.0

Conversation

@Yadan-Wei

@Yadan-Wei Yadan-Wei commented Aug 31, 2026 •

Copy link
Copy Markdown
Collaborator

What

Bump vLLM-Omni 0.26.0 → 0.28.0 (a two-minor jump; omni tracks upstream vLLM 1:1, so vllm_ref → v0.28.0) across both amzn2023 image configs and the Dockerfile ARG defaults.

Field 0.26.0 → 0.28.0
framework_version / vllm_ref / vllm_omni_version 0.28.0
flashinfer_version 0.6.14 → 0.6.16.post3
deepep_commit_hash 73b6ea4 → d4f41e4e93602a15e95f55f6ee8df8f1aaa0e4bb (full 40-char SHA — upstream now requires it; an abbreviated hash cannot be resolved via git fetch origin <sha>)
dlc_minor_version 6 → 7 (also realigns a Dockerfile ARG default that had drifted to 5)
CUDA / Python unchanged (13.0.2 / 3.12 — upstream's 13.0.3 + Ubuntu 24 base move is N/A to the amzn2023 base)

Release-notes reconciliation

Added — mooncake CUDA-13 wheel swap (docker/vllm_omni/Dockerfile.amzn2023, KV-connector install step). Upstream's default mooncake-transfer-engine PyPI wheel is a CUDA-12 build (its engine.so links libcudart.so.12, absent from the CUDA-13 runtime). Since 0.28.0, upstream's install-kv-connectors.sh swaps it for the same-version mooncake-transfer-engine-cuda13 variant on CUDA-13 images. We install kv_connectors.txt directly (bypassing that script) and ship install_kv_connectors: true, so this mirrors the swap here — matching the existing nixl-cu* reinstall pattern.

Checked, no change needed:

  • NCCL — upstream pins nvidia-nccl-cu13==2.30.7 for DeepEPv2 (needs ≥ 2.30.4); we pull unpinned libnccl from NVIDIA's cuda-rhel9 repo → already current. DeepEP's manylinux syscall + CUDA-stub fixes live inside the ep_kernels script we clone at v0.28.0.
  • SageMaker bidi WebSocket routes — WS_ALLOWED_PATHS frozenset unchanged (upstream's 6 routes are identical at v0.28.0).
  • s3tokenizer — still dev-only upstream at 0.28.0; the explicit s3tokenizer==0.3.0 pin stays correct.
  • GCC ≥ 11.3 / rdma-core / ccache / Rust frontend — amzn2023 already satisfies (gcc 11.4, libibverbs-devel, sccache); Rust build (build_rust.sh, install_protoc.sh) is byte-identical vs 0.26.0.
  • Refreshed the stale transformers-cap comment to the new >=5.10.1,<5.15 bound.

Added — PEFT LoRA SageMaker endpoint test

New real-endpoint test test/vllm-omni/sagemaker/test_sm_omni_endpoint.py::test_vllm_omni_peft_lora_endpoint (+ a peft-lora leg in vllm-omni.tests-sagemaker.yml) validates the per-request PEFT LoRA path end-to-end on the SageMaker image, closing the one omni serving mode the suite didn't cover:

  • Deploys a realtime endpoint with SM_VLLM_ENABLE_LORA=true and an adapter registered via SM_VLLM_LORA_MODULES, then invokes /v1/images/generations with and without the per-request lora field and asserts the two images differ — proving the adapter is selected per-request through the DLC SageMaker serving middleware.
  • Base is stable-diffusion-3.5-medium (~20 GiB, fits a single 24 GB GPU with no offload). It is HF-gated, so the base + PEFT adapter are baked into the S3 model artifact (base at tar root + adapters/sd35-lora/) and loaded from /opt/ml/model — no runtime HF pull and no HF token on the endpoint. Ada-only instance pool (g6.xlarge/2xl/4xl; the omni 0.28 container needs sm_89+, so no g5/Ampere).
  • Teardown waits for the endpoint to leave Creating before deleting, so a slow/timed-out deploy cannot leak an endpoint.

SageMaker endpoint test restructure

This PR also reworks how the omni SageMaker endpoint tests run:

  • Per-case fan-out. Replaces the old two-group -k split (realtime / async) with one matrix job per endpoint case — tts-realtime, tts-async, bidi-speech-stream, bidi-default-path-rejected, peft-lora, plus a trailing video-async job. max-parallel: 1 keeps at most one endpoint live at a time (respecting the tiny per-type SageMaker endpoint quotas); fail-fast: false lets every case run even after one fails; each leg gets a fresh runner-role session so a failure can be re-run in isolation.
  • Native instance pools. All three endpoint fixtures now deploy over SageMaker instance pools via the shared build_instance_pools(instance_type) helper (priority-based capacity fallback across an instance-type ladder), replacing the previous client-side ICE-retry loop — the omni half of the vLLM instance-pools migration. The peft-lora leg uses an Ada-only ladder (g6.xlarge/2xl/4xl) since the 0.28 container needs sm_89+; the tts/bidi/video legs keep their existing ladders.
  • video-async runs last as its own job and is allowed to skip (not fail) when SageMaker exhausts every instance-pool candidate, so a capacity skip is not recorded as a full-suite pass.

Test plan

  • CI build (first build of a new version is a full source compile — no wheel-cache hit) — passed
  • DeepEP/NCCL path and the new mooncake cuda13 swap built cleanly
  • EC2 + SageMaker smoke tests — passed (all model smoke-test legs green)
  • SageMaker bidi endpoint tests — passed (bidi-speech-stream, bidi-default-path-rejected)
  • SageMaker TTS + video-async endpoint tests — passed
  • New PEFT LoRA endpoint test — passed (endpoint-test (peft-lora))

Deferred — new-model CI coverage (follow-up)

0.28.0 adds notable families: IndexTTS 2.5, MiniMax Music 3, MiniMax-H3, SANA-Video, Nemotron VoiceChat (full-duplex), dots.tts, π0 VLA, etc. Not added here — each needs model-upload staging + verify-model confirmation before wiring a CI entry, and some require optional-dep extras (indextts2, longcat-video-avatar). Can follow up per customer demand.

The distill LoRA backend (startup-fused LightX2V checkpoints) is validated by config but not yet wired as a CI leg — its base (Qwen-Image, ~60 GiB + cpu-offload) needs a large, capacity-scarce instance; deferred until a reliable slot is available.

Bump vLLM-Omni 0.26.0 -> 0.28.0 (tracks upstream vLLM v0.28.0) across both
the ec2 and sagemaker amzn2023 image configs and the Dockerfile ARG defaults:

- framework_version / vllm_ref / vllm_omni_version -> 0.28.0
- flashinfer_version 0.6.14 -> 0.6.16.post3
- deepep_commit_hash -> d4f41e4e93602a15e95f55f6ee8df8f1aaa0e4bb (full 40-char
  SHA; upstream now pins the full hash since an abbreviated one cannot be
  resolved via `git fetch origin <sha>`)
- dlc_minor_version 6 -> 7 (also realigns the Dockerfile ARG default, which had
  drifted to 5)

Add a CUDA-13 mooncake wheel swap in the KV-connector install step. Upstream's
default mooncake-transfer-engine PyPI wheel is a CUDA-12 build (its engine.so
links libcudart.so.12, absent from the CUDA-13 runtime image), and since 0.28.0
upstream's install-kv-connectors.sh swaps it for the same-version
mooncake-transfer-engine-cuda13 variant on CUDA-13 images. Mirror that here,
matching the existing nixl-cu* reinstall pattern, so mooncake KV connectors
load on this image.

No change needed for: NCCL (pulled unpinned from the NVIDIA cuda-rhel9 repo, so
already >= 2.30.4 for DeepEPv2), the SageMaker bidi WebSocket route set
(unchanged upstream at v0.28.0), and the s3tokenizer==0.3.0 pin (still dev-only
upstream). Refreshed the transformers-cap comment to the new >=5.10.1,<5.15
bound.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Yadan Wei added 15 commits August 31, 2026 22:58
vLLM v0.28.0's CMakeLists.txt applies cmake/patches/pytorch_stable_string.patch
to torch's stable headers at configure time via `patch --batch --forward`
(CMakeLists.txt:417, new in 0.28.0). The upstream manylinux build base ships
`patch`, but our amzn2023 build stage does not, so CMake configure failed with
"child return code: no such file or directory" during setup.py bdist_wheel.
Add `patch` to the build-stage dnf install.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
…8.0)

DeepEP at the 0.28.0-matched ref (d4f41e4e93) uses ncclGinRequest_t from
NCCL's GIN backend, which requires NCCL >= 2.30.4. DeepEP compiles and links
against the venv's nvidia-nccl-cu13 wheel (-I/opt/venv/.../nvidia/nccl/include),
and the version torch pulls in is older, so the build failed with
'ncclGinRequest_t does not name a type'.

Mirror upstream vLLM 0.28.0's UV_OVERRIDE: force nvidia-nccl-cu<major>==2.30.7
in both the build stage (fixes the DeepEP compile) and the deps stage (so the
runtime venv the DeepEP wheel links carries the same NCCL and loads).

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
DeepEP's setup.py adds the nvidia-nccl-cu13 wheel lib dir to the built .so's
rpath but not to the link-time search path, and passes -l:libnccl.so.2. The
amzn2023 build stage has no system libnccl.so.2 (unlike upstream's manylinux/
pytorch build base), so the DeepEP link failed with
'/usr/bin/ld: cannot find -l:libnccl.so.2'. Point LIBRARY_PATH at the nccl
wheel's lib dir before the DeepEP build so the link resolves; DeepEP's rpath
handles runtime resolution (the same wheel is installed in the runtime venv).

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
The prior LIBRARY_PATH fix used python3 -c 'nvidia.nccl.__file__', but
nvidia.nccl is a namespace package so __file__ is None -> TypeError, leaving
LIBRARY_PATH empty and the DeepEP link still failing on -l:libnccl.so.2.
Locate the wheel's libnccl.so.2 directly with find instead.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
The entry's review_by (2026-08-25) lapsed, failing test.ecr_scan. It is one
of the mooncake libetcd_wrapper.so go-stdlib CVEs (same cluster as
CVE-2026-33818/39821/56853), unpatchable without a mooncake upgrade and still
present on the mooncake-transfer-engine-cuda13 wheel shipped for vLLM 0.28.0.
Extend the review date to align with that cluster (2026-10-22).

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Run each real endpoint case as its own serial matrix job so failures can be rerun in isolation and every deploy starts with fresh runner credentials. Keep middleware unit tests separate and avoid unnecessary runner-side ECR login.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Configure realtime, async, and bidirectional Omni endpoints with priority-ordered SageMaker instance pools for server-side capacity fallback. Add CPU-only helper coverage and keep the existing vLLM client-side fallback API compatible.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Run SageMaker argument, routing middleware, and instance-pool helper tests in one Omni-specific unit workflow. Keep the SageMaker workflow focused on managed endpoint deployment tests.

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Signed-off-by: Yadan Wei <weiyadan@amazon.com>
Exercise the vLLM-Omni PEFT LoRA serving path on a real SageMaker endpoint:
deploy SD-3.5-medium (pulled from HF at runtime) with a PEFT adapter shipped
via the model's S3 model_data, then generate the same prompt/seed without and
with the per-request `lora` field and assert the images differ — proving the
adapter is applied per request, not merely loaded at startup.

- test_sm_omni_endpoint.py: `_create_model` gains an optional `model_data_url`;
  add a `lora_endpoint` fixture (SM_VLLM_ENABLE_LORA / _LORA_MODULES /
  _MAX_LORA_RANK, adapter over build_instance_pools) and
  `test_vllm_omni_peft_lora_endpoint` with a with/without bind assertion.
- vllm-omni.tests-sagemaker.yml: add the `peft-lora` matrix leg so it runs
  (max-parallel:1 keeps a single live endpoint).

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
…eout

The peft-lora sagemaker leg failed the ping health check: SD-3.5-medium's
~15 GB gated HF pull + load exceeds SageMaker's 600s default container startup
health-check window. Set container_startup_health_check_timeout_in_seconds=2400
on the lora_endpoint ProductionVariant (the small TTS models load under 600s, so
they were unaffected).

Signed-off-by: Yadan Wei <weiyadan@amazon.com>
The peft-lora leg failed provisioning: the CI HF token is not authorized for
the gated stabilityai/stable-diffusion-3.5-medium base, so the runtime HF pull
returned 403. Bake the base + adapter into the S3 model artifact and load from
/opt/ml/model (SM_VLLM_MODEL=/opt/ml/model) -- no runtime HF pull, no token on
the endpoint.

- Point model_data at the baked tar (base at root + adapters/sd35-lora/); drop
  HF_TOKEN and add model_data_download_timeout_in_seconds for the ~20 GiB pull.
- Restrict the instance pool to the Ada ladder (g6.xlarge/2xl/4xl); the omni
  0.28 container needs sm_89+ (no g5/Ampere).
- Add a Creating-aware teardown guard so a slow/timed-out deploy cannot leak an
  endpoint.
@Yadan-Wei
Yadan-Wei marked this pull request as ready for review September 18, 2026 05:28
@Yadan-Wei
Yadan-Wei enabled auto-merge (squash) September 18, 2026 17:55
@Yadan-Wei
Yadan-Wei merged commit 4098c7c into main Sep 18, 2026
78 checks passed
@jinyan-li1
jinyan-li1 deleted the bump/vllm-omni-0.28.0 branch September 18, 2026 18:15
Yadan-Wei pushed a commit that referenced this pull request Sep 21, 2026
- Replace upstream-PR Highlights with the container-side change: PEFT LoRA validated on SageMaker (new endpoint test, PR #6680)
- Preserve the upstream v0.26.0...v0.28.0 compare link on the source line
Yadan-Wei added a commit that referenced this pull request Sep 21, 2026
* docs(vllm-omni): refresh for v1.7.0 (vLLM-Omni 0.28.0)

- drift: correct s3tokenizer version reference 0.26.0 -> 0.28.0 in index.md
- Add changelog entry for v1.7.0 (vLLM-Omni 0.28.0, DLC PR #6680)

* docs(vllm-omni): focus v1.7.0 changelog Highlights on container changes

- Replace upstream-PR Highlights with the container-side change: PEFT LoRA validated on SageMaker (new endpoint test, PR #6680)
- Preserve the upstream v0.26.0...v0.28.0 compare link on the source line

* docs(vllm-omni): drop upstream-PR frontend bullet from v1.7.0 Changes

* docs(vllm-omni): add v1.7 (0.28.0) entry to README What's New

* docs(vllm-omni): add v1.7 (0.28.0) to available_images data

---------

Co-authored-by: Yadan Wei <weiyadan@amazon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants