2026-01-06 14:26:42 +00:00
ARG BASE_IMAGE = ubuntu:24.04
2025-06-15 14:56:52 +02:00
FROM ${BASE_IMAGE } AS builder
ARG BACKEND = rerankers
ARG BUILD_TYPE
ENV BUILD_TYPE = ${ BUILD_TYPE }
ARG CUDA_MAJOR_VERSION
ARG CUDA_MINOR_VERSION
ARG SKIP_DRIVERS = false
ENV CUDA_MAJOR_VERSION = ${ CUDA_MAJOR_VERSION }
ENV CUDA_MINOR_VERSION = ${ CUDA_MINOR_VERSION }
ENV DEBIAN_FRONTEND = noninteractive
ARG TARGETARCH
ARG TARGETVARIANT
2026-01-06 14:26:42 +00:00
ARG UBUNTU_VERSION = 2404
2025-06-15 14:56:52 +02:00
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
ccache \
ca-certificates \
espeak-ng \
curl \
libssl-dev \
2025-12-03 21:42:33 +01:00
git wget \
2025-06-15 14:56:52 +02:00
git-lfs \
2025-08-23 22:36:39 +02:00
unzip clang \
2025-06-15 14:56:52 +02:00
upx-ucl \
curl python3-pip \
python-is-python3 \
python3-dev llvm \
2025-10-09 21:51:28 +02:00
python3-venv make cmake && \
2025-06-15 14:56:52 +02:00
apt-get clean && \
2025-12-03 22:54:13 +01:00
rm -rf /var/lib/apt/lists/*
RUN <<EOT bash
if [ " ${ UBUNTU_VERSION } " = "2404" ] ; then
pip install --break-system-packages --user --upgrade pip
else
pip install --upgrade pip
fi
EOT
2025-06-15 14:56:52 +02:00
# Cuda
ENV PATH = /usr/local/cuda/bin:${ PATH }
# HipBLAS requirements
ENV PATH = /opt/rocm/bin:${ PATH }
# Vulkan requirements
RUN <<EOT bash
if [ " ${ BUILD_TYPE } " = "vulkan" ] && [ " ${ SKIP_DRIVERS } " = "false" ] ; then
apt-get update && \
apt-get install -y --no-install-recommends \
software-properties-common pciutils wget gpg-agent && \
2026-01-06 14:26:42 +00:00
apt-get install -y libglm-dev cmake libxcb-dri3-0 libxcb-present0 libpciaccess0 \
libpng-dev libxcb-keysyms1-dev libxcb-dri3-dev libx11-dev g++ gcc \
libwayland-dev libxrandr-dev libxcb-randr0-dev libxcb-ewmh-dev \
git python-is-python3 bison libx11-xcb-dev liblz4-dev libzstd-dev \
ocaml-core ninja-build pkg-config libxml2-dev wayland-protocols python3-jsonschema \
2026-01-07 21:49:50 +01:00
clang-format qtbase5-dev qt6-base-dev libxcb-glx0-dev sudo xz-utils
if [ "amd64" = " $TARGETARCH " ] ; then
2026-01-12 07:51:26 +01:00
wget "https://sdk.lunarg.com/sdk/download/1.4.335.0/linux/vulkansdk-linux-x86_64-1.4.335.0.tar.xz" && \
tar -xf vulkansdk-linux-x86_64-1.4.335.0.tar.xz && \
rm vulkansdk-linux-x86_64-1.4.335.0.tar.xz && \
2026-01-07 21:49:50 +01:00
mkdir -p /opt/vulkan-sdk && \
2026-01-12 07:51:26 +01:00
mv 1.4.335.0 /opt/vulkan-sdk/ && \
cd /opt/vulkan-sdk/1.4.335.0 && \
2026-01-07 21:49:50 +01:00
./vulkansdk --no-deps --maxjobs \
vulkan-loader \
vulkan-validationlayers \
vulkan-extensionlayer \
vulkan-tools \
shaderc && \
2026-01-12 07:51:26 +01:00
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/bin/* /usr/bin/ && \
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/lib/* /usr/lib/x86_64-linux-gnu/ && \
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/include/* /usr/include/ && \
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/share/* /usr/share/ && \
2026-01-07 21:49:50 +01:00
rm -rf /opt/vulkan-sdk
fi
if [ "arm64" = " $TARGETARCH " ] ; then
mkdir vulkan && cd vulkan && \
curl -L -o vulkan-sdk.tar.xz https://github.com/mudler/vulkan-sdk-arm/releases/download/1.4.335.0/vulkansdk-ubuntu-24.04-arm-1.4.335.0.tar.xz && \
tar -xvf vulkan-sdk.tar.xz && \
rm vulkan-sdk.tar.xz && \
cd 1.4.335.0 && \
cp -rfv aarch64/bin/* /usr/bin/ && \
cp -rfv aarch64/lib/* /usr/lib/aarch64-linux-gnu/ && \
cp -rfv aarch64/include/* /usr/include/ && \
cp -rfv aarch64/share/* /usr/share/ && \
cd ../.. && \
rm -rf vulkan
fi
2026-01-06 14:26:42 +00:00
ldconfig && \
2025-06-15 14:56:52 +02:00
apt-get clean && \
rm -rf /var/lib/apt/lists/*
fi
EOT
# CuBLAS requirements
RUN <<EOT bash
2025-12-03 09:47:03 +01:00
if ( [ " ${ BUILD_TYPE } " = "cublas" ] || [ " ${ BUILD_TYPE } " = "l4t" ] ) && [ " ${ SKIP_DRIVERS } " = "false" ] ; then
2025-06-15 14:56:52 +02:00
apt-get update && \
apt-get install -y --no-install-recommends \
software-properties-common pciutils
if [ "amd64" = " $TARGETARCH " ] ; then
2025-12-03 09:47:03 +01:00
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${ UBUNTU_VERSION } /x86_64/cuda-keyring_1.1-1_all.deb
2025-06-15 14:56:52 +02:00
fi
if [ "arm64" = " $TARGETARCH " ] ; then
2026-01-08 23:04:33 +01:00
if [ " ${ CUDA_MAJOR_VERSION } " = "13" ] ; then
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${ UBUNTU_VERSION } /sbsa/cuda-keyring_1.1-1_all.deb
else
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${ UBUNTU_VERSION } /arm64/cuda-keyring_1.1-1_all.deb
fi
2025-06-15 14:56:52 +02:00
fi
dpkg -i cuda-keyring_1.1-1_all.deb && \
rm -f cuda-keyring_1.1-1_all.deb && \
apt-get update && \
apt-get install -y --no-install-recommends \
cuda-nvcc-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } \
libcufft-dev-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } \
libcurand-dev-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } \
libcublas-dev-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } \
libcusparse-dev-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } \
2025-12-03 15:13:21 +01:00
libcusolver-dev-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION }
2026-01-08 23:04:33 +01:00
if [ " ${ CUDA_MAJOR_VERSION } " = "13" ] && [ "arm64" = " $TARGETARCH " ] ; then
2025-12-03 15:13:21 +01:00
apt-get install -y --no-install-recommends \
2025-12-03 21:42:33 +01:00
libcufile-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } libcudnn9-cuda-${ CUDA_MAJOR_VERSION } cuda-cupti-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION } libnvjitlink-${ CUDA_MAJOR_VERSION } -${ CUDA_MINOR_VERSION }
2025-12-03 15:13:21 +01:00
fi
2025-06-15 14:56:52 +02:00
apt-get clean && \
2025-12-03 16:47:27 +01:00
rm -rf /var/lib/apt/lists/*
2025-12-03 09:47:03 +01:00
fi
EOT
2025-12-03 21:42:33 +01:00
2025-12-03 09:47:03 +01:00
# https://github.com/NVIDIA/Isaac-GR00T/issues/343
RUN <<EOT bash
if [ " ${ BUILD_TYPE } " = "cublas" ] && [ " ${ TARGETARCH } " = "arm64" ] ; then
wget https://developer.download.nvidia.com/compute/cudss/0.6.0/local_installers/cudss-local-tegra-repo-ubuntu${ UBUNTU_VERSION } -0.6.0_0.6.0-1_arm64.deb && \
dpkg -i cudss-local-tegra-repo-ubuntu${ UBUNTU_VERSION } -0.6.0_0.6.0-1_arm64.deb && \
cp /var/cudss-local-tegra-repo-ubuntu${ UBUNTU_VERSION } -0.6.0/cudss-*-keyring.gpg /usr/share/keyrings/ && \
apt-get update && apt-get -y install cudss cudss-cuda-${ CUDA_MAJOR_VERSION } && \
2025-12-03 15:13:21 +01:00
wget https://developer.download.nvidia.com/compute/nvpl/25.5/local_installers/nvpl-local-repo-ubuntu${ UBUNTU_VERSION } -25.5_1.0-1_arm64.deb && \
dpkg -i nvpl-local-repo-ubuntu${ UBUNTU_VERSION } -25.5_1.0-1_arm64.deb && \
cp /var/nvpl-local-repo-ubuntu${ UBUNTU_VERSION } -25.5/nvpl-*-keyring.gpg /usr/share/keyrings/ && \
2025-12-03 09:47:03 +01:00
apt-get update && apt-get install -y nvpl
2025-06-15 14:56:52 +02:00
fi
EOT
# If we are building with clblas support, we need the libraries for the builds
RUN if [ " ${ BUILD_TYPE } " = "clblas" ] && [ " ${ SKIP_DRIVERS } " = "false" ] ; then \
apt-get update && \
apt-get install -y --no-install-recommends \
libclblast-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* \
; fi
RUN if [ " ${ BUILD_TYPE } " = "hipblas" ] && [ " ${ SKIP_DRIVERS } " = "false" ] ; then \
apt-get update && \
apt-get install -y --no-install-recommends \
hipblas-dev \
rocblas-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# I have no idea why, but the ROCM lib packages don't trigger ldconfig after they install, which results in local-ai and others not being able
# to locate the libraries. We run ldconfig ourselves to work around this packaging deficiency
ldconfig \
; fi
2025-12-03 09:47:03 +01:00
RUN if [ " ${ BUILD_TYPE } " = "hipblas" ] ; then \
ln -s /opt/rocm-**/lib/llvm/lib/libomp.so /usr/lib/libomp.so \
; fi
2025-06-15 14:56:52 +02:00
# Install uv as a system package
RUN curl -LsSf https://astral.sh/uv/install.sh | UV_INSTALL_DIR = /usr/bin sh
ENV PATH = " /root/.cargo/bin: ${ PATH } "
2026-01-06 14:26:42 +00:00
# Increase timeout for uv installs behind slow networks
ENV UV_HTTP_TIMEOUT = 180
2025-06-15 14:56:52 +02:00
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
# Install grpcio-tools (the version in 22.04 is too old)
2025-12-04 09:14:08 +01:00
RUN <<EOT bash
if [ " ${ UBUNTU_VERSION } " = "2404" ] ; then
pip install --break-system-packages --user grpcio-tools= = 1.71.0 grpcio = = 1.71.0
else
pip install grpcio-tools= = 1.71.0 grpcio = = 1.71.0
fi
EOT
2025-06-15 14:56:52 +02:00
2026-01-06 14:26:42 +00:00
COPY backend/python/${ BACKEND } /${ BACKEND }
COPY backend/backend.proto /${ BACKEND } /backend.proto
COPY backend/python/common/ /${ BACKEND } /common
2026-01-07 15:48:51 +01:00
COPY scripts/build/package-gpu-libs.sh /package-gpu-libs.sh
2025-06-15 14:56:52 +02:00
2025-08-23 22:36:39 +02:00
RUN cd /${ BACKEND } && PORTABLE_PYTHON = true make
2025-06-15 14:56:52 +02:00
2026-01-07 15:48:51 +01:00
# Package GPU libraries into the backend's lib directory
RUN mkdir -p /${ BACKEND } /lib && \
TARGET_LIB_DIR = " / ${ BACKEND } /lib " BUILD_TYPE = " ${ BUILD_TYPE } " CUDA_MAJOR_VERSION = " ${ CUDA_MAJOR_VERSION } " \
bash /package-gpu-libs.sh " / ${ BACKEND } /lib "
2026-03-12 07:48:23 +01:00
# Run backend-specific packaging if a package.sh exists
RUN if [ -f " / ${ BACKEND } /package.sh " ] ; then \
cd /${ BACKEND } && bash package.sh; \
fi
2025-06-15 14:56:52 +02:00
FROM scratch
ARG BACKEND = rerankers
COPY --from= builder /${ BACKEND } / /