######################### RUST BUILD IMAGE ######################### # Build the Rust frontend (`vllm-rs`) in a dedicated stage so the main image # doesn't need the rust toolchain or protoc. Runs in parallel with vllm-base. FROM ubuntu:22.04 AS rust-build ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -y \ && apt-get install -y --no-install-recommends \ ca-certificates curl git build-essential unzip python3 python3-pip \ && rm -rf /var/lib/apt/lists/* COPY tools/install_protoc.sh /tmp/install_protoc.sh RUN /tmp/install_protoc.sh && rm /tmp/install_protoc.sh WORKDIR /workspace COPY requirements/build/rust.txt requirements/build/rust.txt RUN python3 -m pip install --no-cache-dir -r requirements/build/rust.txt # Copy only the Rust build inputs; build_rust.sh publishes artifacts needed # by the wheel build stage. COPY rust rust COPY rust-toolchain.toml rust-toolchain.toml COPY tools/build_rust.py tools/build_rust.py COPY build_rust.sh build_rust.sh # Cap cargo parallelism to avoid exhausting the CI host's open-file limit # (rustc spawns enough concurrent processes to hit RLIMIT_NOFILE otherwise). ENV CARGO_BUILD_JOBS=4 RUN --mount=type=cache,target=/root/.cargo/registry,sharing=locked \ --mount=type=cache,target=/root/.cargo/git,sharing=locked \ bash build_rust.sh FROM ubuntu:24.04 AS vllm-base ENV DEBIAN_FRONTEND=noninteractive WORKDIR /workspace/ ARG PYTHON_VERSION=3.12 ARG PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/xpu" RUN apt-get update -y && \ apt-get install -y --no-install-recommends \ build-essential \ curl \ ffmpeg \ git \ gpg \ libsndfile1 \ libsm6 \ libxext6 \ libgl1 \ lsb-release \ libaio-dev \ numactl \ wget \ vim \ ca-certificates \ python3.12 \ python3.12-dev \ python3-pip && \ rm -rf /var/lib/apt/lists/* # Add oneAPI repo, pin oneAPI to 2025.3, then install pinned packages in one layer. RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \ echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | tee /etc/apt/sources.list.d/oneAPI.list && \ printf '%s\n' \ 'Package: intel-oneapi-* intel-deep-learning-essentials* intel-pti*' \ 'Pin: version 2025.3*' \ 'Pin-Priority: 1001' \ > /etc/apt/preferences.d/oneapi-2025.3.pref && \ apt-get update -y && \ apt-get install -y --no-install-recommends \ intel-oneapi-compiler-dpcpp-cpp-2025.3 \ intel-oneapi-mkl-devel-2025.3 \ intel-oneapi-dnnl-devel-2025.3 && \ rm -rf /var/lib/apt/lists/* # Install UMD RUN mkdir neo && \ cd neo && \ wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.34.4/intel-igc-core-2_2.34.4+21428_amd64.deb && \ wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.34.4/intel-igc-opencl-2_2.34.4+21428_amd64.deb && \ wget https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/intel-ocloc_26.18.38308.1-0_amd64.deb && \ wget https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/intel-opencl-icd_26.18.38308.1-0_amd64.deb && \ wget https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/libigdgmm12_22.10.0_amd64.deb && \ wget https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/libze-intel-gpu1_26.18.38308.1-0_amd64.deb && \ wget https://github.com/oneapi-src/level-zero/releases/download/v1.28.2/level-zero_1.28.2+u24.04_amd64.deb && \ wget https://github.com/oneapi-src/level-zero/releases/download/v1.28.2/level-zero-devel_1.28.2+u24.04_amd64.deb && \ dpkg -i *.deb && \ cd .. && \ rm -rf neo ENV PATH="/root/.local/bin:$PATH" ENV VIRTUAL_ENV="/opt/venv" ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ && uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV} ENV PATH="$VIRTUAL_ENV/bin:$PATH" # This oneccl contains the BMG support which is not the case for default version of oneapi 2025.3. ARG ONECCL_INSTALLER="intel-oneccl-2021.15.9.14_offline.sh" RUN wget "https://github.com/uxlfoundation/oneCCL/releases/download/2021.15.9/${ONECCL_INSTALLER}" && \ bash "${ONECCL_INSTALLER}" -a --silent --eula accept && \ rm "${ONECCL_INSTALLER}" && \ echo "source /opt/intel/oneapi/setvars.sh --force" >> /root/.bashrc && \ echo "source /opt/intel/oneapi/ccl/2021.15/env/vars.sh --force" >> /root/.bashrc && \ rm -f /opt/intel/oneapi/ccl/latest && \ ln -s /opt/intel/oneapi/ccl/2021.15 /opt/intel/oneapi/ccl/latest && \ printf '%s\n' \ '/opt/intel/oneapi/ccl/2021.15/lib' \ '/opt/intel/oneapi/mpi/2021.15/lib' \ '/opt/intel/oneapi/compiler/2025.3/lib' \ > /etc/ld.so.conf.d/oneapi-ccl.conf && \ ldconfig SHELL ["bash", "-c"] CMD ["bash", "-c", "source /root/.bashrc && exec bash"] WORKDIR /workspace/vllm ENV UV_HTTP_TIMEOUT=500 # Configure package index for XPU ENV PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ENV UV_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ENV UV_INDEX_STRATEGY="unsafe-best-match" ENV UV_LINK_MODE="copy" RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,src=requirements/common.txt,target=/workspace/vllm/requirements/common.txt \ --mount=type=bind,src=requirements/xpu.txt,target=/workspace/vllm/requirements/xpu.txt \ uv pip install --upgrade pip ENV LD_LIBRARY_PATH=/opt/intel/oneapi/ccl/2021.15/lib:/opt/intel/oneapi/mpi/2021.15/lib:/opt/intel/oneapi/compiler/2025.3/lib:/usr/local/lib CMD ["/bin/bash"] ######################### UCX + NIXL BUILD STAGE ######################### # Build UCX and NIXL in a dedicated stage so compiler/autotools layers are # never included in the final runtime image (mirrors ROCm's build_rixl stage). FROM vllm-base AS ucx-nixl-build ARG UCX_VERSION=v1.21.0-rc2 ARG NIXL_VERSION=v1.2.0 # Build-time only: compiler, autotools, and verbs dev headers RUN apt-get update -y && apt-get install -y --no-install-recommends \ build-essential \ autoconf \ automake \ libtool \ pkg-config \ libibverbs-dev \ librdmacm-dev \ && rm -rf /var/lib/apt/lists/* # Build UCX and produce a NIXL wheel so the final image needs no compiler. # patchelf (installed via uv) is used by the NIXL wheel build to rewrite # RPATH entries, making the wheel portable across stages. RUN --mount=type=cache,target=/root/.cache/uv \ git clone --depth 1 --branch "${UCX_VERSION}" https://github.com/openucx/ucx /tmp/ucx_source && \ cd /tmp/ucx_source && \ bash autogen.sh && \ ./configure --prefix=/tmp/ucx_install --with-ze=yes --enable-examples --enable-mt && \ make CFLAGS="-Wno-error=incompatible-pointer-types" -j"$(nproc)" && make install && \ git clone --depth 1 --branch "${NIXL_VERSION}" https://github.com/ai-dynamo/nixl /tmp/nixl_source && \ cd /tmp/nixl_source && \ uv pip install --upgrade meson pybind11 patchelf && \ uv pip install -r requirements.txt && \ PKG_CONFIG_PATH=/tmp/ucx_install/lib/pkgconfig \ LD_LIBRARY_PATH=/tmp/ucx_install/lib \ python -m pip wheel --no-deps . -w /tmp/nixl_wheels/ && \ find /tmp/ucx_install -type f \( -name '*.a' -o -name '*.la' \) -delete && \ rm -rf /tmp/ucx_install/{include,share,etc,bin} /tmp/ucx_install/lib/cmake \ /tmp/ucx_source /tmp/nixl_source FROM vllm-base AS vllm-openai ARG NIXL_VERSION=v1.2.0 # Copy compiled UCX runtime libraries and the pre-built NIXL wheel. # No compiler or autotools are installed in this stage. COPY --from=ucx-nixl-build /tmp/ucx_install /tmp/ucx_install COPY --from=ucx-nixl-build /tmp/nixl_wheels /tmp/nixl_wheels ENV LD_LIBRARY_PATH=/tmp/ucx_install/lib:${LD_LIBRARY_PATH} # Install RDMA runtime libraries (no build tools) and the pre-built NIXL wheel. # Do not uninstall/reinstall large Python packages here to avoid extra layer # churn; final package resolution remains in the later app install step. RUN --mount=type=cache,target=/root/.cache/uv \ apt-get update -y && apt-get install -y --no-install-recommends \ rdma-core \ libibverbs1 \ librdmacm1 \ libibumad3 \ libibmad5 \ libmlx5-1 \ libmlx4-1 \ ibverbs-providers \ librdmacm1t64 \ && rm -rf /var/lib/apt/lists/* \ && uv pip install --no-deps /tmp/nixl_wheels/nixl*.whl \ && uv pip install nixl==${NIXL_VERSION} && uv pip uninstall nixl-cu13 \ && rm -rf /tmp/nixl_wheels RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,src=requirements/common.txt,target=/workspace/vllm/requirements/common.txt \ --mount=type=bind,src=requirements/xpu.txt,target=/workspace/vllm/requirements/xpu.txt \ --mount=type=bind,src=requirements/test/xpu.txt,target=/workspace/vllm/requirements/test/xpu.txt \ uv pip install grpcio-tools protobuf nanobind && \ uv pip install -r /workspace/vllm/requirements/xpu.txt && \ uv pip install --no-build-isolation -r /workspace/vllm/requirements/test/xpu.txt && \ uv pip uninstall triton triton-xpu && \ uv pip install triton-xpu==3.7.1 && \ uv pip uninstall oneccl oneccl-devel # Keep source-dependent layers near the end so frequent code-only changes # don't invalidate heavy dependency and UCX/NIXL layers. COPY . . # Drop the pre-built Rust artifacts into the source tree. setup.py detects # them and ships them as-is, skipping the local Rust build. COPY --from=rust-build /workspace/vllm/vllm-rs vllm/vllm-rs COPY --from=rust-build /workspace/vllm/_rust_*.so vllm/ 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 ENV VLLM_TARGET_DEVICE=xpu ENV VLLM_WORKER_MULTIPROC_METHOD=spawn RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=.git,target=.git \ uv pip install --no-build-isolation --no-deps . RUN --mount=type=cache,target=/root/.cache/uv \ uv pip install -e tests/vllm_test_utils ENTRYPOINT ["vllm", "serve"]