Dockerfile 16 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/source/contributing/dockerfile/dockerfile.md and
# docs/source/assets/contributing/dockerfile-stages-dependency.png
7

Huy Do's avatar
Huy Do committed
8
ARG CUDA_VERSION=12.8.1
Simon Mo's avatar
Simon Mo committed
9
#################### BASE BUILD IMAGE ####################
10
# prepare basic build environment
11
FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 AS base
Huy Do's avatar
Huy Do committed
12
ARG CUDA_VERSION=12.8.1
13
ARG PYTHON_VERSION=3.12
14
ARG TARGETPLATFORM
15
16
ENV DEBIAN_FRONTEND=noninteractive

17
18
19
20
21
# 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 \
    && apt-get install -y ccache software-properties-common git curl sudo \
22
23
24
25
    && 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 \
26
27
28
29
30
31
32
33
34
35
    && apt-get update -y \
    && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv \
    && 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 \
    && curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} \
    && python3 --version && python3 -m pip --version
# Install uv for faster pip installs
RUN --mount=type=cache,target=/root/.cache/uv \
    python3 -m pip install uv
Stephen Krider's avatar
Stephen Krider committed
36

37
38
39
# 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
40
ENV UV_INDEX_STRATEGY="unsafe-best-match"
41

42
43
44
45
46
47
48
49
# 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
RUN apt-get install -y gcc-10 g++-10
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 110 --slave /usr/bin/g++ g++ /usr/bin/g++-10
RUN <<EOF
gcc --version
EOF

50
51
52
53
# 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.
54
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
55

Stephen Krider's avatar
Stephen Krider committed
56
57
WORKDIR /workspace

58
59
# install build and runtime dependencies

60
61
62
63
# arm64 (GH200) build follows the practice of "use existing pytorch" build,
# we need to install torch and torchvision from the nightly builds first,
# pytorch will not appear as a vLLM dependency in all of the following steps
# after this step
64
RUN --mount=type=cache,target=/root/.cache/uv \
65
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
66
67
        uv pip install --system --index-url https://download.pytorch.org/whl/nightly/cu128 "torch==2.8.0.dev20250318+cu128" "torchvision==0.22.0.dev20250319";  \
        uv pip install --system --index-url https://download.pytorch.org/whl/nightly/cu128 --pre pytorch_triton==3.3.0+gitab727c40; \
68
    fi
Mor Zusman's avatar
Mor Zusman committed
69

70
71
COPY requirements/common.txt requirements/common.txt
COPY requirements/cuda.txt requirements/cuda.txt
72
RUN --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
73
74
    uv pip install --system -r requirements/cuda.txt \
    --extra-index-url https://download.pytorch.org/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
75

76
77
78
79
# 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
80
ARG torch_cuda_arch_list='7.0 7.5 8.0 8.9 9.0 10.0+PTX'
81
ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list}
82
83
84
# Override the arch list for flash-attn to reduce the binary size
ARG vllm_fa_cmake_gpu_arches='80-real;90-real'
ENV VLLM_FA_CMAKE_GPU_ARCHES=${vllm_fa_cmake_gpu_arches}
Simon Mo's avatar
Simon Mo committed
85
86
#################### BASE BUILD IMAGE ####################

87
#################### WHEEL BUILD IMAGE ####################
88
FROM base AS build
89
ARG TARGETPLATFORM
90

91
# install build dependencies
92
COPY requirements/build.txt requirements/build.txt
93

94
95
96
# 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
97
ENV UV_INDEX_STRATEGY="unsafe-best-match"
98

99
RUN --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
100
101
    uv pip install --system -r requirements/build.txt \
    --extra-index-url https://download.pytorch.org/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
102

103
COPY . .
104
105
ARG GIT_REPO_CHECK=0
RUN --mount=type=bind,source=.git,target=.git \
106
    if [ "$GIT_REPO_CHECK" != "0" ]; then bash tools/check_repo.sh ; fi
Stephen Krider's avatar
Stephen Krider committed
107
108

# max jobs used by Ninja to build extensions
109
110
ARG max_jobs=2
ENV MAX_JOBS=${max_jobs}
111
112
113
# number of threads used by nvcc
ARG nvcc_threads=8
ENV NVCC_THREADS=$nvcc_threads
114

115
ARG USE_SCCACHE
116
117
ARG SCCACHE_BUCKET_NAME=vllm-build-sccache
ARG SCCACHE_REGION_NAME=us-west-2
118
ARG SCCACHE_S3_NO_CREDENTIALS=0
119
# if USE_SCCACHE is set, use sccache to speed up compilation
120
RUN --mount=type=cache,target=/root/.cache/uv \
121
    --mount=type=bind,source=.git,target=.git \
122
123
124
125
126
127
    if [ "$USE_SCCACHE" = "1" ]; then \
        echo "Installing sccache..." \
        && curl -L -o sccache.tar.gz https://github.com/mozilla/sccache/releases/download/v0.8.1/sccache-v0.8.1-x86_64-unknown-linux-musl.tar.gz \
        && 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 \
128
129
        && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \
        && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \
130
        && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \
131
        && export SCCACHE_IDLE_TIMEOUT=0 \
132
        && export CMAKE_BUILD_TYPE=Release \
133
        && sccache --show-stats \
134
        && python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 \
135
136
137
        && sccache --show-stats; \
    fi

138
139
ENV CCACHE_DIR=/root/.cache/ccache
RUN --mount=type=cache,target=/root/.cache/ccache \
140
    --mount=type=cache,target=/root/.cache/uv \
141
    --mount=type=bind,source=.git,target=.git  \
142
    if [ "$USE_SCCACHE" != "1" ]; then \
143
144
145
        # Clean any existing CMake artifacts
        rm -rf .deps && \
        mkdir -p .deps && \
146
        python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38; \
147
    fi
148

149
# Check the size of the wheel if RUN_WHEEL_CHECK is true
150
COPY .buildkite/check-wheel-size.py check-wheel-size.py
151
# sync the default value with .buildkite/check-wheel-size.py
152
ARG VLLM_MAX_SIZE_MB=400
153
154
155
156
157
158
159
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
160
#################### EXTENSION Build IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
161

162
163
164
#################### DEV IMAGE ####################
FROM base as dev

165
166
167
# 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
168
169
170
171
172
ENV UV_INDEX_STRATEGY="unsafe-best-match"

# Workaround for #17068
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install --system --no-build-isolation "git+https://github.com/state-spaces/mamba@v2.2.4"
173

174
175
176
COPY requirements/lint.txt requirements/lint.txt
COPY requirements/test.txt requirements/test.txt
COPY requirements/dev.txt requirements/dev.txt
177
RUN --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
178
179
    uv pip install --system -r requirements/dev.txt \
    --extra-index-url https://download.pytorch.org/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
180
#################### DEV IMAGE ####################
181

182
183
#################### vLLM installation IMAGE ####################
# image with vLLM installed
184
185
# TODO: Restore to base image after FlashInfer AOT wheel fixed
FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 AS vllm-base
Huy Do's avatar
Huy Do committed
186
ARG CUDA_VERSION=12.8.1
187
ARG PYTHON_VERSION=3.12
Simon Mo's avatar
Simon Mo committed
188
WORKDIR /vllm-workspace
189
ENV DEBIAN_FRONTEND=noninteractive
190
191
ARG TARGETPLATFORM

Kebe's avatar
Kebe committed
192
193
SHELL ["/bin/bash", "-c"]

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

197
198
199
200
201
202
# 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 \
    && apt-get install -y ccache software-properties-common git curl wget sudo vim python3-pip \
    && apt-get install -y ffmpeg libsm6 libxext6 libgl1 \
203
204
205
206
    && 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 \
207
208
209
210
211
212
213
214
215
216
    && apt-get update -y \
    && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv libibverbs-dev \
    && 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 \
    && curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} \
    && python3 --version && python3 -m pip --version
# Install uv for faster pip installs
RUN --mount=type=cache,target=/root/.cache/uv \
    python3 -m pip install uv
217

218
219
220
# 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
221
ENV UV_INDEX_STRATEGY="unsafe-best-match"
222

223
224
225
226
# 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.
227
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
228

229
230
231
232
# arm64 (GH200) build follows the practice of "use existing pytorch" build,
# we need to install torch and torchvision from the nightly builds first,
# pytorch will not appear as a vLLM dependency in all of the following steps
# after this step
233
RUN --mount=type=cache,target=/root/.cache/uv \
234
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
235
236
        uv pip install --system --index-url https://download.pytorch.org/whl/nightly/cu128 "torch==2.8.0.dev20250318+cu128" "torchvision==0.22.0.dev20250319";  \
        uv pip install --system --index-url https://download.pytorch.org/whl/nightly/cu128 --pre pytorch_triton==3.3.0+gitab727c40; \
237
238
    fi

239
# Install vllm wheel first, so that torch etc will be installed.
240
RUN --mount=type=bind,from=build,src=/workspace/dist,target=/vllm-workspace/dist \
241
    --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
242
243
    uv pip install --system dist/*.whl --verbose \
    --extra-index-url https://download.pytorch.org/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
Mor Zusman's avatar
Mor Zusman committed
244

245
# If we need to build FlashInfer wheel before its release:
246
247
248
249
250
251
# $ export FLASHINFER_ENABLE_AOT=1
# $ # Note we remove 7.0 from the arch list compared to the list below, since FlashInfer only supports sm75+
# $ export TORCH_CUDA_ARCH_LIST='7.5 8.0 8.6 8.9 9.0+PTX'
# $ git clone https://github.com/flashinfer-ai/flashinfer.git --recursive
# $ cd flashinfer
# $ git checkout 524304395bd1d8cd7d07db083859523fcaa246a4
252
# $ rm -rf build
253
# $ python3 setup.py bdist_wheel --dist-dir=dist --verbose
254
255
# $ ls dist
# $ # upload the wheel to a public location, e.g. https://wheels.vllm.ai/flashinfer/524304395bd1d8cd7d07db083859523fcaa246a4/flashinfer_python-0.2.1.post1+cu124torch2.5-cp38-abi3-linux_x86_64.whl
256

257
RUN --mount=type=cache,target=/root/.cache/uv \
258
. /etc/environment && \
259
if [ "$TARGETPLATFORM" != "linux/arm64" ]; then \
260
    # FlashInfer alreary has a wheel for PyTorch 2.7.0 and CUDA 12.8. This is enough for CI use
261
    if [[ "$CUDA_VERSION" == 12.8* ]]; then \
262
        uv pip install --system https://download.pytorch.org/whl/cu128/flashinfer/flashinfer_python-0.2.5%2Bcu128torch2.7-cp38-abi3-linux_x86_64.whl; \
263
264
    else \
        export TORCH_CUDA_ARCH_LIST='7.5 8.0 8.9 9.0+PTX'; \
265
266
267
268
269
270
        CUDA_MAJOR="${CUDA_VERSION%%.*}"; \
        if [ "$CUDA_MAJOR" -lt 12 ]; then \
            export FLASHINFER_ENABLE_SM90=0; \
        fi; \
        uv pip install --system --no-build-isolation "git+https://github.com/flashinfer-ai/flashinfer@21ea1d2545f74782b91eb8c08fd503ac4c0743fc" ; \
    fi \
271
fi
272
COPY examples examples
273
COPY benchmarks benchmarks
274
COPY ./vllm/collect_env.py .
275

Huy Do's avatar
Huy Do committed
276
277
278
279
RUN --mount=type=cache,target=/root/.cache/uv \
. /etc/environment && \
uv pip list

280
# Even when we build Flashinfer with AOT mode, there's still
281
282
283
# some issues w.r.t. JIT compilation. Therefore we need to
# install build dependencies for JIT compilation.
# TODO: Remove this once FlashInfer AOT wheel is fixed
284
COPY requirements/build.txt requirements/build.txt
285
RUN --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
286
287
    uv pip install --system -r requirements/build.txt \
    --extra-index-url https://download.pytorch.org/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
288

289
#################### vLLM installation IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
290

291
292
293
294
#################### 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
295

296
ADD . /vllm-workspace/
Stephen Krider's avatar
Stephen Krider committed
297

298
299
300
# 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
301
ENV UV_INDEX_STRATEGY="unsafe-best-match"
302

303
304
# Workaround for #17068
RUN --mount=type=cache,target=/root/.cache/uv \
Huy Do's avatar
Huy Do committed
305
306
307
    uv pip install --system --no-build-isolation "git+https://github.com/state-spaces/mamba@v2.2.4"

# install development dependencies (for testing)
308
309
310
311
312
RUN --mount=type=cache,target=/root/.cache/uv \   
    CUDA_MAJOR="${CUDA_VERSION%%.*}"; \
    if [ "$CUDA_MAJOR" -ge 12 ]; then \
        uv pip install --system -r requirements/dev.txt; \
    fi
313

youkaichao's avatar
youkaichao committed
314
# install development dependencies (for testing)
315
RUN --mount=type=cache,target=/root/.cache/uv \
316
    uv pip install --system -e tests/vllm_test_utils
youkaichao's avatar
youkaichao committed
317

318
# enable fast downloads from hf (for testing)
319
RUN --mount=type=cache,target=/root/.cache/uv \
320
    uv pip install --system hf_transfer
321
322
ENV HF_HUB_ENABLE_HF_TRANSFER 1

Joe Runde's avatar
Joe Runde committed
323
324
325
# Copy in the v1 package for testing (it isn't distributed yet)
COPY vllm/v1 /usr/local/lib/python3.12/dist-packages/vllm/v1

326
327
328
329
330
# doc requires source code
# we hide them inside `test_docs/` , so that this source code
# will not be imported by other tests
RUN mkdir test_docs
RUN mv docs test_docs/
331
RUN cp -r examples test_docs/
332
RUN mv vllm test_docs/
333
RUN mv mkdocs.yaml test_docs/
334
#################### TEST IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
335

Simon Mo's avatar
Simon Mo committed
336
#################### OPENAI API SERVER ####################
337
338
# base openai image with additional requirements, for any subsequent openai-style images
FROM vllm-base AS vllm-openai-base
339
ARG TARGETPLATFORM
340

341
342
343
344
# 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

345
# install additional dependencies for openai api server
346
RUN --mount=type=cache,target=/root/.cache/uv \
347
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
348
        uv pip install --system accelerate hf_transfer 'modelscope!=1.15.0' 'bitsandbytes>=0.42.0' 'timm==0.9.10' boto3 runai-model-streamer runai-model-streamer[s3]; \
349
    else \
350
        uv pip install --system accelerate hf_transfer 'modelscope!=1.15.0' 'bitsandbytes>=0.45.3' 'timm==0.9.10' boto3 runai-model-streamer runai-model-streamer[s3]; \
351
    fi
352

yhu422's avatar
yhu422 committed
353
354
ENV VLLM_USAGE_SOURCE production-docker-image

355
356
357
# define sagemaker first, so it is not default from `docker build`
FROM vllm-openai-base AS vllm-sagemaker

358
COPY examples/online_serving/sagemaker-entrypoint.sh .
359
360
361
362
363
RUN chmod +x sagemaker-entrypoint.sh
ENTRYPOINT ["./sagemaker-entrypoint.sh"]

FROM vllm-openai-base AS vllm-openai

Stephen Krider's avatar
Stephen Krider committed
364
ENTRYPOINT ["python3", "-m", "vllm.entrypoints.openai.api_server"]
Simon Mo's avatar
Simon Mo committed
365
#################### OPENAI API SERVER ####################