Dockerfile.cpu 7.72 KB
Newer Older
1
2
3
4
5
6
7
8
# This vLLM Dockerfile is used to build images that can run vLLM on both x86_64 and arm64 CPU platforms.
#
# Supported platforms:
#   - linux/amd64 (x86_64)
#   - linux/arm64 (aarch64)
#
# Use the `--platform` option with `docker buildx build` to specify the target architecture, e.g.:
#   docker buildx build --platform=linux/arm64 -f docker/Dockerfile.cpu .
9
10
11
12
13
14
15
#
# Build targets:
#   vllm-openai (default): used for serving deployment
#   vllm-test: used for CI tests
#   vllm-dev: used for development
#
# Build arguments:
16
#   PYTHON_VERSION=3.13|3.12 (default)|3.11|3.10
17
#   VLLM_CPU_X86=false (default)|true (for cross-compilation)
18
#   VLLM_CPU_ARM_BF16=false (default)|true (for cross-compilation)
19
20
#

21
22
######################### COMMON BASE IMAGE #########################
FROM ubuntu:22.04 AS base-common
23

24
WORKDIR /workspace
25

26
27
ARG PYTHON_VERSION=3.12
ARG PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu"
28

29
30
31
32
# Install minimal dependencies and uv
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
    apt-get update -y \
33
    && apt-get install -y --no-install-recommends sudo ccache git curl wget ca-certificates \
34
    gcc-12 g++-12 libtcmalloc-minimal4 libnuma-dev ffmpeg libsm6 libxext6 libgl1 jq lsof make xz-utils \
35
36
37
    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12 \
    && curl -LsSf https://astral.sh/uv/install.sh | sh

38
ENV CC=/usr/bin/gcc-12 CXX=/usr/bin/g++-12
39
ENV CCACHE_DIR=/root/.cache/ccache
40
41
ENV CMAKE_CXX_COMPILER_LAUNCHER=ccache

42
43
ENV PATH="/root/.local/bin:$PATH"
ENV VIRTUAL_ENV="/opt/venv"
44
ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python
45
46
RUN uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV}
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
47

48
ENV UV_HTTP_TIMEOUT=500
49

50
# Install Python dependencies
51
52
53
54
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"
55
56
57
58
59

# Copy requirements files for installation
COPY requirements/common.txt requirements/common.txt
COPY requirements/cpu.txt requirements/cpu.txt

60
61
62
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install --upgrade pip && \
    uv pip install -r requirements/cpu.txt
63

64
65
66
ARG TARGETARCH
ENV TARGETARCH=${TARGETARCH}

67
68
69
70
######################### x86_64 BASE IMAGE #########################
FROM base-common AS base-amd64

ENV LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:/opt/venv/lib/libiomp5.so"
71

72
73
######################### arm64 BASE IMAGE #########################
FROM base-common AS base-arm64
74

75
76
77
78
ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4"

######################### BASE IMAGE #########################
FROM base-${TARGETARCH} AS base
79

80
RUN echo 'ulimit -c 0' >> ~/.bashrc
81

82
83
######################### BUILD IMAGE #########################
FROM base AS vllm-build
84

85
ARG max_jobs=32
86
87
ENV MAX_JOBS=${max_jobs}

88
ARG GIT_REPO_CHECK=0
89
90
91
# Support for cross-compilation with x86 ISA including AVX2 and AVX512: docker build --build-arg VLLM_CPU_X86="true" ...
ARG VLLM_CPU_X86=0
ENV VLLM_CPU_X86=${VLLM_CPU_X86}
92
93
94
# Support for cross-compilation with ARM BF16 ISA: docker build --build-arg VLLM_CPU_ARM_BF16="true" ...
ARG VLLM_CPU_ARM_BF16=0
ENV VLLM_CPU_ARM_BF16=${VLLM_CPU_ARM_BF16}
95

96
WORKDIR /vllm-workspace
97

98
# Validate build arguments - prevent mixing incompatible ISA flags
99
RUN if [ "$TARGETARCH" = "arm64" ] && [ "$VLLM_CPU_X86" != "0" ]; then \
100
101
102
103
104
105
106
107
        echo "ERROR: Cannot use x86-specific ISA flags (AVX2, AVX512, etc.) when building for ARM64 (--platform=linux/arm64)"; \
        exit 1; \
    fi && \
    if [ "$TARGETARCH" = "amd64" ] && [ "$VLLM_CPU_ARM_BF16" != "0" ]; then \
        echo "ERROR: Cannot use ARM-specific ISA flags (ARM_BF16) when building for x86_64 (--platform=linux/amd64)"; \
        exit 1; \
    fi

108
109
110
# Copy build requirements
COPY requirements/cpu-build.txt requirements/build.txt

111
112
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install -r requirements/build.txt
113

114
COPY . .
115
116

RUN if [ "$GIT_REPO_CHECK" != 0 ]; then bash tools/check_repo.sh ; fi
117

118
119
RUN --mount=type=cache,target=/root/.cache/uv \
    --mount=type=cache,target=/root/.cache/ccache \
120
    --mount=type=cache,target=/vllm-workspace/.deps,sharing=locked \
121
    VLLM_TARGET_DEVICE=cpu python3 setup.py bdist_wheel --dist-dir=dist --py-limited-api=cp38
122

123
124
125
######################### TEST DEPS #########################
FROM base AS vllm-test-deps

126
WORKDIR /vllm-workspace
127

128
129
130
131
# Copy test requirements
COPY requirements/test.in requirements/cpu-test.in

RUN \
132
    sed -i '/mamba_ssm/d' requirements/cpu-test.in && \
133
    remove_packages_not_supported_on_aarch64() { \
134
135
136
137
138
139
    case "$(uname -m)" in \
    aarch64|arm64) \
    sed -i '/decord/d' requirements/cpu-test.in; \
    sed -i '/terratorch/d' requirements/cpu-test.in; \
    ;; \
    esac; \
140
141
    }; \
    remove_packages_not_supported_on_aarch64 && \
142
    sed -i 's/^torch==.*/torch==2.10.0/g' requirements/cpu-test.in && \
143
144
    sed -i 's/torchaudio.*/torchaudio/g' requirements/cpu-test.in && \
    sed -i 's/torchvision.*/torchvision/g' requirements/cpu-test.in && \
145
146
147
    uv pip compile requirements/cpu-test.in -o requirements/cpu-test.txt --index-strategy unsafe-best-match --torch-backend cpu

RUN --mount=type=cache,target=/root/.cache/uv \
148
    uv pip install -r requirements/cpu-test.txt
149

150
151
152
######################### DEV IMAGE #########################
FROM vllm-build AS vllm-dev

153
WORKDIR /vllm-workspace
154
155
156

RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
157
    apt-get install -y --no-install-recommends vim numactl clangd-14
158
159

RUN ln -s /usr/bin/clangd-14 /usr/bin/clangd
160
161
162

# install development dependencies (for testing)
RUN --mount=type=cache,target=/root/.cache/uv \
163
    uv pip install -e tests/vllm_test_utils
164

165
RUN --mount=type=cache,target=/root/.cache/uv \
166
    --mount=type=cache,target=/root/.cache/ccache \
167
    --mount=type=bind,source=.git,target=.git \
168
    VLLM_TARGET_DEVICE=cpu python3 setup.py develop
169

170
COPY --from=vllm-test-deps /vllm-workspace/requirements/cpu-test.txt requirements/test.txt
171

172
173
174
175
176
177
178
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install -r requirements/dev.txt && \
    pre-commit install --hook-type pre-commit --hook-type commit-msg

ENTRYPOINT ["bash"]

######################### TEST IMAGE #########################
179
FROM vllm-test-deps AS vllm-test
180

181
WORKDIR /vllm-workspace
182

183
RUN --mount=type=cache,target=/root/.cache/uv \
184
    --mount=type=bind,from=vllm-build,src=/vllm-workspace/dist,target=dist \
185
186
187
188
189
    uv pip install dist/*.whl

ADD ./tests/ ./tests/
ADD ./examples/ ./examples/
ADD ./benchmarks/ ./benchmarks/
190
ADD ./vllm/collect_env.py .
191
ADD ./.buildkite/ ./.buildkite/
192

youkaichao's avatar
youkaichao committed
193
# install development dependencies (for testing)
194
RUN --mount=type=cache,target=/root/.cache/uv \
195
    uv pip install -e tests/vllm_test_utils
196
197
198
199

######################### RELEASE IMAGE #########################
FROM base AS vllm-openai

200
WORKDIR /vllm-workspace
201
202
203

RUN --mount=type=cache,target=/root/.cache/uv \
    --mount=type=cache,target=/root/.cache/ccache \
204
    --mount=type=bind,from=vllm-build,src=/vllm-workspace/dist,target=dist \
205
    uv pip install dist/*.whl
youkaichao's avatar
youkaichao committed
206

207
208
209
210
211
212
213
214
# Add labels to document build configuration
LABEL org.opencontainers.image.title="vLLM CPU"
LABEL org.opencontainers.image.description="vLLM inference engine for CPU platforms"
LABEL org.opencontainers.image.vendor="vLLM Project"
LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm"

# Build configuration labels
ARG TARGETARCH
215
ARG VLLM_CPU_X86
216
ARG VLLM_CPU_ARM_BF16
217
218
219
ARG PYTHON_VERSION

LABEL ai.vllm.build.target-arch="${TARGETARCH}"
220
LABEL ai.vllm.build.cpu-x86="${VLLM_CPU_X86:-false}"
221
LABEL ai.vllm.build.cpu-arm-bf16="${VLLM_CPU_ARM_BF16:-false}"
222
223
LABEL ai.vllm.build.python-version="${PYTHON_VERSION:-3.12}"

224
ENTRYPOINT ["vllm", "serve"]