[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)