| 1 | # Base UBI image |
| 2 | ARG BASE_UBI_IMAGE_TAG=9.6-1754584681 |
| 3 | |
| 4 | ############################################################### |
| 5 | # BUILDER STAGE # |
| 6 | ############################################################### |
| 7 | |
| 8 | FROM registry.access.redhat.com/ubi9/ubi-minimal:${BASE_UBI_IMAGE_TAG} AS builder-base |
| 9 | |
| 10 | ARG VLLM_VERSION="0.22.1" |
| 11 | ARG PYTHON_VERSION=3.12 |
| 12 | ARG VLLM_TARGET_DEVICE=cpu |
| 13 | |
| 14 | USER root |
| 15 | WORKDIR /root |
| 16 | |
| 17 | ENV HOME=/root \ |
| 18 | WHEEL_DIR=/wheelsdir \ |
| 19 | VIRTUAL_ENV=/opt/vllm \ |
| 20 | GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 \ |
| 21 | CARGO_HOME=/root/.cargo \ |
| 22 | RUSTUP_HOME=/root/.rustup \ |
| 23 | UV_CACHE_DIR=$HOME/.cache/uv \ |
| 24 | PATH=/root/.cargo/bin:/root/.rustup/bin:${VIRTUAL_ENV}/bin:$PATH |
| 25 | ENV UV_COMPILE_BYTECODE=1 |
| 26 | |
| 27 | RUN echo "DEBUG: VLLM_VERSION=${VLLM_VERSION}" |
| 28 | RUN --mount=type=cache,target=/var/cache/dnf \ |
| 29 | microdnf install -y \ |
| 30 | python${PYTHON_VERSION}-devel python${PYTHON_VERSION}-pip \ |
| 31 | && python${PYTHON_VERSION} -m venv ${VIRTUAL_ENV} \ |
| 32 | && python${PYTHON_VERSION} -m pip install -U pip uv --no-cache |
| 33 | |
| 34 | # Important: Copy only bare minimum required for the script to run |
| 35 | COPY requirements/ requirements/ |
| 36 | COPY pyproject.toml ./ |
| 37 | |
| 38 | # The script is expected to install whatever python dependencies are missing |
| 39 | # as well as whatever system libraries need to be installed from source |
| 40 | COPY docker/build_vllm_*.sh docker/ |
| 41 | |
| 42 | RUN --mount=type=cache,target=/root/.cache/uv \ |
| 43 | sh ./docker/build_vllm_$(uname -m).sh |
| 44 | |
| 45 | # copy vllm source code to build cache |
| 46 | COPY . . |
| 47 | |
| 48 | RUN --mount=type=cache,target=/root/.cache/uv \ |
| 49 | source /opt/rh/gcc-toolset-14/enable && \ |
| 50 | pip install -U uv |
| 51 | |
| 52 | # build & install vLLM so that all transitive dependencies are build/downloaded into the uv cache |
| 53 | RUN --mount=type=cache,target=/root/.cache/uv \ |
| 54 | source /opt/rh/gcc-toolset-14/enable && \ |
| 55 | export PATH=/opt/rh/gcc-toolset-14/root/usr/bin:$PATH && \ |
| 56 | export CC=/opt/rh/gcc-toolset-14/root/usr/bin/gcc && \ |
| 57 | export CXX=/opt/rh/gcc-toolset-14/root/usr/bin/g++ && \ |
| 58 | export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:$PKG_CONFIG_PATH && \ |
| 59 | export CMAKE_PREFIX_PATH=/usr/local:/usr:$CMAKE_PREFIX_PATH && \ |
| 60 | export Protobuf_PROTOC_EXECUTABLE=/usr/bin/protoc && \ |
| 61 | export CFLAGS="-mcpu=power10 -mtune=power10" && \ |
| 62 | export CXXFLAGS="-mcpu=power10 -mtune=power10" && \ |
| 63 | export DNNL_ARCH_OPT_FLAGS="-mcpu=power10 -mtune=power10" && \ |
| 64 | export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH && \ |
| 65 | export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH && \ |
| 66 | uv pip install 'setuptools>=78.1.1' && \ |
| 67 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/OpenBLAS/lib/:/usr/local/lib64:/usr/local/lib && \ |
| 68 | export LIBGOMP=/opt/rh/gcc-toolset-14/root/usr/lib/gcc/ppc64le-redhat-linux/14/libgomp.so && \ |
| 69 | |
| 70 | export CMAKE_LIBRARY_PATH=$(dirname $LIBGOMP):${CMAKE_LIBRARY_PATH} && \ |
| 71 | export LIBRARY_PATH=$(dirname $LIBGOMP):${LIBRARY_PATH} && \ |
| 72 | export LD_LIBRARY_PATH=$(dirname $LIBGOMP):${LD_LIBRARY_PATH} && \ |
| 73 | |
| 74 | echo "LIBGOMP=${LIBGOMP}" && \ |
| 75 | find /root/.cache/uv -name "*.whl" && \ |
| 76 | SETUPTOOLS_SCM_PRETEND_VERSION="$VLLM_VERSION" uv build \ |
| 77 | --wheel --out-dir ${WHEEL_DIR} --no-build-isolation && \ |
| 78 | uv pip install "$(echo ${WHEEL_DIR}/vllm*.whl)[tensorizer]" --refresh |
| 79 | |
| 80 | ############################################################### |
| 81 | # FINAL VLLM IMAGE STAGE # |
| 82 | ############################################################### |
| 83 | |
| 84 | FROM registry.access.redhat.com/ubi9/ubi-minimal:${BASE_UBI_IMAGE_TAG} AS vllm-openai |
| 85 | |
| 86 | ARG PYTHON_VERSION=3.12 |
| 87 | ENV VLLM_NO_USAGE_STATS=1 |
| 88 | |
| 89 | # Set Environment Variables for venv & openblas |
| 90 | ENV VIRTUAL_ENV=/opt/vllm |
| 91 | ENV PCP_DIR=/opt/rh/gcc-toolset-14/root |
| 92 | ENV PATH=${VIRTUAL_ENV}/bin:${PCP_DIR}/usr/bin:/usr/local/bin:$PATH |
| 93 | ENV PKG_CONFIG_PATH=${PCP_DIR}/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig/ |
| 94 | ENV C_INCLUDE_PATH="/usr/local/include:$C_INCLUDE_PATH" |
| 95 | ENV LD_LIBRARY_PATH=${PCP_DIR}/usr/lib64:${PCP_DIR}/usr/lib:${VIRTUAL_ENV}/lib64/python${PYTHON_VERSION}/site-packages/torch/lib:/usr/local/lib:$LD_LIBRARY_PATH:/usr/local/lib64:/usr/lib64:/usr/lib |
| 96 | ENV UV_LINK_MODE=copy |
| 97 | ARG VLLM_VERSION="0.22.1" |
| 98 | ARG UV_EXTRA_INDEX_URL="https://wheels.developerfirst.ibm.com/ppc64le/linux/+simple/" |
| 99 | ENV UV_EXTRA_INDEX_URL=${UV_EXTRA_INDEX_URL} |
| 100 | ENV UV_INDEX_STRATEGY=first-match |
| 101 | |
| 102 | |
| 103 | RUN --mount=type=cache,target=/root/.cache/uv \ |
| 104 | rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && \ |
| 105 | microdnf install --nodocs -y \ |
| 106 | libomp libicu tar autoconf automake libtool findutils openssl numactl numactl-devel \ |
| 107 | pkgconfig xsimd gcc-toolset-14 libsndfile \ |
| 108 | libtiff libjpeg openjpeg2 zlib zeromq \ |
| 109 | freetype lcms2 libwebp tcl tk utf8proc \ |
| 110 | harfbuzz fribidi libraqm libimagequant libxcb util-linux gperftools-libs \ |
| 111 | python${PYTHON_VERSION}-devel python${PYTHON_VERSION}-pip \ |
| 112 | && source /opt/rh/gcc-toolset-14/enable \ |
| 113 | && microdnf update -y \ |
| 114 | && microdnf clean all |
| 115 | |
| 116 | # The `lscpu` command was added as a requirement in part of https://github.com/vllm-project/vllm/pull/21032, so installing it. |
| 117 | RUN microdnf install --nodocs -y util-linux && \ |
| 118 | microdnf clean all |
| 119 | |
| 120 | COPY --from=builder-base /usr/lib64/libprotobuf.so.25 /usr/lib64/ |
| 121 | COPY --from=builder-base /usr/lib64/libprotobuf.so.25.0.0 /usr/lib64/ |
| 122 | |
| 123 | # Use builder venv in final stage instead of wheel reinstallation |
| 124 | COPY --from=builder-base /opt/vllm /opt/vllm |
| 125 | |
| 126 | ENV LD_PRELOAD=/usr/lib64/libtcmalloc.so.4 |
| 127 | |
| 128 | WORKDIR /home/vllm |
| 129 | |
| 130 | # setup non-root user for OpenShift |
| 131 | RUN umask 002 && \ |
| 132 | useradd --uid 2000 --gid 0 vllm && \ |
| 133 | mkdir -p /home/vllm && \ |
| 134 | chmod g+rwx /home/vllm |
| 135 | |
| 136 | ENV HOME=/home/vllm |
| 137 | |
| 138 | # Add labels to document build configuration |
| 139 | LABEL org.opencontainers.image.title="vLLM CPU" |
| 140 | LABEL org.opencontainers.image.description="vLLM inference engine for CPU platforms" |
| 141 | LABEL org.opencontainers.image.vendor="vLLM Project" |
| 142 | LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" |
| 143 | |
| 144 | # Build configuration labels |
| 145 | ARG TARGETARCH |
| 146 | ARG VLLM_CPU_PPC64LE |
| 147 | ARG PYTHON_VERSION |
| 148 | |
| 149 | LABEL ai.vllm.build.target-arch="${TARGETARCH}" |
| 150 | LABEL ai.vllm.build.cpu-ppc64le="${VLLM_CPU_PPC64LE:-false}" |
| 151 | LABEL ai.vllm.build.python-version="${PYTHON_VERSION:-3.12}" |
| 152 | |
| 153 | USER 2000 |
| 154 | |
| 155 | ENTRYPOINT ["vllm", "serve"] |
| 156 | |
| 157 |