From bf4baa74309f07471b7cfbb74c5ed5c60431a502 Mon Sep 17 00:00:00 2001 From: zeryx <1892175+zeryx@users.noreply.github.com> Date: Tue, 5 May 2026 09:47:58 -0400 Subject: [PATCH 1/3] [Docker] Add SM120 Blackwell Dockerfile for NVFP4 tensor core support The upstream Dockerfile fails to build on SM120 (Blackwell) workstations in firewalled networks because: - deadsnakes PPA is unreachable, blocking Python 3.12 installation - gcc-10/g++-10 unavailable on Ubuntu 24.04 This adds Dockerfile.sm120 which: - Skips deadsnakes when python3.12 is already in base repos (Ubuntu 24.04) - Makes gcc-10 installation optional, falling back to system GCC - Enables universe repo for libxext6/libgl1 on minimal base images Build with: torch_cuda_arch_list=12.0a to compile NVFP4 CUTLASS kernels (nvfp4_scaled_mm_sm120, nvfp4_blockwise_moe, nvfp4_kv_cache) for SM120. Verified on 2x RTX PRO 6000 BWE with Nemotron-3 Nano 30B (single GPU) and Super 120B (TP=2) NVFP4 models. All 146 NVFP4 kernel tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: zeryx <1892175+zeryx@users.noreply.github.com> --- docker/Dockerfile.sm120 | 872 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 872 insertions(+) create mode 100644 docker/Dockerfile.sm120 diff --git a/docker/Dockerfile.sm120 b/docker/Dockerfile.sm120 new file mode 100644 index 000000000000..3ac42997932f --- /dev/null +++ b/docker/Dockerfile.sm120 @@ -0,0 +1,872 @@ +# The vLLM Dockerfile is used to construct vLLM image that can be directly used +# to run the OpenAI compatible server. + +# Please update any changes made here to +# docs/contributing/dockerfile/dockerfile.md and +# docs/assets/contributing/dockerfile-stages-dependency.png + +# ============================================================================= +# VERSION MANAGEMENT +# ============================================================================= +# ARG defaults in this Dockerfile are the source of truth for pinned versions. +# docker/versions.json is auto-generated for use with docker buildx bake. +# +# When updating versions: +# 1. Edit the ARG defaults below +# 2. Run: python tools/generate_versions_json.py +# +# To query versions programmatically: +# jq -r '.variable.CUDA_VERSION.default' docker/versions.json +# +# To build with bake: +# docker buildx bake -f docker/docker-bake.hcl -f docker/versions.json +# ============================================================================= + +ARG CUDA_VERSION=13.0.2 +ARG PYTHON_VERSION=3.12 +ARG UBUNTU_VERSION=22.04 + +# By parameterizing the base images, we allow third-party to use their own +# base images. One use case is hermetic builds with base images stored in +# private registries that use a different repository naming conventions. +# +# Example: +# docker build --build-arg BUILD_BASE_IMAGE=registry.acme.org/mirror/nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 + +# Important: We build with an old version of Ubuntu to maintain broad +# compatibility with other Linux OSes. The main reason for this is that the +# glibc version is baked into the distro, and binaries built with one glibc +# version are not backwards compatible with OSes that use an earlier version. +ARG BUILD_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 +# Using cuda base image with minimal dependencies necessary for JIT compilation (FlashInfer, DeepGEMM, EP kernels) +ARG FINAL_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-base-ubuntu${UBUNTU_VERSION} + +# OS family of BUILD_BASE_IMAGE. Controls package manager (apt vs dnf) and +# Python bootstrap. Set to "manylinux" alongside a manylinux build base such +# as pytorch/manylinux2_28-builder:cuda13.0 to produce wheels with a glibc +# 2.28 floor (matches PyTorch's own published wheels). Default stays on +# Ubuntu for backwards compatibility. +ARG BUILD_OS=ubuntu + +# By parameterizing the Deadsnakes repository URL, we allow third-party to use +# their own mirror. When doing so, we don't benefit from the transparent +# installation of the GPG key of the PPA, as done by add-apt-repository, so we +# also need a URL for the GPG key. +ARG DEADSNAKES_MIRROR_URL +ARG DEADSNAKES_GPGKEY_URL + +# The PyPA get-pip.py script is a self contained script+zip file, that provides +# both the installer script and the pip base85-encoded zip archive. This allows +# bootstrapping pip in environment where a distribution package does not exist. +# +# By parameterizing the URL for get-pip.py installation script, we allow +# third-party to use their own copy of the script stored in a private mirror. +# We set the default value to the PyPA owned get-pip.py script. +# +# Reference: https://pip.pypa.io/en/stable/installation/#get-pip-py +ARG GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" + +# PIP supports fetching the packages from custom indexes, allowing third-party +# to host the packages in private mirrors. The PIP_INDEX_URL and +# PIP_EXTRA_INDEX_URL are standard PIP environment variables to override the +# default indexes. By letting them empty by default, PIP will use its default +# indexes if the build process doesn't override the indexes. +# +# Uv uses different variables. We set them by default to the same values as +# PIP, but they can be overridden. +ARG PIP_INDEX_URL +ARG PIP_EXTRA_INDEX_URL +ARG UV_INDEX_URL=${PIP_INDEX_URL} +ARG UV_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} + +# PyTorch provides its own indexes for standard and nightly builds +ARG PYTORCH_CUDA_INDEX_BASE_URL=https://download.pytorch.org/whl + +# PIP supports multiple authentication schemes, including keyring +# By parameterizing the PIP_KEYRING_PROVIDER variable and setting it to +# disabled by default, we allow third-party to use keyring authentication for +# their private Python indexes, while not changing the default behavior which +# is no authentication. +# +# Reference: https://pip.pypa.io/en/stable/topics/authentication/#keyring-support +ARG PIP_KEYRING_PROVIDER=disabled +ARG UV_KEYRING_PROVIDER=${PIP_KEYRING_PROVIDER} + +# Flag enables built-in KV-connector dependency libs into docker images +ARG INSTALL_KV_CONNECTORS=false + +#################### BASE BUILD IMAGE #################### +# prepare basic build environment +FROM ${BUILD_BASE_IMAGE} AS base + +ARG CUDA_VERSION +ARG PYTHON_VERSION +ARG BUILD_OS + +ENV DEBIAN_FRONTEND=noninteractive + +# Install system dependencies including build tools. +# The Ubuntu path uses apt + deadsnakes-via-uv for Python; the manylinux path +# (AlmaLinux 8, e.g. pytorch/manylinux2_28-builder) uses dnf and the Python +# interpreters pre-installed at /opt/python/cpXY-cpXY/. +RUN if [ "${BUILD_OS}" = "manylinux" ]; then \ + # rdma-core-devel provides libibverbs headers; ccache lives in EPEL, + # which the pytorch manylinux image already enables. git/curl/sudo + # are typically pre-installed but listed defensively. + dnf install -y --setopt=install_weak_deps=False \ + ccache \ + git \ + curl \ + sudo \ + rdma-core-devel \ + && dnf clean all \ + && rm -rf /var/cache/dnf; \ + else \ + apt-get update -y \ + && apt-get install -y --no-install-recommends \ + ccache \ + software-properties-common \ + git \ + curl \ + sudo \ + python3-pip \ + libibverbs-dev \ + && (apt-get install -y --no-install-recommends gcc-10 g++-10 \ + && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 110 --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ + || true) \ + # Install python dev headers if available (needed for cmake FindPython on Ubuntu 24.04 + # which ships cmake 3.28 and requires Development.SABIModule; silently skipped on + # Ubuntu 20.04/22.04 where python3.x-dev is not available without a PPA) + && (apt-get install -y --no-install-recommends python${PYTHON_VERSION}-dev 2>/dev/null || true) \ + && rm -rf /var/lib/apt/lists/*; \ + fi + +# Install uv and bootstrap /opt/venv. Both paths converge on /opt/venv so all +# downstream stages stay distro-agnostic. +RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ + && if [ "${BUILD_OS}" = "manylinux" ]; then \ + # manylinux images ship Python at /opt/python/cpXY-cpXY/; point uv + # at the matching interpreter rather than letting it fetch one. + PYV_NODOT=$(echo ${PYTHON_VERSION} | tr -d '.') \ + && MANYLINUX_PY=/opt/python/cp${PYV_NODOT}-cp${PYV_NODOT}/bin/python${PYTHON_VERSION} \ + && $HOME/.local/bin/uv venv /opt/venv --python "$MANYLINUX_PY"; \ + else \ + $HOME/.local/bin/uv venv /opt/venv --python ${PYTHON_VERSION}; \ + fi \ + && rm -f /usr/bin/python3 /usr/bin/python3-config /usr/bin/pip \ + && ln -sf /opt/venv/bin/python3 /usr/bin/python3 \ + && ln -sf /opt/venv/bin/python3-config /usr/bin/python3-config \ + && ln -sf /opt/venv/bin/pip /usr/bin/pip \ + && python3 --version && python3 -m pip --version + +# Activate virtual environment and add uv to PATH +ENV PATH="/opt/venv/bin:/root/.local/bin:$PATH" +ENV VIRTUAL_ENV="/opt/venv" + +# Environment for uv +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +ENV UV_LINK_MODE=copy + +# Verify GCC version +RUN gcc --version + +# Enable CUDA forward compatibility by setting '-e VLLM_ENABLE_CUDA_COMPATIBILITY=1' +# Only needed for datacenter/professional GPUs with older drivers. +# See: https://docs.nvidia.com/deploy/cuda-compatibility/ +ENV VLLM_ENABLE_CUDA_COMPATIBILITY=0 + +# ============================================================ +# SLOW-CHANGING DEPENDENCIES BELOW +# These are the expensive layers that we want to cache +# ============================================================ + +# Install PyTorch and core CUDA dependencies +# This is ~2GB and rarely changes +ARG PYTORCH_CUDA_INDEX_BASE_URL + +WORKDIR /workspace + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install build and runtime dependencies, including PyTorch +# Check whether to install torch nightly instead of release for this build +COPY requirements/common.txt requirements/common.txt +COPY requirements/cuda.txt requirements/cuda.txt +COPY use_existing_torch.py use_existing_torch.py +COPY pyproject.toml pyproject.toml +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing torch nightly..." \ + && uv pip install --python /opt/venv/bin/python3 torch torchaudio torchvision --pre \ + --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ + && echo "Installing other requirements..." \ + && /opt/venv/bin/python3 use_existing_torch.py --prefix \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/cuda.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + uv pip install --python /opt/venv/bin/python3 -r requirements/cuda.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi + +# Track PyTorch lib versions used during build and match in downstream instances. +# We do this for both nightly and release so we can strip dependencies/*.txt as needed. +# Otherwise library dependencies can upgrade/downgrade torch incorrectly. +RUN --mount=type=cache,target=/root/.cache/uv \ + uv pip freeze | grep -i "^torch=\|^torchvision=\|^torchaudio=" > torch_lib_versions.txt \ + && TORCH_LIB_VERSIONS=$(cat torch_lib_versions.txt | xargs) \ + && echo "Installed torch libs: ${TORCH_LIB_VERSIONS}" + +# CUDA arch list used by torch +# Explicitly set the list to avoid issues with torch 2.2 +# See https://github.com/pytorch/pytorch/pull/123243 +# From versions.json: .torch.cuda_arch_list +ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' +ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} +#################### BUILD BASE IMAGE #################### + +#################### CSRC BUILD IMAGE #################### +FROM base AS csrc-build +ARG TARGETPLATFORM + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL +ARG PYTORCH_CUDA_INDEX_BASE_URL + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install build dependencies +COPY requirements/build/cuda.txt requirements/build/cuda.txt +COPY use_existing_torch.py use_existing_torch.py +COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +# Reference: https://github.com/astral-sh/uv/pull/1694 +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +# Use copy mode to avoid hardlink failures with Docker cache mounts +ENV UV_LINK_MODE=copy + +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing build requirements without torch..." \ + && python3 use_existing_torch.py --prefix \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ + && echo "Installing torch nightly..." \ + && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | grep -i "^torch=" | xargs) --pre \ + --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + echo "Installing build requirements..." \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi + +WORKDIR /workspace + +COPY pyproject.toml setup.py CMakeLists.txt ./ +COPY cmake cmake/ +COPY csrc csrc/ +COPY vllm/envs.py vllm/envs.py +COPY vllm/__init__.py vllm/__init__.py + +# max jobs used by Ninja to build extensions +ARG max_jobs=2 +ENV MAX_JOBS=${max_jobs} +# number of threads used by nvcc +ARG nvcc_threads=8 +ENV NVCC_THREADS=$nvcc_threads + +ARG USE_SCCACHE +ARG SCCACHE_DOWNLOAD_URL +ARG SCCACHE_ENDPOINT +ARG SCCACHE_BUCKET_NAME=vllm-build-sccache +ARG SCCACHE_REGION_NAME=us-west-2 +ARG SCCACHE_S3_NO_CREDENTIALS=0 + +# Flag to control whether to use pre-built vLLM wheels +ARG VLLM_USE_PRECOMPILED="" +ARG VLLM_MERGE_BASE_COMMIT="" +ARG VLLM_MAIN_CUDA_VERSION="" + +# Use dummy version for csrc-build wheel (only .so files are extracted, version doesn't matter) +ENV SETUPTOOLS_SCM_PRETEND_VERSION="0.0.0+csrc.build" + +# Use existing torch for nightly builds +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + python3 use_existing_torch.py --prefix; \ + fi + +# Build the vLLM wheel +# if USE_SCCACHE is set, use sccache to speed up compilation +# AWS credentials mounted at ~/.aws/credentials for sccache S3 auth (optional) +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=secret,id=aws-credentials,target=/root/.aws/credentials,required=false \ + if [ "$USE_SCCACHE" = "1" ]; then \ + echo "Installing sccache..." \ + && case "${TARGETPLATFORM}" in \ + linux/arm64) SCCACHE_ARCH="aarch64" ;; \ + linux/amd64) SCCACHE_ARCH="x86_64" ;; \ + *) echo "Unsupported TARGETPLATFORM for sccache: ${TARGETPLATFORM}" >&2; exit 1 ;; \ + esac \ + && export SCCACHE_DOWNLOAD_URL="${SCCACHE_DOWNLOAD_URL:-https://github.com/mozilla/sccache/releases/download/v0.8.1/sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl.tar.gz}" \ + && curl -L -o sccache.tar.gz ${SCCACHE_DOWNLOAD_URL} \ + && tar -xzf sccache.tar.gz \ + && sudo mv sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl/sccache /usr/bin/sccache \ + && rm -rf sccache.tar.gz sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl \ + && if [ ! -z ${SCCACHE_ENDPOINT} ] ; then export SCCACHE_ENDPOINT=${SCCACHE_ENDPOINT} ; fi \ + && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \ + && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \ + && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \ + && export SCCACHE_IDLE_TIMEOUT=0 \ + && export CMAKE_BUILD_TYPE=Release \ + && export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" \ + && export VLLM_PRECOMPILED_WHEEL_COMMIT="${VLLM_MERGE_BASE_COMMIT}" \ + && export VLLM_MAIN_CUDA_VERSION="${VLLM_MAIN_CUDA_VERSION}" \ + && export VLLM_DOCKER_BUILD_CONTEXT=1 \ + && sccache --show-stats \ + && python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 \ + && sccache --show-stats; \ + fi + +ARG vllm_target_device="cuda" +ENV VLLM_TARGET_DEVICE=${vllm_target_device} +ENV CCACHE_DIR=/root/.cache/ccache +RUN --mount=type=cache,target=/root/.cache/ccache \ + --mount=type=cache,target=/root/.cache/uv \ + if [ "$USE_SCCACHE" != "1" ]; then \ + # Clean any existing CMake artifacts + rm -rf .deps && \ + mkdir -p .deps && \ + export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" && \ + export VLLM_PRECOMPILED_WHEEL_COMMIT="${VLLM_MERGE_BASE_COMMIT}" && \ + export VLLM_DOCKER_BUILD_CONTEXT=1 && \ + python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38; \ + fi + +#################### CSRC BUILD IMAGE #################### + +#################### EXTENSIONS BUILD IMAGE #################### +# Build DeepEP - runs in PARALLEL with csrc-build +# This stage is independent and doesn't affect csrc cache +FROM base AS extensions-build +ARG CUDA_VERSION + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +ENV UV_LINK_MODE=copy + +WORKDIR /workspace + +# Build DeepEP wheels +COPY tools/ep_kernels/install_python_libraries.sh /tmp/install_python_libraries.sh +# Defaults moved here from tools/ep_kernels/install_python_libraries.sh for centralized version management +ARG DEEPEP_COMMIT_HASH=73b6ea4 +ARG NVSHMEM_VER +RUN --mount=type=cache,target=/root/.cache/uv \ + mkdir -p /tmp/ep_kernels_workspace/dist && \ + export TORCH_CUDA_ARCH_LIST='9.0a 10.0a' && \ + /tmp/install_python_libraries.sh \ + --workspace /tmp/ep_kernels_workspace \ + --mode wheel \ + ${DEEPEP_COMMIT_HASH:+--deepep-ref "$DEEPEP_COMMIT_HASH"} \ + ${NVSHMEM_VER:+--nvshmem-ver "$NVSHMEM_VER"} && \ + find /tmp/ep_kernels_workspace/nvshmem -name '*.a' -delete +#################### EXTENSIONS BUILD IMAGE #################### + +#################### WHEEL BUILD IMAGE #################### +FROM base AS build +ARG TARGETPLATFORM + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL +ARG PYTORCH_CUDA_INDEX_BASE_URL + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install build dependencies +COPY requirements/build/cuda.txt requirements/build/cuda.txt +COPY use_existing_torch.py use_existing_torch.py +COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +# Reference: https://github.com/astral-sh/uv/pull/1694 +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +# Use copy mode to avoid hardlink failures with Docker cache mounts +ENV UV_LINK_MODE=copy + +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing build requirements without torch..." \ + && python3 use_existing_torch.py --prefix \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ + && echo "Installing torch nightly..." \ + && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | grep -i "^torch=" | xargs) --pre \ + --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + echo "Installing build requirements..." \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi + +WORKDIR /workspace + +# Copy pre-built csrc wheel directly +COPY --from=csrc-build /workspace/dist /precompiled-wheels +COPY . . + +ARG GIT_REPO_CHECK=0 +RUN --mount=type=bind,source=.git,target=.git \ + if [ "$GIT_REPO_CHECK" != "0" ]; then bash tools/check_repo.sh ; fi + +ARG vllm_target_device="cuda" +ENV VLLM_TARGET_DEVICE=${vllm_target_device} + +# Skip adding +precompiled suffix to version (preserves git-derived version) +ENV VLLM_SKIP_PRECOMPILED_VERSION_SUFFIX=1 + +# Use existing torch for nightly builds +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + python3 use_existing_torch.py --prefix; \ + fi + +# Build the vLLM wheel +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=.git,target=.git \ + if [ "${vllm_target_device}" = "cuda" ]; then \ + export VLLM_PRECOMPILED_WHEEL_LOCATION=$(ls /precompiled-wheels/*.whl); \ + fi && \ + python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 + +# Copy extension wheels from extensions-build stage for later use +COPY --from=extensions-build /tmp/ep_kernels_workspace/dist /tmp/ep_kernels_workspace/dist + +# Check the size of the wheel if RUN_WHEEL_CHECK is true +COPY .buildkite/check-wheel-size.py check-wheel-size.py +# sync the default value with .buildkite/check-wheel-size.py +ARG VLLM_MAX_SIZE_MB=500 +ENV VLLM_MAX_SIZE_MB=$VLLM_MAX_SIZE_MB +ARG RUN_WHEEL_CHECK=true +RUN if [ "$RUN_WHEEL_CHECK" = "true" ]; then \ + python3 check-wheel-size.py dist; \ + else \ + echo "Skipping wheel size check."; \ + fi + +#################### WHEEL BUILD IMAGE #################### + +#################### DEV IMAGE #################### +FROM base AS dev + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL +ARG PYTORCH_CUDA_INDEX_BASE_URL +ARG BUILD_OS + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +# Reference: https://github.com/astral-sh/uv/pull/1694 +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +# Use copy mode to avoid hardlink failures with Docker cache mounts +ENV UV_LINK_MODE=copy + +# Install libnuma-dev, required by fastsafetensors (fixes #20384) +RUN if [ "${BUILD_OS}" = "manylinux" ]; then \ + dnf install -y numactl-devel && dnf clean all && rm -rf /var/cache/dnf; \ + else \ + apt-get update && apt-get install -y --no-install-recommends libnuma-dev && rm -rf /var/lib/apt/lists/*; \ + fi + + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install development dependencies +COPY requirements/lint.txt requirements/lint.txt +COPY requirements/test/cuda.in requirements/test/cuda.in +COPY requirements/test/cuda.txt requirements/test/cuda.txt +COPY requirements/dev.txt requirements/dev.txt +COPY use_existing_torch.py use_existing_torch.py +COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing dev requirements plus torch nightly..." \ + && python3 use_existing_torch.py --prefix \ + && cat torch_lib_versions.txt >> requirements/test/cuda.in \ + && uv pip compile requirements/test/cuda.in -o requirements/test/cuda.txt --index-strategy unsafe-best-match \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ + && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | xargs) --pre \ + -r requirements/dev.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + echo "Installing dev requirements..." \ + && uv pip install --python /opt/venv/bin/python3 -r requirements/dev.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi + +#################### DEV IMAGE #################### +#################### vLLM installation IMAGE #################### +# image with vLLM installed +FROM ${FINAL_BASE_IMAGE} AS vllm-base + +ARG CUDA_VERSION +ARG PYTHON_VERSION +ARG DEADSNAKES_MIRROR_URL +ARG DEADSNAKES_GPGKEY_URL +ARG GET_PIP_URL + +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /vllm-workspace + + +# Python version string for paths (e.g., "312" for 3.12) +RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \ + echo "export PYTHON_VERSION_STR=${PYTHON_VERSION_STR}" >> /etc/environment + +# Install Python and system dependencies +RUN apt-get update -y \ + && (add-apt-repository -y universe 2>/dev/null || true) \ + && apt-get update -y \ + && apt-get install -y --no-install-recommends \ + software-properties-common \ + curl \ + sudo \ + ffmpeg \ + libsm6 \ + libxext6 \ + libgl1 \ + && if apt-cache show python${PYTHON_VERSION} >/dev/null 2>&1 ; then \ + echo "python${PYTHON_VERSION} available in base repos, skipping deadsnakes" ; \ + elif [ ! -z ${DEADSNAKES_MIRROR_URL} ] ; then \ + if [ ! -z "${DEADSNAKES_GPGKEY_URL}" ] ; then \ + mkdir -p -m 0755 /etc/apt/keyrings ; \ + curl -L ${DEADSNAKES_GPGKEY_URL} | gpg --dearmor > /etc/apt/keyrings/deadsnakes.gpg ; \ + sudo chmod 644 /etc/apt/keyrings/deadsnakes.gpg ; \ + echo "deb [signed-by=/etc/apt/keyrings/deadsnakes.gpg] ${DEADSNAKES_MIRROR_URL} $(lsb_release -cs) main" > /etc/apt/sources.list.d/deadsnakes.list ; \ + fi ; \ + else \ + for i in 1 2 3; do \ + add-apt-repository -y ppa:deadsnakes/ppa && break || \ + { echo "Attempt $i failed, retrying in 5s..."; sleep 5; }; \ + done ; \ + fi \ + && apt-get update -y \ + && apt-get install -y --no-install-recommends \ + python${PYTHON_VERSION} \ + python${PYTHON_VERSION}-dev \ + python${PYTHON_VERSION}-venv \ + libibverbs-dev \ + && rm -rf /var/lib/apt/lists/* \ + && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ + && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ + && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ + && rm -f /usr/lib/python${PYTHON_VERSION}/EXTERNALLY-MANAGED \ + && curl -sS ${GET_PIP_URL} | python${PYTHON_VERSION} \ + && python3 --version && python3 -m pip --version + +# Install CUDA development tools for runtime JIT compilation +# (FlashInfer, DeepGEMM, EP kernels all require compilation at runtime) +RUN CUDA_VERSION_DASH=$(echo $CUDA_VERSION | cut -d. -f1,2 | tr '.' '-') && \ + CUDA_VERSION_SHORT=$(echo $CUDA_VERSION | cut -d. -f1,2) && \ + apt-get update -y && \ + apt-get install -y --no-install-recommends --allow-change-held-packages \ + cuda-nvcc-${CUDA_VERSION_DASH} \ + cuda-cudart-${CUDA_VERSION_DASH} \ + cuda-nvrtc-${CUDA_VERSION_DASH} \ + cuda-cuobjdump-${CUDA_VERSION_DASH} \ + libcurand-dev-${CUDA_VERSION_DASH} \ + libcublas-dev-${CUDA_VERSION_DASH} \ + # Required by fastsafetensors (fixes #20384) + libnuma-dev \ + # numactl CLI for NUMA binding at runtime + numactl && \ + # Fixes nccl_allocator requiring nccl.h at runtime + # https://github.com/vllm-project/vllm/blob/1336a1ea244fa8bfd7e72751cabbdb5b68a0c11a/vllm/distributed/device_communicators/pynccl_allocator.py#L22 + # NCCL packages don't use the cuda-MAJOR-MINOR naming convention, + # so we pin the version to match our CUDA version + NCCL_VER=$(apt-cache madison libnccl-dev | grep "+cuda${CUDA_VERSION_SHORT}" | head -1 | awk -F'|' '{gsub(/^ +| +$/, "", $2); print $2}') && \ + apt-get install -y --no-install-recommends --allow-change-held-packages libnccl-dev=${NCCL_VER} libnccl2=${NCCL_VER} && \ + rm -rf /var/lib/apt/lists/* + +# Install uv for faster pip installs +RUN python3 -m pip install uv + +# Environment for uv +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +ENV UV_LINK_MODE=copy + +# Enable CUDA forward compatibility by setting '-e VLLM_ENABLE_CUDA_COMPATIBILITY=1' +# Only needed for datacenter/professional GPUs with older drivers. +# See: https://docs.nvidia.com/deploy/cuda-compatibility/ +ENV VLLM_ENABLE_CUDA_COMPATIBILITY=0 + +# ============================================================ +# SLOW-CHANGING DEPENDENCIES BELOW +# These are the expensive layers that we want to cache +# ============================================================ + +# Install PyTorch and core CUDA dependencies +# This is ~2GB and rarely changes +ARG PYTORCH_CUDA_INDEX_BASE_URL +COPY requirements/common.txt /tmp/common.txt +COPY requirements/cuda.txt /tmp/requirements-cuda.txt +RUN --mount=type=cache,target=/root/.cache/uv \ + uv pip install --system -r /tmp/requirements-cuda.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') && \ + rm /tmp/requirements-cuda.txt /tmp/common.txt + +# Install FlashInfer JIT cache (requires CUDA-version-specific index URL) +# https://docs.flashinfer.ai/installation.html +# From versions.json: .flashinfer.version +ARG FLASHINFER_VERSION=0.6.8.post1 +RUN --mount=type=cache,target=/root/.cache/uv \ + uv pip install --system flashinfer-jit-cache==${FLASHINFER_VERSION} \ + --extra-index-url https://flashinfer.ai/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') + +# ============================================================ +# OPENAI API SERVER DEPENDENCIES +# Pre-install these to avoid reinstalling on every vLLM wheel rebuild +# ============================================================ + +# Install gdrcopy (saves ~6s per build) +# TODO (huydhn): There is no prebuilt gdrcopy package on 12.9 at the moment +ARG GDRCOPY_CUDA_VERSION=12.8 +ARG GDRCOPY_OS_VERSION=Ubuntu22_04 +ARG TARGETPLATFORM +COPY tools/install_gdrcopy.sh /tmp/install_gdrcopy.sh +RUN set -eux; \ + case "${TARGETPLATFORM}" in \ + linux/arm64) UUARCH="aarch64" ;; \ + linux/amd64) UUARCH="x64" ;; \ + *) echo "Unsupported TARGETPLATFORM: ${TARGETPLATFORM}" >&2; exit 1 ;; \ + esac; \ + /tmp/install_gdrcopy.sh "${GDRCOPY_OS_VERSION}" "${GDRCOPY_CUDA_VERSION}" "${UUARCH}" && \ + rm /tmp/install_gdrcopy.sh + +# Install vllm-openai dependencies (saves ~2.6s per build) +# These are stable packages that don't depend on vLLM itself +# From versions.json: .bitsandbytes.x86_64, .bitsandbytes.arm64 +# From versions.json: .openai_server_extras.timm, .openai_server_extras.runai_model_streamer +ARG BITSANDBYTES_VERSION_X86=0.46.1 +ARG BITSANDBYTES_VERSION_ARM64=0.42.0 +ARG TIMM_VERSION=">=1.0.17" +ARG RUNAI_MODEL_STREAMER_VERSION=">=0.15.7" +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ + BITSANDBYTES_VERSION="${BITSANDBYTES_VERSION_ARM64}"; \ + else \ + BITSANDBYTES_VERSION="${BITSANDBYTES_VERSION_X86}"; \ + fi; \ + uv pip install --system accelerate modelscope \ + "bitsandbytes>=${BITSANDBYTES_VERSION}" "timm${TIMM_VERSION}" "runai-model-streamer[s3,gcs,azure]${RUNAI_MODEL_STREAMER_VERSION}" + +# ============================================================ +# VLLM INSTALLATION (depends on build stage) +# ============================================================ + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL +ARG PYTORCH_CUDA_INDEX_BASE_URL +ARG PIP_KEYRING_PROVIDER UV_KEYRING_PROVIDER + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install vLLM wheel first, so that torch etc will be installed. +# Check whether to install torch nightly instead of release for this build. +COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt +RUN --mount=type=bind,from=build,src=/workspace/dist,target=/vllm-workspace/dist \ + --mount=type=cache,target=/root/.cache/uv \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing torch nightly..." \ + && uv pip install --system $(cat torch_lib_versions.txt | xargs) --pre \ + --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ + && echo "Installing vLLM..." \ + && uv pip install --system dist/*.whl --verbose \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + echo "Installing vLLM..." \ + && uv pip install --system dist/*.whl --verbose \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi + +RUN --mount=type=cache,target=/root/.cache/uv \ +. /etc/environment && \ +uv pip list + +# Pytorch now installs NVSHMEM, setting LD_LIBRARY_PATH +ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH + +# Install EP kernels wheels (DeepEP) that have been built in the `build` stage +RUN --mount=type=bind,from=build,src=/tmp/ep_kernels_workspace/dist,target=/vllm-workspace/ep_kernels/dist \ + --mount=type=cache,target=/root/.cache/uv \ + uv pip install --system ep_kernels/dist/*.whl --verbose \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') + +# Download FlashInfer precompiled cubins AFTER all pip installs are done. +# This must run after the vLLM wheel and EP kernels installs above, because +# those can reinstall/touch flashinfer packages. Downloading cubins earlier +# (in the flashinfer-jit-cache layer) causes ~2.5 GB of layer duplication +# when a later pip install overwrites flashinfer package files. +RUN flashinfer show-config && flashinfer download-cubin + +# CUDA image changed from /usr/local/nvidia to /usr/local/cuda in 12.8 but will +# return to /usr/local/nvidia in 13.0 to allow container providers to mount drivers +# consistently from the host (see https://github.com/vllm-project/vllm/issues/18859). +# Until then, add /usr/local/nvidia/lib64 before the image cuda path to allow override. +ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib64:${LD_LIBRARY_PATH} + +# Copy examples and benchmarks at the end to minimize cache invalidation +COPY examples examples +COPY benchmarks benchmarks +COPY ./vllm/collect_env.py . +#################### vLLM installation IMAGE #################### +#################### TEST IMAGE #################### +# image to run unit testing suite +# note that this uses vllm installed by `pip` +FROM vllm-base AS test + +ADD . /vllm-workspace/ + +ARG PYTHON_VERSION + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL +ARG PYTORCH_CUDA_INDEX_BASE_URL + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +# Reference: https://github.com/astral-sh/uv/pull/1694 +ENV UV_HTTP_TIMEOUT=500 +ENV UV_INDEX_STRATEGY="unsafe-best-match" +# Use copy mode to avoid hardlink failures with Docker cache mounts +ENV UV_LINK_MODE=copy + +RUN apt-get update -y \ + && apt-get install -y git + +# We can specify the standard or nightly build of PyTorch +ARG PYTORCH_NIGHTLY + +# Install development dependencies (for testing) +COPY requirements/lint.txt requirements/lint.txt +COPY requirements/test/cuda.in requirements/test/cuda.in +COPY requirements/test/cuda.txt requirements/test/cuda.txt +COPY requirements/dev.txt requirements/dev.txt +COPY use_existing_torch.py use_existing_torch.py +COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt +RUN --mount=type=cache,target=/root/.cache/uv \ + CUDA_MAJOR="${CUDA_VERSION%%.*}"; \ + if [ "$CUDA_MAJOR" -ge 12 ]; then \ + if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ + echo "Installing dev requirements plus torch nightly..." \ + && python3 use_existing_torch.py --prefix \ + && cat torch_lib_versions.txt >> requirements/test/cuda.in \ + && uv pip compile requirements/test/cuda.in -o requirements/test/cuda.txt --index-strategy unsafe-best-match \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ + && uv pip install --system $(cat torch_lib_versions.txt | xargs) --pre \ + -r requirements/dev.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + else \ + echo "Installing dev requirements..." \ + && uv pip install --system -r requirements/dev.txt \ + --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ + fi \ + fi + +# install development dependencies (for testing) +RUN --mount=type=cache,target=/root/.cache/uv \ + uv pip install --system -e tests/vllm_test_utils + +# enable fast downloads from hf (for testing) +ENV HF_XET_HIGH_PERFORMANCE 1 + +# increase timeout for hf downloads (for testing) +ENV HF_HUB_DOWNLOAD_TIMEOUT 60 + +# Copy in the v1 package for testing (it isn't distributed yet) +COPY vllm/v1 /usr/local/lib/python${PYTHON_VERSION}/dist-packages/vllm/v1 + +# Source code is used in the `python_only_compile.sh` test +# We hide it inside `src/` so that this source code +# will not be imported by other tests +RUN mkdir src +RUN mv vllm src/vllm +#################### TEST IMAGE #################### + +#################### OPENAI API SERVER #################### +# base openai image with additional requirements, for any subsequent openai-style images +FROM vllm-base AS vllm-openai-base +ARG TARGETPLATFORM +ARG INSTALL_KV_CONNECTORS=false +ARG CUDA_VERSION +ARG VLLM_BUILD_COMMIT +ARG VLLM_BUILD_PIPELINE +ARG VLLM_BUILD_URL +ARG VLLM_IMAGE_TAG + +ARG PIP_INDEX_URL UV_INDEX_URL +ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL + +# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out +# Reference: https://github.com/astral-sh/uv/pull/1694 +ENV UV_HTTP_TIMEOUT=500 + +# install kv_connectors if requested +ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' +ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=requirements/kv_connectors.txt,target=/tmp/kv_connectors.txt,ro \ + CUDA_MAJOR="${CUDA_VERSION%%.*}"; \ + CUDA_VERSION_DASH=$(echo $CUDA_VERSION | cut -d. -f1,2 | tr '.' '-'); \ + CUDA_HOME=/usr/local/cuda; \ + # lmcache requires explicit specifying CUDA_HOME + BUILD_PKGS="libcusparse-dev-${CUDA_VERSION_DASH} \ + libcublas-dev-${CUDA_VERSION_DASH} \ + libcusolver-dev-${CUDA_VERSION_DASH}"; \ + if [ "$INSTALL_KV_CONNECTORS" = "true" ]; then \ + if [ "$CUDA_MAJOR" -ge 13 ]; then \ + uv pip install --system nixl-cu13; \ + fi; \ + uv pip install --system -r /tmp/kv_connectors.txt --no-build || ( \ + # if the above fails, install from source + apt-get update -y && \ + apt-get install -y --no-install-recommends --allow-change-held-packages ${BUILD_PKGS} && \ + uv pip install --system -r /tmp/kv_connectors.txt --no-build-isolation && \ + apt-get purge -y ${BUILD_PKGS} && \ + # clean up -dev packages, keep runtime libraries + rm -rf /var/lib/apt/lists/* \ + ); \ + fi + +ENV VLLM_USAGE_SOURCE production-docker-image +ENV VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown} \ + VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local} \ + VLLM_BUILD_URL=${VLLM_BUILD_URL:-} \ + VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev} +LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" \ + org.opencontainers.image.revision="${VLLM_BUILD_COMMIT}" \ + org.opencontainers.image.version="${VLLM_IMAGE_TAG}" \ + org.opencontainers.image.url="${VLLM_BUILD_URL}" \ + ai.vllm.build.commit="${VLLM_BUILD_COMMIT}" \ + ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}" \ + ai.vllm.build.url="${VLLM_BUILD_URL}" \ + ai.vllm.image.tag="${VLLM_IMAGE_TAG}" + +# define sagemaker first, so it is not default from `docker build` +FROM vllm-openai-base AS vllm-sagemaker + +COPY examples/online_serving/sagemaker-entrypoint.sh . +RUN chmod +x sagemaker-entrypoint.sh +ENTRYPOINT ["./sagemaker-entrypoint.sh"] + +FROM vllm-openai-base AS vllm-openai + +ENTRYPOINT ["vllm", "serve"] +#################### OPENAI API SERVER #################### From f59929f5911113976c5b719ee566dc32d0f52956 Mon Sep 17 00:00:00 2001 From: zeryx <1892175+zeryx@users.noreply.github.com> Date: Tue, 5 May 2026 10:27:25 -0400 Subject: [PATCH 2/3] [Bugfix] Add LoRA mixin to CutlassExpertsFp4 to prevent Marlin fallback When --enable-lora is set, all MoE layers have is_lora_enabled=True regardless of whether LoRA adapters target expert weights. CutlassExpertsFp4 lacked LoRAExpertsMixin, causing is_supported_config() to reject it and fall through to MarlinExperts (weight-only FP4 decompression instead of native FP4 tensor core math). This is especially impactful on SM120 (Blackwell) where NVFP4 CUTLASS MoE kernels are the primary compute path. Co-authored-by: Claude Signed-off-by: Josh Sutton Signed-off-by: zeryx <1892175+zeryx@users.noreply.github.com> --- vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py b/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py index fdd802e7da3a..ce5193ed0ceb 100644 --- a/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py +++ b/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py @@ -16,6 +16,9 @@ FusedMoEParallelConfig, FusedMoEQuantConfig, ) +from vllm.model_executor.layers.fused_moe.lora_experts_mixin import ( + LoRAExpertsMixin, +) from vllm.model_executor.layers.fused_moe.moe_permute_unpermute import ( moe_permute, moe_unpermute, @@ -665,7 +668,7 @@ def run_cutlass_moe_fp4( return -class CutlassExpertsFp4(mk.FusedMoEExpertsModular): +class CutlassExpertsFp4(LoRAExpertsMixin, mk.FusedMoEExpertsModular): """CUTLASS FP4 fused MoE expert implementation.""" def process_weights_after_loading(self, layer: torch.nn.Module) -> None: From e0857265321119a5608b76ae5041d12a8eac622a Mon Sep 17 00:00:00 2001 From: zeryx <1892175+zeryx@users.noreply.github.com> Date: Tue, 5 May 2026 10:55:05 -0400 Subject: [PATCH 3/3] [Docker] Enable SM120 NVFP4 CUTLASS kernels in default Dockerfile Change `TORCH_CUDA_ARCH_LIST` from `12.0+PTX` to `12.0` in the Dockerfile, versions.json, and the openai-base stage. The `+PTX` suffix generates virtual-only gencode (`compute_120`) which does not satisfy CMake's `cuda_archs_loose_intersection("12.0f")` check, silently skipping all NVFP4 SM120 CUTLASS kernels (nvfp4_scaled_mm, nvfp4_blockwise_moe, nvfp4_experts_quant, nvfp4_kv_cache, activation_nvfp4_quant_fusion). Bare `12.0` produces real SM code (`sm_120`) which matches the intersection. nvcc still embeds PTX for the highest real arch, so forward compatibility is preserved. Also incorporates robustness fixes from Dockerfile.sm120: - GCC-10 made optional for Ubuntu 24.04+ (ships gcc-13/14) - Universe repo added for libxext6/libgl1 on minimal base images - Deadsnakes PPA bypassed when Python is in base repos Removes the separate Dockerfile.sm120 as its changes are now in the main Dockerfile. Co-authored-by: Claude Signed-off-by: Josh Sutton Signed-off-by: zeryx <1892175+zeryx@users.noreply.github.com> --- docker/Dockerfile | 18 +- docker/Dockerfile.sm120 | 872 ---------------------------------------- docker/versions.json | 2 +- 3 files changed, 11 insertions(+), 881 deletions(-) delete mode 100644 docker/Dockerfile.sm120 diff --git a/docker/Dockerfile b/docker/Dockerfile index fd0622e2416a..fd7af2d53b60 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -131,11 +131,9 @@ RUN if [ "${BUILD_OS}" = "manylinux" ]; then \ sudo \ python3-pip \ libibverbs-dev \ - # Upgrade to GCC 10 to avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92519 - # as it was causing spam when compiling the CUTLASS kernels - gcc-10 \ - g++-10 \ - && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 110 --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ + && (apt-get install -y --no-install-recommends gcc-10 g++-10 \ + && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 110 --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ + || true) \ # Install python dev headers if available (needed for cmake FindPython on Ubuntu 24.04 # which ships cmake 3.28 and requires Development.SABIModule; silently skipped on # Ubuntu 20.04/22.04 where python3.x-dev is not available without a PPA) @@ -224,7 +222,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \ # Explicitly set the list to avoid issues with torch 2.2 # See https://github.com/pytorch/pytorch/pull/123243 # From versions.json: .torch.cuda_arch_list -ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' +ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0' ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} #################### BUILD BASE IMAGE #################### @@ -533,6 +531,8 @@ RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \ # Install Python and system dependencies RUN apt-get update -y \ + && (add-apt-repository -y universe 2>/dev/null || true) \ + && apt-get update -y \ && apt-get install -y --no-install-recommends \ software-properties-common \ curl \ @@ -541,7 +541,9 @@ RUN apt-get update -y \ libsm6 \ libxext6 \ libgl1 \ - && if [ ! -z ${DEADSNAKES_MIRROR_URL} ] ; then \ + && if apt-cache show python${PYTHON_VERSION} >/dev/null 2>&1 ; then \ + echo "python${PYTHON_VERSION} available in base repos, skipping deadsnakes" ; \ + elif [ ! -z ${DEADSNAKES_MIRROR_URL} ] ; then \ if [ ! -z "${DEADSNAKES_GPGKEY_URL}" ] ; then \ mkdir -p -m 0755 /etc/apt/keyrings ; \ curl -L ${DEADSNAKES_GPGKEY_URL} | gpg --dearmor > /etc/apt/keyrings/deadsnakes.gpg ; \ @@ -817,7 +819,7 @@ ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL ENV UV_HTTP_TIMEOUT=500 # install kv_connectors if requested -ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' +ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0' ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=requirements/kv_connectors.txt,target=/tmp/kv_connectors.txt,ro \ diff --git a/docker/Dockerfile.sm120 b/docker/Dockerfile.sm120 deleted file mode 100644 index 3ac42997932f..000000000000 --- a/docker/Dockerfile.sm120 +++ /dev/null @@ -1,872 +0,0 @@ -# The vLLM Dockerfile is used to construct vLLM image that can be directly used -# to run the OpenAI compatible server. - -# Please update any changes made here to -# docs/contributing/dockerfile/dockerfile.md and -# docs/assets/contributing/dockerfile-stages-dependency.png - -# ============================================================================= -# VERSION MANAGEMENT -# ============================================================================= -# ARG defaults in this Dockerfile are the source of truth for pinned versions. -# docker/versions.json is auto-generated for use with docker buildx bake. -# -# When updating versions: -# 1. Edit the ARG defaults below -# 2. Run: python tools/generate_versions_json.py -# -# To query versions programmatically: -# jq -r '.variable.CUDA_VERSION.default' docker/versions.json -# -# To build with bake: -# docker buildx bake -f docker/docker-bake.hcl -f docker/versions.json -# ============================================================================= - -ARG CUDA_VERSION=13.0.2 -ARG PYTHON_VERSION=3.12 -ARG UBUNTU_VERSION=22.04 - -# By parameterizing the base images, we allow third-party to use their own -# base images. One use case is hermetic builds with base images stored in -# private registries that use a different repository naming conventions. -# -# Example: -# docker build --build-arg BUILD_BASE_IMAGE=registry.acme.org/mirror/nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 - -# Important: We build with an old version of Ubuntu to maintain broad -# compatibility with other Linux OSes. The main reason for this is that the -# glibc version is baked into the distro, and binaries built with one glibc -# version are not backwards compatible with OSes that use an earlier version. -ARG BUILD_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 -# Using cuda base image with minimal dependencies necessary for JIT compilation (FlashInfer, DeepGEMM, EP kernels) -ARG FINAL_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-base-ubuntu${UBUNTU_VERSION} - -# OS family of BUILD_BASE_IMAGE. Controls package manager (apt vs dnf) and -# Python bootstrap. Set to "manylinux" alongside a manylinux build base such -# as pytorch/manylinux2_28-builder:cuda13.0 to produce wheels with a glibc -# 2.28 floor (matches PyTorch's own published wheels). Default stays on -# Ubuntu for backwards compatibility. -ARG BUILD_OS=ubuntu - -# By parameterizing the Deadsnakes repository URL, we allow third-party to use -# their own mirror. When doing so, we don't benefit from the transparent -# installation of the GPG key of the PPA, as done by add-apt-repository, so we -# also need a URL for the GPG key. -ARG DEADSNAKES_MIRROR_URL -ARG DEADSNAKES_GPGKEY_URL - -# The PyPA get-pip.py script is a self contained script+zip file, that provides -# both the installer script and the pip base85-encoded zip archive. This allows -# bootstrapping pip in environment where a distribution package does not exist. -# -# By parameterizing the URL for get-pip.py installation script, we allow -# third-party to use their own copy of the script stored in a private mirror. -# We set the default value to the PyPA owned get-pip.py script. -# -# Reference: https://pip.pypa.io/en/stable/installation/#get-pip-py -ARG GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" - -# PIP supports fetching the packages from custom indexes, allowing third-party -# to host the packages in private mirrors. The PIP_INDEX_URL and -# PIP_EXTRA_INDEX_URL are standard PIP environment variables to override the -# default indexes. By letting them empty by default, PIP will use its default -# indexes if the build process doesn't override the indexes. -# -# Uv uses different variables. We set them by default to the same values as -# PIP, but they can be overridden. -ARG PIP_INDEX_URL -ARG PIP_EXTRA_INDEX_URL -ARG UV_INDEX_URL=${PIP_INDEX_URL} -ARG UV_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} - -# PyTorch provides its own indexes for standard and nightly builds -ARG PYTORCH_CUDA_INDEX_BASE_URL=https://download.pytorch.org/whl - -# PIP supports multiple authentication schemes, including keyring -# By parameterizing the PIP_KEYRING_PROVIDER variable and setting it to -# disabled by default, we allow third-party to use keyring authentication for -# their private Python indexes, while not changing the default behavior which -# is no authentication. -# -# Reference: https://pip.pypa.io/en/stable/topics/authentication/#keyring-support -ARG PIP_KEYRING_PROVIDER=disabled -ARG UV_KEYRING_PROVIDER=${PIP_KEYRING_PROVIDER} - -# Flag enables built-in KV-connector dependency libs into docker images -ARG INSTALL_KV_CONNECTORS=false - -#################### BASE BUILD IMAGE #################### -# prepare basic build environment -FROM ${BUILD_BASE_IMAGE} AS base - -ARG CUDA_VERSION -ARG PYTHON_VERSION -ARG BUILD_OS - -ENV DEBIAN_FRONTEND=noninteractive - -# Install system dependencies including build tools. -# The Ubuntu path uses apt + deadsnakes-via-uv for Python; the manylinux path -# (AlmaLinux 8, e.g. pytorch/manylinux2_28-builder) uses dnf and the Python -# interpreters pre-installed at /opt/python/cpXY-cpXY/. -RUN if [ "${BUILD_OS}" = "manylinux" ]; then \ - # rdma-core-devel provides libibverbs headers; ccache lives in EPEL, - # which the pytorch manylinux image already enables. git/curl/sudo - # are typically pre-installed but listed defensively. - dnf install -y --setopt=install_weak_deps=False \ - ccache \ - git \ - curl \ - sudo \ - rdma-core-devel \ - && dnf clean all \ - && rm -rf /var/cache/dnf; \ - else \ - apt-get update -y \ - && apt-get install -y --no-install-recommends \ - ccache \ - software-properties-common \ - git \ - curl \ - sudo \ - python3-pip \ - libibverbs-dev \ - && (apt-get install -y --no-install-recommends gcc-10 g++-10 \ - && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 110 --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ - || true) \ - # Install python dev headers if available (needed for cmake FindPython on Ubuntu 24.04 - # which ships cmake 3.28 and requires Development.SABIModule; silently skipped on - # Ubuntu 20.04/22.04 where python3.x-dev is not available without a PPA) - && (apt-get install -y --no-install-recommends python${PYTHON_VERSION}-dev 2>/dev/null || true) \ - && rm -rf /var/lib/apt/lists/*; \ - fi - -# Install uv and bootstrap /opt/venv. Both paths converge on /opt/venv so all -# downstream stages stay distro-agnostic. -RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ - && if [ "${BUILD_OS}" = "manylinux" ]; then \ - # manylinux images ship Python at /opt/python/cpXY-cpXY/; point uv - # at the matching interpreter rather than letting it fetch one. - PYV_NODOT=$(echo ${PYTHON_VERSION} | tr -d '.') \ - && MANYLINUX_PY=/opt/python/cp${PYV_NODOT}-cp${PYV_NODOT}/bin/python${PYTHON_VERSION} \ - && $HOME/.local/bin/uv venv /opt/venv --python "$MANYLINUX_PY"; \ - else \ - $HOME/.local/bin/uv venv /opt/venv --python ${PYTHON_VERSION}; \ - fi \ - && rm -f /usr/bin/python3 /usr/bin/python3-config /usr/bin/pip \ - && ln -sf /opt/venv/bin/python3 /usr/bin/python3 \ - && ln -sf /opt/venv/bin/python3-config /usr/bin/python3-config \ - && ln -sf /opt/venv/bin/pip /usr/bin/pip \ - && python3 --version && python3 -m pip --version - -# Activate virtual environment and add uv to PATH -ENV PATH="/opt/venv/bin:/root/.local/bin:$PATH" -ENV VIRTUAL_ENV="/opt/venv" - -# Environment for uv -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -ENV UV_LINK_MODE=copy - -# Verify GCC version -RUN gcc --version - -# Enable CUDA forward compatibility by setting '-e VLLM_ENABLE_CUDA_COMPATIBILITY=1' -# Only needed for datacenter/professional GPUs with older drivers. -# See: https://docs.nvidia.com/deploy/cuda-compatibility/ -ENV VLLM_ENABLE_CUDA_COMPATIBILITY=0 - -# ============================================================ -# SLOW-CHANGING DEPENDENCIES BELOW -# These are the expensive layers that we want to cache -# ============================================================ - -# Install PyTorch and core CUDA dependencies -# This is ~2GB and rarely changes -ARG PYTORCH_CUDA_INDEX_BASE_URL - -WORKDIR /workspace - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install build and runtime dependencies, including PyTorch -# Check whether to install torch nightly instead of release for this build -COPY requirements/common.txt requirements/common.txt -COPY requirements/cuda.txt requirements/cuda.txt -COPY use_existing_torch.py use_existing_torch.py -COPY pyproject.toml pyproject.toml -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing torch nightly..." \ - && uv pip install --python /opt/venv/bin/python3 torch torchaudio torchvision --pre \ - --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ - && echo "Installing other requirements..." \ - && /opt/venv/bin/python3 use_existing_torch.py --prefix \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/cuda.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - uv pip install --python /opt/venv/bin/python3 -r requirements/cuda.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi - -# Track PyTorch lib versions used during build and match in downstream instances. -# We do this for both nightly and release so we can strip dependencies/*.txt as needed. -# Otherwise library dependencies can upgrade/downgrade torch incorrectly. -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip freeze | grep -i "^torch=\|^torchvision=\|^torchaudio=" > torch_lib_versions.txt \ - && TORCH_LIB_VERSIONS=$(cat torch_lib_versions.txt | xargs) \ - && echo "Installed torch libs: ${TORCH_LIB_VERSIONS}" - -# CUDA arch list used by torch -# Explicitly set the list to avoid issues with torch 2.2 -# See https://github.com/pytorch/pytorch/pull/123243 -# From versions.json: .torch.cuda_arch_list -ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' -ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} -#################### BUILD BASE IMAGE #################### - -#################### CSRC BUILD IMAGE #################### -FROM base AS csrc-build -ARG TARGETPLATFORM - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL -ARG PYTORCH_CUDA_INDEX_BASE_URL - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install build dependencies -COPY requirements/build/cuda.txt requirements/build/cuda.txt -COPY use_existing_torch.py use_existing_torch.py -COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -# Reference: https://github.com/astral-sh/uv/pull/1694 -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -# Use copy mode to avoid hardlink failures with Docker cache mounts -ENV UV_LINK_MODE=copy - -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing build requirements without torch..." \ - && python3 use_existing_torch.py --prefix \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ - && echo "Installing torch nightly..." \ - && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | grep -i "^torch=" | xargs) --pre \ - --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - echo "Installing build requirements..." \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi - -WORKDIR /workspace - -COPY pyproject.toml setup.py CMakeLists.txt ./ -COPY cmake cmake/ -COPY csrc csrc/ -COPY vllm/envs.py vllm/envs.py -COPY vllm/__init__.py vllm/__init__.py - -# max jobs used by Ninja to build extensions -ARG max_jobs=2 -ENV MAX_JOBS=${max_jobs} -# number of threads used by nvcc -ARG nvcc_threads=8 -ENV NVCC_THREADS=$nvcc_threads - -ARG USE_SCCACHE -ARG SCCACHE_DOWNLOAD_URL -ARG SCCACHE_ENDPOINT -ARG SCCACHE_BUCKET_NAME=vllm-build-sccache -ARG SCCACHE_REGION_NAME=us-west-2 -ARG SCCACHE_S3_NO_CREDENTIALS=0 - -# Flag to control whether to use pre-built vLLM wheels -ARG VLLM_USE_PRECOMPILED="" -ARG VLLM_MERGE_BASE_COMMIT="" -ARG VLLM_MAIN_CUDA_VERSION="" - -# Use dummy version for csrc-build wheel (only .so files are extracted, version doesn't matter) -ENV SETUPTOOLS_SCM_PRETEND_VERSION="0.0.0+csrc.build" - -# Use existing torch for nightly builds -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - python3 use_existing_torch.py --prefix; \ - fi - -# Build the vLLM wheel -# if USE_SCCACHE is set, use sccache to speed up compilation -# AWS credentials mounted at ~/.aws/credentials for sccache S3 auth (optional) -RUN --mount=type=cache,target=/root/.cache/uv \ - --mount=type=secret,id=aws-credentials,target=/root/.aws/credentials,required=false \ - if [ "$USE_SCCACHE" = "1" ]; then \ - echo "Installing sccache..." \ - && case "${TARGETPLATFORM}" in \ - linux/arm64) SCCACHE_ARCH="aarch64" ;; \ - linux/amd64) SCCACHE_ARCH="x86_64" ;; \ - *) echo "Unsupported TARGETPLATFORM for sccache: ${TARGETPLATFORM}" >&2; exit 1 ;; \ - esac \ - && export SCCACHE_DOWNLOAD_URL="${SCCACHE_DOWNLOAD_URL:-https://github.com/mozilla/sccache/releases/download/v0.8.1/sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl.tar.gz}" \ - && curl -L -o sccache.tar.gz ${SCCACHE_DOWNLOAD_URL} \ - && tar -xzf sccache.tar.gz \ - && sudo mv sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl/sccache /usr/bin/sccache \ - && rm -rf sccache.tar.gz sccache-v0.8.1-${SCCACHE_ARCH}-unknown-linux-musl \ - && if [ ! -z ${SCCACHE_ENDPOINT} ] ; then export SCCACHE_ENDPOINT=${SCCACHE_ENDPOINT} ; fi \ - && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \ - && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \ - && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \ - && export SCCACHE_IDLE_TIMEOUT=0 \ - && export CMAKE_BUILD_TYPE=Release \ - && export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" \ - && export VLLM_PRECOMPILED_WHEEL_COMMIT="${VLLM_MERGE_BASE_COMMIT}" \ - && export VLLM_MAIN_CUDA_VERSION="${VLLM_MAIN_CUDA_VERSION}" \ - && export VLLM_DOCKER_BUILD_CONTEXT=1 \ - && sccache --show-stats \ - && python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 \ - && sccache --show-stats; \ - fi - -ARG vllm_target_device="cuda" -ENV VLLM_TARGET_DEVICE=${vllm_target_device} -ENV CCACHE_DIR=/root/.cache/ccache -RUN --mount=type=cache,target=/root/.cache/ccache \ - --mount=type=cache,target=/root/.cache/uv \ - if [ "$USE_SCCACHE" != "1" ]; then \ - # Clean any existing CMake artifacts - rm -rf .deps && \ - mkdir -p .deps && \ - export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" && \ - export VLLM_PRECOMPILED_WHEEL_COMMIT="${VLLM_MERGE_BASE_COMMIT}" && \ - export VLLM_DOCKER_BUILD_CONTEXT=1 && \ - python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38; \ - fi - -#################### CSRC BUILD IMAGE #################### - -#################### EXTENSIONS BUILD IMAGE #################### -# Build DeepEP - runs in PARALLEL with csrc-build -# This stage is independent and doesn't affect csrc cache -FROM base AS extensions-build -ARG CUDA_VERSION - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -ENV UV_LINK_MODE=copy - -WORKDIR /workspace - -# Build DeepEP wheels -COPY tools/ep_kernels/install_python_libraries.sh /tmp/install_python_libraries.sh -# Defaults moved here from tools/ep_kernels/install_python_libraries.sh for centralized version management -ARG DEEPEP_COMMIT_HASH=73b6ea4 -ARG NVSHMEM_VER -RUN --mount=type=cache,target=/root/.cache/uv \ - mkdir -p /tmp/ep_kernels_workspace/dist && \ - export TORCH_CUDA_ARCH_LIST='9.0a 10.0a' && \ - /tmp/install_python_libraries.sh \ - --workspace /tmp/ep_kernels_workspace \ - --mode wheel \ - ${DEEPEP_COMMIT_HASH:+--deepep-ref "$DEEPEP_COMMIT_HASH"} \ - ${NVSHMEM_VER:+--nvshmem-ver "$NVSHMEM_VER"} && \ - find /tmp/ep_kernels_workspace/nvshmem -name '*.a' -delete -#################### EXTENSIONS BUILD IMAGE #################### - -#################### WHEEL BUILD IMAGE #################### -FROM base AS build -ARG TARGETPLATFORM - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL -ARG PYTORCH_CUDA_INDEX_BASE_URL - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install build dependencies -COPY requirements/build/cuda.txt requirements/build/cuda.txt -COPY use_existing_torch.py use_existing_torch.py -COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -# Reference: https://github.com/astral-sh/uv/pull/1694 -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -# Use copy mode to avoid hardlink failures with Docker cache mounts -ENV UV_LINK_MODE=copy - -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing build requirements without torch..." \ - && python3 use_existing_torch.py --prefix \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ - && echo "Installing torch nightly..." \ - && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | grep -i "^torch=" | xargs) --pre \ - --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - echo "Installing build requirements..." \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/build/cuda.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi - -WORKDIR /workspace - -# Copy pre-built csrc wheel directly -COPY --from=csrc-build /workspace/dist /precompiled-wheels -COPY . . - -ARG GIT_REPO_CHECK=0 -RUN --mount=type=bind,source=.git,target=.git \ - if [ "$GIT_REPO_CHECK" != "0" ]; then bash tools/check_repo.sh ; fi - -ARG vllm_target_device="cuda" -ENV VLLM_TARGET_DEVICE=${vllm_target_device} - -# Skip adding +precompiled suffix to version (preserves git-derived version) -ENV VLLM_SKIP_PRECOMPILED_VERSION_SUFFIX=1 - -# Use existing torch for nightly builds -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - python3 use_existing_torch.py --prefix; \ - fi - -# Build the vLLM wheel -RUN --mount=type=cache,target=/root/.cache/uv \ - --mount=type=bind,source=.git,target=.git \ - if [ "${vllm_target_device}" = "cuda" ]; then \ - export VLLM_PRECOMPILED_WHEEL_LOCATION=$(ls /precompiled-wheels/*.whl); \ - fi && \ - python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 - -# Copy extension wheels from extensions-build stage for later use -COPY --from=extensions-build /tmp/ep_kernels_workspace/dist /tmp/ep_kernels_workspace/dist - -# Check the size of the wheel if RUN_WHEEL_CHECK is true -COPY .buildkite/check-wheel-size.py check-wheel-size.py -# sync the default value with .buildkite/check-wheel-size.py -ARG VLLM_MAX_SIZE_MB=500 -ENV VLLM_MAX_SIZE_MB=$VLLM_MAX_SIZE_MB -ARG RUN_WHEEL_CHECK=true -RUN if [ "$RUN_WHEEL_CHECK" = "true" ]; then \ - python3 check-wheel-size.py dist; \ - else \ - echo "Skipping wheel size check."; \ - fi - -#################### WHEEL BUILD IMAGE #################### - -#################### DEV IMAGE #################### -FROM base AS dev - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL -ARG PYTORCH_CUDA_INDEX_BASE_URL -ARG BUILD_OS - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -# Reference: https://github.com/astral-sh/uv/pull/1694 -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -# Use copy mode to avoid hardlink failures with Docker cache mounts -ENV UV_LINK_MODE=copy - -# Install libnuma-dev, required by fastsafetensors (fixes #20384) -RUN if [ "${BUILD_OS}" = "manylinux" ]; then \ - dnf install -y numactl-devel && dnf clean all && rm -rf /var/cache/dnf; \ - else \ - apt-get update && apt-get install -y --no-install-recommends libnuma-dev && rm -rf /var/lib/apt/lists/*; \ - fi - - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install development dependencies -COPY requirements/lint.txt requirements/lint.txt -COPY requirements/test/cuda.in requirements/test/cuda.in -COPY requirements/test/cuda.txt requirements/test/cuda.txt -COPY requirements/dev.txt requirements/dev.txt -COPY use_existing_torch.py use_existing_torch.py -COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing dev requirements plus torch nightly..." \ - && python3 use_existing_torch.py --prefix \ - && cat torch_lib_versions.txt >> requirements/test/cuda.in \ - && uv pip compile requirements/test/cuda.in -o requirements/test/cuda.txt --index-strategy unsafe-best-match \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ - && uv pip install --python /opt/venv/bin/python3 $(cat torch_lib_versions.txt | xargs) --pre \ - -r requirements/dev.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - echo "Installing dev requirements..." \ - && uv pip install --python /opt/venv/bin/python3 -r requirements/dev.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi - -#################### DEV IMAGE #################### -#################### vLLM installation IMAGE #################### -# image with vLLM installed -FROM ${FINAL_BASE_IMAGE} AS vllm-base - -ARG CUDA_VERSION -ARG PYTHON_VERSION -ARG DEADSNAKES_MIRROR_URL -ARG DEADSNAKES_GPGKEY_URL -ARG GET_PIP_URL - -ENV DEBIAN_FRONTEND=noninteractive -WORKDIR /vllm-workspace - - -# Python version string for paths (e.g., "312" for 3.12) -RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \ - echo "export PYTHON_VERSION_STR=${PYTHON_VERSION_STR}" >> /etc/environment - -# Install Python and system dependencies -RUN apt-get update -y \ - && (add-apt-repository -y universe 2>/dev/null || true) \ - && apt-get update -y \ - && apt-get install -y --no-install-recommends \ - software-properties-common \ - curl \ - sudo \ - ffmpeg \ - libsm6 \ - libxext6 \ - libgl1 \ - && if apt-cache show python${PYTHON_VERSION} >/dev/null 2>&1 ; then \ - echo "python${PYTHON_VERSION} available in base repos, skipping deadsnakes" ; \ - elif [ ! -z ${DEADSNAKES_MIRROR_URL} ] ; then \ - if [ ! -z "${DEADSNAKES_GPGKEY_URL}" ] ; then \ - mkdir -p -m 0755 /etc/apt/keyrings ; \ - curl -L ${DEADSNAKES_GPGKEY_URL} | gpg --dearmor > /etc/apt/keyrings/deadsnakes.gpg ; \ - sudo chmod 644 /etc/apt/keyrings/deadsnakes.gpg ; \ - echo "deb [signed-by=/etc/apt/keyrings/deadsnakes.gpg] ${DEADSNAKES_MIRROR_URL} $(lsb_release -cs) main" > /etc/apt/sources.list.d/deadsnakes.list ; \ - fi ; \ - else \ - for i in 1 2 3; do \ - add-apt-repository -y ppa:deadsnakes/ppa && break || \ - { echo "Attempt $i failed, retrying in 5s..."; sleep 5; }; \ - done ; \ - fi \ - && apt-get update -y \ - && apt-get install -y --no-install-recommends \ - python${PYTHON_VERSION} \ - python${PYTHON_VERSION}-dev \ - python${PYTHON_VERSION}-venv \ - libibverbs-dev \ - && rm -rf /var/lib/apt/lists/* \ - && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ - && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ - && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ - && rm -f /usr/lib/python${PYTHON_VERSION}/EXTERNALLY-MANAGED \ - && curl -sS ${GET_PIP_URL} | python${PYTHON_VERSION} \ - && python3 --version && python3 -m pip --version - -# Install CUDA development tools for runtime JIT compilation -# (FlashInfer, DeepGEMM, EP kernels all require compilation at runtime) -RUN CUDA_VERSION_DASH=$(echo $CUDA_VERSION | cut -d. -f1,2 | tr '.' '-') && \ - CUDA_VERSION_SHORT=$(echo $CUDA_VERSION | cut -d. -f1,2) && \ - apt-get update -y && \ - apt-get install -y --no-install-recommends --allow-change-held-packages \ - cuda-nvcc-${CUDA_VERSION_DASH} \ - cuda-cudart-${CUDA_VERSION_DASH} \ - cuda-nvrtc-${CUDA_VERSION_DASH} \ - cuda-cuobjdump-${CUDA_VERSION_DASH} \ - libcurand-dev-${CUDA_VERSION_DASH} \ - libcublas-dev-${CUDA_VERSION_DASH} \ - # Required by fastsafetensors (fixes #20384) - libnuma-dev \ - # numactl CLI for NUMA binding at runtime - numactl && \ - # Fixes nccl_allocator requiring nccl.h at runtime - # https://github.com/vllm-project/vllm/blob/1336a1ea244fa8bfd7e72751cabbdb5b68a0c11a/vllm/distributed/device_communicators/pynccl_allocator.py#L22 - # NCCL packages don't use the cuda-MAJOR-MINOR naming convention, - # so we pin the version to match our CUDA version - NCCL_VER=$(apt-cache madison libnccl-dev | grep "+cuda${CUDA_VERSION_SHORT}" | head -1 | awk -F'|' '{gsub(/^ +| +$/, "", $2); print $2}') && \ - apt-get install -y --no-install-recommends --allow-change-held-packages libnccl-dev=${NCCL_VER} libnccl2=${NCCL_VER} && \ - rm -rf /var/lib/apt/lists/* - -# Install uv for faster pip installs -RUN python3 -m pip install uv - -# Environment for uv -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -ENV UV_LINK_MODE=copy - -# Enable CUDA forward compatibility by setting '-e VLLM_ENABLE_CUDA_COMPATIBILITY=1' -# Only needed for datacenter/professional GPUs with older drivers. -# See: https://docs.nvidia.com/deploy/cuda-compatibility/ -ENV VLLM_ENABLE_CUDA_COMPATIBILITY=0 - -# ============================================================ -# SLOW-CHANGING DEPENDENCIES BELOW -# These are the expensive layers that we want to cache -# ============================================================ - -# Install PyTorch and core CUDA dependencies -# This is ~2GB and rarely changes -ARG PYTORCH_CUDA_INDEX_BASE_URL -COPY requirements/common.txt /tmp/common.txt -COPY requirements/cuda.txt /tmp/requirements-cuda.txt -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install --system -r /tmp/requirements-cuda.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') && \ - rm /tmp/requirements-cuda.txt /tmp/common.txt - -# Install FlashInfer JIT cache (requires CUDA-version-specific index URL) -# https://docs.flashinfer.ai/installation.html -# From versions.json: .flashinfer.version -ARG FLASHINFER_VERSION=0.6.8.post1 -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install --system flashinfer-jit-cache==${FLASHINFER_VERSION} \ - --extra-index-url https://flashinfer.ai/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') - -# ============================================================ -# OPENAI API SERVER DEPENDENCIES -# Pre-install these to avoid reinstalling on every vLLM wheel rebuild -# ============================================================ - -# Install gdrcopy (saves ~6s per build) -# TODO (huydhn): There is no prebuilt gdrcopy package on 12.9 at the moment -ARG GDRCOPY_CUDA_VERSION=12.8 -ARG GDRCOPY_OS_VERSION=Ubuntu22_04 -ARG TARGETPLATFORM -COPY tools/install_gdrcopy.sh /tmp/install_gdrcopy.sh -RUN set -eux; \ - case "${TARGETPLATFORM}" in \ - linux/arm64) UUARCH="aarch64" ;; \ - linux/amd64) UUARCH="x64" ;; \ - *) echo "Unsupported TARGETPLATFORM: ${TARGETPLATFORM}" >&2; exit 1 ;; \ - esac; \ - /tmp/install_gdrcopy.sh "${GDRCOPY_OS_VERSION}" "${GDRCOPY_CUDA_VERSION}" "${UUARCH}" && \ - rm /tmp/install_gdrcopy.sh - -# Install vllm-openai dependencies (saves ~2.6s per build) -# These are stable packages that don't depend on vLLM itself -# From versions.json: .bitsandbytes.x86_64, .bitsandbytes.arm64 -# From versions.json: .openai_server_extras.timm, .openai_server_extras.runai_model_streamer -ARG BITSANDBYTES_VERSION_X86=0.46.1 -ARG BITSANDBYTES_VERSION_ARM64=0.42.0 -ARG TIMM_VERSION=">=1.0.17" -ARG RUNAI_MODEL_STREAMER_VERSION=">=0.15.7" -RUN --mount=type=cache,target=/root/.cache/uv \ - if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ - BITSANDBYTES_VERSION="${BITSANDBYTES_VERSION_ARM64}"; \ - else \ - BITSANDBYTES_VERSION="${BITSANDBYTES_VERSION_X86}"; \ - fi; \ - uv pip install --system accelerate modelscope \ - "bitsandbytes>=${BITSANDBYTES_VERSION}" "timm${TIMM_VERSION}" "runai-model-streamer[s3,gcs,azure]${RUNAI_MODEL_STREAMER_VERSION}" - -# ============================================================ -# VLLM INSTALLATION (depends on build stage) -# ============================================================ - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL -ARG PYTORCH_CUDA_INDEX_BASE_URL -ARG PIP_KEYRING_PROVIDER UV_KEYRING_PROVIDER - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install vLLM wheel first, so that torch etc will be installed. -# Check whether to install torch nightly instead of release for this build. -COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt -RUN --mount=type=bind,from=build,src=/workspace/dist,target=/vllm-workspace/dist \ - --mount=type=cache,target=/root/.cache/uv \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing torch nightly..." \ - && uv pip install --system $(cat torch_lib_versions.txt | xargs) --pre \ - --index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ - && echo "Installing vLLM..." \ - && uv pip install --system dist/*.whl --verbose \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - echo "Installing vLLM..." \ - && uv pip install --system dist/*.whl --verbose \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi - -RUN --mount=type=cache,target=/root/.cache/uv \ -. /etc/environment && \ -uv pip list - -# Pytorch now installs NVSHMEM, setting LD_LIBRARY_PATH -ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH - -# Install EP kernels wheels (DeepEP) that have been built in the `build` stage -RUN --mount=type=bind,from=build,src=/tmp/ep_kernels_workspace/dist,target=/vllm-workspace/ep_kernels/dist \ - --mount=type=cache,target=/root/.cache/uv \ - uv pip install --system ep_kernels/dist/*.whl --verbose \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') - -# Download FlashInfer precompiled cubins AFTER all pip installs are done. -# This must run after the vLLM wheel and EP kernels installs above, because -# those can reinstall/touch flashinfer packages. Downloading cubins earlier -# (in the flashinfer-jit-cache layer) causes ~2.5 GB of layer duplication -# when a later pip install overwrites flashinfer package files. -RUN flashinfer show-config && flashinfer download-cubin - -# CUDA image changed from /usr/local/nvidia to /usr/local/cuda in 12.8 but will -# return to /usr/local/nvidia in 13.0 to allow container providers to mount drivers -# consistently from the host (see https://github.com/vllm-project/vllm/issues/18859). -# Until then, add /usr/local/nvidia/lib64 before the image cuda path to allow override. -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib64:${LD_LIBRARY_PATH} - -# Copy examples and benchmarks at the end to minimize cache invalidation -COPY examples examples -COPY benchmarks benchmarks -COPY ./vllm/collect_env.py . -#################### vLLM installation IMAGE #################### -#################### TEST IMAGE #################### -# image to run unit testing suite -# note that this uses vllm installed by `pip` -FROM vllm-base AS test - -ADD . /vllm-workspace/ - -ARG PYTHON_VERSION - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL -ARG PYTORCH_CUDA_INDEX_BASE_URL - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -# Reference: https://github.com/astral-sh/uv/pull/1694 -ENV UV_HTTP_TIMEOUT=500 -ENV UV_INDEX_STRATEGY="unsafe-best-match" -# Use copy mode to avoid hardlink failures with Docker cache mounts -ENV UV_LINK_MODE=copy - -RUN apt-get update -y \ - && apt-get install -y git - -# We can specify the standard or nightly build of PyTorch -ARG PYTORCH_NIGHTLY - -# Install development dependencies (for testing) -COPY requirements/lint.txt requirements/lint.txt -COPY requirements/test/cuda.in requirements/test/cuda.in -COPY requirements/test/cuda.txt requirements/test/cuda.txt -COPY requirements/dev.txt requirements/dev.txt -COPY use_existing_torch.py use_existing_torch.py -COPY --from=base /workspace/torch_lib_versions.txt torch_lib_versions.txt -RUN --mount=type=cache,target=/root/.cache/uv \ - CUDA_MAJOR="${CUDA_VERSION%%.*}"; \ - if [ "$CUDA_MAJOR" -ge 12 ]; then \ - if [ "${PYTORCH_NIGHTLY}" = "1" ]; then \ - echo "Installing dev requirements plus torch nightly..." \ - && python3 use_existing_torch.py --prefix \ - && cat torch_lib_versions.txt >> requirements/test/cuda.in \ - && uv pip compile requirements/test/cuda.in -o requirements/test/cuda.txt --index-strategy unsafe-best-match \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \ - && uv pip install --system $(cat torch_lib_versions.txt | xargs) --pre \ - -r requirements/dev.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - else \ - echo "Installing dev requirements..." \ - && uv pip install --system -r requirements/dev.txt \ - --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ - fi \ - fi - -# install development dependencies (for testing) -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install --system -e tests/vllm_test_utils - -# enable fast downloads from hf (for testing) -ENV HF_XET_HIGH_PERFORMANCE 1 - -# increase timeout for hf downloads (for testing) -ENV HF_HUB_DOWNLOAD_TIMEOUT 60 - -# Copy in the v1 package for testing (it isn't distributed yet) -COPY vllm/v1 /usr/local/lib/python${PYTHON_VERSION}/dist-packages/vllm/v1 - -# Source code is used in the `python_only_compile.sh` test -# We hide it inside `src/` so that this source code -# will not be imported by other tests -RUN mkdir src -RUN mv vllm src/vllm -#################### TEST IMAGE #################### - -#################### OPENAI API SERVER #################### -# base openai image with additional requirements, for any subsequent openai-style images -FROM vllm-base AS vllm-openai-base -ARG TARGETPLATFORM -ARG INSTALL_KV_CONNECTORS=false -ARG CUDA_VERSION -ARG VLLM_BUILD_COMMIT -ARG VLLM_BUILD_PIPELINE -ARG VLLM_BUILD_URL -ARG VLLM_IMAGE_TAG - -ARG PIP_INDEX_URL UV_INDEX_URL -ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL - -# This timeout (in seconds) is necessary when installing some dependencies via uv since it's likely to time out -# Reference: https://github.com/astral-sh/uv/pull/1694 -ENV UV_HTTP_TIMEOUT=500 - -# install kv_connectors if requested -ARG torch_cuda_arch_list='7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX' -ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} -RUN --mount=type=cache,target=/root/.cache/uv \ - --mount=type=bind,source=requirements/kv_connectors.txt,target=/tmp/kv_connectors.txt,ro \ - CUDA_MAJOR="${CUDA_VERSION%%.*}"; \ - CUDA_VERSION_DASH=$(echo $CUDA_VERSION | cut -d. -f1,2 | tr '.' '-'); \ - CUDA_HOME=/usr/local/cuda; \ - # lmcache requires explicit specifying CUDA_HOME - BUILD_PKGS="libcusparse-dev-${CUDA_VERSION_DASH} \ - libcublas-dev-${CUDA_VERSION_DASH} \ - libcusolver-dev-${CUDA_VERSION_DASH}"; \ - if [ "$INSTALL_KV_CONNECTORS" = "true" ]; then \ - if [ "$CUDA_MAJOR" -ge 13 ]; then \ - uv pip install --system nixl-cu13; \ - fi; \ - uv pip install --system -r /tmp/kv_connectors.txt --no-build || ( \ - # if the above fails, install from source - apt-get update -y && \ - apt-get install -y --no-install-recommends --allow-change-held-packages ${BUILD_PKGS} && \ - uv pip install --system -r /tmp/kv_connectors.txt --no-build-isolation && \ - apt-get purge -y ${BUILD_PKGS} && \ - # clean up -dev packages, keep runtime libraries - rm -rf /var/lib/apt/lists/* \ - ); \ - fi - -ENV VLLM_USAGE_SOURCE production-docker-image -ENV VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown} \ - VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local} \ - VLLM_BUILD_URL=${VLLM_BUILD_URL:-} \ - VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev} -LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" \ - org.opencontainers.image.revision="${VLLM_BUILD_COMMIT}" \ - org.opencontainers.image.version="${VLLM_IMAGE_TAG}" \ - org.opencontainers.image.url="${VLLM_BUILD_URL}" \ - ai.vllm.build.commit="${VLLM_BUILD_COMMIT}" \ - ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}" \ - ai.vllm.build.url="${VLLM_BUILD_URL}" \ - ai.vllm.image.tag="${VLLM_IMAGE_TAG}" - -# define sagemaker first, so it is not default from `docker build` -FROM vllm-openai-base AS vllm-sagemaker - -COPY examples/online_serving/sagemaker-entrypoint.sh . -RUN chmod +x sagemaker-entrypoint.sh -ENTRYPOINT ["./sagemaker-entrypoint.sh"] - -FROM vllm-openai-base AS vllm-openai - -ENTRYPOINT ["vllm", "serve"] -#################### OPENAI API SERVER #################### diff --git a/docker/versions.json b/docker/versions.json index 75652823db0b..5abe35298ab8 100644 --- a/docker/versions.json +++ b/docker/versions.json @@ -35,7 +35,7 @@ "default": "false" }, "TORCH_CUDA_ARCH_LIST": { - "default": "7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0+PTX" + "default": "7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0" }, "MAX_JOBS": { "default": "2"