Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
f1899b2
[Bugfix][ROCm] AITER MLA: size MTP verification decode metadata for r…
chaeminlim-mb Jul 31, 2026
ab98034
[Frontend][Bugfix] Use default tool call IDs for Kimi K3 for conversa…
BugenZhao Jul 31, 2026
60399d4
[CI] Retry Buildkite API rate limits (#50481)
khluu Jul 31, 2026
d91f7af
[Hardware][AMD][Kernel][CI][Bugfix] Fix ROCm DeepEP FP8 max (#50467)
mawong-amd Jul 31, 2026
5d5f22e
[ROCm][CI] Use larger atol value for INT3 in test_quick_all_reduce.py…
music-dino Jul 31, 2026
4689c7d
[ROCm] Add tuned selective_state_update float16 config for AMD Instin…
vanshbhatia-amd Jul 31, 2026
6724051
[CI/Build][AMD] Install triton_kernels via CMake (#50328)
rjrock Jul 31, 2026
ef0d084
[XPU] Fix FP8 block scale layout for MLA compatibility (#50349)
majian4work Jul 31, 2026
1d8be5c
[XPU] [BugFix] Add deepseek_v4_fp8 to xpu supported_quantization list…
xwu-intel Jul 31, 2026
541128b
[KV Offload] Enable single-copy MLA layout for CPUOffloadingSpec (#50…
Change72 Jul 31, 2026
2773ec3
[ROCm][CI] Use explicit wvSplitKrc skinny-GEMM test tolerance for bf1…
stefankoncarevic Jul 31, 2026
b49eaf2
[DSv4] Remove sparse-MLA q-head padding for FlashInfer >=0.6.14 (#48047)
majunze2001 Jul 31, 2026
bebf918
[Bugfix][Model] Reject encoder-backbone jina-embeddings-v5 checkpoint…
woosebastian Jul 31, 2026
0f17394
[Model Runner V2] Enable encoder token classification (#50293)
taneem-ibrahim Jul 31, 2026
1180b60
[Multimodal] Expose mm hash algothrim selection to cli args (#49686)
Isotr0py Jul 31, 2026
0351e9a
[XPU][CI]Adjust source_file_dependencies for NixlConnector PD accurac…
zxd1997066 Jul 31, 2026
3ee2bd1
Fix duplicate HunyuanVL image boundary tokens (#49691)
Mi-Jiazhi Jul 31, 2026
10e6b40
[CPU][BugFix] Remove redundant kv cache write (#50437)
fadara01 Jul 31, 2026
f727951
[Bugfix] Re-land MiniMax M3 default video processor (#50305)
taneem-ibrahim Jul 31, 2026
34bb795
[CI] Add M3 MSA tests to CI (#49143)
gau-nernst Jul 31, 2026
5d7647a
[UT] add skipif for rocm aiter sampler UT (#50530)
mayuyuace Jul 31, 2026
482cfc2
[XPU] Unify XPU RMSNorm kernels with vllm_c and drop redundant XPU-sp…
chaojun-zhang Jul 31, 2026
88bc8fb
[CPU][s390x] Optimize inference perf and add oneDNN INT8 GEMM for s39…
R3hankhan123 Jul 31, 2026
0e9b500
[chore] clean-up weight prepack for INT8 MoE (#50116)
fadara01 Jul 31, 2026
c911120
[ROCm][CI] Update Transformers AR+RMS fusion expectation (#50517)
AndreasKaratzas Jul 31, 2026
6e311c6
[MoE Refactor] Rename FusedMoE to FusedMoEFactory (#44941)
bnellnm Jul 31, 2026
17beffd
[Misc] Clarify mono audio requirement (#50141)
NickLucche Jul 31, 2026
92643d6
K3 DSpark AR fusion (#50242)
jeejeelee Jul 31, 2026
03e2b24
Merge upstream 92643d68f5 into gfx11
roberteg16 Aug 15, 2026
9bcee74
Merge lint fix from batch 80 into batch 81
roberteg16 Aug 15, 2026
c260fae
Merge cpu_stats fix from batch 80 into batch 81
roberteg16 Aug 16, 2026
b56e7b8
Merge clang-format fix from batch 80 into batch 81
roberteg16 Aug 16, 2026
a183995
Merge review fixes from batch 80 into batch 81
roberteg16 Aug 18, 2026
1b8fc06
Merge gfx11 sync from batch 80 into batch 81
roberteg16 Aug 18, 2026
dd539c7
Merge batch 80 into batch 81 (gfx11 sync + review fixes)
roberteg16 Aug 18, 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
4 changes: 3 additions & 1 deletion .buildkite/intel_jobs/engine_intel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,13 @@ steps:
source_file_dependencies:
- vllm/v1/engine/
- tests/v1/engine/
- tests/test_config/
commands:
- >-
bash .buildkite/scripts/hardware_ci/run-intel-test.sh
'cd tests &&
pytest -v -s v1/engine --ignore v1/engine/test_preprocess_error_handling.py'
pytest -v -s v1/engine --ignore v1/engine/test_preprocess_error_handling.py &&
VLLM_XPU_ENABLE_XPU_GRAPH=1 pytest -v -s test_config.py'

- label: V1 e2e (2 GPUs)
timeout_in_minutes: 30
Expand Down
1 change: 1 addition & 0 deletions .buildkite/intel_jobs/kernels_intel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ steps:
- >-
bash .buildkite/scripts/hardware_ci/run-intel-test.sh
'cd tests &&
pytest -v -s ir &&
pytest -v -s kernels/ir'
2 changes: 1 addition & 1 deletion .buildkite/intel_jobs/misc_intel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ steps:
REPO: "vllm-ci-test-repo"
VLLM_TEST_DEVICE: "xpu"
source_file_dependencies:
- vllm/distributed/kv_transfer/kv_connector/v1/nixl/
- vllm/distributed/kv_transfer/kv_connector/
- vllm/v1/worker/kv_connector_model_runner_mixin.py
- tests/v1/kv_connector/nixl_integration/
- vllm/platforms/xpu.py
Expand Down
5 changes: 3 additions & 2 deletions .buildkite/scripts/hardware_ci/run-cpu-test-arm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,11 @@ function cpu_tests() {
set -e
python3 examples/basic/offline_inference/generate.py --model facebook/opt-125m"

# Run model tests
# Test encoder-decoder and encoder-only models
docker exec cpu-test bash -c "
set -e
pytest -x -v -s tests/models/multimodal/generation/test_whisper.py -m cpu_model"
pytest -x -v -s tests/models/multimodal/generation/test_whisper.py -m cpu_model
pytest -x -v -s 'tests/models/language/pooling/test_embedding.py::test_models[sentence-transformers/all-MiniLM-L12-v2]'"

# Run quantized model tests
docker exec cpu-test bash -c "
Expand Down
4 changes: 4 additions & 0 deletions .buildkite/test_areas/kernels.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -287,8 +287,11 @@ steps:
- vllm/cute_utils/
- vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/
- vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py
- vllm/models/minimax_m3/nvidia/
- cmake/external_projects/fmha_sm100.cmake
- tests/kernels/mamba/test_gdn_prefill_cutedsl.py
- tests/kernels/test_bf16x3_router_gemm_cutedsl.py
- tests/kernels/attention/test_minimax_m3.py
- tests/kernels/test_ll_bf16_gemm.py
- tests/kernels/test_top_k_per_row.py
commands:
Expand Down Expand Up @@ -320,6 +323,7 @@ steps:
- pytest -v -s tests/kernels/moe/test_cutedsl_moe.py
- pytest -v -s tests/kernels/mamba/test_gdn_prefill_cutedsl.py
- pytest -v -s tests/kernels/test_bf16x3_router_gemm_cutedsl.py
- pytest -v -s tests/kernels/attention/test_minimax_m3.py
- pytest -v -s tests/kernels/test_ll_bf16_gemm.py
# e2e
- pytest -v -s tests/models/quantization/test_nvfp4.py
Expand Down
85 changes: 72 additions & 13 deletions .github/workflows/scripts/run_ci_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@

import json
import os
import random
import sys
import time
import urllib.error
import urllib.parse
import urllib.request
from collections.abc import Mapping, Sequence
from collections.abc import Callable, Mapping, Sequence
from typing import Any

COMMAND_RUN_CI = "/ci run"
Expand Down Expand Up @@ -39,7 +41,22 @@ def __init__(self, status: int | None, message: str) -> None:
self.status = status


def rate_limit_jitter() -> float:
return random.uniform(1, 5)


class HttpTransport:
def __init__(
self,
*,
max_retries: int = 3,
jitter: Callable[[], float] = rate_limit_jitter,
sleep: Callable[[float], None] = time.sleep,
) -> None:
self.max_retries = max_retries
self.jitter = jitter
self.sleep = sleep

def request(
self,
url: str,
Expand All @@ -55,18 +72,33 @@ def request(
headers=dict(headers or {}),
method=method,
)
try:
with urllib.request.urlopen(request, timeout=30) as response:
response_body = response.read().decode()
except urllib.error.HTTPError as error:
response_body = error.read().decode()
message = self._error_message(response_body, error.reason)
raise ApiError(
error.code,
f"API returned {error.code}: {message}",
) from error
except urllib.error.URLError as error:
raise ApiError(None, f"API request failed: {error.reason}") from error
for attempt in range(self.max_retries + 1):
try:
with urllib.request.urlopen(request, timeout=30) as response:
response_body = response.read().decode()
break
except urllib.error.HTTPError as error:
response_body = error.read().decode()
if error.code == 429 and attempt < self.max_retries:
delay = self._rate_limit_delay(error, response_body)
print(
"API rate limit reached; "
f"retry {attempt + 1}/{self.max_retries} "
f"in {delay:g} seconds.",
file=sys.stderr,
)
self.sleep(delay)
continue
message = self._error_message(response_body, error.reason)
raise ApiError(
error.code,
f"API returned {error.code}: {message}",
) from error
except urllib.error.URLError as error:
raise ApiError(
None,
f"API request failed: {error.reason}",
) from error

if not response_body:
return None
Expand All @@ -83,6 +115,33 @@ def _error_message(response_body: str, fallback: str) -> str:
return fallback
return str(parsed.get("message", fallback))

def _rate_limit_delay(
self,
error: urllib.error.HTTPError,
response_body: str,
) -> float:
try:
parsed = json.loads(response_body)
except json.JSONDecodeError:
parsed = {}

scope = parsed.get("scope")
reset_header = (
"RateLimit-User-Reset" if scope == "rest_user" else "RateLimit-Reset"
)
candidates = [
error.headers.get(reset_header),
parsed.get("reset"),
]
for candidate in candidates:
try:
delay = float(candidate)
except (TypeError, ValueError):
continue
if delay >= 0:
return delay + self.jitter()
return 60 + self.jitter()


class GitHubClient:
def __init__(
Expand Down
106 changes: 106 additions & 0 deletions .github/workflows/scripts/test_run_ci_command.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project

import io
import json
import unittest
import urllib.error
from typing import Any
from unittest.mock import patch

from run_ci_command import (
CI_AUTHORIZED_COMMENT_MARKER,
COMMAND_RETRY_FAILED,
COMMAND_RUN_CI,
RETRY_STATES,
BuildkiteClient,
HttpTransport,
authorize,
create_build_payload,
has_trusted_approval,
Expand Down Expand Up @@ -160,7 +164,109 @@ def request(self, url: str, **kwargs: Any) -> Any:
return self.response


class FakeHttpResponse:
def __init__(self, response: Any) -> None:
self.response = response

def __enter__(self) -> "FakeHttpResponse":
return self

def __exit__(self, *args: Any) -> None:
return None

def read(self) -> bytes:
return json.dumps(self.response).encode()


class RunCiCommandTest(unittest.TestCase):
@patch("run_ci_command.urllib.request.urlopen")
def test_http_transport_retries_buildkite_rate_limit(self, urlopen: Any) -> None:
body = {
"message": "Please wait 9 seconds before making more requests.",
"reset": 9,
"scope": "rest",
}
rate_limit_error = urllib.error.HTTPError(
"https://api.buildkite.com/v2/builds",
429,
"Too Many Requests",
{
"RateLimit-Limit": "400",
"RateLimit-Remaining": "0",
"RateLimit-Reset": "9",
},
io.BytesIO(json.dumps(body).encode()),
)
urlopen.side_effect = [rate_limit_error, FakeHttpResponse({"ok": True})]
delays: list[float] = []

response = HttpTransport(
jitter=lambda: 2.5,
sleep=delays.append,
).request("https://api.buildkite.com/v2/builds")

self.assertEqual(response, {"ok": True})
self.assertEqual(delays, [11.5])
self.assertEqual(urlopen.call_count, 2)

@patch("run_ci_command.urllib.request.urlopen")
def test_http_transport_retries_rate_limit_three_times(self, urlopen: Any) -> None:
def rate_limit_error() -> urllib.error.HTTPError:
body = {
"message": "Please wait 9 seconds before making more requests.",
"reset": 9,
"scope": "rest",
}
return urllib.error.HTTPError(
"https://api.buildkite.com/v2/builds",
429,
"Too Many Requests",
{
"RateLimit-Limit": "400",
"RateLimit-Remaining": "0",
"RateLimit-Reset": "9",
},
io.BytesIO(json.dumps(body).encode()),
)

urlopen.side_effect = [rate_limit_error() for _ in range(4)]
delays: list[float] = []

with self.assertRaisesRegex(RuntimeError, "API returned 429"):
HttpTransport(
jitter=lambda: 2,
sleep=delays.append,
).request("https://api.buildkite.com/v2/builds")

self.assertEqual(delays, [11, 11, 11])
self.assertEqual(urlopen.call_count, 4)

@patch("run_ci_command.urllib.request.urlopen")
def test_http_transport_does_not_retry_permission_error(self, urlopen: Any) -> None:
permission_error = urllib.error.HTTPError(
"https://api.github.com/repos/vllm-project/vllm/issues/1/comments",
403,
"Forbidden",
{},
io.BytesIO(b'{"message":"Resource not accessible by integration"}'),
)
urlopen.side_effect = permission_error
delays: list[float] = []

with self.assertRaisesRegex(
RuntimeError,
"Resource not accessible by integration",
):
HttpTransport(
jitter=lambda: 2,
sleep=delays.append,
).request(
"https://api.github.com/repos/vllm-project/vllm/issues/1/comments"
)

self.assertEqual(delays, [])
self.assertEqual(urlopen.call_count, 1)

def test_only_exact_ci_commands_are_accepted(self) -> None:
self.assertEqual(parse_command(COMMAND_RUN_CI), COMMAND_RUN_CI)
self.assertEqual(
Expand Down
20 changes: 18 additions & 2 deletions cmake/cpu_extension.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ endif()


# Build oneDNN for GEMM kernels
if (ENABLE_X86_ISA OR (ASIMD_FOUND AND NOT APPLE_SILICON_FOUND) OR POWER9_FOUND OR POWER10_FOUND OR POWER11_FOUND OR RVV_FP16_FOUND OR RVV_BF16_FOUND)
if (ENABLE_X86_ISA OR (ASIMD_FOUND AND NOT APPLE_SILICON_FOUND) OR POWER9_FOUND OR POWER10_FOUND OR POWER11_FOUND OR RVV_FP16_FOUND OR RVV_BF16_FOUND OR S390_FOUND)
# Fetch and build Arm Compute Library (ACL) as oneDNN's backend for AArch64
# TODO [fadara01]: remove this once ACL can be fetched and built automatically as a dependency of oneDNN
set(ONEDNN_AARCH64_USE_ACL OFF CACHE BOOL "")
Expand Down Expand Up @@ -368,7 +368,23 @@ if (ENABLE_X86_ISA OR (ASIMD_FOUND AND NOT APPLE_SILICON_FOUND) OR POWER9_FOUND

set(VLLM_BUILD_TYPE ${CMAKE_BUILD_TYPE})
set(CMAKE_BUILD_TYPE "Release") # remove oneDNN debug symbols to reduce size
FetchContent_MakeAvailable(oneDNN)

if(S390_FOUND)
FetchContent_GetProperties(oneDNN)
if(NOT onednn_POPULATED)
FetchContent_Populate(oneDNN)
# Patch s390x helpers.h: ALWAYS_INLINE on operator+= breaks C++20/GCC14
file(READ "${onednn_SOURCE_DIR}/src/cpu/s390x/helpers.h" _helpers_content)
string(REPLACE
"vec_type_t<T> &ALWAYS_INLINE operator+="
"ALWAYS_INLINE vec_type_t<T> &operator+="
_helpers_content "${_helpers_content}")
file(WRITE "${onednn_SOURCE_DIR}/src/cpu/s390x/helpers.h" "${_helpers_content}")
add_subdirectory("${onednn_SOURCE_DIR}" "${onednn_BINARY_DIR}")
endif()
else()
FetchContent_MakeAvailable(oneDNN)
endif()
set(CMAKE_BUILD_TYPE ${VLLM_BUILD_TYPE})
add_library(dnnl_ext OBJECT "csrc/cpu/dnnl_helper.cpp")
target_include_directories(
Expand Down
17 changes: 11 additions & 6 deletions cmake/external_projects/triton_kernels.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# Install OpenAI triton_kernels from https://github.com/triton-lang/triton/tree/main/python/triton_kernels

set(DEFAULT_TRITON_KERNELS_TAG "v3.5.1")

# Set TRITON_KERNELS_SRC_DIR for use with local development with vLLM. We expect TRITON_KERNELS_SRC_DIR to
# be directly set to the triton_kernels python directory.
if (DEFINED ENV{TRITON_KERNELS_SRC_DIR})
Expand All @@ -12,13 +10,20 @@ if (DEFINED ENV{TRITON_KERNELS_SRC_DIR})
)

else()
set(TRITON_GIT "https://github.com/triton-lang/triton.git")
message (STATUS "[triton_kernels] Fetch from ${TRITON_GIT}:${DEFAULT_TRITON_KERNELS_TAG}")
if (VLLM_TARGET_DEVICE STREQUAL "rocm")
set(TRITON_GIT "https://github.com/ROCm/triton.git")
# Pinned from release/internal/3.6.x
set(TRITON_KERNELS_TAG "0f380657dbf3ee86eb57558ff71df24f03b5d4e7")
else()
set(TRITON_GIT "https://github.com/triton-lang/triton.git")
set(TRITON_KERNELS_TAG "v3.5.1")
endif()
message (STATUS "[triton_kernels] Fetch from ${TRITON_GIT}:${TRITON_KERNELS_TAG}")
FetchContent_Declare(
triton_kernels
# TODO (varun) : Fetch just the triton_kernels directory from Triton
GIT_REPOSITORY https://github.com/triton-lang/triton.git
GIT_TAG ${DEFAULT_TRITON_KERNELS_TAG}
GIT_REPOSITORY ${TRITON_GIT}
GIT_TAG ${TRITON_KERNELS_TAG}
GIT_PROGRESS TRUE
SOURCE_SUBDIR python/triton_kernels/triton_kernels
)
Expand Down
11 changes: 11 additions & 0 deletions csrc/cpu/cpu_arch_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,15 @@

#endif // __powerpc__

// IBM Z (s390x) VXE
#ifdef __s390x__
// FP32Vec16::exp() in cpu_types_vxe.hpp delegates to FP32Vec8::exp(), which
// implements a vectorised 5-term minimax polynomial using VXE intrinsics.
#define DEFINE_FAST_EXP \
auto fast_exp = [&](const vec_op::FP32Vec16& vec) \
__attribute__((always_inline)) { return vec.exp(); }; \
auto fast_exp_f16 = fast_exp;

#endif // __s390x__

#endif
Loading
Loading