From d74f88b92f152d0a512ffe5c5663383cb2789a58 Mon Sep 17 00:00:00 2001 From: "riseproject-dev[bot]" <330740410+riseproject-dev[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 08:46:17 +0000 Subject: [PATCH 1/3] vllm: Add version 0.31.0 Signed-off-by: riseproject-dev[bot] <330740410+riseproject-dev[bot]@users.noreply.github.com> --- docs/packages/vllm.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/packages/vllm.yaml b/docs/packages/vllm.yaml index a65f2d9f66b..d36a4a2b217 100644 --- a/docs/packages/vllm.yaml +++ b/docs/packages/vllm.yaml @@ -16,3 +16,4 @@ versions: - filename: vllm-0.30.0-cp312-abi3-manylinux_2_39_riscv64.whl sha256: 8981c8e48b92e6c891543d2b85c203f98569f65366bd40afbbdf8970881d92e1 requires-python: <3.15,>=3.10 +- version: 0.31.0 From fe280f5336a475bd196ef5c8f5cc65c0adbbf24a Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Fri, 9 Oct 2026 16:32:21 +0000 Subject: [PATCH 2/3] vllm: carry forward riscv64 patches to 0.31.0 Nightly version bump omitted the patches/vllm/ directory for 0.31.0, so the build's unconditional `git apply .../*.patch` step failed with "No such file or directory" before any build/test ran. Copied forward the same patch set from 0.30.0 (unchanged since then). --- ...ents-do-not-require-numba-on-riscv64.patch | 42 +++++++++++ ...-probe-the-torch-openblas-for-sbgemm.patch | 70 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch create mode 100644 patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch diff --git a/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch b/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch new file mode 100644 index 00000000000..a51b47a73e3 --- /dev/null +++ b/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000001 Mon Sep 17 00:00:00 2001 +From: RISE Project CI +Date: Sat, 19 Sep 2026 00:00:00 +0000 +Subject: [PATCH] [CPU] Do not require numba on riscv64 + +requirements/cpu.txt requires numba on every CPU architecture except +s390x. numba has no riscv64 wheel on any index, and it cannot be built +from its sdist either: it hard-depends on llvmlite, whose build links a +patched LLVM distributed only as a conda package on a channel that +publishes no linux-riscv64 subdir. An unpatched riscv64 CPU wheel is +therefore buildable but not installable. + +numba is optional to vLLM by construction - vllm/utils/import_utils.py +declares is_numba_available() "Whether the optional `numba` package is +available" and the Kimi-K2.5 fused vision processor falls back to the +remote HF processor when it is absent. Excluding it costs riscv64 the +same features s390x already goes without (n-gram speculative decoding +and the fused vision/inkling processors), which is exactly the +configuration upstream already ships for s390x. + +Upstream-Status: To upstream [vLLM publishes no riscv64 wheels and runs no riscv64 CI, so there is no upstream build this marker would affect yet; resubmit once riscv64 joins docs/getting_started/installation/cpu.md and the CPU release matrix] + +Signed-off-by: RISE Project CI +--- + requirements/cpu.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/requirements/cpu.txt b/requirements/cpu.txt +index 30e47a8..e4ce77b 100644 +--- a/requirements/cpu.txt ++++ b/requirements/cpu.txt +@@ -3,7 +3,7 @@ + + setuptools==77.0.3 # this version can reuse CMake build dir + +-numba == 0.65.0; platform_machine != "s390x" # Required for N-gram speculative decoding ++numba == 0.65.0; platform_machine != "s390x" and platform_machine != "riscv64" # Required for N-gram speculative decoding + + # Dependencies for CPUs + torch==2.13.0+cpu; platform_machine == "x86_64" or platform_machine == "s390x" or platform_machine == "aarch64" +-- +2.51.0 diff --git a/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch b/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch new file mode 100644 index 00000000000..33bed09ffa2 --- /dev/null +++ b/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000002 Mon Sep 17 00:00:00 2001 +From: RISE Project CI +Date: Sun, 20 Sep 2026 00:00:00 +0000 +Subject: [PATCH] [CPU] Probe the torch wheel's OpenBLAS for sbgemm_ + +cpu_extension.cmake decides whether to compile the OpenBLAS bf16 GEMM path +by globbing the installed torch wheel for libopenblas*.so*, and defines +VLLM_HAS_OPENBLAS when the glob hits. Presence of the library is not the +same thing as presence of the symbol: blas_gemm() in +csrc/cpu/sgl-kernels/blas_gemm.h calls sbgemm_, and OpenBLAS only builds +sbgemm_ for the architectures it has BFLOAT16 kernels for (x86_64 +Cooper Lake and later, ARM64 Neoverse, POWER10, z14 and later). RISC-V is +not one of them. + +The miss cannot be caught at link time, because the comment right above +the glob is accurate - _C deliberately does not link OpenBLAS and expects +libtorch.so to have loaded it RTLD_GLOBAL - so a shared object with an +unresolved sbgemm_ links happily and the build succeeds. It fails on the +first "import vllm._C" instead: + + ImportError: .../vllm/_C.abi3.so: undefined symbol: sbgemm_ + +blas_gemm.h already carries the right fallback for this case: its #else +branch dispatches through at::native::cpublas::gemm_no_downcast_stub, +which libtorch_cpu.so exports on every architecture. So ask the library +whether it actually provides sbgemm_ and take that fallback when it does +not, rather than assuming every non-x86 torch wheel ships a bf16-capable +OpenBLAS. When the probe itself cannot run the previous behaviour is kept, +so no platform that works today changes. + +Upstream-Status: To upstream [Architecture-agnostic: the probe is a no-op wherever OpenBLAS does export sbgemm_, and it fixes any platform whose torch wheel ships an OpenBLAS built without BUILD_BFLOAT16, riscv64 being the one this repo builds for] + +Signed-off-by: RISE Project CI +--- + cmake/cpu_extension.cmake | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +diff --git a/cmake/cpu_extension.cmake b/cmake/cpu_extension.cmake +index 92c3daa..a7a229c 100644 +--- a/cmake/cpu_extension.cmake ++++ b/cmake/cpu_extension.cmake +@@ -430,8 +430,24 @@ if (NOT ENABLE_X86_ISA) + "${TORCH_INSTALL_PREFIX}/lib/libopenblas*.so*") + # Note: we don't link openblas directly to _C extension, as it's available through libtorch.so + if (_VLLM_TORCH_OPENBLAS_LIBS) +- list(GET _VLLM_TORCH_OPENBLAS_LIBS 0 VLLM_OPENBLAS_LIB) +- message(STATUS "CPU OpenBLAS library: ${VLLM_OPENBLAS_LIB}") ++ list(GET _VLLM_TORCH_OPENBLAS_LIBS 0 _VLLM_TORCH_OPENBLAS_LIB) ++ # blas_gemm() calls OpenBLAS' bf16 GEMM, which OpenBLAS only builds for ++ # the architectures it has BFLOAT16 kernels for. Elsewhere the library is ++ # present but sbgemm_ is not, and since _C resolves it through ++ # libtorch.so instead of linking OpenBLAS itself, the miss is not ++ # reported until the extension is imported. Probe for the symbol and keep ++ # the PyTorch reference BLAS path when it is absent. ++ execute_process( ++ COMMAND ${CMAKE_NM} --dynamic --defined-only "${_VLLM_TORCH_OPENBLAS_LIB}" ++ OUTPUT_VARIABLE _VLLM_TORCH_OPENBLAS_SYMBOLS ++ ERROR_QUIET) ++ if (_VLLM_TORCH_OPENBLAS_SYMBOLS STREQUAL "" OR ++ _VLLM_TORCH_OPENBLAS_SYMBOLS MATCHES "[ \t]sbgemm_[\r\n]") ++ set(VLLM_OPENBLAS_LIB "${_VLLM_TORCH_OPENBLAS_LIB}") ++ message(STATUS "CPU OpenBLAS library: ${VLLM_OPENBLAS_LIB}") ++ else() ++ message(STATUS "CPU OpenBLAS library ${_VLLM_TORCH_OPENBLAS_LIB} provides no sbgemm_, using the PyTorch reference BLAS path") ++ endif() + endif() + endif() + +-- +2.51.0 From 7cc6f275662eebca255266a24ad981a812f169f6 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Sat, 10 Oct 2026 07:49:48 +0000 Subject: [PATCH 3/3] vllm: rebase numba patch onto 0.31.0 requirements/cpu.txt vllm-project/vllm#58693 (fd2f3fcf, in v0.31.0) dropped the platform_machine != "s390x" marker from the numba line in requirements/cpu.txt, so the carried-forward 0001 hunk no longer matched and git apply failed. s390x now builds LLVM 20, llvmlite and numba from source in docker/Dockerfile.s390x; nothing changed for riscv64, where numba and llvmlite still have no wheel on any index. Re-express the patch against the new line as 'platform_machine != "riscv64"' and update its message, which cited the s390x exclusion as precedent. Also refresh 0002's hunk header to cmake/cpu_extension.cmake's new line numbers (content unchanged; it applied with a 37-line offset). --- ...ents-do-not-require-numba-on-riscv64.patch | 41 +++++++++++-------- ...-probe-the-torch-openblas-for-sbgemm.patch | 2 +- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch b/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch index a51b47a73e3..43b901534ad 100644 --- a/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch +++ b/patches/vllm/0.31.0/0001-requirements-do-not-require-numba-on-riscv64.patch @@ -3,20 +3,27 @@ From: RISE Project CI Date: Sat, 19 Sep 2026 00:00:00 +0000 Subject: [PATCH] [CPU] Do not require numba on riscv64 -requirements/cpu.txt requires numba on every CPU architecture except -s390x. numba has no riscv64 wheel on any index, and it cannot be built -from its sdist either: it hard-depends on llvmlite, whose build links a -patched LLVM distributed only as a conda package on a channel that -publishes no linux-riscv64 subdir. An unpatched riscv64 CPU wheel is -therefore buildable but not installable. +requirements/cpu.txt requires numba on every CPU architecture. numba +has no riscv64 wheel on any index, and it cannot be built from its +sdist at install time either: it hard-depends on llvmlite, which has no +riscv64 wheel and whose sdist build needs a matching LLVM toolchain +(llvm-config for LLVM 20 with llvmlite 0.47) that pip cannot provide. +An unpatched riscv64 CPU wheel is therefore buildable but not +installable. + +Until 0.30.0 upstream excluded numba on s390x for the same reason. +vllm-project/vllm#58693 (fd2f3fcf) dropped that marker; s390x does not +gain a numba wheel from it, docker/Dockerfile.s390x instead compiles +LLVM 20 from source and builds llvmlite and numba from git before +installing vLLM. That is a container-image recipe, not something a +pip install of a published wheel can do, so riscv64 keeps the +exclusion s390x used to have. numba is optional to vLLM by construction - vllm/utils/import_utils.py declares is_numba_available() "Whether the optional `numba` package is available" and the Kimi-K2.5 fused vision processor falls back to the -remote HF processor when it is absent. Excluding it costs riscv64 the -same features s390x already goes without (n-gram speculative decoding -and the fused vision/inkling processors), which is exactly the -configuration upstream already ships for s390x. +remote HF processor when it is absent. Excluding it costs riscv64 +n-gram speculative decoding and the fused vision/inkling processors. Upstream-Status: To upstream [vLLM publishes no riscv64 wheels and runs no riscv64 CI, so there is no upstream build this marker would affect yet; resubmit once riscv64 joins docs/getting_started/installation/cpu.md and the CPU release matrix] @@ -26,17 +33,17 @@ Signed-off-by: RISE Project CI 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/cpu.txt b/requirements/cpu.txt -index 30e47a8..e4ce77b 100644 +index b4867a0..63c68b1 100644 --- a/requirements/cpu.txt +++ b/requirements/cpu.txt @@ -3,7 +3,7 @@ - + setuptools==77.0.3 # this version can reuse CMake build dir - --numba == 0.65.0; platform_machine != "s390x" # Required for N-gram speculative decoding -+numba == 0.65.0; platform_machine != "s390x" and platform_machine != "riscv64" # Required for N-gram speculative decoding - + +-numba == 0.65.0 # Required for N-gram speculative decoding ++numba == 0.65.0; platform_machine != "riscv64" # Required for N-gram speculative decoding + # Dependencies for CPUs torch==2.13.0+cpu; platform_machine == "x86_64" or platform_machine == "s390x" or platform_machine == "aarch64" --- +-- 2.51.0 diff --git a/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch b/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch index 33bed09ffa2..efd627c7ef1 100644 --- a/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch +++ b/patches/vllm/0.31.0/0002-cpu-probe-the-torch-openblas-for-sbgemm.patch @@ -39,7 +39,7 @@ diff --git a/cmake/cpu_extension.cmake b/cmake/cpu_extension.cmake index 92c3daa..a7a229c 100644 --- a/cmake/cpu_extension.cmake +++ b/cmake/cpu_extension.cmake -@@ -430,8 +430,24 @@ if (NOT ENABLE_X86_ISA) +@@ -467,8 +467,24 @@ if (NOT ENABLE_X86_ISA) "${TORCH_INSTALL_PREFIX}/lib/libopenblas*.so*") # Note: we don't link openblas directly to _C extension, as it's available through libtorch.so if (_VLLM_TORCH_OPENBLAS_LIBS)