Dockerfile 22.4 KB
Newer Older
Simon Mo's avatar
Simon Mo committed
1
2
3
# The vLLM Dockerfile is used to construct vLLM image that can be directly used
# to run the OpenAI compatible server.

4
# Please update any changes made here to
5
6
# docs/contributing/dockerfile/dockerfile.md and
# docs/assets/contributing/dockerfile-stages-dependency.png
7

8
ARG CUDA_VERSION=12.9.1
9
10
11
12
13
14
15
ARG PYTHON_VERSION=3.12

# 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:
16
17
# docker build --build-arg BUILD_BASE_IMAGE=registry.acme.org/mirror/nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04

18
# Important: We build with an old version of Ubuntu to maintain broad
19
20
21
22
# 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-ubuntu20.04
23
24
# Using cuda base image with minimal dependencies necessary for JIT compilation (FlashInfer, DeepGEMM, EP kernels)
ARG FINAL_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-base-ubuntu22.04
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

# 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 dsitribution 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}

70
# Flag enables built-in KV-connector dependency libs into docker images
71
72
ARG INSTALL_KV_CONNECTORS=false

Simon Mo's avatar
Simon Mo committed
73
#################### BASE BUILD IMAGE ####################
74
# prepare basic build environment
75
76
77
FROM ${BUILD_BASE_IMAGE} AS base
ARG CUDA_VERSION
ARG PYTHON_VERSION
78
ARG TARGETPLATFORM
79
ARG INSTALL_KV_CONNECTORS=false
80
81
ENV DEBIAN_FRONTEND=noninteractive

82
83
ARG GET_PIP_URL

84
# Install system dependencies and uv, then create Python virtual environment
85
86
87
RUN echo 'tzdata tzdata/Areas select America' | debconf-set-selections \
    && echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections \
    && apt-get update -y \
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    && apt-get install -y --no-install-recommends \
        ccache \
        software-properties-common \
        git \
        curl \
        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 \
    && rm -rf /var/lib/apt/lists/* \
102
103
104
105
106
107
    && curl -LsSf https://astral.sh/uv/install.sh | sh \
    && $HOME/.local/bin/uv venv /opt/venv --python ${PYTHON_VERSION} \
    && rm -f /usr/bin/python3 /usr/bin/python3-config /usr/bin/pip \
    && ln -s /opt/venv/bin/python3 /usr/bin/python3 \
    && ln -s /opt/venv/bin/python3-config /usr/bin/python3-config \
    && ln -s /opt/venv/bin/pip /usr/bin/pip \
108
    && python3 --version && python3 -m pip --version
109
110
111
112
113
114

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

115
116
117
# Activate virtual environment and add uv to PATH
ENV PATH="/opt/venv/bin:/root/.local/bin:$PATH"
ENV VIRTUAL_ENV="/opt/venv"
Stephen Krider's avatar
Stephen Krider committed
118

119
120
121
# 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
Huy Do's avatar
Huy Do committed
122
ENV UV_INDEX_STRATEGY="unsafe-best-match"
123
124
# Use copy mode to avoid hardlink failures with Docker cache mounts
ENV UV_LINK_MODE=copy
125

126
127
128
129
RUN <<EOF
gcc --version
EOF

130
131
132
133
# Workaround for https://github.com/openai/triton/issues/2507 and
# https://github.com/pytorch/pytorch/issues/107960 -- hopefully
# this won't be needed for future versions of this docker image
# or future versions of triton.
134
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
135

Stephen Krider's avatar
Stephen Krider committed
136
137
WORKDIR /workspace

138
# install build and runtime dependencies
139
140
COPY requirements/common.txt requirements/common.txt
COPY requirements/cuda.txt requirements/cuda.txt
141
RUN --mount=type=cache,target=/root/.cache/uv \
142
    uv pip install --python /opt/venv/bin/python3 -r requirements/cuda.txt \
143
    --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
144

145
146
147
148
# cuda arch list used by torch
# can be useful for both `dev` and `test`
# explicitly set the list to avoid issues with torch 2.2
# see https://github.com/pytorch/pytorch/pull/123243
149
ARG torch_cuda_arch_list='7.0 7.5 8.0 8.9 9.0 10.0 12.0'
150
ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list}
Simon Mo's avatar
Simon Mo committed
151
152
#################### BASE BUILD IMAGE ####################

153
#################### WHEEL BUILD IMAGE ####################
154
FROM base AS build
155
ARG TARGETPLATFORM
156

157
158
159
160
ARG PIP_INDEX_URL UV_INDEX_URL
ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL
ARG PYTORCH_CUDA_INDEX_BASE_URL

161
# install build dependencies
162
COPY requirements/build.txt requirements/build.txt
163

164
165
166
# 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
Huy Do's avatar
Huy Do committed
167
ENV UV_INDEX_STRATEGY="unsafe-best-match"
168
169
# Use copy mode to avoid hardlink failures with Docker cache mounts
ENV UV_LINK_MODE=copy
170

171
RUN --mount=type=cache,target=/root/.cache/uv \
172
    uv pip install --python /opt/venv/bin/python3 -r requirements/build.txt \
173
    --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
174

175
COPY . .
176
177
ARG GIT_REPO_CHECK=0
RUN --mount=type=bind,source=.git,target=.git \
178
    if [ "$GIT_REPO_CHECK" != "0" ]; then bash tools/check_repo.sh ; fi
Stephen Krider's avatar
Stephen Krider committed
179
180

# max jobs used by Ninja to build extensions
181
182
ARG max_jobs=2
ENV MAX_JOBS=${max_jobs}
183
184
185
# number of threads used by nvcc
ARG nvcc_threads=8
ENV NVCC_THREADS=$nvcc_threads
186

187
ARG USE_SCCACHE
188
189
ARG SCCACHE_DOWNLOAD_URL=https://github.com/mozilla/sccache/releases/download/v0.8.1/sccache-v0.8.1-x86_64-unknown-linux-musl.tar.gz
ARG SCCACHE_ENDPOINT
190
191
ARG SCCACHE_BUCKET_NAME=vllm-build-sccache
ARG SCCACHE_REGION_NAME=us-west-2
192
ARG SCCACHE_S3_NO_CREDENTIALS=0
193
194

# Flag to control whether to use pre-built vLLM wheels
195
ARG VLLM_USE_PRECOMPILED=""
196
ARG VLLM_MAIN_CUDA_VERSION=""
197

198
# if USE_SCCACHE is set, use sccache to speed up compilation
199
RUN --mount=type=cache,target=/root/.cache/uv \
200
    --mount=type=bind,source=.git,target=.git \
201
202
    if [ "$USE_SCCACHE" = "1" ]; then \
        echo "Installing sccache..." \
203
        && curl -L -o sccache.tar.gz ${SCCACHE_DOWNLOAD_URL} \
204
205
206
        && tar -xzf sccache.tar.gz \
        && sudo mv sccache-v0.8.1-x86_64-unknown-linux-musl/sccache /usr/bin/sccache \
        && rm -rf sccache.tar.gz sccache-v0.8.1-x86_64-unknown-linux-musl \
207
        && if [ ! -z ${SCCACHE_ENDPOINT} ] ; then export SCCACHE_ENDPOINT=${SCCACHE_ENDPOINT} ; fi \
208
209
        && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \
        && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \
210
        && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \
211
        && export SCCACHE_IDLE_TIMEOUT=0 \
212
        && export CMAKE_BUILD_TYPE=Release \
213
        && export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" \
214
        && export VLLM_MAIN_CUDA_VERSION="${VLLM_MAIN_CUDA_VERSION}" \
215
        && export VLLM_DOCKER_BUILD_CONTEXT=1 \
216
        && sccache --show-stats \
217
        && python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 \
218
219
220
        && sccache --show-stats; \
    fi

221
222
ARG vllm_target_device="cuda"
ENV VLLM_TARGET_DEVICE=${vllm_target_device}
223
224
ENV CCACHE_DIR=/root/.cache/ccache
RUN --mount=type=cache,target=/root/.cache/ccache \
225
    --mount=type=cache,target=/root/.cache/uv \
226
    --mount=type=bind,source=.git,target=.git  \
227
    if [ "$USE_SCCACHE" != "1" ]; then \
228
229
230
        # Clean any existing CMake artifacts
        rm -rf .deps && \
        mkdir -p .deps && \
231
232
        export VLLM_USE_PRECOMPILED="${VLLM_USE_PRECOMPILED}" && \
        export VLLM_DOCKER_BUILD_CONTEXT=1 && \
233
        python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38; \
234
    fi
235

236
237
238
239
240
241
242
243
244
245
246
# Install DeepGEMM from source
ARG DEEPGEMM_GIT_REF
COPY tools/install_deepgemm.sh /tmp/install_deepgemm.sh
RUN --mount=type=cache,target=/root/.cache/uv \
    VLLM_DOCKER_BUILD_CONTEXT=1 TORCH_CUDA_ARCH_LIST="9.0a 10.0a" /tmp/install_deepgemm.sh --cuda-version "${CUDA_VERSION}" ${DEEPGEMM_GIT_REF:+--ref "$DEEPGEMM_GIT_REF"} --wheel-dir /tmp/deepgemm/dist

# Ensure the wheel dir exists so later-stage COPY won't fail when DeepGEMM is skipped
RUN mkdir -p /tmp/deepgemm/dist && touch /tmp/deepgemm/dist/.deepgemm_skipped

COPY tools/ep_kernels/install_python_libraries.sh /tmp/install_python_libraries.sh
# Install EP kernels(pplx-kernels and DeepEP)
247
248
ARG PPLX_COMMIT_HASH
ARG DEEPEP_COMMIT_HASH
249
250
RUN --mount=type=cache,target=/root/.cache/uv \
    export TORCH_CUDA_ARCH_LIST='9.0a 10.0a' && \
251
252
253
254
255
    /tmp/install_python_libraries.sh \
        --workspace /tmp/ep_kernels_workspace \
        --mode wheel \
        ${PPLX_COMMIT_HASH:+--pplx-ref "$PPLX_COMMIT_HASH"} \
        ${DEEPEP_COMMIT_HASH:+--deepep-ref "$DEEPEP_COMMIT_HASH"} && \
256
257
    find /tmp/ep_kernels_workspace/nvshmem -name '*.a' -delete

258
# Check the size of the wheel if RUN_WHEEL_CHECK is true
259
COPY .buildkite/check-wheel-size.py check-wheel-size.py
260
# sync the default value with .buildkite/check-wheel-size.py
261
ARG VLLM_MAX_SIZE_MB=500
262
263
264
265
266
267
268
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
Simon Mo's avatar
Simon Mo committed
269
#################### EXTENSION Build IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
270

271
#################### DEV IMAGE ####################
272
FROM base AS dev
273

274
275
276
277
ARG PIP_INDEX_URL UV_INDEX_URL
ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL
ARG PYTORCH_CUDA_INDEX_BASE_URL

278
279
280
# 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
Huy Do's avatar
Huy Do committed
281
ENV UV_INDEX_STRATEGY="unsafe-best-match"
282
283
# Use copy mode to avoid hardlink failures with Docker cache mounts
ENV UV_LINK_MODE=copy
Huy Do's avatar
Huy Do committed
284

285
# Install libnuma-dev, required by fastsafetensors (fixes #20384)
286
RUN apt-get update && apt-get install -y --no-install-recommends libnuma-dev && rm -rf /var/lib/apt/lists/*
287
288
289
COPY requirements/lint.txt requirements/lint.txt
COPY requirements/test.txt requirements/test.txt
COPY requirements/dev.txt requirements/dev.txt
290
RUN --mount=type=cache,target=/root/.cache/uv \
291
    uv pip install --python /opt/venv/bin/python3 -r requirements/dev.txt \
292
    --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
293
#################### DEV IMAGE ####################
294

295
296
#################### vLLM installation IMAGE ####################
# image with vLLM installed
297
298
299
FROM ${FINAL_BASE_IMAGE} AS vllm-base
ARG CUDA_VERSION
ARG PYTHON_VERSION
300
ARG INSTALL_KV_CONNECTORS=false
Simon Mo's avatar
Simon Mo committed
301
WORKDIR /vllm-workspace
302
ENV DEBIAN_FRONTEND=noninteractive
303
304
ARG TARGETPLATFORM

305
# TODO (huydhn): There is no prebuilt gdrcopy package on 12.9 at the moment
306
307
308
309
ARG GDRCOPY_CUDA_VERSION=12.8
# Keep in line with FINAL_BASE_IMAGE
ARG GDRCOPY_OS_VERSION=Ubuntu22_04

Kebe's avatar
Kebe committed
310
311
SHELL ["/bin/bash", "-c"]

312
313
314
315
ARG DEADSNAKES_MIRROR_URL
ARG DEADSNAKES_GPGKEY_URL
ARG GET_PIP_URL

316
317
RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \
    echo "export PYTHON_VERSION_STR=${PYTHON_VERSION_STR}" >> /etc/environment
318

319
320
321
322
# Install Python and other dependencies
RUN echo 'tzdata tzdata/Areas select America' | debconf-set-selections \
    && echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections \
    && apt-get update -y \
323
324
325
326
327
328
329
330
331
    && apt-get install -y --no-install-recommends \
        software-properties-common \
        curl \
        sudo \
        python3-pip \
        ffmpeg \
        libsm6 \
        libxext6 \
        libgl1 \
332
333
334
335
336
337
338
339
340
341
342
343
344
    && if [ ! -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 \
345
    && apt-get update -y \
346
347
348
349
350
351
    && 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/* \
352
353
354
    && 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 \
355
    && curl -sS ${GET_PIP_URL} | python${PYTHON_VERSION} \
356
    && python3 --version && python3 -m pip --version
357

358
359
360
361
362
363
364
365
366
367
368
369
# Install CUDA development tools and build essentials 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 '.' '-') && \
    apt-get update -y && \
    apt-get install -y --no-install-recommends \
    cuda-nvcc-${CUDA_VERSION_DASH} \
    cuda-cudart-${CUDA_VERSION_DASH} \
    cuda-nvrtc-${CUDA_VERSION_DASH} \
    cuda-cuobjdump-${CUDA_VERSION_DASH} \
    libcublas-${CUDA_VERSION_DASH} && \
    rm -rf /var/lib/apt/lists/*

370
371
372
373
374
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

375
376
377
# Install uv for faster pip installs
RUN --mount=type=cache,target=/root/.cache/uv \
    python3 -m pip install uv
378

379
380
381
# 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
Huy Do's avatar
Huy Do committed
382
ENV UV_INDEX_STRATEGY="unsafe-best-match"
383
384
# Use copy mode to avoid hardlink failures with Docker cache mounts
ENV UV_LINK_MODE=copy
385

386
387
388
389
# Workaround for https://github.com/openai/triton/issues/2507 and
# https://github.com/pytorch/pytorch/issues/107960 -- hopefully
# this won't be needed for future versions of this docker image
# or future versions of triton.
390
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
391

392
# Install vllm wheel first, so that torch etc will be installed.
393
RUN --mount=type=bind,from=build,src=/workspace/dist,target=/vllm-workspace/dist \
394
    --mount=type=cache,target=/root/.cache/uv \
395
    uv pip install --system dist/*.whl --verbose \
396
        --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
Mor Zusman's avatar
Mor Zusman committed
397

398
399
400
# Install FlashInfer pre-compiled kernel cache and binaries
# https://docs.flashinfer.ai/installation.html
RUN --mount=type=cache,target=/root/.cache/uv \
401
402
    uv pip install --system flashinfer-cubin==0.5.2 \
    && uv pip install --system flashinfer-jit-cache==0.5.2 \
403
404
405
        --extra-index-url https://flashinfer.ai/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.') \
    && flashinfer show-config

406
COPY examples examples
407
COPY benchmarks benchmarks
408
COPY ./vllm/collect_env.py .
409

Huy Do's avatar
Huy Do committed
410
411
412
413
RUN --mount=type=cache,target=/root/.cache/uv \
. /etc/environment && \
uv pip list

414
# Install deepgemm wheel that has been built in the `build` stage
415
RUN --mount=type=cache,target=/root/.cache/uv \
416
417
418
419
420
421
422
423
424
425
426
427
428
429
    --mount=type=bind,from=build,source=/tmp/deepgemm/dist,target=/tmp/deepgemm/dist,ro \
    sh -c 'if ls /tmp/deepgemm/dist/*.whl >/dev/null 2>&1; then \
              uv pip install --system /tmp/deepgemm/dist/*.whl; \
           else \
              echo "No DeepGEMM wheels to install; skipping."; \
           fi'

# Pytorch now installs NVSHMEM, setting LD_LIBRARY_PATH (https://github.com/pytorch/pytorch/blob/d38164a545b4a4e4e0cf73ce67173f70574890b6/.ci/manywheel/build_cuda.sh#L141C14-L141C36)
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

# Install EP kernels wheels (pplx-kernels and 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 \
430
        --extra-index-url ${PYTORCH_CUDA_INDEX_BASE_URL}/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
431

432
433
RUN --mount=type=bind,source=tools/install_gdrcopy.sh,target=/tmp/install_gdrcopy.sh,ro \
    set -eux; \
434
435
436
437
438
    case "${TARGETPLATFORM}" in \
      linux/arm64) UUARCH="aarch64" ;; \
      linux/amd64) UUARCH="x64" ;; \
      *) echo "Unsupported TARGETPLATFORM: ${TARGETPLATFORM}" >&2; exit 1 ;; \
    esac; \
439
    /tmp/install_gdrcopy.sh "${GDRCOPY_OS_VERSION}" "${GDRCOPY_CUDA_VERSION}" "${UUARCH}"
440

441
442
443
444
445
446
# 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}

447
#################### vLLM installation IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
448

449
450
451
452
#################### TEST IMAGE ####################
# image to run unit testing suite
# note that this uses vllm installed by `pip`
FROM vllm-base AS test
Stephen Krider's avatar
Stephen Krider committed
453

454
ADD . /vllm-workspace/
Stephen Krider's avatar
Stephen Krider committed
455

456
457
458
459
ARG PYTHON_VERSION

ARG PIP_INDEX_URL UV_INDEX_URL
ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL
460
ARG PYTORCH_CUDA_INDEX_BASE_URL
461

462
463
464
# 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
Huy Do's avatar
Huy Do committed
465
ENV UV_INDEX_STRATEGY="unsafe-best-match"
466
467
# Use copy mode to avoid hardlink failures with Docker cache mounts
ENV UV_LINK_MODE=copy
468

469
470
471
472
473
RUN echo 'tzdata tzdata/Areas select America' | debconf-set-selections \
    && echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections \
    && apt-get update -y \
    && apt-get install -y git

Huy Do's avatar
Huy Do committed
474
# install development dependencies (for testing)
475
RUN --mount=type=cache,target=/root/.cache/uv \
476
477
    CUDA_MAJOR="${CUDA_VERSION%%.*}"; \
    if [ "$CUDA_MAJOR" -ge 12 ]; then \
478
479
        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 '.'); \
480
    fi
481

youkaichao's avatar
youkaichao committed
482
# install development dependencies (for testing)
483
RUN --mount=type=cache,target=/root/.cache/uv \
484
    uv pip install --system -e tests/vllm_test_utils
youkaichao's avatar
youkaichao committed
485

486
# enable fast downloads from hf (for testing)
487
RUN --mount=type=cache,target=/root/.cache/uv \
488
    uv pip install --system hf_transfer
489
490
ENV HF_HUB_ENABLE_HF_TRANSFER 1

Joe Runde's avatar
Joe Runde committed
491
# Copy in the v1 package for testing (it isn't distributed yet)
492
COPY vllm/v1 /usr/local/lib/python${PYTHON_VERSION}/dist-packages/vllm/v1
Joe Runde's avatar
Joe Runde committed
493

494
495
# Source code is used in the `python_only_compile.sh` test
# We hide it inside `src/` so that this source code
496
# will not be imported by other tests
497
498
RUN mkdir src
RUN mv vllm src/vllm
499
#################### TEST IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
500

Simon Mo's avatar
Simon Mo committed
501
#################### OPENAI API SERVER ####################
502
503
# base openai image with additional requirements, for any subsequent openai-style images
FROM vllm-base AS vllm-openai-base
504
ARG TARGETPLATFORM
505
ARG INSTALL_KV_CONNECTORS=false
506

507
508
509
ARG PIP_INDEX_URL UV_INDEX_URL
ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL

510
511
512
513
# 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

514
# install additional dependencies for openai api server
515
RUN --mount=type=cache,target=/root/.cache/uv \
516
    --mount=type=bind,source=requirements/kv_connectors.txt,target=/tmp/kv_connectors.txt,ro \
517
    if [ "$INSTALL_KV_CONNECTORS" = "true" ]; then \
518
        uv pip install --system -r /tmp/kv_connectors.txt; \
519
    fi; \
520
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
521
        BITSANDBYTES_VERSION="0.42.0"; \
522
    else \
523
524
        BITSANDBYTES_VERSION="0.46.1"; \
    fi; \
525
    uv pip install --system accelerate hf_transfer modelscope "bitsandbytes>=${BITSANDBYTES_VERSION}" 'timm>=1.0.17' 'runai-model-streamer[s3,gcs]>=0.15.0'
526

yhu422's avatar
yhu422 committed
527
528
ENV VLLM_USAGE_SOURCE production-docker-image

529
530
531
# define sagemaker first, so it is not default from `docker build`
FROM vllm-openai-base AS vllm-sagemaker

532
COPY examples/online_serving/sagemaker-entrypoint.sh .
533
534
535
536
537
RUN chmod +x sagemaker-entrypoint.sh
ENTRYPOINT ["./sagemaker-entrypoint.sh"]

FROM vllm-openai-base AS vllm-openai

538
ENTRYPOINT ["vllm", "serve"]
Simon Mo's avatar
Simon Mo committed
539
#################### OPENAI API SERVER ####################