Dockerfile.vllm 19.1 KB
Newer Older
1
2
3
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

4
ARG BASE_IMAGE="nvcr.io/nvidia/cuda-dl-base"
5
6
7
8
9
# FIXME: NCCL will hang with 25.03, so use 25.01 for now
# Please check https://github.com/ai-dynamo/dynamo/pull/1065
# for details and reproducer to manually test if the image
# can be updated to later versions.
ARG BASE_IMAGE_TAG="25.01-cuda12.8-devel-ubuntu24.04"
10
ARG RELEASE_BUILD
11
12
ARG RUNTIME_IMAGE="nvcr.io/nvidia/cuda"
ARG RUNTIME_IMAGE_TAG="12.8.1-runtime-ubuntu24.04"
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Define general architecture ARGs for supporting both x86 and aarch64 builds.
#   ARCH: Used for package suffixes (e.g., amd64, arm64)
#   ARCH_ALT: Used for Rust targets, manylinux suffix (e.g., x86_64, aarch64)
#
# Default values are for x86/amd64:
#   --build-arg ARCH=amd64 --build-arg ARCH_ALT=x86_64
#
# For arm64/aarch64, build with:
#   --build-arg ARCH=arm64 --build-arg ARCH_ALT=aarch64
#
# NOTE: There isn't an easy way to define one of these values based on the other value
# without adding if statements everywhere, so just define both as ARGs for now.
ARG ARCH=amd64
ARG ARCH_ALT=x86_64

29
##################################
30
########## Base Image ############
31
32
##################################

33
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS base
34

35
36
37
# Redeclare ARCH and ARCH_ALT so they're available in this stage
ARG ARCH
ARG ARCH_ALT
38

39
USER root
40
ARG PYTHON_VERSION=3.12
41
42
43
44

RUN apt-get update -y && \
    apt-get install -y \
    # NIXL build dependencies
45
    cmake \
46
47
    meson \
    ninja-build \
48
    pybind11-dev \
49
    # Rust build dependencies
50
	clang \
51
    libclang-dev \
52
	git \
53
54
    # Install utilities
    nvtop \
55
    tmux \
56
57
    vim \
    autoconf \
58
59
    libtool \
    net-tools
60

61
62
63
64
65
66
67
68
# These headers are missing with the hpcx installer, required
# by UCX to find RDMA devices
RUN apt-get update -y && \
    apt-get install -y --no-install-recommends \
    --reinstall libibverbs-dev rdma-core ibverbs-utils libibumad-dev \
    libnuma-dev librdmacm-dev ibverbs-providers

ARG NIXL_UCX_REF=v1.19.x
69
ARG NIXL_REF=3c47a48955e6f96bd5d4fb43a9d80bb64722f8e4
70

71
72
73
74
75
WORKDIR /workspace

### UCX EFA Setup ###
RUN rm -rf /opt/hpcx/ucx
RUN rm -rf /usr/local/ucx
76
77
RUN echo "Building UCX with reference $NIXL_UCX_REF"
RUN cd /usr/local/src &&                            \
78
    git clone https://github.com/openucx/ucx.git && \
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    cd ucx &&                                       \
    git checkout $NIXL_UCX_REF &&                   \
    ./autogen.sh && ./configure                     \
    --prefix=/usr/local/ucx                         \
    --enable-shared                                 \
    --disable-static                                \
    --disable-doxygen-doc                           \
    --enable-optimizations                          \
    --enable-cma                                    \
    --enable-devel-headers                          \
    --with-cuda=/usr/local/cuda                     \
    --with-verbs                                    \
    --with-efa                                      \
    --with-dm                                       \
    --with-gdrcopy=/usr/local                       \
    --enable-mt &&                                  \
    make -j &&                                      \
    make -j install-strip &&                        \
97
98
    ldconfig

Alec's avatar
Alec committed
99
ENV LD_LIBRARY_PATH=/usr/lib:/usr/local/ucx/lib:$LD_LIBRARY_PATH
100
ENV CPATH=/usr/include
101
ENV PATH=/usr/bin:$PATH
102
ENV PKG_CONFIG_PATH=/usr/lib/pkgconfig
103
SHELL ["/bin/bash", "-c"]
104
105
106

WORKDIR /workspace

107
### NIXL SETUP ###
108
# Clone nixl source
109
# TEMP: disable gds backend for arm64
110
111
112
RUN git clone "https://github.com/ai-dynamo/nixl.git" /opt/nixl && \
    cd /opt/nixl && \
    git checkout ${NIXL_REF}
113
114
115
RUN if [ "$ARCH" = "arm64" ]; then \
        cd /opt/nixl && \
        mkdir build && \
116
        meson setup build/ --buildtype=release --prefix=/usr/local/nixl -Ddisable_gds_backend=true -Dgds_path=/usr/local/cuda/targets/sbsa-linux && \
117
118
119
120
121
122
123
124
125
126
127
        cd build/ && \
        ninja && \
        ninja install; \
    else \
        cd /opt/nixl && \
        mkdir build && \
        meson setup build/ --buildtype=release --prefix=/usr/local/nixl && \
        cd build/ && \
        ninja && \
        ninja install; \
    fi
128

129
### NATS & ETCD SETUP ###
130
# nats
131
132
RUN wget --tries=3 --waitretry=5 https://github.com/nats-io/nats-server/releases/download/v2.10.28/nats-server-v2.10.28-${ARCH}.deb && \
    dpkg -i nats-server-v2.10.28-${ARCH}.deb && rm nats-server-v2.10.28-${ARCH}.deb
133
# etcd
134
ENV ETCD_VERSION="v3.5.21"
135
RUN wget --tries=3 --waitretry=5 https://github.com/etcd-io/etcd/releases/download/$ETCD_VERSION/etcd-$ETCD_VERSION-linux-${ARCH}.tar.gz -O /tmp/etcd.tar.gz && \
136
137
138
    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
139
140
141
142
ENV PATH=/usr/local/bin/etcd/:$PATH


### VIRTUAL ENVIRONMENT SETUP ###
143
144
145

# Install uv and create virtualenv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
Neelay Shah's avatar
Neelay Shah committed
146
147
RUN mkdir /opt/dynamo && \
    uv venv /opt/dynamo/venv --python 3.12
148
149

# Activate virtual environment
Neelay Shah's avatar
Neelay Shah committed
150
ENV VIRTUAL_ENV=/opt/dynamo/venv
151
152
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"

153
# Install NIXL Python module
154
# TODO: Move gds_path selection based on arch into NIXL build
155
# TEMP: disable gds backend for arm64
156
157
RUN if [ "$ARCH" = "arm64" ]; then \
        cd /opt/nixl && uv build . --out-dir /workspace/wheels/nixl \
158
        --config-settings=setup-args="-Ddisable_gds_backend=true" \
159
160
161
162
        --config-settings=setup-args="-Dgds_path=/usr/local/cuda/targets/sbsa-linux"; \
    else \
        cd /opt/nixl && uv build . --out-dir /workspace/wheels/nixl; \
    fi
163

164
165
166
167
# Install the wheel
# TODO: Move NIXL wheel install to the wheel_builder stage
RUN uv pip install /workspace/wheels/nixl/*.whl

168
# Install vllm - keep this early in Dockerfile to avoid
169
# rebuilds from unrelated source code changes
170
171
172
173
174
# [gluo NOTE] currently using a fork of vllm until the fix
# for multi-modal disaggregated serving is merged upstream.
# see https://github.com/vllm-project/vllm/pull/21074
ARG VLLM_REPO=https://github.com/GuanLuo/vllm.git
ARG VLLM_REF="eaadf838ebe93e29a38a6fc1bab5a9801abe7d2c"
175
176
ARG MAX_JOBS=16
ENV MAX_JOBS=$MAX_JOBS
177
ENV CUDA_HOME=/usr/local/cuda
178
RUN --mount=type=bind,source=./container/deps/,target=/tmp/deps \
179
    --mount=type=cache,target=/root/.cache/uv \
180
181
182
183
    if [ "$ARCH" = "arm64" ]; then \
        uv pip install pip cuda-python && \
        mkdir /opt/vllm && \
        cd /opt/vllm && \
184
        git clone $VLLM_REPO && \
185
186
187
188
189
190
191
192
193
        cd vllm && \
        git checkout $VLLM_REF && \
        uv pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 && \
        python use_existing_torch.py && \
        uv pip install -r requirements/build.txt && \
        MAX_JOBS=${MAX_JOBS} uv pip install --no-build-isolation -e . -v && \
        cd tools/ep_kernels && \
        bash install_python_libraries.sh && \
        cd ep_kernels_workspace && \
194
        git clone https://github.com/deepseek-ai/DeepGEMM.git && \
195
        cd DeepGEMM && \
196
197
198
199
200
        sed -i 's|git@github.com:|https://github.com/|g' .gitmodules && \
        git submodule sync --recursive && \
        git submodule update --init --recursive && \
        cat install.sh && \
        ./install.sh; \
201
202
203
204
    else \
        uv pip install pip cuda-python && \
        mkdir /opt/vllm && \
        cd /opt/vllm && \
205
        git clone $VLLM_REPO && \
206
207
208
209
210
211
        cd vllm && \
        git checkout $VLLM_REF && \
        VLLM_USE_PRECOMPILED=1 uv pip install -e . && \
        cd tools/ep_kernels && \
        bash install_python_libraries.sh && \
        cd ep_kernels_workspace && \
212
        git clone https://github.com/deepseek-ai/DeepGEMM.git && \
213
        cd DeepGEMM && \
214
215
216
217
218
        sed -i 's|git@github.com:|https://github.com/|g' .gitmodules && \
        git submodule sync --recursive && \
        git submodule update --init --recursive && \
        cat install.sh && \
        ./install.sh; \
219
    fi
220

221
222
223
224
# Common dependencies
RUN --mount=type=bind,source=./container/deps/requirements.txt,target=/tmp/requirements.txt \
    uv pip install --requirement /tmp/requirements.txt

225
226
227
# Install test dependencies
RUN --mount=type=bind,source=./container/deps/requirements.test.txt,target=/tmp/requirements.txt \
    uv pip install --requirement /tmp/requirements.txt
228

229
# ### MISC UTILITY SETUP ###
230
231
232

# Finish pyright install
RUN pyright --help > /dev/null 2>&1
233

234
235
236
# Enable Git operations in the /workspace directory
RUN printf "[safe]\n      directory=/workspace\n" > /root/.gitconfig

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# Install prometheus
ARG PROM_VERSION=3.4.1
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl tar ca-certificates && \
    rm -rf /var/lib/apt/lists/*
RUN ARCH=$(dpkg --print-architecture) && \
    case "$ARCH" in \
        amd64) PLATFORM=linux-amd64 ;; \
        arm64) PLATFORM=linux-arm64 ;; \
        *) echo "Unsupported architecture: $ARCH" && exit 1 ;; \
    esac && \
    curl -fsSL https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.${PLATFORM}.tar.gz \
    | tar -xz -C /tmp && \
    mv /tmp/prometheus-${PROM_VERSION}.${PLATFORM}/prometheus /usr/local/bin/ && \
    chmod +x /usr/local/bin/prometheus && \
    rm -rf /tmp/prometheus-${PROM_VERSION}.${PLATFORM}

254
255
256
257
### BUILDS ###

# Rust build/dev dependencies
RUN apt update -y && \
258
    apt install --no-install-recommends -y \
259
    build-essential \
Biswa Panda's avatar
Biswa Panda committed
260
    protobuf-compiler \
Neelay Shah's avatar
Neelay Shah committed
261
262
    cmake \
    libssl-dev \
263
264
265
266
267
    pkg-config

ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
268
    RUST_VERSION=1.87.0
269

270
271
272
273
# Define Rust target based on ARCH_ALT ARG
ARG RUSTARCH=${ARCH_ALT}-unknown-linux-gnu

# Install Rust using RUSTARCH derived from ARCH_ALT
274
RUN wget --tries=3 --waitretry=5 "https://static.rust-lang.org/rustup/archive/1.28.1/${RUSTARCH}/rustup-init" && \
275
    # TODO: Add SHA check back based on RUSTARCH
276
    chmod +x rustup-init && \
277
    ./rustup-init -y --no-modify-path --profile default --default-toolchain $RUST_VERSION --default-host ${RUSTARCH} && \
278
279
    rm rustup-init && \
    chmod -R a+w $RUSTUP_HOME $CARGO_HOME
280

281
282
283
284
285
286
ARG CARGO_BUILD_JOBS
# Set CARGO_BUILD_JOBS to 16 if not provided
# This is to prevent cargo from building $(nproc) jobs in parallel,
# which might exceed the number of opened files limit.
ENV CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS:-16}

287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#######################################
########## Local Development ##########
#######################################

FROM base AS local-dev

# https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user
# Will use the default ubuntu user, but give sudo access
# Needed so files permissions aren't set to root ownership when writing from inside container

# Don't want ubuntu to be editable, just change uid and gid. User ubuntu is hardcoded in .devcontainer
ENV USERNAME=ubuntu
ARG USER_UID=1000
ARG USER_GID=1000

RUN apt-get update && apt-get install -y sudo gnupg2 gnupg1 \
    && echo "$USERNAME ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME \
    && chmod 0440 /etc/sudoers.d/$USERNAME \
    && mkdir -p /home/$USERNAME \
    && chown -R $USERNAME:$USERNAME /home/$USERNAME \
    && rm -rf /var/lib/apt/lists/* \
    && chsh -s /bin/bash $USERNAME

# This is a slow operation (~40s on my cpu)
# Much better than chown -R $USERNAME:$USERNAME /opt/dynamo/venv (~10min on my cpu)
COPY --from=base --chown=$USER_UID:$USER_GID /opt/dynamo/venv/ /opt/dynamo/venv/
313
RUN chown $USERNAME:$USERNAME /opt/dynamo/venv
314
315
COPY --from=base --chown=$USERNAME:$USERNAME /usr/local/bin /usr/local/bin

316
# so we can use maturin develop
317
RUN uv pip install maturin[patchelf]
318

319
320
USER $USERNAME
ENV HOME=/home/$USERNAME
321
ENV PYTHONPATH=$HOME/dynamo/deploy/sdk/src:$PYTHONPATH:$HOME/dynamo/components/planner/src:$PYTHONPATH
322
ENV CARGO_TARGET_DIR=$HOME/dynamo/.build/target
323
324
325
326
327
328
329
330
331
332
333
334
335
WORKDIR $HOME

# https://code.visualstudio.com/remote/advancedcontainers/persist-bash-history
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=$HOME/.commandhistory/.bash_history" \
    && mkdir -p $HOME/.commandhistory \
    && touch $HOME/.commandhistory/.bash_history \
    && echo "$SNIPPET" >> "$HOME/.bashrc"

RUN mkdir -p /home/$USERNAME/.cache/

ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]

##################################
336
##### Wheel Build Image ##########
337
338
##################################

339
340
341
342
# Redeclare ARCH_ALT ARG so it's available for interpolation in the FROM instruction
ARG ARCH_ALT

FROM quay.io/pypa/manylinux_2_28_${ARCH_ALT} AS wheel_builder
343

344
345
346
347
348
349
350
ARG CARGO_BUILD_JOBS
# Set CARGO_BUILD_JOBS to 16 if not provided
# This is to prevent cargo from building $(nproc) jobs in parallel,
# which might exceed the number of opened files limit.
ENV CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS:-16}
# Use build arg RELEASE_BUILD = true to generate wheels for Python 3.10, 3.11 and 3.12.
ARG RELEASE_BUILD
351

352
353
WORKDIR /workspace

354
RUN yum update -y \
Ryan Olson's avatar
Ryan Olson committed
355
    && yum install -y llvm-toolset \
356
    && yum install -y python3.12-devel \
357
358
359
    && yum install -y protobuf-compiler \
    && yum clean all \
    && rm -rf /var/cache/yum
360
361
362

ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
363
364
    CARGO_TARGET_DIR=/workspace/target \
    VIRTUAL_ENV=/opt/dynamo/venv
365

366
367
COPY --from=base $RUSTUP_HOME $RUSTUP_HOME
COPY --from=base $CARGO_HOME $CARGO_HOME
Ryan Olson's avatar
Ryan Olson committed
368
COPY --from=base /usr/local/nixl /opt/nvidia/nvda_nixl
369
370
371
COPY --from=base /workspace /workspace
COPY --from=base $VIRTUAL_ENV $VIRTUAL_ENV
ENV PATH=$CARGO_HOME/bin:$VIRTUAL_ENV/bin:$PATH
372

373
374
375
376
377
378
379
380
# Copy 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 hatch_build.py /workspace/
381

382
383
384
385
# Copy source code
COPY lib/ /workspace/lib/
COPY components /workspace/components
COPY launch /workspace/launch
386
COPY deploy/sdk /workspace/deploy/sdk
387

388
389
390
391
392
RUN cargo build \
	--release \
	--locked \
	--features dynamo-llm/block-manager \
	--workspace
393
394

# Build dynamo wheel
395
RUN uv build --wheel --out-dir /workspace/dist && \
396
    cd /workspace/lib/bindings/python && \
397
398
    uv pip install maturin[patchelf] && \
    maturin build --release --features block-manager --out /workspace/dist && \
399
    if [ "$RELEASE_BUILD" = "true" ]; then \
400
401
402
        # do not enable KVBM feature, ensure compatibility with lower glibc
        uv run --python 3.11 maturin build --release --out /workspace/dist && \
        uv run --python 3.10 maturin build --release --out /workspace/dist; \
403
    fi
404

405
406
407
#######################################
########## CI Minimum Image ###########
#######################################
408
FROM base AS ci_minimum
409

410
ENV DYNAMO_HOME=/workspace
411
412
413
ENV CARGO_TARGET_DIR=/workspace/target

WORKDIR /workspace
414

415
COPY --from=wheel_builder /workspace /workspace
Ryan Olson's avatar
Ryan Olson committed
416
COPY --from=wheel_builder /opt/nvidia/nvda_nixl /opt/nvidia/nvda_nixl
417
418
419
# Copy Cargo cache to avoid re-downloading dependencies
COPY --from=wheel_builder $CARGO_HOME $CARGO_HOME

420
421
422
# Copy rest of the code
COPY . /workspace

423
424
425
426
427
428
# Build C bindings, creates lib/bindings/c/include
#
# TODO: In theory the 'cargo build' in earlier stage covers this, we "just" need to copy the
# `lib/bindings/c/include` folder that build.rs generated across.
# I couldn't get that to work, hence TODO.
RUN cd /workspace/lib/bindings/c && cargo build --release --locked
429
430
431
432
433
434

# 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/. && \
435
436
437
438
    cp -r lib/bindings/c/include /opt/dynamo/bindings/.  && \
    cp target/release/dynamo-run /usr/local/bin && \
    cp target/release/metrics /usr/local/bin && \
    cp target/release/mock_worker /usr/local/bin
439
440

RUN uv pip install /workspace/dist/ai_dynamo_runtime*cp312*.whl && \
441
    uv pip install /workspace/dist/ai_dynamo*any.whl
442

443
444
RUN uv pip install /workspace/benchmarks

445
446
447
448
449
# Copy launch banner
RUN --mount=type=bind,source=./container/launch_message.txt,target=/workspace/launch_message.txt \
    sed '/^#\s/d' /workspace/launch_message.txt > ~/.launch_screen && \
    echo "cat ~/.launch_screen" >> ~/.bashrc

450
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/nvidia/nvda_nixl/lib/x86_64-linux-gnu/
451

452
########################################
453
########## Development Image ###########
454
########################################
455
FROM ci_minimum AS dev
456
457
458
459
460
461
462
463

ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]

CMD []

####################################
########## Runtime Image ###########
####################################
464
465
466
467

FROM ${RUNTIME_IMAGE}:${RUNTIME_IMAGE_TAG} AS runtime

WORKDIR /workspace
468
ENV DYNAMO_HOME=/workspace
469
ENV VIRTUAL_ENV=/opt/dynamo/venv
470
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
471

472
473
474
475
476
477
478
479
480
481
482
483
484
485
# Install build-essential and python3-dev as apt dependencies
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        build-essential \
        python3-dev && \
    rm -rf /var/lib/apt/lists/*

### COPY BINDINGS ###
# Copy all bindings (wheels, lib, include) from ci_minimum
COPY --from=ci_minimum /opt/dynamo/bindings /opt/dynamo/bindings
### COPY NATS & ETCD ###
# Copy nats and etcd from base image
COPY --from=base /usr/bin/nats-server /usr/bin/nats-server
COPY --from=base /usr/local/bin/etcd/ /usr/local/bin/etcd/
486
ENV PATH=/usr/local/bin/etcd/:$PATH
487
488
489
490
491
492
493
494
495

# Copy UCX from base image as plugin for NIXL
# Copy NIXL source from base image (required for NIXL plugins)
COPY --from=base /usr/local/ucx /usr/local/ucx
COPY --from=base /usr/local/nixl /usr/local/nixl
ARG ARCH_ALT
ENV NIXL_PLUGIN_DIR=/usr/local/nixl/lib/${ARCH_ALT}-linux-gnu/plugins
ENV LD_LIBRARY_PATH=/usr/local/nixl/lib/${ARCH_ALT}-linux-gnu:/usr/local/nixl/lib/${ARCH_ALT}-linux-gnu/plugins:/usr/local/ucx/lib:$LD_LIBRARY_PATH

496
497
# Setup the python environment
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
498
RUN uv venv $VIRTUAL_ENV --python 3.12 && \
499
500
    echo "source $VIRTUAL_ENV/bin/activate" >> ~/.bashrc

501
502
503
504
# Common dependencies
RUN --mount=type=bind,source=./container/deps/requirements.txt,target=/tmp/requirements.txt \
    uv pip install --requirement /tmp/requirements.txt

505
506
507
508
509
510
511
512
513
# Install test dependencies
#TODO: Remove this once we have a functional ci_minimum image built on top of the runtime image
RUN --mount=type=bind,source=./container/deps/requirements.test.txt,target=/tmp/requirements.txt \
    uv pip install --requirement /tmp/requirements.txt

#TODO: Remove this once we have a functional ci_minimum image built on top of the runtime image
COPY . /workspace
RUN uv pip install /workspace/benchmarks

514
515
# Install the wheels and symlink executables to /usr/local/bin so dynamo components can use them
# Dynamo components currently do not have the VIRTUAL_ENV in their PATH, so we need to symlink the executables
516
517
#Copy NIXL and Dynamo wheels into wheelhouse
COPY --from=base /workspace/wheels/nixl/*.whl wheelhouse/
518
COPY --from=wheel_builder /workspace/dist/*.whl wheelhouse/
519
RUN uv pip install ai-dynamo[vllm] --find-links wheelhouse && \
520
    uv pip install nixl --find-links wheelhouse && \
521
522
    ln -sf $VIRTUAL_ENV/bin/* /usr/local/bin/ && \
    rm -r wheelhouse
523

524
525
526
527
528
# Copy launch banner
RUN --mount=type=bind,source=./container/launch_message.txt,target=/workspace/launch_message.txt \
    sed '/^#\s/d' /workspace/launch_message.txt > ~/.launch_screen && \
    echo "cat ~/.launch_screen" >> ~/.bashrc

529
ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]
530
CMD []