# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 ARG BASE_IMAGE="nvcr.io/nvidia/cuda-dl-base" ARG BASE_IMAGE_TAG="25.01-cuda12.8-devel-ubuntu24.04" FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS dev USER root ### NIXL SETUP ### ARG MOFED_VERSION=24.10-1.1.4.0 ARG PYTHON_VERSION=3.12 ARG NSYS_URL=https://developer.nvidia.com/downloads/assets/tools/secure/nsight-systems/2025_1/ ARG NSYS_PKG=NsightSystems-linux-cli-public-2025.1.1.131-3554042.deb RUN apt-get update -y && apt-get -y install curl \ git \ libnuma-dev \ numactl \ wget \ autotools-dev \ automake \ libtool \ libz-dev \ libiberty-dev \ flex \ build-essential \ cmake \ libibverbs-dev \ libgoogle-glog-dev \ libgtest-dev \ libjsoncpp-dev \ libpython3-dev \ libboost-all-dev \ libssl-dev \ libgrpc-dev \ libgrpc++-dev \ libprotobuf-dev \ protobuf-compiler-grpc \ pybind11-dev \ python3-full \ python3-pip \ python3-numpy \ etcd-server \ net-tools \ pciutils \ libpci-dev \ vim \ tmux \ screen \ ibverbs-utils \ libibmad-dev RUN apt-get install -y linux-tools-common linux-tools-generic ethtool iproute2 RUN apt-get install -y dkms linux-headers-generic RUN apt-get install -y meson ninja-build uuid-dev gdb RUN apt install -y libglib2.0-0 RUN wget ${NSYS_URL}${NSYS_PKG} &&\ apt install -y ./${NSYS_PKG} &&\ rm ${NSYS_PKG} RUN cd /usr/local/src && \ curl -fSsL "https://content.mellanox.com/ofed/MLNX_OFED-${MOFED_VERSION}/MLNX_OFED_LINUX-${MOFED_VERSION}-ubuntu24.04-x86_64.tgz" -o mofed.tgz && \ tar -xf /usr/local/src/mofed.tgz && \ cd MLNX_OFED_LINUX-* && \ apt-get update && apt-get install -y --no-install-recommends \ ./DEBS/libibverbs* ./DEBS/ibverbs-providers* ./DEBS/librdmacm* ./DEBS/libibumad* && \ rm -rf /var/lib/apt/lists/* /usr/local/src/* mofed.tgz ENV LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64 \ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 ENV LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib \ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib WORKDIR /workspace RUN git clone https://github.com/NVIDIA/gdrcopy.git RUN PREFIX=/usr/local DESTLIB=/usr/local/lib make -C /workspace/gdrcopy lib_install RUN cp gdrcopy/src/libgdrapi.so.2.* /usr/lib/x86_64-linux-gnu/ RUN ldconfig ARG UCX_VERSION=v1.18.0 RUN cd /usr/local/src && \ curl -fSsL "https://github.com/openucx/ucx/tarball/${UCX_VERSION}" | tar xz && \ cd openucx-ucx* && \ ./autogen.sh && ./configure \ --enable-shared \ --disable-static \ --disable-doxygen-doc \ --enable-optimizations \ --enable-cma \ --enable-devel-headers \ --with-cuda=/usr/local/cuda \ --with-verbs \ --with-dm \ --with-gdrcopy=/usr/local \ --enable-mt \ --with-mlx5-dv && \ make -j && \ make -j install-strip && \ ldconfig ENV LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH ENV CPATH=/usr/include:$CPATH ENV PATH=/usr/bin:$PATH ENV PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH SHELL ["/bin/bash", "-c"] WORKDIR /workspace ENV LD_LIBRARY_PATH=/usr/local/ompi/lib:$LD_LIBRARY_PATH ENV CPATH=/usr/local/ompi/include:$CPATH ENV PATH=/usr/local/ompi/bin:$PATH ENV PKG_CONFIG_PATH=/usr/local/ompi/lib/pkgconfig:$PKG_CONFIG_PATH COPY --from=nixl . /opt/nixl RUN cd /opt/nixl && \ mkdir build && \ meson setup build/ --prefix=/usr/local/nixl && \ cd build/ && \ ninja && \ ninja install ENV LD_LIBRARY_PATH=/usr/local/nixl/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH ENV PYTHONPATH=/usr/local/nixl/lib/python3/dist-packages/:/opt/nixl/test/python/:$PYTHONPATH ENV UCX_TLS=^cuda_ipc ENV NIXL_PLUGIN_DIR=/usr/local/nixl/lib/x86_64-linux-gnu/plugins RUN ls -l /usr/local/nixl/ RUN ls -l /usr/local/nixl/include/ RUN ls -l /usr/local/nixl/include/internal/ RUN ls /opt/nixl # Install utilities RUN apt update -y && apt install -y git wget curl nvtop tmux vim # nats RUN wget https://github.com/nats-io/nats-server/releases/download/v2.10.24/nats-server-v2.10.24-amd64.deb && dpkg -i nats-server-v2.10.24-amd64.deb && rm nats-server-v2.10.24-amd64.deb # etcd ENV ETCD_VERSION="v3.5.18" RUN wget https://github.com/etcd-io/etcd/releases/download/$ETCD_VERSION/etcd-$ETCD_VERSION-linux-amd64.tar.gz -O /tmp/etcd.tar.gz && \ mkdir -p /usr/local/bin/etcd && \ tar -xvf /tmp/etcd.tar.gz -C /usr/local/bin/etcd --strip-components=1 && \ rm /tmp/etcd.tar.gz ENV PATH=/usr/local/bin/etcd/:$PATH ### VIRTUAL ENVIRONMENT SETUP ### # Install uv and create virtualenv COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ RUN mkdir /opt/dynamo && \ uv venv /opt/dynamo/venv --python 3.12 # Activate virtual environment ENV VIRTUAL_ENV=/opt/dynamo/venv ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" # Common dependencies RUN --mount=type=bind,source=./container/deps/requirements.txt,target=/tmp/requirements.txt \ uv pip install --requirement /tmp/requirements.txt # Install patched vllm - keep this early in Dockerfile to avoid # rebuilds from unrelated source code changes ARG VLLM_REF="v0.7.2" ARG VLLM_PATCH="vllm_${VLLM_REF}-dynamo-kv-disagg-patch.patch" RUN --mount=type=bind,source=./container/deps/,target=/tmp/deps \ bash /tmp/deps/vllm/install.sh --patch /tmp/deps/vllm/${VLLM_PATCH} --ref ${VLLM_REF} --install-cmd "uv pip install --editable" --use-precompiled --installation-dir /opt/vllm # Install genai-perf for benchmarking ARG GENAI_PERF_TAG="25d0188713adc47868d6b3f22426375237a90529" RUN uv pip install "git+https://github.com/triton-inference-server/perf_analyzer.git@${GENAI_PERF_TAG}#subdirectory=genai-perf" # Install test dependencies RUN --mount=type=bind,source=./container/deps/requirements.test.txt,target=/tmp/requirements.txt \ uv pip install --requirement /tmp/requirements.txt # ### MISC UTILITY SETUP ### # Finish pyright install RUN pyright --help > /dev/null 2>&1 # Enable Git operations in the /workspace directory RUN printf "[safe]\n directory=/workspace\n" > /root/.gitconfig RUN ln -sf /bin/bash /bin/sh ### BUILDS ### # Rust build/dev dependencies RUN apt update -y && \ apt install -y \ build-essential \ protobuf-compiler \ cmake \ libssl-dev \ pkg-config && \ curl https://sh.rustup.rs -sSf | bash -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" RUN rustup toolchain install 1.85.0-x86_64-unknown-linux-gnu # Working directory WORKDIR /workspace # Copy Python wheel configuration files COPY pyproject.toml /workspace/ COPY README.md /workspace/ COPY LICENSE /workspace/ COPY Cargo.toml /workspace/ COPY Cargo.lock /workspace/ COPY rust-toolchain.toml /workspace/ COPY lib/ /workspace/lib/ COPY components /workspace/components COPY launch /workspace/launch ARG CARGO_BUILD_JOBS ENV CARGO_TARGET_DIR=/workspace/target RUN cargo build --release --locked --features mistralrs,sglang,vllm,python && \ cargo doc --no-deps COPY deploy/dynamo/sdk /workspace/deploy/dynamo/sdk # Build dynamo wheel RUN source /opt/dynamo/venv/bin/activate && \ uv build --wheel --out-dir /workspace/dist && \ uv pip install /workspace/dist/ai_dynamo*cp312*.whl && \ cd /workspace/deploy/dynamo/sdk && \ uv build --wheel --out-dir /workspace/dist && \ uv pip install /workspace/dist/ai_dynamo_sdk*any.whl # Package the bindings RUN mkdir -p /opt/dynamo/bindings/wheels && \ mkdir /opt/dynamo/bindings/lib && \ cp dist/ai_dynamo*cp312*.whl /opt/dynamo/bindings/wheels/. && \ cp target/release/libdynamo_llm_capi.so /opt/dynamo/bindings/lib/. && \ cp -r lib/bindings/c/include /opt/dynamo/bindings/. # Tell vllm to use the Dynamo LLM C API for KV Cache Routing ENV VLLM_KV_CAPI_PATH="/opt/dynamo/bindings/lib/libdynamo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace # FIXME: May want a modification with dynamo banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] CMD [] ### TODO Lean Runtime Image Stage ###