Skip to content

Commit

Permalink
Add fallback provisioning support for old builds. Update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
robballantyne committed Aug 5, 2024
1 parent 3a1eb96 commit 9b7dd32
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 23 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Tags follow these patterns:

- `:latest-cpu` → `:v2-cpu-22.04`

Browse [here](https://github.com/ai-dock/stable-diffusion-webui/pkgs/container/stable-diffusion-webui) for an image suitable for your target environment.
Browse [here](https://github.com/ai-dock/stable-diffusion-webui/pkgs/container/stable-diffusion-webui) for an image suitable for your target environment. Alternatively, view a select range of [CUDA](https://hub.docker.com/r/aidockorg/stable-diffusion-webui-cuda) and [ROCm](https://hub.docker.com/r/aidockorg/stable-diffusion-webui-rocm) builds at DockerHub.

Supported Python versions: `3.10`

Expand Down
5 changes: 5 additions & 0 deletions config/provisioning/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
This directory contains example provisioning scripts for auto-configuration of your container.

Recent builds no longer contain micromamba for python package installation, so old builds are not fully compatible with the new format. If you are using an older build you should upgrade as soon as possible.

The previous default, if you need it for reference can be found in `./mamba_base`.
84 changes: 64 additions & 20 deletions config/provisioning/default.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,22 @@
# https://raw.githubusercontent.com/ai-dock/stable-diffusion-webui/main/config/provisioning/default.sh

### Edit the following arrays to suit your workflow - values must be quoted and separated by newlines or spaces.
### If you specify gated models you'll need to set environment variables HF_TOKEN and/orf CIVITAI_TOKEN

DISK_GB_REQUIRED=30

PIP_PACKAGES=(
APT_PACKAGES=(
#"package-1"
#"package-2"
)

PIP_PACKAGES=(
#"package-1"
#"package-2"
)

EXTENSIONS=(
"https://github.com/Mikubill/sd-webui-controlnet"
"https://github.com/d8ahazard/sd_dreambooth_extension"
"https://github.com/deforum-art/sd-webui-deforum"
"https://github.com/adieyal/sd-dynamic-prompts"
"https://github.com/ototadana/sd-face-editor"
Expand All @@ -25,19 +31,19 @@ EXTENSIONS=(
)

CHECKPOINT_MODELS=(
"https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt"
#"https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt"
#"https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.ckpt"
#"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors"
#"https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors"
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors"
"https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors"
)

LORA_MODELS=(
#"https://civitai.com/api/download/models/16576"
)

VAE_MODELS=(
"https://huggingface.co/stabilityai/sd-vae-ft-ema-original/resolve/main/vae-ft-ema-560000-ema-pruned.safetensors"
"https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors"
#"https://huggingface.co/stabilityai/sd-vae-ft-ema-original/resolve/main/vae-ft-ema-560000-ema-pruned.safetensors"
#"https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors"
"https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors"
)

Expand All @@ -48,19 +54,22 @@ ESRGAN_MODELS=(
)

CONTROLNET_MODELS=(
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors"
"https://huggingface.co/lllyasviel/sd_control_collection/resolve/main/diffusers_xl_canny_mid.safetensors"
"https://huggingface.co/lllyasviel/sd_control_collection/resolve/main/diffusers_xl_depth_mid.safetensors?download"
"https://huggingface.co/lllyasviel/sd_control_collection/resolve/main/t2i-adapter_diffusers_xl_openpose.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_depth-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_hed-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_mlsd-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_normal-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_scribble-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_seg-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_canny-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_canny-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_color-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_depth-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_keypose-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_seg-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_sketch-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_style-fp16.safetensors"
Expand All @@ -70,13 +79,18 @@ CONTROLNET_MODELS=(
### DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING ###

function provisioning_start() {
# We need to apply some workarounds to make old builds work with the new default
if [[ ! -d /opt/environments/python ]]; then
export MAMBA_BASE=true
fi
source /opt/ai-dock/etc/environment.sh
source /opt/ai-dock/bin/venv-set.sh webui

DISK_GB_AVAILABLE=$(($(df --output=avail -m "${WORKSPACE}" | tail -n1) / 1000))
DISK_GB_USED=$(($(df --output=used -m "${WORKSPACE}" | tail -n1) / 1000))
DISK_GB_ALLOCATED=$(($DISK_GB_AVAILABLE + $DISK_GB_USED))
provisioning_print_header
provisioning_get_apt_packages
provisioning_get_pip_packages
provisioning_get_extensions
provisioning_get_models \
Expand All @@ -103,17 +117,36 @@ function provisioning_start() {
ARGS_COMBINED="${PLATFORM_ARGS} $(cat /etc/a1111_webui_flags.conf) ${PROVISIONING_ARGS}"

# Start and exit because webui will probably require a restart
cd /opt/stable-diffusion-webui && \
source "$WEBUI_VENV/bin/activate"
LD_PRELOAD=libtcmalloc.so python launch.py \
${ARGS_COMBINED}
deactivate
cd /opt/stable-diffusion-webui
if [[ -z $MAMBA_BASE ]]; then
source "$WEBUI_VENV/bin/activate"
LD_PRELOAD=libtcmalloc.so python launch.py \
${ARGS_COMBINED}
deactivate
else
micromamba run -n webui -e LD_PRELOAD=libtcmalloc.so python launch.py \
${ARGS_COMBINED}
fi
provisioning_print_end
}

function pip_install() {
if [[ -z $MAMBA_BASE ]]; then
"$WEBUI_VENV_PIP" install --no-cache-dir "$@"
else
micromamba run -n webui pip install --no-cache-dir "$@"
fi
}

function provisioning_get_apt_packages() {
if [[ -n $APT_PACKAGES ]]; then
$APT_INSTALL ${APT_PACKAGES[@]}
fi
}

function provisioning_get_pip_packages() {
if [[ -n $PIP_PACKAGES ]]; then
"$WEBUI_VENV_PIP" install --no-cache-dir ${PIP_PACKAGES[@]}
pip_install ${PIP_PACKAGES[@]}
fi
}

Expand All @@ -130,13 +163,13 @@ function provisioning_get_extensions() {
fi
# Always pip install
if [[ -e $requirements ]]; then
"$WEBUI_VENV_PIP" install --no-cache-dir -r "$requirements"
pip_install -r "$requirements"
fi
else
printf "Downloading extension: %s...\n" "${repo}"
git clone "${repo}" "${path}" --recursive
if [[ -e $requirements ]]; then
"$WEBUI_VENV_PIP" install --no-cache-dir -r "${requirements}"
pip_install -r "${requirements}"
fi
fi
done
Expand Down Expand Up @@ -173,9 +206,20 @@ function provisioning_print_end() {
printf "\nProvisioning complete: Web UI will start now\n\n"
}


# Download from $1 URL to $2 file path
function provisioning_download() {
wget -qnc --content-disposition --show-progress -e dotbytes="${3:-4M}" -P "$2" "$1"
if [[ -n $HF_TOKEN && $1 =~ ^https://([a-zA-Z0-9_-]+\.)?huggingface\.co(/|$|\?) ]]; then
auth_token="$HF_TOKEN"
elif
[[ -n $CIVITAI_TOKEN && $1 =~ ^https://([a-zA-Z0-9_-]+\.)?civitai\.com(/|$|\?) ]]; then
auth_token="$CIVITAI_TOKEN"
fi
if [[ -n $auth_token ]];then
wget --header="Authorization: Bearer $auth_token" -qnc --content-disposition --show-progress -e dotbytes="${3:-4M}" -P "$2" "$1"
else
wget -qnc --content-disposition --show-progress -e dotbytes="${3:-4M}" -P "$2" "$1"
fi
}

provisioning_start
188 changes: 188 additions & 0 deletions config/provisioning/mamba_base/default.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
#!/bin/bash
# This file will be sourced in init.sh
# Namespace functions with provisioning_

# https://raw.githubusercontent.com/ai-dock/stable-diffusion-webui/main/config/provisioning/default.sh

### Edit the following arrays to suit your workflow - values must be quoted and separated by newlines or spaces.

DISK_GB_REQUIRED=30

MAMBA_PACKAGES=(
#"package1"
#"package2=version"
)

PIP_PACKAGES=(
"bitsandbytes==0.41.2.post2"
)

EXTENSIONS=(
"https://github.com/Mikubill/sd-webui-controlnet"
"https://github.com/d8ahazard/sd_dreambooth_extension"
"https://github.com/deforum-art/sd-webui-deforum"
"https://github.com/adieyal/sd-dynamic-prompts"
"https://github.com/ototadana/sd-face-editor"
"https://github.com/AlUlkesh/stable-diffusion-webui-images-browser"
"https://github.com/hako-mikan/sd-webui-regional-prompter"
"https://github.com/Coyote-A/ultimate-upscale-for-automatic1111"
"https://github.com/fkunn1326/openpose-editor"
"https://github.com/Gourieff/sd-webui-reactor"
)

CHECKPOINT_MODELS=(
"https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt"
#"https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.ckpt"
#"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors"
#"https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors"
)

LORA_MODELS=(
#"https://civitai.com/api/download/models/16576"
)

VAE_MODELS=(
"https://huggingface.co/stabilityai/sd-vae-ft-ema-original/resolve/main/vae-ft-ema-560000-ema-pruned.safetensors"
"https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors"
"https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors"
)

ESRGAN_MODELS=(
"https://huggingface.co/ai-forever/Real-ESRGAN/resolve/main/RealESRGAN_x4.pth"
"https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri/resolve/main/4x_foolhardy_Remacri.pth"
"https://huggingface.co/Akumetsu971/SD_Anime_Futuristic_Armor/resolve/main/4x_NMKD-Siax_200k.pth"
)

CONTROLNET_MODELS=(
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_depth-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_hed-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_mlsd-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_normal-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_scribble-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_seg-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_canny-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_color-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_depth-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_keypose-fp16.safetensors"
"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_openpose-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_seg-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_sketch-fp16.safetensors"
#"https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/t2iadapter_style-fp16.safetensors"
)


### DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING ###

function provisioning_start() {
source /opt/ai-dock/etc/environment.sh
DISK_GB_AVAILABLE=$(($(df --output=avail -m "${WORKSPACE}" | tail -n1) / 1000))
DISK_GB_USED=$(($(df --output=used -m "${WORKSPACE}" | tail -n1) / 1000))
DISK_GB_ALLOCATED=$(($DISK_GB_AVAILABLE + $DISK_GB_USED))
provisioning_print_header
provisioning_get_mamba_packages
provisioning_get_pip_packages
provisioning_get_extensions
provisioning_get_models \
"${WORKSPACE}/storage/stable_diffusion/models/ckpt" \
"${CHECKPOINT_MODELS[@]}"
provisioning_get_models \
"${WORKSPACE}/storage/stable_diffusion/models/lora" \
"${LORA_MODELS[@]}"
provisioning_get_models \
"${WORKSPACE}/storage/stable_diffusion/models/controlnet" \
"${CONTROLNET_MODELS[@]}"
provisioning_get_models \
"${WORKSPACE}/storage/stable_diffusion/models/vae" \
"${VAE_MODELS[@]}"
provisioning_get_models \
"${WORKSPACE}/storage/stable_diffusion/models/esrgan" \
"${ESRGAN_MODELS[@]}"

PLATFORM_FLAGS=""
if [[ $XPU_TARGET = "CPU" ]]; then
PLATFORM_FLAGS="--use-cpu all --skip-torch-cuda-test --no-half"
fi
PROVISIONING_FLAGS="--skip-python-version-check --no-download-sd-model --do-not-download-clip --port 11404 --exit"
FLAGS_COMBINED="${PLATFORM_FLAGS} $(cat /etc/a1111_webui_flags.conf) ${PROVISIONING_FLAGS}"

# Start and exit because webui will probably require a restart
cd /opt/stable-diffusion-webui && \
micromamba run -n webui -e LD_PRELOAD=libtcmalloc.so python launch.py \
${FLAGS_COMBINED}
provisioning_print_end
}

function provisioning_get_mamba_packages() {
if [[ -n $MAMBA_PACKAGES ]]; then
$MAMBA_INSTALL -n webui ${MAMBA_PACKAGES[@]}
fi
}

function provisioning_get_pip_packages() {
if [[ -n $PIP_PACKAGES ]]; then
micromamba run -n webui $PIP_INSTALL ${PIP_PACKAGES[@]}
fi
}

function provisioning_get_extensions() {
for repo in "${EXTENSIONS[@]}"; do
dir="${repo##*/}"
path="/opt/stable-diffusion-webui/extensions/${dir}"
requirements="${path}/requirements.txt"
if [[ -d $path ]]; then
if [[ ${AUTO_UPDATE,,} == "true" ]]; then
printf "Updating extension: %s...\n" "${repo}"
( cd "$path" && git pull )
if [[ -e $requirements ]]; then
micromamba -n webui run ${PIP_INSTALL} -r "$requirements"
fi
fi
else
printf "Downloading extension: %s...\n" "${repo}"
git clone "${repo}" "${path}" --recursive
if [[ -e $requirements ]]; then
micromamba -n webui run ${PIP_INSTALL} -r "${requirements}"
fi
fi
done
}

function provisioning_get_models() {
if [[ -z $2 ]]; then return 1; fi
dir="$1"
mkdir -p "$dir"
shift
if [[ $DISK_GB_ALLOCATED -ge $DISK_GB_REQUIRED ]]; then
arr=("$@")
else
printf "WARNING: Low disk space allocation - Only the first model will be downloaded!\n"
arr=("$1")
fi

printf "Downloading %s model(s) to %s...\n" "${#arr[@]}" "$dir"
for url in "${arr[@]}"; do
printf "Downloading: %s\n" "${url}"
provisioning_download "${url}" "${dir}"
printf "\n"
done
}

function provisioning_print_header() {
printf "\n##############################################\n# #\n# Provisioning container #\n# #\n# This will take some time #\n# #\n# Your container will be ready on completion #\n# #\n##############################################\n\n"
if [[ $DISK_GB_ALLOCATED -lt $DISK_GB_REQUIRED ]]; then
printf "WARNING: Your allocated disk size (%sGB) is below the recommended %sGB - Some models will not be downloaded\n" "$DISK_GB_ALLOCATED" "$DISK_GB_REQUIRED"
fi
}

function provisioning_print_end() {
printf "\nProvisioning complete: Web UI will start now\n\n"
}

# Download from $1 URL to $2 file path
function provisioning_download() {
wget -qnc --content-disposition --show-progress -e dotbytes="${3:-4M}" -P "$2" "$1"
}

provisioning_start
Loading

0 comments on commit 9b7dd32

Please sign in to comment.