mirror of
https://github.com/AbdBarho/stable-diffusion-webui-docker.git
synced 2026-03-21 20:44:47 +01:00
Merge branch 'master' into master
This commit is contained in:
commit
d013e88f27
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -1,2 +1,6 @@
|
||||||
/.devcontainer
|
/.devcontainer
|
||||||
/docker-compose.override.yml
|
/docker-compose.override.yml
|
||||||
|
|
||||||
|
# VSCode specific
|
||||||
|
*.code-workspace
|
||||||
|
/.vscode
|
||||||
|
|
|
||||||
2
data/.gitignore
vendored
2
data/.gitignore
vendored
|
|
@ -22,3 +22,5 @@
|
||||||
/Lora
|
/Lora
|
||||||
/ControlNet
|
/ControlNet
|
||||||
/openpose
|
/openpose
|
||||||
|
/ModelScope
|
||||||
|
/LyCORIS
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ services:
|
||||||
<<: *base_service
|
<<: *base_service
|
||||||
profiles: ["auto"]
|
profiles: ["auto"]
|
||||||
build: ./services/AUTOMATIC1111
|
build: ./services/AUTOMATIC1111
|
||||||
image: sd-auto:51
|
image: sd-auto:55
|
||||||
environment:
|
environment:
|
||||||
- CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api
|
- CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api
|
||||||
|
|
||||||
|
|
@ -39,14 +39,21 @@ services:
|
||||||
environment:
|
environment:
|
||||||
- CLI_ARGS=--no-half --precision full --allow-code --enable-insecure-extension-access --api
|
- CLI_ARGS=--no-half --precision full --allow-code --enable-insecure-extension-access --api
|
||||||
|
|
||||||
invoke:
|
invoke: &invoke
|
||||||
<<: *base_service
|
<<: *base_service
|
||||||
profiles: ["invoke"]
|
profiles: ["invoke"]
|
||||||
build: ./services/invoke/
|
build: ./services/invoke/
|
||||||
image: sd-invoke:27
|
image: sd-invoke:28
|
||||||
environment:
|
environment:
|
||||||
- PRELOAD=true
|
- PRELOAD=true
|
||||||
- CLI_ARGS=--no-nsfw_checker --no-safety_checker --xformers
|
- CLI_ARGS=--xformers
|
||||||
|
|
||||||
|
# invoke-cpu:
|
||||||
|
# <<: *invoke
|
||||||
|
# profiles: ["invoke-cpu"]
|
||||||
|
# environment:
|
||||||
|
# - PRELOAD=true
|
||||||
|
# - CLI_ARGS=--always_use_cpu
|
||||||
|
|
||||||
sygil: &sygil
|
sygil: &sygil
|
||||||
<<: *base_service
|
<<: *base_service
|
||||||
|
|
|
||||||
|
|
@ -18,16 +18,20 @@ RUN . /clone.sh clip-interrogator https://github.com/pharmapsychotic/clip-interr
|
||||||
|
|
||||||
FROM alpine:3.17 as xformers
|
FROM alpine:3.17 as xformers
|
||||||
RUN apk add --no-cache aria2
|
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'
|
RUN aria2c -x 5 --dir / --out wheel.whl 'https://github.com/AbdBarho/stable-diffusion-webui-docker/releases/download/5.0.3/xformers-0.0.20.dev528-cp310-cp310-manylinux2014_x86_64-pytorch2.whl'
|
||||||
|
|
||||||
|
|
||||||
FROM python:3.10.9-slim
|
FROM python:3.10.9-slim
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1
|
ENV DEBIAN_FRONTEND=noninteractive PIP_PREFER_BINARY=1
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN apt-get update && apt install fonts-dejavu-core rsync git jq moreutils aria2 -y && apt-get clean
|
||||||
pip install torch==1.13.1+cu117 torchvision --extra-index-url https://download.pytorch.org/whl/cu117
|
|
||||||
|
RUN --mount=type=cache,target=/cache --mount=type=cache,target=/root/.cache/pip \
|
||||||
|
aria2c -x 5 --dir /cache --out torch-2.0.0-cp310-cp310-linux_x86_64.whl -c \
|
||||||
|
https://download.pytorch.org/whl/cu118/torch-2.0.0%2Bcu118-cp310-cp310-linux_x86_64.whl && \
|
||||||
|
pip install /cache/torch-2.0.0-cp310-cp310-linux_x86_64.whl torchvision --index-url https://download.pytorch.org/whl/cu118
|
||||||
|
|
||||||
RUN apt-get update && apt install fonts-dejavu-core rsync git jq moreutils -y && apt-get clean
|
|
||||||
|
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
|
|
@ -37,8 +41,8 @@ RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
pip install -r requirements_versions.txt
|
pip install -r requirements_versions.txt
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
--mount=type=bind,from=xformers,source=/wheel.whl,target=/xformers-0.0.15-cp310-cp310-linux_x86_64.whl \
|
--mount=type=bind,from=xformers,source=/wheel.whl,target=/xformers-0.0.20.dev528-cp310-cp310-manylinux2014_x86_64.whl \
|
||||||
pip install triton /xformers-0.0.15-cp310-cp310-linux_x86_64.whl
|
pip install /xformers-0.0.20.dev528-cp310-cp310-manylinux2014_x86_64.whl
|
||||||
|
|
||||||
ENV ROOT=/stable-diffusion-webui
|
ENV ROOT=/stable-diffusion-webui
|
||||||
|
|
||||||
|
|
@ -61,7 +65,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
RUN apt-get -y install libgoogle-perftools-dev && apt-get clean
|
RUN apt-get -y install libgoogle-perftools-dev && apt-get clean
|
||||||
ENV LD_PRELOAD=libtcmalloc.so
|
ENV LD_PRELOAD=libtcmalloc.so
|
||||||
|
|
||||||
ARG SHA=a9fed7c364061ae6efb37f797b6b522cb3cf7aa2
|
ARG SHA=5ab7f213bec2f816f9c5644becb32eb72c8ffb89
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
cd stable-diffusion-webui && \
|
cd stable-diffusion-webui && \
|
||||||
git fetch && \
|
git fetch && \
|
||||||
|
|
@ -76,7 +80,8 @@ RUN \
|
||||||
python3 /docker/info.py ${ROOT}/modules/ui.py && \
|
python3 /docker/info.py ${ROOT}/modules/ui.py && \
|
||||||
mv ${ROOT}/style.css ${ROOT}/user.css && \
|
mv ${ROOT}/style.css ${ROOT}/user.css && \
|
||||||
# one of the ugliest hacks I ever wrote \
|
# one of the ugliest hacks I ever wrote \
|
||||||
sed -i 's/in_app_dir = .*/in_app_dir = True/g' /usr/local/lib/python3.10/site-packages/gradio/routes.py
|
sed -i 's/in_app_dir = .*/in_app_dir = True/g' /usr/local/lib/python3.10/site-packages/gradio/routes.py && \
|
||||||
|
git config --global --add safe.directory '*'
|
||||||
|
|
||||||
WORKDIR ${ROOT}
|
WORKDIR ${ROOT}
|
||||||
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility
|
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility
|
||||||
|
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
{
|
|
||||||
"outdir_samples": "",
|
|
||||||
"outdir_txt2img_samples": "/output/txt2img",
|
|
||||||
"outdir_img2img_samples": "/output/img2img",
|
|
||||||
"outdir_extras_samples": "/output/extras",
|
|
||||||
"outdir_txt2img_grids": "/output/txt2img-grids",
|
|
||||||
"outdir_img2img_grids": "/output/img2img-grids",
|
|
||||||
"outdir_save": "/output/saved",
|
|
||||||
"font": "DejaVuSans.ttf"
|
|
||||||
}
|
|
||||||
78
services/AUTOMATIC1111/config.py
Normal file
78
services/AUTOMATIC1111/config.py
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""Checks and sets default values for config.json before starting the container."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
DEFAULT_FILEPATH = '/data/config/auto/config.json'
|
||||||
|
|
||||||
|
DEFAULT_OUTDIRS = {
|
||||||
|
"outdir_samples": "",
|
||||||
|
"outdir_txt2img_samples": "/output/txt2img",
|
||||||
|
"outdir_img2img_samples": "/output/img2img",
|
||||||
|
"outdir_extras_samples": "/output/extras",
|
||||||
|
"outdir_grids": "",
|
||||||
|
"outdir_txt2img_grids": "/output/txt2img-grids",
|
||||||
|
"outdir_img2img_grids": "/output/img2img-grids",
|
||||||
|
"outdir_save": "/output/saved",
|
||||||
|
"outdir_init_images": "/output/init-images",
|
||||||
|
}
|
||||||
|
RE_VALID_OUTDIR = re.compile(r"(^/output(/\.?[\w\-\_]+)+/?$)|(^\s?$)")
|
||||||
|
|
||||||
|
DEFAULT_OTHER = {
|
||||||
|
"font": "DejaVuSans.ttf",
|
||||||
|
}
|
||||||
|
|
||||||
|
def dict_to_json_file(target_file: str, data: dict):
|
||||||
|
"""Write dictionary to specified json file"""
|
||||||
|
|
||||||
|
with open(target_file, 'w') as f:
|
||||||
|
json.dump(data, f)
|
||||||
|
|
||||||
|
def json_file_to_dict(config_file: str) -> dict|None:
|
||||||
|
"""Load json file into a dictionary. Return None if file does not exist."""
|
||||||
|
|
||||||
|
if os.path.isfile(config_file):
|
||||||
|
with open(config_file, 'r') as f:
|
||||||
|
return json.load(f)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def replace_if_invalid(value: str, replacement: str, pattern: str|re.Pattern[str]) -> str:
|
||||||
|
"""Returns original value if valid, fallback value if invalid"""
|
||||||
|
|
||||||
|
if re.match(pattern, value):
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return replacement
|
||||||
|
|
||||||
|
def check_and_replace_config(config_file: str, target_file: str = None):
|
||||||
|
"""Checks given file for invalid values. Replaces those with fallback values (default: overwrites file)."""
|
||||||
|
|
||||||
|
# Get current user config, or empty if file does not exists
|
||||||
|
data = json_file_to_dict(config_file) or {}
|
||||||
|
|
||||||
|
# Check and fix output directories
|
||||||
|
for k, def_val in DEFAULT_OUTDIRS.items():
|
||||||
|
if k not in data:
|
||||||
|
data[k] = def_val
|
||||||
|
else:
|
||||||
|
data[k] = replace_if_invalid(value=data[k], replacement=def_val, pattern=RE_VALID_OUTDIR)
|
||||||
|
|
||||||
|
# Check and fix other default settings
|
||||||
|
for k, def_val in DEFAULT_OTHER.items():
|
||||||
|
if k not in data:
|
||||||
|
data[k] = def_val
|
||||||
|
|
||||||
|
# Write results to file
|
||||||
|
dict_to_json_file(target_file or config_file, data)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
check_and_replace_config(*sys.argv[1:])
|
||||||
|
else:
|
||||||
|
check_and_replace_config(DEFAULT_FILEPATH)
|
||||||
|
|
||||||
|
|
@ -8,13 +8,17 @@ mkdir -p /data/config/auto/scripts/
|
||||||
find "${ROOT}/scripts/" -maxdepth 1 -type l -delete
|
find "${ROOT}/scripts/" -maxdepth 1 -type l -delete
|
||||||
cp -vrfTs /data/config/auto/scripts/ "${ROOT}/scripts/"
|
cp -vrfTs /data/config/auto/scripts/ "${ROOT}/scripts/"
|
||||||
|
|
||||||
cp -n /docker/config.json /data/config/auto/config.json
|
# Set up config file
|
||||||
jq '. * input' /data/config/auto/config.json /docker/config.json | sponge /data/config/auto/config.json
|
python /docker/config.py /data/config/auto/config.json
|
||||||
|
|
||||||
if [ ! -f /data/config/auto/ui-config.json ]; then
|
if [ ! -f /data/config/auto/ui-config.json ]; then
|
||||||
echo '{}' >/data/config/auto/ui-config.json
|
echo '{}' >/data/config/auto/ui-config.json
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -f /data/config/auto/styles.csv ]; then
|
||||||
|
touch /data/config/auto/styles.csv
|
||||||
|
fi
|
||||||
|
|
||||||
declare -A MOUNTS
|
declare -A MOUNTS
|
||||||
|
|
||||||
MOUNTS["/root/.cache"]="/data/.cache"
|
MOUNTS["/root/.cache"]="/data/.cache"
|
||||||
|
|
@ -35,12 +39,15 @@ MOUNTS["${ROOT}/models/torch_deepdanbooru"]="/data/Deepdanbooru"
|
||||||
MOUNTS["${ROOT}/models/BLIP"]="/data/BLIP"
|
MOUNTS["${ROOT}/models/BLIP"]="/data/BLIP"
|
||||||
MOUNTS["${ROOT}/models/midas"]="/data/MiDaS"
|
MOUNTS["${ROOT}/models/midas"]="/data/MiDaS"
|
||||||
MOUNTS["${ROOT}/models/Lora"]="/data/Lora"
|
MOUNTS["${ROOT}/models/Lora"]="/data/Lora"
|
||||||
|
MOUNTS["${ROOT}/models/LyCORIS"]="/data/LyCORIS"
|
||||||
MOUNTS["${ROOT}/models/ControlNet"]="/data/ControlNet"
|
MOUNTS["${ROOT}/models/ControlNet"]="/data/ControlNet"
|
||||||
MOUNTS["${ROOT}/models/openpose"]="/data/openpose"
|
MOUNTS["${ROOT}/models/openpose"]="/data/openpose"
|
||||||
|
MOUNTS["${ROOT}/models/ModelScope"]="/data/ModelScope"
|
||||||
|
|
||||||
MOUNTS["${ROOT}/embeddings"]="/data/embeddings"
|
MOUNTS["${ROOT}/embeddings"]="/data/embeddings"
|
||||||
MOUNTS["${ROOT}/config.json"]="/data/config/auto/config.json"
|
MOUNTS["${ROOT}/config.json"]="/data/config/auto/config.json"
|
||||||
MOUNTS["${ROOT}/ui-config.json"]="/data/config/auto/ui-config.json"
|
MOUNTS["${ROOT}/ui-config.json"]="/data/config/auto/ui-config.json"
|
||||||
|
MOUNTS["${ROOT}/styles.csv"]="/data/config/auto/styles.csv"
|
||||||
MOUNTS["${ROOT}/extensions"]="/data/config/auto/extensions"
|
MOUNTS["${ROOT}/extensions"]="/data/config/auto/extensions"
|
||||||
|
|
||||||
# extra hacks
|
# extra hacks
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
# TODO: maybe just use the .gitignore file to create all of these
|
# TODO: maybe just use the .gitignore file to create all of these
|
||||||
mkdir -vp /data/.cache /data/StableDiffusion /data/Codeformer /data/GFPGAN /data/ESRGAN /data/BSRGAN /data/RealESRGAN /data/SwinIR /data/LDSR /data/ScuNET /data/embeddings /data/VAE /data/Deepdanbooru /data/MiDaS /data/Lora /data/ControlNet /data/openpose
|
mkdir -vp /data/.cache /data/StableDiffusion /data/LyCORIS /data/Codeformer /data/ModelScope /data/GFPGAN /data/ESRGAN /data/BSRGAN /data/RealESRGAN /data/SwinIR /data/LDSR /data/ScuNET /data/embeddings /data/VAE /data/Deepdanbooru /data/MiDaS /data/Lora /data/ControlNet /data/openpose
|
||||||
|
|
||||||
echo "Downloading, this might take a while..."
|
echo "Downloading, this might take a while..."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
FROM alpine:3.17 as xformers
|
FROM alpine:3.17 as xformers
|
||||||
RUN apk add --no-cache aria2
|
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'
|
RUN aria2c -x 5 --dir / --out wheel.whl 'https://github.com/AbdBarho/stable-diffusion-webui-docker/releases/download/5.0.3/xformers-0.0.20.dev528-cp310-cp310-manylinux2014_x86_64-pytorch1.13.whl'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -22,27 +22,26 @@ RUN --mount=type=cache,target=/var/cache/apt \
|
||||||
ln -sf opencv4.pc opencv.pc
|
ln -sf opencv4.pc opencv.pc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ENV ROOT=/InvokeAI
|
ENV ROOT=/InvokeAI
|
||||||
RUN git clone https://github.com/invoke-ai/InvokeAI.git ${ROOT}
|
RUN git clone https://github.com/invoke-ai/InvokeAI.git ${ROOT}
|
||||||
WORKDIR ${ROOT}
|
WORKDIR ${ROOT}
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
git reset --hard 4463124bddd221c333d4c70e73aa2949ad35453d && \
|
git reset --hard 4463124bddd221c333d4c70e73aa2949ad35453d && \
|
||||||
pip install .
|
pip install -e .
|
||||||
|
|
||||||
|
|
||||||
ARG BRANCH=main SHA=50eb02f68be912276a9c106d5e8038a5671a0386
|
ARG BRANCH=main SHA=d73f1c363c3f2fe00f14ed34e276b4366b32a886
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
git fetch && \
|
git fetch && \
|
||||||
git reset --hard && \
|
git reset --hard && \
|
||||||
git checkout ${BRANCH} && \
|
git checkout ${BRANCH} && \
|
||||||
git reset --hard ${SHA} && \
|
git reset --hard ${SHA} && \
|
||||||
pip install -U .
|
pip install -U -e .
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
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 \
|
--mount=type=bind,from=xformers,source=/wheel.whl,target=/xformers-0.0.20-cp310-cp310-linux_x86_64.whl \
|
||||||
pip install -U opencv-python-headless triton /xformers-0.0.17-cp310-cp310-linux_x86_64.whl && \
|
pip install -U opencv-python-headless triton /xformers-0.0.20-cp310-cp310-linux_x86_64.whl && \
|
||||||
python3 -c "from patchmatch import patch_match"
|
python3 -c "from patchmatch import patch_match"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -54,5 +53,7 @@ ENV PYTHONUNBUFFERED=1 PRELOAD=false HF_HOME=/root/.cache/huggingface CONFIG_DIR
|
||||||
EXPOSE 7860
|
EXPOSE 7860
|
||||||
|
|
||||||
ENTRYPOINT ["/docker/entrypoint.sh"]
|
ENTRYPOINT ["/docker/entrypoint.sh"]
|
||||||
CMD invokeai --web --host 0.0.0.0 --port 7860 --root_dir ${ROOT} --config ${CONFIG_DIR}/models.yaml --outdir /output/invoke ${CLI_ARGS}
|
CMD invokeai --web --host 0.0.0.0 --port 7860 --root_dir ${ROOT} --config ${CONFIG_DIR}/models.yaml \
|
||||||
# TODO: make sure the config is persisted between sessions
|
--outdir /output/invoke --embedding_directory /data/embeddings/ --lora_directory /data/Lora \
|
||||||
|
--no-nsfw_checker --no-safety_checker ${CLI_ARGS}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ set -Eeuo pipefail
|
||||||
|
|
||||||
declare -A MOUNTS
|
declare -A MOUNTS
|
||||||
|
|
||||||
mkdir -p ${CONFIG_DIR}
|
mkdir -p ${CONFIG_DIR} ${ROOT}/configs/stable-diffusion/
|
||||||
|
|
||||||
# cache
|
# cache
|
||||||
MOUNTS["/root/.cache"]=/data/.cache/
|
MOUNTS["/root/.cache"]=/data/.cache/
|
||||||
|
|
@ -20,8 +20,6 @@ MOUNTS["${ROOT}/models/realesrgan"]=/data/RealESRGAN/
|
||||||
|
|
||||||
MOUNTS["${ROOT}/models/ldm"]=/data/.cache/invoke/ldm/
|
MOUNTS["${ROOT}/models/ldm"]=/data/.cache/invoke/ldm/
|
||||||
|
|
||||||
MOUNTS["${ROOT}/embeddings"]=/data/embeddings/
|
|
||||||
|
|
||||||
# hacks
|
# hacks
|
||||||
|
|
||||||
for to_path in "${!MOUNTS[@]}"; do
|
for to_path in "${!MOUNTS[@]}"; do
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue