Dockerfile.vllm 17.6 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
ARG ENABLE_KVBM=false
12
13
ARG RUNTIME_IMAGE="nvcr.io/nvidia/cuda"
ARG RUNTIME_IMAGE_TAG="12.8.1-runtime-ubuntu24.04"
14

15
# Make sure to update the dependency version in pyproject.toml when updating this
16
ARG VLLM_REF="aab549870df50edf0512f0a59b574f692f546465"  # from v0.10.1
17
18
ARG TORCH_BACKEND="cu128"

19
20
# Match 0.10.1 vLLM release
# https://github.com/vllm-project/vllm/releases/tag/v0.10.1
21
22
# Pinned to commit before https://github.com/deepseek-ai/DeepGEMM/pull/112 for DeepGEMM which seems to break on H100:
# "RuntimeError: Failed: CUDA runtime error csrc/jit/kernel_runtime.hpp:108 '98'"
23
ARG DEEPGEMM_REF="f85ec64"
24
ARG FLASHINF_REF="v0.2.11"
25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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

41
##################################
42
########## Base Image ############
43
44
##################################

45
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS base
46

47
# Redeclare ARCH, ARCH_ALT, TORCH_BACKEND so they're available in this stage
48
49
ARG ARCH
ARG ARCH_ALT
50
ARG TORCH_BACKEND
51

52
USER root
53
ARG PYTHON_VERSION=3.12
54
55

RUN apt-get update -y && \
56
    apt-get install -y --no-install-recommends  \
57
    # NIXL build dependencies
58
    cmake \
59
60
    meson \
    ninja-build \
61
    pybind11-dev \
62
63
64
65
    # These headers are missing with the hpcx installer, required
    # by UCX to find RDMA devices
    libibverbs-dev rdma-core ibverbs-utils libibumad-dev \
    libnuma-dev librdmacm-dev ibverbs-providers \
66
    # Rust build dependencies
67
	clang \
68
    libclang-dev \
69
	git \
70
71
72
73
    build-essential \
    protobuf-compiler \
    libssl-dev \
    pkg-config \
74
75
    # Install utilities
    nvtop \
76
    tmux \
77
78
    vim \
    autoconf \
79
    automake \
80
    libtool \
81
82
83
84
    net-tools \
    # For Prometheus
    curl tar ca-certificates && \
    rm -rf /var/lib/apt/lists/*
85

86
ARG NIXL_UCX_REF=v1.19.0
87
ARG NIXL_REF=0.4.1
88

89
90
91
92
93
94
95
ENV NIXL_SRC_DIR=/opt/nixl
ENV NIXL_PREFIX=/opt/nvidia/nvda_nixl
ARG ARCH_ALT
ENV NIXL_LIB_DIR=$NIXL_PREFIX/lib/${ARCH_ALT}-linux-gnu
ENV NIXL_PLUGIN_DIR=$NIXL_LIB_DIR/plugins
ENV LD_LIBRARY_PATH=$NIXL_LIB_DIR:$NIXL_PLUGIN_DIR:$LD_LIBRARY_PATH

96
97
98
WORKDIR /workspace

### UCX EFA Setup ###
99
100
101
102
RUN rm -rf /opt/hpcx/ucx && \
    rm -rf /usr/local/ucx && \
    echo "Building UCX with reference $NIXL_UCX_REF" && \
    cd /usr/local/src &&                            \
103
    git clone https://github.com/openucx/ucx.git && \
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    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 &&                        \
122
123
    ldconfig

124
125
126
127
ENV LD_LIBRARY_PATH=\
/usr/lib:/usr/local/ucx/lib:\
/usr/local/ucx/lib/ucx:\
$LD_LIBRARY_PATH
128
ENV CPATH=/usr/include
129
ENV PATH=/usr/bin:$PATH
130
ENV PKG_CONFIG_PATH=/usr/lib/pkgconfig
131
SHELL ["/bin/bash", "-c"]
132
133
134

WORKDIR /workspace

135
### NIXL SETUP ###
136
# Clone nixl source
137
# TEMP: disable gds backend for arm64
138
139
RUN git clone "https://github.com/ai-dynamo/nixl.git" ${NIXL_SRC_DIR} && \
    cd ${NIXL_SRC_DIR} && \
140
141
    git checkout ${NIXL_REF} && \
    if [ "$ARCH" = "arm64" ]; then \
142
        nixl_build_args="-Ddisable_gds_backend=true"; \
143
    else \
144
145
146
147
148
149
150
        nixl_build_args=""; \
    fi && \
    mkdir build && \
    meson setup build/ --buildtype=release --prefix=$NIXL_PREFIX $nixl_build_args && \
    cd build/ && \
    ninja && \
    ninja install;
151

152
### NATS & ETCD SETUP ###
153
ENV ETCD_VERSION="v3.5.21"
154
155
156
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 && \
    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 && \
157
158
159
    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
160
161
162
163
ENV PATH=/usr/local/bin/etcd/:$PATH


### VIRTUAL ENVIRONMENT SETUP ###
164
165

# Install uv and create virtualenv
166
ENV VIRTUAL_ENV=/opt/dynamo/venv
167
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
Neelay Shah's avatar
Neelay Shah committed
168
RUN mkdir /opt/dynamo && \
169
    uv venv ${VIRTUAL_ENV} --python 3.12
170
171
172
173

# Activate virtual environment
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"

174
# Install NIXL Python module
175
# TODO: Move gds_path selection based on arch into NIXL build
176
# TEMP: disable gds backend for arm64
177
RUN if [ "$ARCH" = "arm64" ]; then \
178
        cd ${NIXL_SRC_DIR} && uv build . --out-dir /workspace/wheels/nixl \
179
        --config-settings=setup-args="-Ddisable_gds_backend=true"; \
180
    else \
181
        cd ${NIXL_SRC_DIR} && uv build . --out-dir /workspace/wheels/nixl; \
182
183
184
185
    fi && \
    # Install the wheel
    # TODO: Move NIXL wheel install to the wheel_builder stage
    uv pip install /workspace/wheels/nixl/*.whl
186

187
# Install vllm - keep this early in Dockerfile to avoid
188
# rebuilds from unrelated source code changes
189
ARG VLLM_REF
190
ARG VLLM_GIT_URL
191
192
193
ARG DEEPGEMM_REF
ARG FLASHINF_REF

194
195
ARG MAX_JOBS=16
ENV MAX_JOBS=$MAX_JOBS
196
ENV CUDA_HOME=/usr/local/cuda
197

198
RUN --mount=type=bind,source=./container/deps/,target=/tmp/deps \
199
    --mount=type=cache,target=/root/.cache/uv \
200
201
202
203
        # TODO - split vllm, DeepEP, DeepGeMM, PPLX installs
        # Should be able to select how you want your build to go
        cp /tmp/deps/vllm/install_vllm.sh /tmp/install_vllm.sh && \
        chmod +x /tmp/install_vllm.sh && \
204
        /tmp/install_vllm.sh --editable --vllm-ref $VLLM_REF --max-jobs $MAX_JOBS --arch $ARCH --installation-dir /opt --deepgemm-ref $DEEPGEMM_REF --flashinf-ref $FLASHINF_REF --torch-backend $TORCH_BACKEND;
205
206
207
208

ENV LD_LIBRARY_PATH=\
/opt/vllm/tools/ep_kernels/ep_kernels_workspace/nvshmem_install/lib:\
$LD_LIBRARY_PATH
209

210
211
212
213
# Common dependencies
RUN --mount=type=bind,source=./container/deps/requirements.txt,target=/tmp/requirements.txt \
    uv pip install --requirement /tmp/requirements.txt

214
215
### MISC UTILITY SETUP ###

216
217
# Install test dependencies
RUN --mount=type=bind,source=./container/deps/requirements.test.txt,target=/tmp/requirements.txt \
218
219
220
    uv pip install --requirement /tmp/requirements.txt && \
    pyright --help > /dev/null 2>&1 && \
    printf "[safe]\n      directory=/workspace\n" > /root/.gitconfig
221

222
223
224
225
226
227
228
229
230
231
232
233
234
235
# Install prometheus
ARG PROM_VERSION=3.4.1
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}

236
237
### BUILDS ###

238
239
240
ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
241
    RUST_VERSION=1.89.0
242

243
244
245
246
# Define Rust target based on ARCH_ALT ARG
ARG RUSTARCH=${ARCH_ALT}-unknown-linux-gnu

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

254
255
256
257
258
259
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}

260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#######################################
########## 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)
285
286
COPY --from=base --chown=$USER_UID:$USER_GID ${VIRTUAL_ENV} ${VIRTUAL_ENV}
RUN chown $USERNAME:$USERNAME ${VIRTUAL_ENV}
287
288
COPY --from=base --chown=$USERNAME:$USERNAME /usr/local/bin /usr/local/bin

289
# so we can use maturin develop
290
RUN uv pip install maturin[patchelf]
291

292
293
USER $USERNAME
ENV HOME=/home/$USERNAME
294
ENV PYTHONPATH=$PYTHONPATH:$HOME/dynamo/components/planner/src
295
ENV CARGO_TARGET_DIR=$HOME/dynamo/.build/target
296
297
298
299
300
301
302
303
304
305
306
307
308
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"]

##################################
309
##### Wheel Build Image ##########
310
311
##################################

312
313
314
315
# 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
316

317
318
319
320
321
322
323
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
324
325
# Use arg ENABLE_KVBM = true to turn on the block-manager feature
ARG ENABLE_KVBM
326

327
328
329
# Keep in sync with the base image.
ENV NIXL_PREFIX=/opt/nvidia/nvda_nixl

330
331
WORKDIR /workspace

332
RUN yum update -y \
Ryan Olson's avatar
Ryan Olson committed
333
    && yum install -y llvm-toolset \
334
    && yum install -y python3.12-devel \
335
336
337
    && yum install -y protobuf-compiler \
    && yum clean all \
    && rm -rf /var/cache/yum
338
339
340

ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
341
342
    CARGO_TARGET_DIR=/workspace/target \
    VIRTUAL_ENV=/opt/dynamo/venv
343

344
345
COPY --from=base $RUSTUP_HOME $RUSTUP_HOME
COPY --from=base $CARGO_HOME $CARGO_HOME
346
COPY --from=base $NIXL_PREFIX $NIXL_PREFIX
347
348
349
COPY --from=base /workspace /workspace
COPY --from=base $VIRTUAL_ENV $VIRTUAL_ENV
ENV PATH=$CARGO_HOME/bin:$VIRTUAL_ENV/bin:$PATH
350

351
352
353
354
355
356
357
# 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/
358
COPY hatch_build.py /workspace/
359

360
361
362
363
364
# Copy source code
COPY lib/ /workspace/lib/
COPY components /workspace/components
COPY launch /workspace/launch

365
366
367
368
369
RUN cargo build \
	--release \
	--locked \
	--features dynamo-llm/block-manager \
	--workspace
370
371

# Build dynamo wheel
372
RUN uv build --wheel --out-dir /workspace/dist && \
373
    cd /workspace/lib/bindings/python && \
374
    uv pip install maturin[patchelf] && \
375
376
377
378
379
    if [ "$ENABLE_KVBM" = "true" ]; then \
        maturin build --release --features block-manager --out /workspace/dist; \
    else \
        maturin build --release --out /workspace/dist; \
    fi && \
380
    if [ "$RELEASE_BUILD" = "true" ]; then \
381
382
383
        # 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; \
384
    fi
385

386
387
388
#######################################
########## CI Minimum Image ###########
#######################################
389
FROM base AS ci_minimum
390

391
ENV DYNAMO_HOME=/workspace
392
393
394
ENV CARGO_TARGET_DIR=/workspace/target

WORKDIR /workspace
395

396
COPY --from=wheel_builder /workspace /workspace
397
COPY --from=wheel_builder $NIXL_PREFIX $NIXL_PREFIX
398

399
400
401
# Copy Cargo cache to avoid re-downloading dependencies
COPY --from=wheel_builder $CARGO_HOME $CARGO_HOME

402
403
404
# Copy rest of the code
COPY . /workspace

405
406
407
408
# 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/. && \
409
    cp target/release/metrics /usr/local/bin
410
411

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

414
415
RUN uv pip install /workspace/benchmarks

416
417
418
419
420
# 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

421
########################################
422
########## Development Image ###########
423
########################################
424
FROM ci_minimum AS dev
425
426
427
428
429
430
431
432

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

CMD []

####################################
########## Runtime Image ###########
####################################
433
434
435
436

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

WORKDIR /workspace
437
ENV DYNAMO_HOME=/workspace
438
ENV VIRTUAL_ENV=/opt/dynamo/venv
439
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
440

441
442
443
444
445
ARG ARCH_ALT
ENV NIXL_PREFIX=/opt/nvidia/nvda_nixl
ENV NIXL_LIB_DIR=$NIXL_PREFIX/lib/${ARCH_ALT}-linux-gnu
ENV NIXL_PLUGIN_DIR=$NIXL_LIB_DIR/plugins

446
447
448
449
# 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 \
450
        python3-dev \
451
452
        # jq and curl for polling various endpoints and health checks
        jq \
453
454
455
456
457
458
        curl \
        # For debugging
        vim \
        # Libraries required by UCX to find RDMA devices
        libibverbs1 rdma-core ibverbs-utils libibumad3 \
        libnuma1 librdmacm1 ibverbs-providers \
459
460
461
462
        # JIT Kernel Compilation, flashinfer
        ninja-build \
        g++ \
        cuda-toolkit-12-8 && \
463
464
    rm -rf /var/lib/apt/lists/*

465
### COPY NATS & ETCD & PROMETHEUS ###
466
467
468
# 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/
469
ENV PATH=/usr/local/bin/etcd/:$PATH
470

471
472
473
# Copy prometheus from base image
COPY --from=base /usr/local/bin/prometheus /usr/local/bin/prometheus

474
# Copy UCX from base image as plugin for NIXL
475
# Copy NIXL source from wheel_builder image
476
# Copy dynamo wheels for gitlab artifacts
477
COPY --from=base /usr/local/ucx /usr/local/ucx
478
COPY --from=wheel_builder $NIXL_PREFIX $NIXL_PREFIX
479
COPY --from=wheel_builder /workspace/dist/*.whl wheelhouse/
480

481
# Copies vllm, DeepEP, DeepGEMM, PPLX repos (all editable installs) and nvshmem binaries
482
COPY --from=base /opt/vllm /opt/vllm
483

484
485
ENV LD_LIBRARY_PATH=\
/opt/vllm/tools/ep_kernels/ep_kernels_workspace/nvshmem_install/lib:\
486
487
$NIXL_LIB_DIR:\
$NIXL_PLUGIN_DIR:\
488
489
490
491
492
/usr/local/ucx/lib:\
/usr/local/ucx/lib/ucx:\
$LD_LIBRARY_PATH

# Copy entire venv
493
494
495
496
# Theres a lot of stuff we'd have to re-compile (for arm64)
# TODO: use pip ai-dynamo[vllm] in venv to replicate end user environment
# Copy metrics binary from wheel_builder image, not part of ai-dynamo wheel
COPY --from=ci_minimum /workspace/target/release/metrics /usr/local/bin/metrics
497
498
COPY --from=ci_minimum ${VIRTUAL_ENV} ${VIRTUAL_ENV}

499
500
501
# Keep everything from ci_minimum for mypy and other pre-merge tests
# TODO: Remove this once we have a functional CI image built on top of the runtime image
COPY --from=ci_minimum /workspace/ /workspace/
502

503
504
505
# 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 && \
506
507
    echo "cat ~/.launch_screen" >> ~/.bashrc && \
    echo "source $VIRTUAL_ENV/bin/activate" >> ~/.bashrc
508

509
ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]
510
CMD []