diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 241f11b..6fd8686 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,3 +11,4 @@ Closes issue # - auto: https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/ - sygil: https://github.com/Sygil-Dev/sygil-webui/commit/ - invoke: https://github.com/invoke-ai/InvokeAI/commit/ +- comfy: https://github.com/comfyanonymous/ComfyUI/commit/ diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 2c7645e..0955d69 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -16,6 +16,7 @@ jobs: - auto - sygil - invoke + - comfy - download runs-on: ubuntu-latest name: ${{ matrix.profile }} diff --git a/README.md b/README.md index eacb01d..78a1732 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,14 @@ This repository provides multiple UIs for you to play around with stable diffusi | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | | ![](https://user-images.githubusercontent.com/24505302/189541298-f902b021-a1eb-4e4b-b2eb-b6a696a8ec80.jpg) | ![](https://user-images.githubusercontent.com/24505302/189541295-7d7f2162-2189-4e0a-abbd-703f4779e1cd.jpg) | ![](https://user-images.githubusercontent.com/24505302/189541294-aa7f7735-a973-4e17-ada0-1fe3acbb1772.jpg) | +### [ComfyUI](https://github.com/comfyanonymous/ComfyUI) + +[Full feature list here](https://github.com/comfyanonymous/ComfyUI#features), Screenshot: + +| Workflow | +| -------------------------------------------------------------------------------- | +| ![](https://github.com/comfyanonymous/ComfyUI/raw/master/comfyui_screenshot.png) | + ## Contributing Contributions are welcome! **Create a discussion first of what the problem is and what you want to contribute (before you implement anything)** @@ -51,5 +59,6 @@ Special thanks to everyone behind these awesome projects, without them, none of - [AUTOMATIC1111/stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) - [InvokeAI](https://github.com/invoke-ai/InvokeAI) - [Sygil-webui](https://github.com/Sygil-Dev/sygil-webui) +- [ComfyUI](https://github.com/comfyanonymous/ComfyUI) - [CompVis/stable-diffusion](https://github.com/CompVis/stable-diffusion) - and many many more. diff --git a/docker-compose.yml b/docker-compose.yml index 2d17b6c..3199435 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,7 +48,6 @@ services: - PRELOAD=true - CLI_ARGS=--no-nsfw_checker --no-safety_checker --xformers - sygil: &sygil <<: *base_service profiles: ["sygil"] @@ -63,3 +62,19 @@ services: profiles: ["sygil-sl"] environment: - USE_STREAMLIT=1 + + comfy: &comfy + <<: *base_service + profiles: ["comfy"] + build: ./services/comfy/ + image: sd-comfy:1 + environment: + - CLI_ARGS= + + + comfy-cpu: + <<: *comfy + profiles: ["comfy-cpu"] + deploy: {} + environment: + - CLI_ARGS=--cpu diff --git a/services/comfy/Dockerfile b/services/comfy/Dockerfile new file mode 100644 index 0000000..0df273f --- /dev/null +++ b/services/comfy/Dockerfile @@ -0,0 +1,44 @@ +FROM alpine:3.17 as xformers +RUN apk add --no-cache aria2 +RUN aria2c -x 5 --dir / --out wheel.whl 'https://github.com/AbdBarho/stable-diffusion-webui-docker/releases/download/5.0.0/xformers-0.0.17.dev449-cp310-cp310-manylinux2014_x86_64.whl' + + +FROM python:3.10.9-slim + +ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1 + +RUN --mount=type=cache,target=/root/.cache/pip pip install torch==1.13.1 torchvision --extra-index-url https://download.pytorch.org/whl/cu117 + +RUN apt-get update && apt-get install -y git && apt-get clean + +ENV ROOT=/stable-diffusion +RUN --mount=type=cache,target=/root/.cache/pip \ + git clone https://github.com/comfyanonymous/ComfyUI.git ${ROOT} && \ + cd ${ROOT} && \ + git checkout master && \ + git reset --hard 884ea653c8d6fe19b3724f45a04a0d74cd881f2f && \ + pip install -r requirements.txt + + +RUN --mount=type=cache,target=/root/.cache/pip \ + --mount=type=bind,from=xformers,source=/wheel.whl,target=/xformers-0.0.17-cp310-cp310-linux_x86_64.whl \ + pip install triton /xformers-0.0.17-cp310-cp310-linux_x86_64.whl + + +WORKDIR ${ROOT} + +ARG BRANCH=master SHA=884ea653c8d6fe19b3724f45a04a0d74cd881f2f +RUN --mount=type=cache,target=/root/.cache/pip \ + git fetch && \ + git checkout ${BRANCH} && \ + git reset --hard ${SHA} && \ + pip install -r requirements.txt + +# add info +COPY . /docker/ + +ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility NVIDIA_VISIBLE_DEVICES=all +ENV PYTHONPATH="${PYTHONPATH}:${PWD}" CLI_ARGS="" +EXPOSE 7860 +ENTRYPOINT ["/docker/entrypoint.sh"] +CMD python -u main.py --listen --port 7860 ${CLI_ARGS} diff --git a/services/comfy/entrypoint.sh b/services/comfy/entrypoint.sh new file mode 100644 index 0000000..5ffc6bc --- /dev/null +++ b/services/comfy/entrypoint.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +set -Eeuo pipefail + +declare -A MOUNTS + + +mkdir -vp /data/config/comfy/ + +# cache +MOUNTS["/root/.cache"]=/data/.cache +# ui specific +MOUNTS["${ROOT}/models/checkpoints"]="/data/StableDiffusion" +MOUNTS["${ROOT}/models/controlnet"]="/data/ControlNet" +MOUNTS["${ROOT}/models/upscale_models/RealESRGAN"]="/data/RealESRGAN" +MOUNTS["${ROOT}/models/upscale_models/GFPGAN"]="/data/GFPGAN" +MOUNTS["${ROOT}/models/upscale_models/SwinIR"]="/data/SwinIR" +MOUNTS["${ROOT}/models/vae"]="/data/VAE" + +# data +MOUNTS["${ROOT}/models/loras"]="/data/Lora" +MOUNTS["${ROOT}/models/embeddings"]="/data/embeddings" + +# config +# TODO: I am not sure if this is final, maybe it should change in the future +MOUNTS["${ROOT}/models/clip"]="/data/.cache/comfy/clip" +MOUNTS["${ROOT}/models/clip_vision"]="/data/.cache/comfy/clip_vision" +MOUNTS["${ROOT}/models/custom_nodes"]="/data/config/comfy/custom_nodes" +MOUNTS["${ROOT}/models/style_models"]="/data/config/comfy/style_models" +MOUNTS["${ROOT}/models/t2i_adapter"]="/data/config/comfy/t2i_adapter" + +# output +MOUNTS["${ROOT}/output"]="/output/comfy" + +for to_path in "${!MOUNTS[@]}"; do + set -Eeuo pipefail + from_path="${MOUNTS[${to_path}]}" + rm -rf "${to_path}" + if [ ! -f "$from_path" ]; then + mkdir -vp "$from_path" + fi + mkdir -vp "$(dirname "${to_path}")" + ln -sT "${from_path}" "${to_path}" + echo Mounted $(basename "${from_path}") +done + +exec "$@"