[CI] Zen5 image build (#50314)

Signed-off-by: Chinmay Kulkarni <Chinmay.Kulkarni@amd.com> Signed-off-by: andy-neuma <alinfoot@redhat.com> Co-authored-by: Chinmay Kulkarni <Chinmay.Kulkarni@amd.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

Andy Linfoot committed Sep 3, 2026 at 17:34 UTC 6fdee17f849b1aad5b4d88ff13b475d2e73d8c1a
2 files changed +98 -17
docker/Dockerfile.cpu
-17
@@ -9,7 +9,6 @@
9 #
10 # Build targets:
11 # vllm-openai (default): used for serving deployment
12 -# vllm-openai-zen: vLLM from source + zentorch from PyPI via vllm[zen]
12 # vllm-test: used for CI tests
13 # vllm-dev: used for development
14 #
@@ -469,19 +468,3 @@ LABEL ai.vllm.build.python-version="${PYTHON_VERSION:-3.12}"
468 COPY examples examples
469
470 ENTRYPOINT ["vllm", "serve"]
472 -
473 -
474 -######################### ZEN CPU PYPI IMAGE #########################
475 -FROM vllm-openai AS vllm-openai-zen
476 -
477 -ARG TARGETARCH
478 -
479 -RUN if [ "$TARGETARCH" != "amd64" ]; then \
480 - echo "ERROR: vllm-openai-amd only supports --platform=linux/amd64"; \
481 - exit 1; \
482 - fi
483 -
484 -RUN --mount=type=cache,target=/root/.cache/uv \
485 - uv pip install "vllm[zen]"
486 -
487 -ENTRYPOINT ["vllm", "serve"]
docker/Dockerfile.zen new
+98
@@ -0,0 +1,98 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +
4 +# This Dockerfile builds AMD Zen CPU images for vLLM with zentorch.
5 +# It layers on top of the CPU image produced by docker/Dockerfile.cpu.
6 +#
7 +# Supported platforms:
8 +# - linux/amd64 (Zen2 and newer; Zen5 is the canonical CI target)
9 +#
10 +# Build targets:
11 +# vllm-openai-zen (default): vLLM + zentorch for serving
12 +# vllm-zen-test : vllm-openai-zen + test deps for CI
13 +#
14 +# Build workflow (see .buildkite/image_build/image_build_zen_cpu.sh):
15 +# 1. Obtain a CPU base image that already has vLLM installed. In CI this is the
16 +# shared `<repo>:<commit>-cpu` image (docker/Dockerfile.cpu --target
17 +# vllm-test); either the vllm-test or vllm-openai target works as the base
18 +# since both install vLLM into the same venv this stage extends.
19 +# 2. docker build -f docker/Dockerfile.zen --build-arg BASE_IMAGE=<base>:<tag> \
20 +# --target vllm-zen-test -t <out>:<tag> .
21 +
22 +ARG BASE_IMAGE
23 +ARG PYTHON_VERSION=3.12
24 +ARG ZENTORCH_VERSION
25 +
26 +######################### ZEN OPENAI IMAGE #########################
27 +FROM ${BASE_IMAGE} AS vllm-openai-zen
28 +
29 +ARG TARGETARCH
30 +ARG ZENTORCH_VERSION
31 +
32 +RUN if [ "${TARGETARCH}" != "amd64" ]; then \
33 + echo "ERROR: Dockerfile.zen requires --platform=linux/amd64"; \
34 + exit 1; \
35 + fi
36 +
37 +WORKDIR /vllm-workspace
38 +
39 +RUN --mount=type=cache,target=/root/.cache/uv \
40 + if [ -n "${ZENTORCH_VERSION}" ]; then \
41 + uv pip install "zentorch==${ZENTORCH_VERSION}"; \
42 + else \
43 + uv pip install "vllm[zen]"; \
44 + fi
45 +
46 +LABEL org.opencontainers.image.title="vLLM Zen CPU"
47 +LABEL org.opencontainers.image.description="vLLM with zentorch for AMD Zen CPUs"
48 +LABEL org.opencontainers.image.vendor="vLLM Project"
49 +LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm"
50 +LABEL ai.vllm.build.target-arch="${TARGETARCH}"
51 +LABEL ai.vllm.build.python-version="${PYTHON_VERSION}"
52 +LABEL ai.vllm.build.zentorch-version="${ZENTORCH_VERSION:-unpinned}"
53 +
54 +ENTRYPOINT ["vllm", "serve"]
55 +
56 +######################### ZEN TEST IMAGE #########################
57 +FROM vllm-openai-zen AS vllm-zen-test
58 +
59 +WORKDIR /vllm-workspace
60 +
61 +COPY requirements/common.txt requirements/common.txt
62 +COPY requirements/test/cuda.in requirements/test/zen.in
63 +
64 +RUN sed -i '/mamba_ssm/d' requirements/test/zen.in && \
65 + sed -i 's/^torch==.*/torch==2.13.0/g' requirements/test/zen.in && \
66 + sed -i 's/torchaudio.*/torchaudio/g' requirements/test/zen.in && \
67 + sed -i 's/torchvision.*/torchvision/g' requirements/test/zen.in && \
68 + # zentorch parity: keep sentence-transformers pinned where vllm-test-deps did.
69 + sed -i 's/^sentence-transformers.*/sentence-transformers==5.3.0/g' requirements/test/zen.in && \
70 + uv pip compile requirements/test/zen.in \
71 + -o requirements/test/zen.txt \
72 + --index-strategy unsafe-best-match --torch-backend cpu
73 +
74 +RUN --mount=type=cache,target=/root/.cache/uv \
75 + uv pip install -r requirements/test/zen.txt --torch-backend cpu
76 +
77 +# Reassert zentorch's torch in case test-deps moved it.
78 +RUN --mount=type=cache,target=/root/.cache/uv \
79 + if [ -n "${ZENTORCH_VERSION}" ]; then \
80 + uv pip install --force-reinstall --no-deps "zentorch==${ZENTORCH_VERSION}"; \
81 + else \
82 + uv pip install --force-reinstall --no-deps "vllm[zen]"; \
83 + fi
84 +
85 +ADD ./tests/ ./tests/
86 +ADD ./examples/ ./examples/
87 +ADD ./benchmarks/ ./benchmarks/
88 +ADD ./vllm/collect_env.py .
89 +ADD ./docker/ ./docker/
90 +ADD ./.buildkite/ ./.buildkite/
91 +
92 +RUN --mount=type=cache,target=/root/.cache/uv \
93 + uv pip install -e tests/vllm_test_utils
94 +
95 +ENV HF_XET_HIGH_PERFORMANCE=1
96 +ENV HF_HUB_DOWNLOAD_TIMEOUT=60
97 +
98 +ENTRYPOINT []
\ No newline at end of file