From 6a0366cf4534d1044b84f2397f2f67d31bedcdf6 Mon Sep 17 00:00:00 2001 From: Self Denial Date: Sun, 29 Sep 2024 03:45:53 -0600 Subject: [PATCH 1/4] New ComfyUI Dockerfile features - Non-root default - Use `git describe` to automatically use latest ComfyUI tag (or `USE_EDGE=true` variable for latest commit) - Support custom_nodes: * **ComfyUI-GGUF support** (`USE_GGUF=true`) * **x-flux-comfyui support** (`USE_XFLUX=true`) * **comfyui_controlnet_aux support** (`USE_CNAUX=false`) --- services/comfy/Dockerfile | 65 ++++++++++++++++++++++++--- services/comfy/entrypoint.sh | 26 ++++++++++- services/comfy/extra_model_paths.yaml | 4 +- 3 files changed, 85 insertions(+), 10 deletions(-) diff --git a/services/comfy/Dockerfile b/services/comfy/Dockerfile index 2de504d..a34c01f 100644 --- a/services/comfy/Dockerfile +++ b/services/comfy/Dockerfile @@ -1,19 +1,70 @@ +# Limited system user UID +ARG USE_UID=991 +# Limited system user GID +ARG USE_GID=991 +# Latest tag or bleeding edge commit +ARG USE_EDGE=false +# ComfyUI-GGUF support +ARG USE_GGUF=false +# x-flux-comfyui support +ARG USE_XFLUX=false +# comfyui_controlnet_aux support +ARG USE_CNAUX=false + FROM pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime -ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1 +# Use args +ARG USE_UID +ARG USE_GID +ARG USE_EDGE +ARG USE_GGUF +ARG USE_XFLUX +ARG USE_CNAUX -RUN apt-get update && apt-get install -y git && apt-get clean +ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1 USE_EDGE=$USE_EDGE +ENV USE_GGUF=$USE_GGUF USE_XFLUX=$USE_XFLUX ROOT=/stable-diffusion +ENV CACHE=/home/app/.cache USE_CNAUX=$USE_CNAUX -ENV ROOT=/stable-diffusion -RUN --mount=type=cache,target=/root/.cache/pip \ +# User/Group +RUN groupadd -r app -g ${USE_GID} && useradd --no-log-init -m -r -g app app -u ${USE_UID} && \ + mkdir -p ${ROOT} && chown ${USE_UID}:${USE_GID} ${ROOT} && mkdir -p ${CACHE}/pip && chown -R ${USE_UID}:${USE_GID} ${CACHE} +RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} chown -R ${USE_UID}:${USE_UID} ${CACHE} + +RUN apt-get update && apt-get install -y git && ([ "${USE_XFLUX}" = "true" ] && apt-get install -y libgl1-mesa-glx python3-opencv) && apt-get clean + +USER app:app +ENV PATH="${PATH}:/home/app/.local/bin" + +RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} pip --cache-dir=${CACHE}/pip install -U pip + +RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} \ git clone https://github.com/comfyanonymous/ComfyUI.git ${ROOT} && \ cd ${ROOT} && \ git checkout master && \ - git reset --hard 276f8fce9f5a80b500947fb5745a4dde9e84622d && \ - pip install -r requirements.txt + bash -c 'VERSION=$(git describe --tags --abbrev=0) && \ + if [ "${USE_EDGE}" = "true" ]; then VERSION=$(git describe --abbrev=7); fi && \ + git reset --hard ${VERSION}' && \ + pip --cache-dir=${CACHE}/pip install -r requirements.txt && \ + if [ "${USE_GGUF}" = "true" ]; then \ + git clone https://github.com/city96/ComfyUI-GGUF.git && \ + cd ComfyUI-GGUF && git checkout main && \ + pip --cache-dir=${CACHE}/pip install -r requirements.txt && cd ..; \ + fi; \ + if [ "${USE_XFLUX}" = "true" ]; then \ + git clone https://github.com/XLabs-AI/x-flux-comfyui.git && \ + cd x-flux-comfyui && git checkout main && \ + pip --cache-dir=${CACHE}/pip install -r requirements.txt && cd ..; \ + fi; \ + if [ "${USE_CNAUX}" = "true" ]; then \ + git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git && \ + cd comfyui_controlnet_aux && git checkout main && \ + pip --cache-dir=${CACHE}/pip install -r requirements.txt && \ + # This extra step to separate onnxruntime installation is required to restore onnx cuda support + pip --cache-dir=${CACHE}/pip install onnxruntime && pip --cache-dir=${CACHE}/pip install onnxruntime-gpu && cd ..; \ + fi WORKDIR ${ROOT} -COPY . /docker/ +COPY --chown=${USE_UID}:${USE_GID} . /docker/ RUN chmod u+x /docker/entrypoint.sh && cp /docker/extra_model_paths.yaml ${ROOT} ENV NVIDIA_VISIBLE_DEVICES=all PYTHONPATH="${PYTHONPATH}:${PWD}" CLI_ARGS="" diff --git a/services/comfy/entrypoint.sh b/services/comfy/entrypoint.sh index b4299a7..f4ffe68 100755 --- a/services/comfy/entrypoint.sh +++ b/services/comfy/entrypoint.sh @@ -2,11 +2,12 @@ set -Eeuo pipefail -mkdir -vp /data/config/comfy/custom_nodes +CUSTOM_NODES="/data/config/comfy/custom_nodes" +mkdir -vp "${CUSTOM_NODES}" declare -A MOUNTS -MOUNTS["/root/.cache"]="/data/.cache" +MOUNTS["${CACHE}"]="/data/.cache" MOUNTS["${ROOT}/input"]="/data/config/comfy/input" MOUNTS["${ROOT}/output"]="/output/comfy" @@ -22,6 +23,27 @@ for to_path in "${!MOUNTS[@]}"; do echo Mounted $(basename "${from_path}") done +if [ "${USE_GGUF}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/ComfyUI-GGUF" ] && mv "${ROOT}/ComfyUI-GGUF" "${CUSTOM_NODES}"/ +fi +if [ "${USE_XFLUX}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/x-flux-comfyui" ] && mv "${ROOT}/x-flux-comfyui" "${CUSTOM_NODES}"/ + [ ! -e "/data/models/clip_vision" ] && mkdir -p /data/models/clip_vision + [ ! -e "/data/models/clip_vision/model.safetensors" ] && cd /data/models/clip_vision && \ + python -c 'import sys; from urllib.request import urlopen; from pathlib import Path; Path(sys.argv[2]).write_bytes(urlopen("".join([sys.argv[1],sys.argv[2]])).read())' \ + "https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/" "model.safetensors" + [ ! -e "/data/models/xlabs" ] && mkdir -p /data/models/xlabs/{ipadapters,loras,controlnets} + [ ! -e "/data/models/xlabs/ipadapters/flux-ip-adapter.safetensors" ] && cd /data/models/xlabs/ipadapters && \ + python -c 'import sys; from urllib.request import urlopen; from pathlib import Path; Path(sys.argv[2]).write_bytes(urlopen("".join([sys.argv[1],sys.argv[2]])).read())' \ + "https://huggingface.co/XLabs-AI/flux-ip-adapter/resolve/main/" "flux-ip-adapter.safetensors" + [ -d "${ROOT}/models/xlabs" ] && rm -rf "${ROOT}/models/xlabs" + [ ! -e "${ROOT}/models/xlabs" ] && cd "${ROOT}/models" && ln -sT /data/models/xlabs xlabs && cd .. +fi +if [ "${USE_CNAUX}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/comfyui_controlnet_aux" ] && mv "${ROOT}/comfyui_controlnet_aux" "${CUSTOM_NODES}"/ +fi + + if [ -f "/data/config/comfy/startup.sh" ]; then pushd ${ROOT} . /data/config/comfy/startup.sh diff --git a/services/comfy/extra_model_paths.yaml b/services/comfy/extra_model_paths.yaml index eb374eb..2443bdd 100644 --- a/services/comfy/extra_model_paths.yaml +++ b/services/comfy/extra_model_paths.yaml @@ -15,11 +15,13 @@ a111: gligen: models/GLIGEN clip: models/CLIPEncoder embeddings: embeddings + unet: models/unet + clip_vision: models/clip_vision + xlabs: models/xlabs custom_nodes: config/comfy/custom_nodes # TODO: I am unsure about these, need more testing # style_models: config/comfy/style_models # t2i_adapter: config/comfy/t2i_adapter - # clip_vision: config/comfy/clip_vision # diffusers: config/comfy/diffusers From 25d8d0c0088c2de0a99cb45c368bc10896c58ea5 Mon Sep 17 00:00:00 2001 From: Self Denial Date: Mon, 28 Oct 2024 22:40:37 -0600 Subject: [PATCH 2/4] Update, more ComfyUI Dockerfile features & bugfix - Update base image to pytorch 2.3.1 - Fix missing comment line escape - Support [krita-ai-diffusion](https://github.com/Acly/krita-ai-diffusion/wiki/ComfyUI-Setup) (`USE_KRITA=true`) This enables the following custom nodes (including comfyui_controlnet_aux): * **ComfyUI_IPAdapter_plus** (`USE_IPAPLUS=true`) * **comfyui-inpaint-nodes** (`USE_INPAINT=true`) * **comfyui-tooling-nodes** (`USE_TOOLING=true`) --- services/comfy/Dockerfile | 48 +++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/services/comfy/Dockerfile b/services/comfy/Dockerfile index a34c01f..be55849 100644 --- a/services/comfy/Dockerfile +++ b/services/comfy/Dockerfile @@ -1,29 +1,30 @@ +FROM pytorch/pytorch:2.3.1-cuda12.1-cudnn8-runtime + # Limited system user UID ARG USE_UID=991 # Limited system user GID ARG USE_GID=991 # Latest tag or bleeding edge commit ARG USE_EDGE=false -# ComfyUI-GGUF support +# ComfyUI-GGUF ARG USE_GGUF=false -# x-flux-comfyui support +# x-flux-comfyui ARG USE_XFLUX=false -# comfyui_controlnet_aux support +# comfyui_controlnet_aux ARG USE_CNAUX=false - -FROM pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime - -# Use args -ARG USE_UID -ARG USE_GID -ARG USE_EDGE -ARG USE_GGUF -ARG USE_XFLUX -ARG USE_CNAUX +# krita-ai-diffusion +ARG USE_KRITA=false +# ComfyUI_IPAdapter_plus +ARG USE_IPAPLUS=false +# comfyui-inpaint-nodes +ARG USE_INPAINT=false +# comfyui-tooling-nodes +ARG USE_TOOLING=false ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1 USE_EDGE=$USE_EDGE ENV USE_GGUF=$USE_GGUF USE_XFLUX=$USE_XFLUX ROOT=/stable-diffusion -ENV CACHE=/home/app/.cache USE_CNAUX=$USE_CNAUX +ENV CACHE=/home/app/.cache USE_CNAUX=$USE_CNAUX USE_KRITA=$USE_KRITA +ENV USE_IPAPLUS=$USE_IPAPLUS USE_INPAINT=$USE_INPAINT USE_TOOLING=$USE_TOOLING # User/Group RUN groupadd -r app -g ${USE_GID} && useradd --no-log-init -m -r -g app app -u ${USE_UID} && \ @@ -45,6 +46,10 @@ RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} \ if [ "${USE_EDGE}" = "true" ]; then VERSION=$(git describe --abbrev=7); fi && \ git reset --hard ${VERSION}' && \ pip --cache-dir=${CACHE}/pip install -r requirements.txt && \ + if [ "${USE_KRITA}" = "true" ]; then \ + USE_CNAUX="true"; USE_IPAPLUS="true"; \ + USE_INPAINT="true"; USE_TOOLING="true"; \ + fi; \ if [ "${USE_GGUF}" = "true" ]; then \ git clone https://github.com/city96/ComfyUI-GGUF.git && \ cd ComfyUI-GGUF && git checkout main && \ @@ -59,8 +64,21 @@ RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} \ git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git && \ cd comfyui_controlnet_aux && git checkout main && \ pip --cache-dir=${CACHE}/pip install -r requirements.txt && \ - # This extra step to separate onnxruntime installation is required to restore onnx cuda support + # This extra step to separate onnxruntime installation is required to restore onnx cuda support \ pip --cache-dir=${CACHE}/pip install onnxruntime && pip --cache-dir=${CACHE}/pip install onnxruntime-gpu && cd ..; \ + fi; \ + if [ "${USE_IPAPLUS}" = "true" ]; then \ + git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git && \ + cd ComfyUI_IPAdapter_plus && git checkout main && cd ..; \ + fi; \ + if [ "${USE_INPAINT}" = "true" ]; then \ + git clone https://github.com/Acly/comfyui-inpaint-nodes.git && \ + cd comfyui-inpaint-nodes && git checkout main && \ + pip install opencv-python && cd ..; \ + fi; \ + if [ "${USE_TOOLING}" = "true" ]; then \ + git clone https://github.com/Acly/comfyui-tooling-nodes.git && \ + cd comfyui-tooling-nodes && git checkout main && cd ..; \ fi WORKDIR ${ROOT} From 0f3187505bfe76ba24372f135e4f6481097210af Mon Sep 17 00:00:00 2001 From: Self Denial Date: Tue, 29 Oct 2024 01:36:21 -0600 Subject: [PATCH 3/4] feat: Add support for Krita AI Diffusion support This commit adds support for integrating Krita AI Diffusion models and nodes into the Comfy image editing application. It includes the following changes: - Downloads recommended models for Krita AI Diffusion if enabled - Symlinks the downloaded upscale models into the models directory - Adds environment variables to enable/disable dependancy node packs - Clones and sets up the required Git repositories for those node packs if enabled - Installs additional dependencies like aiohttp and tqdm if Krita AI Diffusion is used These changes allow Comfy to leverage the powerful image generation and editing capabilities provided by the Krita AI Diffusion project. Users can now access advanced features like outpainting, inpainting, upscaling, etc. within the Comfy UI. The commit also improves the build process by using a cache for pip installs and specifying types for mounted volumes in Docker for better performance and reproducibility. --- services/comfy/Dockerfile | 10 +++++++--- services/comfy/entrypoint.sh | 18 +++++++++++++++++- services/comfy/extra_model_paths.yaml | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/services/comfy/Dockerfile b/services/comfy/Dockerfile index be55849..b474d34 100644 --- a/services/comfy/Dockerfile +++ b/services/comfy/Dockerfile @@ -47,8 +47,12 @@ RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} \ git reset --hard ${VERSION}' && \ pip --cache-dir=${CACHE}/pip install -r requirements.txt && \ if [ "${USE_KRITA}" = "true" ]; then \ - USE_CNAUX="true"; USE_IPAPLUS="true"; \ - USE_INPAINT="true"; USE_TOOLING="true"; \ + pip --cache-dir=${CACHE}/pip install aiohttp tqdm && \ + git clone https://github.com/Acly/krita-ai-diffusion.git && \ + cd krita-ai-diffusion && git checkout main && \ + git submodule update --init && cd ..; \ + export USE_CNAUX="true" USE_IPAPLUS="true" \ + USE_INPAINT="true" USE_TOOLING="true"; \ fi; \ if [ "${USE_GGUF}" = "true" ]; then \ git clone https://github.com/city96/ComfyUI-GGUF.git && \ @@ -74,7 +78,7 @@ RUN --mount=type=cache,uid=${USE_UID},gid=${USE_GID},target=${CACHE} \ if [ "${USE_INPAINT}" = "true" ]; then \ git clone https://github.com/Acly/comfyui-inpaint-nodes.git && \ cd comfyui-inpaint-nodes && git checkout main && \ - pip install opencv-python && cd ..; \ + pip --cache-dir=${CACHE}/pip install opencv-python && cd ..; \ fi; \ if [ "${USE_TOOLING}" = "true" ]; then \ git clone https://github.com/Acly/comfyui-tooling-nodes.git && \ diff --git a/services/comfy/entrypoint.sh b/services/comfy/entrypoint.sh index f4ffe68..53cb6ce 100755 --- a/services/comfy/entrypoint.sh +++ b/services/comfy/entrypoint.sh @@ -23,6 +23,14 @@ for to_path in "${!MOUNTS[@]}"; do echo Mounted $(basename "${from_path}") done + +if [ "${USE_KRITA}" = "true" ]; then + if [ "${KRITA_DOWNLOAD_MODELS:-false}" = "true" ]; then + cd "${ROOT}/krita-ai-diffusion/scripts" && python scripts/download_models.py --recommended /data && cd .. + cd "${ROOT}/models/" mv -v upscale_models upscale_models.stock && ln -sT /data/models/upscale_models upscale_models + fi + export USE_CNAUX="true" USE_IPAPLUS="true" USE_INPAINT="true"; USE_TOOLING="true" +fi if [ "${USE_GGUF}" = "true" ]; then [ ! -e "${CUSTOM_NODES}/ComfyUI-GGUF" ] && mv "${ROOT}/ComfyUI-GGUF" "${CUSTOM_NODES}"/ fi @@ -42,7 +50,15 @@ fi if [ "${USE_CNAUX}" = "true" ]; then [ ! -e "${CUSTOM_NODES}/comfyui_controlnet_aux" ] && mv "${ROOT}/comfyui_controlnet_aux" "${CUSTOM_NODES}"/ fi - +if [ "${USE_IPAPLUS}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/ComfyUI_IPAdapter_plus" ] && mv "${ROOT}/ComfyUI_IPAdapter_plus" "${CUSTOM_NODES}"/ +fi +if [ "${USE_INPAINT}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/comfyui-inpaint-nodes" ] && mv "${ROOT}/comfyui-inpaint-nodes" "${CUSTOM_NODES}"/ +fi +if [ "${USE_TOOLING}" = "true" ]; then + [ ! -e "${CUSTOM_NODES}/comfyui-tooling-nodes" ] && mv "${ROOT}/comfyui-tooling-nodes" "${CUSTOM_NODES}"/ +fi if [ -f "/data/config/comfy/startup.sh" ]; then pushd ${ROOT} diff --git a/services/comfy/extra_model_paths.yaml b/services/comfy/extra_model_paths.yaml index 2443bdd..365f5d2 100644 --- a/services/comfy/extra_model_paths.yaml +++ b/services/comfy/extra_model_paths.yaml @@ -18,6 +18,8 @@ a111: unet: models/unet clip_vision: models/clip_vision xlabs: models/xlabs + inpaint: models/inpaint + ipadapter: models/ipadapter custom_nodes: config/comfy/custom_nodes From ee10e058cc94709cc5e605652ed2dd62f4d3b345 Mon Sep 17 00:00:00 2001 From: Self Denial Date: Tue, 29 Oct 2024 15:38:49 -0600 Subject: [PATCH 4/4] Fix *upscale_models* path for `USE_KRITA=true` --- services/comfy/entrypoint.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/comfy/entrypoint.sh b/services/comfy/entrypoint.sh index 53cb6ce..309bada 100755 --- a/services/comfy/entrypoint.sh +++ b/services/comfy/entrypoint.sh @@ -27,7 +27,11 @@ done if [ "${USE_KRITA}" = "true" ]; then if [ "${KRITA_DOWNLOAD_MODELS:-false}" = "true" ]; then cd "${ROOT}/krita-ai-diffusion/scripts" && python scripts/download_models.py --recommended /data && cd .. - cd "${ROOT}/models/" mv -v upscale_models upscale_models.stock && ln -sT /data/models/upscale_models upscale_models + fi + [ -d "${ROOT}/models/upscale_models" ] && mv -v "${ROOT}/models/upscale_models" "${ROOT}/models/upscale_models.stock" + if [ ! -L "${ROOT}/models/upscale_models" ]; then + cd "${ROOT}/models" + ln -sfT /data/models/upscale_models upscale_models fi export USE_CNAUX="true" USE_IPAPLUS="true" USE_INPAINT="true"; USE_TOOLING="true" fi