Dockerfile 12.6 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

8
ARG CUDA_VERSION=12.4.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
12
ARG CUDA_VERSION=12.4.1
13
ARG PYTHON_VERSION=3.12
14
ARG TARGETPLATFORM
15
16
ENV DEBIAN_FRONTEND=noninteractive

17
# Install minimal dependencies and uv
18
19
20
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 \
21
22
23
24
25
26
27
28
29
    && apt-get install -y ccache git curl wget sudo \
    && curl -LsSf https://astral.sh/uv/install.sh | sh

# Add uv to PATH
ENV PATH="/root/.local/bin:$PATH"
# Create venv with specified Python and activate by placing at the front of path
ENV VIRTUAL_ENV="/opt/venv"
RUN uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV}
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
Stephen Krider's avatar
Stephen Krider committed
30

31
32
33
34
# 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

35
36
37
38
39
40
41
42
# 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

43
44
45
46
# 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.
47
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
48

Stephen Krider's avatar
Stephen Krider committed
49
50
WORKDIR /workspace

51
52
53
54
# 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
55
RUN --mount=type=cache,target=/root/.cache/uv \
56
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
57
        uv pip install --index-url https://download.pytorch.org/whl/nightly/cu126 "torch==2.7.0.dev20250121+cu126" "torchvision==0.22.0.dev20250121";  \
58
    fi
Mor Zusman's avatar
Mor Zusman committed
59

60
61
COPY requirements-common.txt requirements-common.txt
COPY requirements-cuda.txt requirements-cuda.txt
62
RUN --mount=type=cache,target=/root/.cache/uv \
63
    uv pip install -r requirements-cuda.txt
64

65
66
67
68
69
70
# 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
ARG torch_cuda_arch_list='7.0 7.5 8.0 8.6 8.9 9.0+PTX'
ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list}
71
72
73
# 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
74
75
#################### BASE BUILD IMAGE ####################

76
#################### WHEEL BUILD IMAGE ####################
77
FROM base AS build
78
ARG TARGETPLATFORM
79

80
81
# install build dependencies
COPY requirements-build.txt requirements-build.txt
82

83
84
85
86
# 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

87
RUN --mount=type=cache,target=/root/.cache/uv \
88
    uv pip install -r requirements-build.txt
89

90
COPY . .
91
92
ARG GIT_REPO_CHECK=0
RUN --mount=type=bind,source=.git,target=.git \
93
    if [ "$GIT_REPO_CHECK" != "0" ]; then bash tools/check_repo.sh ; fi
Stephen Krider's avatar
Stephen Krider committed
94
95

# max jobs used by Ninja to build extensions
96
97
ARG max_jobs=2
ENV MAX_JOBS=${max_jobs}
98
99
100
# number of threads used by nvcc
ARG nvcc_threads=8
ENV NVCC_THREADS=$nvcc_threads
101

102
ARG USE_SCCACHE
103
104
ARG SCCACHE_BUCKET_NAME=vllm-build-sccache
ARG SCCACHE_REGION_NAME=us-west-2
105
ARG SCCACHE_S3_NO_CREDENTIALS=0
106
# if USE_SCCACHE is set, use sccache to speed up compilation
107
RUN --mount=type=cache,target=/root/.cache/uv \
108
    --mount=type=bind,source=.git,target=.git \
109
110
111
112
113
114
    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 \
115
116
        && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \
        && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \
117
        && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \
118
        && export SCCACHE_IDLE_TIMEOUT=0 \
119
        && export CMAKE_BUILD_TYPE=Release \
120
        && sccache --show-stats \
121
        && python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38 \
122
123
124
        && sccache --show-stats; \
    fi

125
126
ENV CCACHE_DIR=/root/.cache/ccache
RUN --mount=type=cache,target=/root/.cache/ccache \
127
    --mount=type=cache,target=/root/.cache/uv \
128
    --mount=type=bind,source=.git,target=.git  \
129
    if [ "$USE_SCCACHE" != "1" ]; then \
130
131
132
        # Clean any existing CMake artifacts
        rm -rf .deps && \
        mkdir -p .deps && \
133
        python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38; \
134
    fi
135

136
# Check the size of the wheel if RUN_WHEEL_CHECK is true
137
COPY .buildkite/check-wheel-size.py check-wheel-size.py
138
# sync the default value with .buildkite/check-wheel-size.py
139
ARG VLLM_MAX_SIZE_MB=400
140
141
142
143
144
145
146
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
147
#################### EXTENSION Build IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
148

149
150
151
#################### DEV IMAGE ####################
FROM base as dev

152
153
154
155
# 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

156
157
158
COPY requirements-lint.txt requirements-lint.txt
COPY requirements-test.txt requirements-test.txt
COPY requirements-dev.txt requirements-dev.txt
159
RUN --mount=type=cache,target=/root/.cache/uv \
160
    uv pip install -r requirements-dev.txt
161
#################### DEV IMAGE ####################
162

163
164
#################### vLLM installation IMAGE ####################
# image with vLLM installed
165
166
# TODO: Restore to base image after FlashInfer AOT wheel fixed
FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 AS vllm-base
167
ARG CUDA_VERSION=12.4.1
168
ARG PYTHON_VERSION=3.12
Simon Mo's avatar
Simon Mo committed
169
WORKDIR /vllm-workspace
170
ENV DEBIAN_FRONTEND=noninteractive
171
172
ARG TARGETPLATFORM

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

176
# Install minimal dependencies and uv
177
178
179
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 \
180
181
182
183
184
185
186
187
188
189
    && apt-get install -y ccache git curl wget sudo vim \
    && apt-get install -y ffmpeg libsm6 libxext6 libgl1 libibverbs-dev \
    && curl -LsSf https://astral.sh/uv/install.sh | sh

# Add uv to PATH
ENV PATH="/root/.local/bin:$PATH"
# Create venv with specified Python and activate by placing at the front of path
ENV VIRTUAL_ENV="/opt/venv"
RUN uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV}
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
190

191
192
193
194
# 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

195
196
197
198
# 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.
199
RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/
200

201
202
203
204
# 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
205
RUN --mount=type=cache,target=/root/.cache/uv \
206
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
207
        uv pip install --index-url https://download.pytorch.org/whl/nightly/cu124 "torch==2.6.0.dev20241210+cu124" "torchvision==0.22.0.dev20241215";  \
208
209
    fi

210
# Install vllm wheel first, so that torch etc will be installed.
211
RUN --mount=type=bind,from=build,src=/workspace/dist,target=/vllm-workspace/dist \
212
    --mount=type=cache,target=/root/.cache/uv \
213
    uv pip install dist/*.whl --verbose
Mor Zusman's avatar
Mor Zusman committed
214

215
# If we need to build FlashInfer wheel before its release:
216
217
218
219
220
221
# $ 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
222
# $ rm -rf build
223
# $ python3 setup.py bdist_wheel --dist-dir=dist --verbose
224
225
# $ 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
226

227
RUN --mount=type=cache,target=/root/.cache/uv \
228
if [ "$TARGETPLATFORM" != "linux/arm64" ]; then \
229
    uv pip install https://github.com/flashinfer-ai/flashinfer/releases/download/v0.2.1.post1/flashinfer_python-0.2.1.post1+cu124torch2.5-cp38-abi3-linux_x86_64.whl ; \
230
fi
231
COPY examples examples
232
233
234
235
236
237

# Although we build Flashinfer with AOT mode, there's still
# 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
COPY requirements-build.txt requirements-build.txt
238
RUN --mount=type=cache,target=/root/.cache/uv \
239
    uv pip install -r requirements-build.txt
240

241
#################### vLLM installation IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
242

243
244
245
246
#################### 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
247

248
ADD . /vllm-workspace/
Stephen Krider's avatar
Stephen Krider committed
249

250
251
252
253
# 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

254
# install development dependencies (for testing)
255
RUN --mount=type=cache,target=/root/.cache/uv \
256
    uv pip install -r requirements-dev.txt
257

youkaichao's avatar
youkaichao committed
258
# install development dependencies (for testing)
259
RUN --mount=type=cache,target=/root/.cache/uv \
260
    uv pip install -e tests/vllm_test_utils
youkaichao's avatar
youkaichao committed
261

262
# enable fast downloads from hf (for testing)
263
RUN --mount=type=cache,target=/root/.cache/uv \
264
    uv pip install hf_transfer
265
266
ENV HF_HUB_ENABLE_HF_TRANSFER 1

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

270
271
272
273
274
275
276
# 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/
RUN mv vllm test_docs/
#################### TEST IMAGE ####################
Stephen Krider's avatar
Stephen Krider committed
277

Simon Mo's avatar
Simon Mo committed
278
#################### OPENAI API SERVER ####################
279
280
# base openai image with additional requirements, for any subsequent openai-style images
FROM vllm-base AS vllm-openai-base
281

282
283
284
285
# 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

286
# install additional dependencies for openai api server
287
RUN --mount=type=cache,target=/root/.cache/uv \
288
    if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
289
        uv pip install accelerate hf_transfer 'modelscope!=1.15.0' 'bitsandbytes>=0.42.0' 'timm==0.9.10' boto3 runai-model-streamer runai-model-streamer[s3]; \
290
    else \
291
        uv pip install accelerate hf_transfer 'modelscope!=1.15.0' 'bitsandbytes>=0.45.0' 'timm==0.9.10' boto3 runai-model-streamer runai-model-streamer[s3]; \
292
    fi
293

yhu422's avatar
yhu422 committed
294
295
ENV VLLM_USAGE_SOURCE production-docker-image

296
297
298
# define sagemaker first, so it is not default from `docker build`
FROM vllm-openai-base AS vllm-sagemaker

299
COPY examples/online_serving/sagemaker-entrypoint.sh .
300
301
302
303
304
RUN chmod +x sagemaker-entrypoint.sh
ENTRYPOINT ["./sagemaker-entrypoint.sh"]

FROM vllm-openai-base AS vllm-openai

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