Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
aa81e67
[ROCm][Bugfix] Serve gfx942 MLA verify past 4 tokens with a Triton ke…
AndreasKaratzas Nov 5, 2026
fd75a7a
[Perf][Core] Keep prompt token ids as int32 buffers (#62702)
Juntian777 Nov 5, 2026
305a839
[CPU][Zen] Enable Laguna MoE on Zen CPU via grouped W8A16 (DA8W8) (#6…
ganeshr10 Nov 5, 2026
3f47d6b
[ZenCPU] Add zen5 CPU tests reusing the pushed zen image (#60824)
Chinmay-Kulkarni-AMD Nov 5, 2026
76f5e47
[Rust Frontend] Choose chat content format by probing the template (#…
BugenZhao Nov 5, 2026
52bc0c1
[Rust Frontend] Keep developer messages in place for templates withou…
BugenZhao Nov 5, 2026
80ff32c
[KV Connector][Mooncake] Start async lookup when a request arrives vi…
Dao007forever Nov 5, 2026
37e8a69
[Rust Frontend] Generate through an `Llm` trait (#64695)
BugenZhao Nov 5, 2026
4d72309
[Perf][Qwen4Exp] Route the PLE shard copy through copy_weight_ (#65692)
JimmyToluene Nov 5, 2026
0997a17
[CI] Drop the removed input_dtype arg from the Zen DA8W4 test (#65810)
khluu Nov 5, 2026
92b1573
[Bugfix] Granite4Vision: strip padding tiles for list pixel_values (#…
artem-spector Nov 5, 2026
83fcf52
[Perf][Qwen4Exp] Fuse HyperConnection up projection and gate mix for …
Gin-Sin Nov 5, 2026
d8588b7
[XPU] skipp unsupported test cases in CI (#65805)
yma11 Nov 5, 2026
c436239
[CI Failure] Move Multimodal Models (Extended Pooling) to h200_35gb (…
noooop Nov 5, 2026
a2bcb56
[Bugfix][MiniMax-M3] Initialize the shard record in the indexer QKV l…
gau-nernst Nov 5, 2026
1929f16
[ROCm][Perf][DSv4.1] Skip the top-k -1 fill on the rows vLLM's decode…
okorzh-amd Nov 5, 2026
49c1a73
[ROCm][Perf][DSv4.1] Run DSpark's fused Markov sampling on gfx950 wit…
okorzh-amd Nov 5, 2026
e5d0ef3
[Bugfix][ROCm][Kimi-K3] Refresh derived weight copies after in-place …
okorzh-amd Nov 5, 2026
1ab4476
[Bugfix][Model] Fix Ling3 SwiGLU clamping (#65088)
zexplorerhj Nov 5, 2026
db914ca
[Bugfix][ROCm] Take the AITER MLA KV cache dtype from the group's spe…
BaoYunkai Nov 5, 2026
a981cad
[Rust Frontend] Support n > 1 choices (#65625)
BugenZhao Nov 5, 2026
1a983e2
[Recipe] Add ERNIE-5.5-Flash recipe (#65817)
jackyYang6 Nov 5, 2026
90b7739
[Build] Update DeepGEMM pin to latest main (#65494)
qqaatw Nov 5, 2026
edc7181
[Bugfix][LoRA] Apply DeepSeek-V4 compressor and wo_a adapters (#64880)
HollowMan6 Nov 5, 2026
c2bc949
[Bugfix] Honor checkpoint FP8 KV scales in Qwen4Exp QSA (#65812)
lHrHenry233 Nov 5, 2026
9901ffc
[Online quantization] Support activation quant key override for onlin…
fxmarty-amd Nov 5, 2026
baf2afa
[Rust Frontend] Split engine-core settings out of the server config
BugenZhao Oct 30, 2026
21d7d92
[Rust Frontend] Serve over a caller-built `Llm`
BugenZhao Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .buildkite/hardware_tests/cpu.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,11 @@ steps:
agents:
queue: amd-cpu
source_file_dependencies:
- setup.py
- .buildkite/hardware_tests/cpu.yaml
- .buildkite/hardware_tests/zen.yaml
- .buildkite/image_build/image_build_zen_cpu.sh
- .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh
- docker/Dockerfile.zen
- docker/Dockerfile.cpu
- requirements/cpu.txt
Expand Down
107 changes: 107 additions & 0 deletions .buildkite/hardware_tests/zen.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
group: Zen CPU
depends_on: []
steps:
- label: Zen-CPU-Kernel Tests
key: zen-cpu-kernel-tests
# run-zen-cpu-test.sh pulls the prebuilt <repo>:<commit>-zen-cpu image
# that zen-cpu-image-build publishes, falling back to a local build
# only if the pull misses.
depends_on:
- zen-cpu-image-build
allow_dependency_failure: true
soft_fail: true
device: zen5
no_plugin: true
source_file_dependencies:
- setup.py
- .buildkite/hardware_tests/cpu.yaml
- .buildkite/hardware_tests/zen.yaml
- .buildkite/image_build/image_build_zen_cpu.sh
- .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh
- docker/Dockerfile.zen
- docker/Dockerfile.cpu
- requirements/cpu.txt
- requirements/build/cpu.txt
- requirements/test/cpu.txt
- cmake/cpu_extension.cmake
- vllm/model_executor/layers/utils.py
- vllm/model_executor/kernels/linear/zentorch_utils.py
- vllm/model_executor/kernels/linear/scaled_mm/zentorch.py
- vllm/model_executor/kernels/linear/mixed_precision/zentorch.py
- vllm/platforms/cpu.py
- vllm/platforms/zen_cpu.py
- vllm/platforms/__init__.py
- tests/model_executor/test_cpu_unquantized_gemm_dispatch.py
- tests/test_zen_cpu_platform_detection.py
- tests/kernels/moe/test_zen_cpu_fused_moe.py
- tests/kernels/moe/test_zen_cpu_int8_moe.py
- vllm/v1/attention/backends/zentorch_sdpa.py
- tests/test_zentorch_version_pin.py
- vllm/v1/attention/backends/mla/prefill/zen_cpu_sdpa.py
- vllm/model_executor/layers/fused_moe/experts/zentorch_moe.py
- tests/kernels/quantization/test_zen_da8w4.py
commands:
- |
# The zen5 agent env does not provide REGISTRY/REPO, so pass the public-ECR
# coordinates the zen-cpu-image-build step pushed to (anonymous pull). Keep
# the repo mapping in sync with ci_config.yaml (main vs premerge).
export REGISTRY="public.ecr.aws/q9t5s3a7"
if [[ "$$BUILDKITE_BRANCH" == "main" ]]; then
export REPO="vllm-ci-postmerge-repo"
else
export REPO="vllm-ci-test-repo"
fi
bash .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh 20m "
pytest -x -v -s tests/model_executor/test_cpu_unquantized_gemm_dispatch.py"
- label: Zen-CPU-Platform-Detection Tests
key: zen-cpu-platform-detection-tests
# Same model as the kernel step: run-zen-cpu-test.sh pulls the prebuilt
# <repo>:<commit>-zen-cpu image from zen-cpu-image-build (local-build fallback).
depends_on:
- zen-cpu-image-build
allow_dependency_failure: true
soft_fail: true
device: zen5
no_plugin: true
source_file_dependencies:
- setup.py
- .buildkite/hardware_tests/cpu.yaml
- .buildkite/hardware_tests/zen.yaml
- .buildkite/image_build/image_build_zen_cpu.sh
- .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh
- docker/Dockerfile.zen
- docker/Dockerfile.cpu
- requirements/cpu.txt
- requirements/build/cpu.txt
- requirements/test/cpu.txt
- cmake/cpu_extension.cmake
- vllm/model_executor/layers/utils.py
- vllm/model_executor/kernels/linear/zentorch_utils.py
- vllm/model_executor/kernels/linear/scaled_mm/zentorch.py
- vllm/model_executor/kernels/linear/mixed_precision/zentorch.py
- vllm/platforms/cpu.py
- vllm/platforms/zen_cpu.py
- vllm/platforms/__init__.py
- tests/model_executor/test_cpu_unquantized_gemm_dispatch.py
- tests/test_zen_cpu_platform_detection.py
- tests/kernels/moe/test_zen_cpu_fused_moe.py
- tests/kernels/moe/test_zen_cpu_int8_moe.py
- vllm/v1/attention/backends/zentorch_sdpa.py
- tests/test_zentorch_version_pin.py
- vllm/v1/attention/backends/mla/prefill/zen_cpu_sdpa.py
- vllm/model_executor/layers/fused_moe/experts/zentorch_moe.py
- tests/kernels/quantization/test_zen_da8w4.py
commands:
- |
# The zen5 agent env does not provide REGISTRY/REPO, so pass the public-ECR
# coordinates the zen-cpu-image-build step pushed to (anonymous pull). Keep
# the repo mapping in sync with ci_config.yaml (main vs premerge).
export REGISTRY="public.ecr.aws/q9t5s3a7"
if [[ "$$BUILDKITE_BRANCH" == "main" ]]; then
export REPO="vllm-ci-postmerge-repo"
else
export REPO="vllm-ci-test-repo"
fi
bash .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh 20m "
pytest -x -v -s tests/test_zen_cpu_platform_detection.py"
19 changes: 11 additions & 8 deletions .buildkite/image_build/image_build_zen_cpu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,6 @@
# Build the AMD Zen CPU image (vLLM + zentorch) by layering docker/Dockerfile.zen
# on top of a CPU base image that already has vLLM installed.
#
# To avoid recompiling vLLM from source, prefer reusing the shared CPU image that
# the image-build-cpu step already builds and publishes for this commit
# (`<repo>:<commit>-cpu`). It lives in public ECR, which allows anonymous pulls,
# so no registry credentials are required. If the pull fails (e.g. the image
# isn't published yet), fall back to building the base from docker/Dockerfile.cpu.
#
# The zen image is not pushed to a registry.
#
# See docker/Dockerfile.zen for the build workflow this mirrors.
set -euo pipefail

Expand Down Expand Up @@ -73,3 +65,14 @@ docker build --file docker/Dockerfile.zen \
--tag "$IMAGE" \
--target vllm-zen-test \
--progress plain .

# Step 3: push the zen image so test nodes can pull it instead of rebuilding.
# Only when a registry is provided (CI); local runs keep the image local.
# Pushing to public ECR requires AWS credentials on the build agent; pulls are
# anonymous.
if [[ -n "${REGISTRY}" ]]; then
echo "--- :docker: Pushing Zen image: $IMAGE"
aws ecr-public get-login-password --region us-east-1 \
| docker login --username AWS --password-stdin "$REGISTRY"
docker push "$IMAGE"
fi
4 changes: 3 additions & 1 deletion .buildkite/intel_jobs/entrypoints_intel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,9 @@ steps:
bash .buildkite/scripts/hardware_ci/run-intel-test.sh
'export VLLM_WORKER_MULTIPROC_METHOD=spawn &&
cd tests &&
pytest -v -s entrypoints/scale_out'
pytest -v -s entrypoints/scale_out
--deselect="entrypoints/scale_out/derender/test_derender_parity.py::test_inline_derender_parity[n2]"
--deselect="entrypoints/scale_out/derender/test_derender_parity.py::test_inline_derender_stream_parity[n2]"'
- label: ":intel: (BMG) Entrypoints Integration (API Server Generate)"
key: entrypoints-integration-api-server-generate-intel
Expand Down
1 change: 1 addition & 0 deletions .buildkite/intel_jobs/models_multimodal_intel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ steps:
--ignore models/multimodal/generation/test_whisper.py
--ignore models/multimodal/generation/test_gemma_ragged_audio.py
--ignore models/multimodal/generation/test_memory_leak.py
--ignore models/multimodal/generation/test_unlimited_ocr.py
--ignore models/multimodal/processing'

- label: ":intel: (BMG) Multi-Modal Processor" # 44min
Expand Down
97 changes: 97 additions & 0 deletions .buildkite/scripts/hardware_ci/run-zen-cpu-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#!/bin/bash

# Run the AMD Zen CPU tests on the zen5 hardware.

set -euox pipefail

# allow to bind to different cores
CORE_RANGE=${CORE_RANGE:-0-47}
NUMA_NODE=${NUMA_NODE:-0}
IMAGE_NAME="zen-cpu-test-$NUMA_NODE"
FALLBACK_BASE_IMAGE="zen-cpu-base-$NUMA_NODE"
TIMEOUT_VAL=$1
TEST_COMMAND=$2

# Install zentorch directly in Dockerfile.zen instead of `uv pip install
# "vllm[zen]"`, which makes uv re-resolve vLLM and fail on its transitive
# triton-cpu URL dependency. Keep in sync with the `zen` extra in setup.py.
ZENTORCH_VERSION="${ZENTORCH_VERSION:-2.14.0.1}"

CLEANUP_IMAGES=()
cleanup() {
if [ "${#CLEANUP_IMAGES[@]}" -gt 0 ]; then
docker rmi -f "${CLEANUP_IMAGES[@]}" > /dev/null 2>&1 || true
fi
}
trap cleanup EXIT

# Published images (resolvable only when the Buildkite registry env vars are
# present, i.e. in CI). Pulls from public ECR are anonymous.
ZEN_IMAGE=""
SHARED_CPU_IMAGE=""
if [ -n "${REGISTRY:-}" ] && [ -n "${REPO:-}" ] && [ -n "${BUILDKITE_COMMIT:-}" ]; then
ZEN_IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-zen-cpu"
SHARED_CPU_IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-cpu"
fi

if [ -n "$ZEN_IMAGE" ] && docker pull "$ZEN_IMAGE"; then
# Fast path: reuse the prebuilt zen image; no local build.
echo "--- :docker: Using published Zen image: $ZEN_IMAGE"
IMAGE_NAME="$ZEN_IMAGE"
CLEANUP_IMAGES+=("$ZEN_IMAGE")
else
# Step 1: obtain the CPU base image that Dockerfile.zen layers on. Prefer
# pulling the published `-cpu` image; fall back to building it from source.
if [ -n "$SHARED_CPU_IMAGE" ] && docker pull "$SHARED_CPU_IMAGE"; then
echo "--- :docker: Using published CPU image as base: $SHARED_CPU_IMAGE"
BASE_IMAGE="$SHARED_CPU_IMAGE"
CLEANUP_IMAGES+=("$SHARED_CPU_IMAGE")
else
echo "--- :docker: Published CPU image unavailable; building base from source"
docker build --progress plain --tag "$FALLBACK_BASE_IMAGE" \
--target vllm-openai -f docker/Dockerfile.cpu .
BASE_IMAGE="$FALLBACK_BASE_IMAGE"
CLEANUP_IMAGES+=("$FALLBACK_BASE_IMAGE")
fi

# Step 2: build the zen test image on top of the CPU base.
echo "--- :docker: Building Zen test image"
docker build --progress plain --tag "$IMAGE_NAME" \
--build-arg BASE_IMAGE="$BASE_IMAGE" \
--build-arg ZENTORCH_VERSION="$ZENTORCH_VERSION" \
--target vllm-zen-test -f docker/Dockerfile.zen .
CLEANUP_IMAGES+=("$IMAGE_NAME")
fi

# Run the image, setting --shm-size=4g for tensor parallel. The in-container
# command verifies the installed zentorch matches the pinned version and that
# its torch.compile backend is registered (i.e. not the stable-only build), so
# a mismatch fails loudly instead of silently testing a different zentorch.
docker run --rm \
--cpuset-cpus="$CORE_RANGE" \
--cpuset-mems="$NUMA_NODE" \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--privileged=true \
-e HF_TOKEN \
-e VLLM_CPU_KVCACHE_SPACE=16 \
-e VLLM_CPU_CI_ENV=1 \
-e VLLM_CPU_SIM_MULTI_NUMA=1 \
--shm-size=4g \
"$IMAGE_NAME" \
timeout "$TIMEOUT_VAL" bash -c "set -euox pipefail
echo \"--- Print packages\"
pip list
echo \"--- Verify zentorch\"
python -c \"
import importlib.metadata as m, torch, zentorch
from torch._dynamo import list_backends
v = m.version('zentorch')
assert v == '${ZENTORCH_VERSION}', (
'zentorch ' + v + ' != expected ${ZENTORCH_VERSION}'
)
assert 'zentorch' in list_backends(), (
'zentorch torch.compile backend not registered (stable-only build?)'
)
\"
echo \"--- Running tests\"
${TEST_COMMAND}"
12 changes: 12 additions & 0 deletions .buildkite/test_areas/models_basic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,18 @@ steps:
# PLE and QSA import conflicting HC registrations in a shared process.
- pytest -v -s models/qwen4_exp/test_ple.py

- label: ":nvidia: (B200) Qwen4 Exp HC Kernels"
key: qwen4-exp-hc-kernels-b200
timeout_in_minutes: 20
device: b200-k8s
source_file_dependencies:
- csrc/qwen4_exp/
- vllm/models/qwen4_exp/nvidia/hyperconnection.py
- vllm/models/qwen4_exp/nvidia/ops/hc.py
- tests/models/qwen4_exp/test_hc_ops.py
commands:
- pytest -v -s models/qwen4_exp/test_hc_ops.py

- label: ":amd: (MI300) Qwen4 Exp"
key: qwen4-exp-unit-tests-mi300
automatic_shard: true
Expand Down
4 changes: 2 additions & 2 deletions .buildkite/test_areas/models_multimodal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -278,11 +278,11 @@ steps:
depends_on:
- image-build-amd

- label: ":nvidia: (H200 MIG 18GB) [Nightly] Multimodal Models (Extended Pooling)"
- label: ":nvidia: (H200 MIG 35GB) [Nightly] Multimodal Models (Extended Pooling)"
key: multi-modal-models-extended-pooling
automatic_shard: true
optional: true
device: h200_18gb
device: h200_35gb
source_file_dependencies:
- vllm/
- "!vllm/distributed/kv_transfer/"
Expand Down
19 changes: 19 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1189,6 +1189,21 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
"Building Kimi K3 AttnRes for archs: ${KIMI_K3_ATTN_RES_ARCHS}")
endif()

# Qwen4Exp HyperConnection up projection + gate mix (tcgen05).
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
cuda_archs_loose_intersection(QWEN4_EXP_HC_UP_GATE_MIX_ARCHS
"10.0f" "${CUDA_ARCHS}")
endif()
if(QWEN4_EXP_HC_UP_GATE_MIX_ARCHS)
set(QWEN4_EXP_HC_UP_GATE_MIX_SRC "csrc/qwen4_exp/hc_up_gate_mix.cu")
set_gencode_flags_for_srcs(
SRCS "${QWEN4_EXP_HC_UP_GATE_MIX_SRC}"
CUDA_ARCHS "${QWEN4_EXP_HC_UP_GATE_MIX_ARCHS}")
list(APPEND VLLM_STABLE_EXT_SRC "${QWEN4_EXP_HC_UP_GATE_MIX_SRC}")
message(STATUS "Building Qwen4Exp HC up+gate mix for archs: "
"${QWEN4_EXP_HC_UP_GATE_MIX_ARCHS}")
endif()

# Hadacore kernels
cuda_archs_loose_intersection(HADACORE_ARCHS "8.0+PTX;9.0+PTX" "${CUDA_ARCHS}")
if(HADACORE_ARCHS)
Expand Down Expand Up @@ -1295,6 +1310,10 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
target_compile_definitions(_C_stable_libtorch PRIVATE
VLLM_ENABLE_KIMI_K3_ATTN_RES=1)
endif()
if(QWEN4_EXP_HC_UP_GATE_MIX_ARCHS)
target_compile_definitions(_C_stable_libtorch PRIVATE
VLLM_ENABLE_QWEN4_EXP_HC_UP_GATE_MIX=1)
endif()
if(BEAM_KERNEL_ARCHS)
target_compile_definitions(_C_stable_libtorch PRIVATE
VLLM_ENABLE_BEAM_KERNELS=1)
Expand Down
4 changes: 2 additions & 2 deletions cmake/external_projects/deepgemm.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ else()
# (vllm-project/DeepGEMM#43), plus the restored FP32 MQA logits and their
# `logits_dtype` switch (vllm-project/DeepGEMM#46) and the mega_mhc
# CUDA-graph replay barrier fix (vllm-project/DeepGEMM#48).
# Uses the PyTorch 2.11 stable ABI and CPython 3.10 limited API.
set(_DEEPGEMM_UPSTREAM_TAG "ae4fd25d036a86042ac4bbfc01e2e0fa5fb362b6")
# Targets the PyTorch 2.11 stable ABI (requires PyTorch 2.14+ headers at build time) and CPython 3.10 limited API.
set(_DEEPGEMM_UPSTREAM_TAG "82ca617e5879d0efb0aba5b91b1c81852588af6f")

set(_deepgemm_fc_root "${FETCHCONTENT_BASE_DIR}")
if(NOT _deepgemm_fc_root)
Expand Down
Loading