[CI/Build][Hardware][NVIDIA] Add Rubin CUDA 13.4 nightly images (#55953)

Signed-off-by: Tyler Michael Smith <tlrmchlsmth@gmail.com> Co-authored-by: OpenAI Codex <noreply@openai.com> Co-authored-by: OpenAI Codex <codex@openai.com> Co-authored-by: Misha Goin <mgoin64@gmail.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

Tyler Michael Smith committed Sep 17, 2026 at 11:05 UTC 4f9a41ac94beb940249d9712a6dd2996cf37da61
6 files changed +105 -5
.buildkite/release-pipeline.yaml
+92
@@ -316,6 +316,66 @@ steps:
316 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129"
317 - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129" release-images'
318
319 + - label: "Build release image - x86_64 - Rubin CUDA 13.4"
320 + depends_on: ~
321 + id: build-release-image-x86-rubin-cuda-13-4
322 + if: build.env("NIGHTLY") == "1"
323 + agents:
324 + queue: cpu_queue_release
325 + commands:
326 + - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
327 + - |
328 + DOCKER_BUILDKIT=1 docker buildx build --load \
329 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu134) \
330 + --platform linux/amd64 \
331 + --build-arg max_jobs=16 \
332 + --build-arg USE_SCCACHE=1 \
333 + --build-arg GIT_REPO_CHECK=1 \
334 + --build-arg CUDA_VERSION=13.4 \
335 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86}" \
336 + --build-arg INSTALL_KV_CONNECTORS=true \
337 + --build-arg INSTALL_RUBIN_PRERELEASE=true \
338 + --build-arg TRITON_INSTALL_FROM_SOURCE_REPO=https://github.com/triton-lang/triton.git \
339 + --build-arg TRITON_INSTALL_FROM_SOURCE_REVISION=3f6e41132b5edf639bfb872ad73d4688765e08b8 \
340 + --build-arg RUN_WHEEL_CHECK=false \
341 + --build-arg BUILD_BASE_IMAGE=pytorch/manylinux2_28-builder:cuda13.4 \
342 + --build-arg FINAL_BASE_IMAGE=nvcr.io/nvidia/cuda-dl-base:26.08-cuda13.4-devel-ubuntu24.04 \
343 + --target vllm-openai \
344 + --progress plain \
345 + -f docker/Dockerfile .
346 + - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu134"
347 + - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu134" release-images'
348 +
349 + - label: "Build release image - aarch64 - Rubin CUDA 13.4"
350 + depends_on: ~
351 + id: build-release-image-arm64-rubin-cuda-13-4
352 + if: build.env("NIGHTLY") == "1"
353 + agents:
354 + queue: arm64_cpu_queue_release
355 + commands:
356 + - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
357 + - |
358 + DOCKER_BUILDKIT=1 docker buildx build --load \
359 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu134) \
360 + --platform linux/arm64 \
361 + --build-arg max_jobs=16 \
362 + --build-arg USE_SCCACHE=1 \
363 + --build-arg GIT_REPO_CHECK=1 \
364 + --build-arg CUDA_VERSION=13.4 \
365 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64}" \
366 + --build-arg INSTALL_KV_CONNECTORS=true \
367 + --build-arg INSTALL_RUBIN_PRERELEASE=true \
368 + --build-arg TRITON_INSTALL_FROM_SOURCE_REPO=https://github.com/triton-lang/triton.git \
369 + --build-arg TRITON_INSTALL_FROM_SOURCE_REVISION=3f6e41132b5edf639bfb872ad73d4688765e08b8 \
370 + --build-arg RUN_WHEEL_CHECK=false \
371 + --build-arg BUILD_BASE_IMAGE=pytorch/manylinuxaarch64-builder:cuda13.4 \
372 + --build-arg FINAL_BASE_IMAGE=nvcr.io/nvidia/cuda-dl-base:26.08-cuda13.4-devel-ubuntu24.04 \
373 + --target vllm-openai \
374 + --progress plain \
375 + -f docker/Dockerfile .
376 + - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu134"
377 + - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu134" release-images'
378 +
379 - label: "Build release image - x86_64 - CUDA 13.0 - Ubuntu 24.04"
380 depends_on: ~
381 id: build-release-image-x86-ubuntu2404
@@ -513,6 +573,20 @@ steps:
573 - "docker manifest push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129"
574 - 'bash .buildkite/scripts/annotate-build-artifact.sh "Manifest: CUDA 12.9" "public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129" release-manifests'
575
576 + - label: "Create multi-arch manifest - Rubin CUDA 13.4"
577 + depends_on:
578 + - build-release-image-x86-rubin-cuda-13-4
579 + - build-release-image-arm64-rubin-cuda-13-4
580 + id: create-multi-arch-manifest-rubin-cuda-13-4
581 + if: build.env("NIGHTLY") == "1"
582 + agents:
583 + queue: small_cpu_queue_release
584 + commands:
585 + - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
586 + - "docker manifest create public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu134 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-x86_64-cu134 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-aarch64-cu134 --amend"
587 + - "docker manifest push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu134"
588 + - 'bash .buildkite/scripts/annotate-build-artifact.sh "Manifest: Rubin CUDA 13.4" "public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu134" release-manifests'
589 +
590 - label: "Create multi-arch manifest - CUDA 13.0 - Ubuntu 24.04"
591 depends_on:
592 - build-release-image-x86-ubuntu2404
@@ -585,6 +659,24 @@ steps:
659 DOCKER_BUILDKIT: "1"
660 DOCKERHUB_USERNAME: "vllmbot"
661
662 + - label: "Publish nightly multi-arch Rubin image to DockerHub - CUDA 13.4"
663 + depends_on:
664 + - create-multi-arch-manifest-rubin-cuda-13-4
665 + if: build.env("NIGHTLY") == "1"
666 + agents:
667 + queue: small_cpu_queue_release
668 + commands:
669 + - "bash .buildkite/scripts/push-nightly-builds.sh cu134"
670 + # Clean up old nightly builds (keep only last 14)
671 + - "bash .buildkite/scripts/cleanup-nightly-builds.sh cu134-nightly-"
672 + plugins:
673 + - docker-login#v3.0.0:
674 + username: vllmbot
675 + password-env: DOCKERHUB_TOKEN
676 + env:
677 + DOCKER_BUILDKIT: "1"
678 + DOCKERHUB_USERNAME: "vllmbot"
679 +
680 - label: "Publish nightly CPU multi-arch image to DockerHub"
681 depends_on:
682 - build-cpu-release-image-x86
.buildkite/scripts/cleanup-nightly-builds.sh
+2 -2
@@ -56,8 +56,8 @@ get_all_tags() {
56 set -x
57
58 # Get both last_updated timestamp and tag name, separated by |
59 - # Exclude nightly-dev tags from cleanup
60 - local tags=$(echo "$response" | jq -r --arg prefix "$TAG_PREFIX" '.results[] | select(.name | startswith($prefix)) | select(.name | startswith("nightly-dev") | not) | "\(.last_updated)|\(.name)"')
59 + # Exclude mutable architecture tags and nightly-dev tags from cleanup
60 + local tags=$(echo "$response" | jq -r --arg prefix "$TAG_PREFIX" '.results[] | select(.name | startswith($prefix)) | select(.name != ($prefix + "x86_64") and .name != ($prefix + "aarch64")) | select(.name | startswith("nightly-dev") | not) | "\(.last_updated)|\(.name)"')
61
62 if [ -z "$tags" ]; then
63 break
docker/Dockerfile
+5
@@ -231,10 +231,12 @@ RUN --mount=type=cache,target=/opt/uv/cache \
231 echo "Installing Rubin prerelease requirements..." \
232 && /opt/venv/bin/python3 use_existing_torch.py --prefix \
233 && uv pip install --python /opt/venv/bin/python3 \
234 + --prerelease=allow --index-strategy unsafe-first-match \
235 -r /tmp/vllm-requirements/rubin-prerelease.txt \
236 && uv pip install --python /opt/venv/bin/python3 \
237 -r requirements/cuda.txt \
238 && uv pip install --python /opt/venv/bin/python3 \
239 + --prerelease=allow --index-strategy unsafe-first-match \
240 -r /tmp/vllm-requirements/rubin-prerelease.txt; \
241 elif [ "${PYTORCH_NIGHTLY}" = "1" ]; then \
242 echo "Installing torch nightly..." \
@@ -941,11 +943,13 @@ RUN --mount=type=cache,target=/opt/uv/cache \
943 fi && \
944 if [ "${INSTALL_RUBIN_PRERELEASE}" = "true" ]; then \
945 uv pip install --system \
946 + --prerelease=allow --index-strategy unsafe-first-match \
947 -r /tmp/vllm-requirements/rubin-prerelease.txt \
948 && sed -Ei '/^[[:space:]]*(torch|torchvision|torchaudio)[[:space:]]*==/Id' \
949 /tmp/requirements-cuda.txt \
950 && uv pip install --system -r /tmp/requirements-cuda.txt \
951 && uv pip install --system \
952 + --prerelease=allow --index-strategy unsafe-first-match \
953 -r /tmp/vllm-requirements/rubin-prerelease.txt \
954 && printf '%s\n' \
955 "/usr/local/lib/python${PYTHON_VERSION}/dist-packages/nvpl/lib" \
@@ -1262,6 +1266,7 @@ RUN --mount=type=cache,target=/opt/uv/cache \
1266 if [ "${INSTALL_RUBIN_PRERELEASE}" = "true" ]; then \
1267 echo "Installing Rubin prerelease requirements..." \
1268 && uv pip install --system \
1269 + --prerelease=allow --index-strategy unsafe-first-match \
1270 -r /tmp/vllm-requirements/rubin-prerelease.txt; \
1271 fi
1272
tests/v1/engine/test_output_processor.py
+2 -1
@@ -177,7 +177,8 @@ def test_incremental_detokenization(
177 def test_remote_prefill_cached_tokens_override(do_remote_prefill: bool):
178 """P/D disaggregation: num_cached_tokens should report the P worker's
179 cache hits (passed via kv_transfer_params) instead of the local count,
180 - which sees the KVs pulled from the remote prefill as a ~100% hit."""
180 + which sees the KVs pulled from the remote prefill as a ~100% hit.
181 + """
182 output_processor = OutputProcessor(tokenizer=None, log_stats=False)
183
184 prompt_tokens = [1, 2, 3, 4, 5, 6, 7, 8]
tests/v1/kv_connector/unit/test_nixl_connector.py
+2 -1
@@ -350,7 +350,8 @@ def test_prefill_exports_cached_tokens_in_kv_transfer_params():
350 """The P worker reports its own prefix-cache hits in the returned
351 kv_transfer_params so the D worker can surface them in
352 prompt_tokens_details instead of the ~100% local hit it measures
353 - when pulling the KVs from the remote."""
353 + when pulling the KVs from the remote.
354 + """
355 vllm_config = create_vllm_config()
356 scheduler = create_scheduler(vllm_config)
357
vllm/models/qwen4_exp/nvidia/ops/qsa.py
+2 -1
@@ -482,7 +482,8 @@ def _select_sm120_config(
482 """(block_n, target_splits, num_warps) retuned on sm_120 (RTX PRO 6000
483 Blackwell), split by cache dtype: bf16 and fp8 favour different configs on
484 sm_120, most visibly on the large-prefill region. Each entry is the fastest
485 - config that stays correct on its own path; the main win is more warps."""
485 + config that stays correct on its own path; the main win is more warps.
486 + """
487 if is_fp8:
488 if base_programs > 2048:
489 return (32, 2, 1) if use_prefill_config else (64, 1, 2)