Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.git
.env
*.pyc
Dockerfile
89 changes: 89 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-devel AS builder

# Install build dependencies
RUN apt-get update && \
apt-get install -y ffmpeg build-essential git rdfind

WORKDIR /app
ADD setup.sh /app/setup.sh

# Setup conda
RUN conda config --set always_yes true && \
conda init && \
conda config --add channels defaults

# Use bash shell so we can source activate
SHELL ["/bin/bash", "-c"]


RUN conda install torchvision=0.19.0 \
onnx==1.17.0 \
pytorch=2.4.0 \
pytorch-cuda=12.4 \
--force-reinstall \
-c pytorch \
-c nvidia

# Create a g++ wrapper for JIT, since the include dirs are passed with -i rather than -I for some reason
RUN printf '#!/usr/bin/env bash\nexec /usr/bin/g++ -I/usr/local/cuda/include -I/usr/local/cuda/include/crt "$@"\n' > /usr/local/bin/gxx-wrapper && \
chmod +x /usr/local/bin/gxx-wrapper
ENV CXX=/usr/local/bin/gxx-wrapper


# Run setup.sh - this won't install all the things due to missing GPU in the builder
RUN conda run -n base ./setup.sh --basic --xformers --flash-attn --diffoctreerast --vox2seq --spconv --mipgaussian --kaolin --nvdiffrast --demo

# Now install additional Python packages
# These ones work inside the builder
RUN conda run -n base pip install diso
RUN conda run -n base pip install plyfile utils3d flash_attn spconv-cu120 xformers onnxscript
RUN conda run -n base pip install kaolin -f https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.4.0_cu121.html
RUN conda run -n base pip install git+https://github.com/NVlabs/nvdiffrast.git

# Remove downloaded packages from conda and pip
RUN conda clean --all -f -y
RUN pip cache purge

# Deduplicate with rdfind
# This reduces the size of the image by a few hundred megs.
RUN rdfind -makesymlinks true /opt/conda

# Final stage
FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-devel AS final

WORKDIR /app
COPY --from=builder /usr/local/bin/gxx-wrapper /usr/local/bin/gxx-wrapper
COPY --from=builder /opt/conda /opt/conda
COPY --from=builder /root /root
COPY --from=builder /app /app

# Reinstall any runtime tools needed
# git and build-essential are needed for post_install.sh script.
# vim and strace are useful for debugging, remove those if you want to.
RUN apt update && \
apt upgrade && \
Copy link

@AnotiaWang AnotiaWang Dec 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe missing a -y option here in apt upgrade? Otherwise docker will fail:

Need to get xxxMB of archives.
After this operation, xxxMB of additional disk space will be used.
Do you want to continue? [Y/n] Abort.
ERROR: failed to solve: process "/bin/sh -c apt upgrade" did not complete successfully: exit code: 1

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oof! Yes I added this without testing it. You wouldn't believe how many times I've rebuilt this image! Thanks :)

apt install -y build-essential \
git \
strace \
vim && \
rm -rf /var/lib/apt/lists/*

# install these last, so we can experiment without excessive build times.
COPY trellis /app/trellis
COPY app.py /app/app.py
COPY example.py /app/example.py
COPY extensions /app/extensions
COPY assets /app/assets
COPY onstart.sh /app/onstart.sh
COPY post_install.sh /app/post_install.sh

ENV PATH=/opt/conda/bin:$PATH

# This script runs the post_install steps

# If you're pushing to a container registry, let this run once, run some
# tests, then do `docker commit` to save the models along with the image.
# This will ensure that it won't fail at runtime due to models being
# unavailable, or network restrictions.
CMD ["bash", "/app/onstart.sh"]

2 changes: 1 addition & 1 deletion app.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,4 +245,4 @@ def deactivate_button() -> gr.Button:
if __name__ == "__main__":
pipeline = TrellisImageTo3DPipeline.from_pretrained("JeffreyXiang/TRELLIS-image-large")
pipeline.cuda()
demo.launch()
demo.launch(server_name="0.0.0.0")
12 changes: 12 additions & 0 deletions onstart.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash

cd /app

echo "Doing post install steps"
./post_install.sh

export CXX=/usr/local/bin/gxx-wrapper

echo "Launching app"
python3 app.py

25 changes: 25 additions & 0 deletions post_install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
set -e

# Check if post-install steps have already been run
if [ -f /app/.post_install_done ]; then
echo "Post-install steps already completed."
exit 0
fi

cd /app

echo "Install stuff that couldn't be installed without GPU"
# Run the demo setup
conda run -n base ./setup.sh --mipgaussian --diffoctreerast

echo "Proving it actually works..."

export CXX=/usr/local/bin/gxx-wrapper
python example.py

# Mark completion
touch /app/.post_install_done

echo "Post-install steps completed successfully."