Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docker support (Tested on RTX3080) + ignoring reproducable files / cache #50

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
models/
Dockerfile
README.md
LICENSE
assets/
*.egg-info
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
models/ldm/text2img-large/
outputs/
src/
__pycache__/
*.egg-info
38 changes: 38 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
MAINTAINER Peter Willemsen <peter@codebuffet.co>
RUN echo "Installing dependencies..." && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y curl wget sudo git build-essential cmake pkg-config liblzma-dev libbz2-dev zlib1g-dev libssl-dev zsh clang && \
apt-get dist-upgrade -y && \
rm -rf /var/lib/apt/lists/*

WORKDIR /src/python
RUN wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz -O python-src.tar.gz && \
tar xzvf python-src.tar.gz --strip-components=1 && \
rm python-src.tar.gz && \
./configure --enable-optimizations --prefix=/opt/python-3.8.5 && \
make && \
make install && \
rm -rf /src/python
WORKDIR /
ENV PATH="/opt/python-3.8.5/bin:${PATH}"

RUN python3 -m pip install pip==20.3
RUN pip3 install torch==1.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
Copy link

Choose a reason for hiding this comment

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

^ This will probably not work on older GPUs. Perhaps we should state it in the documentation somewhere?

Copy link
Author

Choose a reason for hiding this comment

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

I'm thinking of using build args for this. However, I don't know the exact configuration for each GPU. I used an RTX3080, I think that we should just expose the choice of Torch versions as build arg, and then let people choose themselves. We can set a default version that works for most GPU's.

But I don't think GPU with less than 12GB VRAM works anyway, so it narrows down the old GPU's supported, depending on how old we're talking about!

Copy link
Author

Choose a reason for hiding this comment

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

I wonder, is there a better way to get the right Torch version supporting the GPU of the machine running the image builder I'm not aware of? Currently, all my Dockerfiles are configured for my GPU, but it makes it less portable.

RUN pip3 install numpy==1.19.2 torchvision==0.11.2 albumentations==0.4.3 opencv-python==4.1.2.30 pudb==2019.2 imageio==2.9.0 imageio-ffmpeg==0.4.2 pytorch-lightning==1.6.1 omegaconf==2.1.1 test-tube>=0.7.5 streamlit>=0.73.1 einops==0.3.0 torch-fidelity==0.3.0 transformers==4.3.1 -e "git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers" -e "git+https://github.com/openai/CLIP.git@main#egg=clip"
Copy link

Choose a reason for hiding this comment

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

Just curious, why not put these in a requirements file so its easier to read?

Copy link
Author

Choose a reason for hiding this comment

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

We can do that, except RUN python3 -m pip install pip==20.3 because the goal was to stay as close to the Conda environment as possible to make sure we won't run into issues that they wouldn't have otherwise when they chose to install with Conda.


RUN mkdir -p /opt/ldm_package
ADD ./setup.py /opt/ldm_package
ADD ./ldm /opt/ldm_package/ldm
ADD ./configs /opt/ldm_package/configs
RUN pip3 install -e /opt/ldm_package

WORKDIR /opt/ldm

# Add dev user
RUN useradd -ms /bin/zsh ldm-dev && \
usermod -aG sudo ldm-dev && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER ldm-dev

ENTRYPOINT ["python3"]
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,20 @@ As a rule of thumb, higher values of `scale` produce better samples at the cost
Furthermore, increasing `ddim_steps` generally also gives higher quality samples, but returns are diminishing for values > 250.
Fast sampling (i.e. low values of `ddim_steps`) while retaining good quality can be achieved by using `--ddim_eta 0.0`.

## Installing on Docker

- Note: depending on CUDA/GPU version, you might have to change the first line in te Dockerfile or change the torch version being installed.
- Build the image: `docker build . --tag latent-diffusion`
- For text-to-image, download the pre-trained weights (5.7GB):
```
mkdir -p models/ldm/text2img-large/
wget -O models/ldm/text2img-large/model.ckpt https://ommer-lab.com/files/latent-diffusion/nitro/txt2img-f8-large/model.ckpt
```
- Sample with (Make sure to call in the directory of this repo):
```
docker run --name=tmp-diffusion --rm --gpus all -it -v "$(pwd):/opt/ldm" latent-diffusion /opt/ldm/scripts/txt2img.py --prompt "A large blue whale on a freight ship, vector art" --ddim_eta 0.0 --n_samples 4 --n_iter 4 --scale 5.0 --ddim_steps 50
```

#### Beyond 256²

For certain inputs, simply running the model in a convolutional fashion on larger features than it was trained on
Expand Down