246 lines
9.9 KiB
Docker
246 lines
9.9 KiB
Docker
######################### 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"]
|