-
Notifications
You must be signed in to change notification settings - Fork 27.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
311 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from modules import launch_utils | ||
|
||
prepare_environment = launch_utils.prepare_environment | ||
|
||
|
||
def main(): | ||
launch_utils.startup_timer.record("Environment setup") | ||
|
||
with launch_utils.startup_timer.subcategory("prepare environment"): | ||
prepare_environment() | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,297 @@ | ||
#!/usr/bin/env bash | ||
################################################# | ||
# Please do not make any changes to this file, # | ||
# change the variables in webui-user.sh instead # | ||
################################################# | ||
|
||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | ||
|
||
|
||
# If run from macOS, load defaults from webui-macos-env.sh | ||
if [[ "$OSTYPE" == "darwin"* ]]; then | ||
if [[ -f "$SCRIPT_DIR"/webui-macos-env.sh ]] | ||
then | ||
source "$SCRIPT_DIR"/webui-macos-env.sh | ||
fi | ||
fi | ||
|
||
# Read variables from webui-user.sh | ||
# shellcheck source=/dev/null | ||
if [[ -f "$SCRIPT_DIR"/webui-user.sh ]] | ||
then | ||
source "$SCRIPT_DIR"/webui-user.sh | ||
fi | ||
|
||
# If $venv_dir is "-", then disable venv support | ||
use_venv=1 | ||
if [[ $venv_dir == "-" ]]; then | ||
use_venv=0 | ||
fi | ||
|
||
# Set defaults | ||
# Install directory without trailing slash | ||
if [[ -z "${install_dir}" ]] | ||
then | ||
install_dir="$SCRIPT_DIR" | ||
fi | ||
|
||
# Name of the subdirectory (defaults to stable-diffusion-webui) | ||
if [[ -z "${clone_dir}" ]] | ||
then | ||
clone_dir="stable-diffusion-webui" | ||
fi | ||
|
||
# python3 executable | ||
if [[ -z "${python_cmd}" ]] | ||
then | ||
python_cmd="python3" | ||
fi | ||
|
||
# git executable | ||
if [[ -z "${GIT}" ]] | ||
then | ||
export GIT="git" | ||
else | ||
export GIT_PYTHON_GIT_EXECUTABLE="${GIT}" | ||
fi | ||
|
||
# python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv) | ||
if [[ -z "${venv_dir}" ]] && [[ $use_venv -eq 1 ]] | ||
then | ||
venv_dir="venv" | ||
fi | ||
|
||
if [[ -z "${INSTALL_SCRIPT}" ]] | ||
then | ||
INSTALL_SCRIPT="install.py" | ||
fi | ||
|
||
# this script cannot be run as root by default | ||
can_run_as_root=0 | ||
|
||
# read any command line flags to the webui.sh script | ||
while getopts "f" flag > /dev/null 2>&1 | ||
do | ||
case ${flag} in | ||
f) can_run_as_root=1;; | ||
*) break;; | ||
esac | ||
done | ||
|
||
# Disable sentry logging | ||
export ERROR_REPORTING=FALSE | ||
|
||
# Do not reinstall existing pip packages on Debian/Ubuntu | ||
export PIP_IGNORE_INSTALLED=0 | ||
|
||
# Pretty print | ||
delimiter="################################################################" | ||
|
||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[32mInstall script for stable-diffusion + Web UI\n" | ||
printf "\e[1m\e[34mTested on Debian 11 (Bullseye), Fedora 34+ and openSUSE Leap 15.4 or newer.\e[0m" | ||
printf "\n%s\n" "${delimiter}" | ||
|
||
# Do not run as root | ||
if [[ $(id -u) -eq 0 && can_run_as_root -eq 0 ]] | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[31mERROR: This script must not be launched as root, aborting...\e[0m" | ||
printf "\n%s\n" "${delimiter}" | ||
exit 1 | ||
else | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Running on \e[1m\e[32m%s\e[0m user" "$(whoami)" | ||
printf "\n%s\n" "${delimiter}" | ||
fi | ||
|
||
if [[ $(getconf LONG_BIT) = 32 ]] | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[31mERROR: Unsupported Running on a 32bit OS\e[0m" | ||
printf "\n%s\n" "${delimiter}" | ||
exit 1 | ||
fi | ||
|
||
if [[ -d "$SCRIPT_DIR/.git" ]] | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Repo already cloned, using it as install directory" | ||
printf "\n%s\n" "${delimiter}" | ||
install_dir="${SCRIPT_DIR}/../" | ||
clone_dir="${SCRIPT_DIR##*/}" | ||
fi | ||
|
||
# Check prerequisites | ||
gpu_info=$(lspci 2>/dev/null | grep -E "VGA|Display") | ||
case "$gpu_info" in | ||
*"Navi 1"*) | ||
export HSA_OVERRIDE_GFX_VERSION=10.3.0 | ||
if [[ -z "${TORCH_COMMAND}" ]] | ||
then | ||
pyv="$(${python_cmd} -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]:02d}")')" | ||
# Using an old nightly compiled against rocm 5.2 for Navi1, see https://github.com/pytorch/pytorch/issues/106728#issuecomment-1749511711 | ||
if [[ $pyv == "3.8" ]] | ||
then | ||
export TORCH_COMMAND="pip install https://download.pytorch.org/whl/nightly/rocm5.2/torch-2.0.0.dev20230209%2Brocm5.2-cp38-cp38-linux_x86_64.whl https://download.pytorch.org/whl/nightly/rocm5.2/torchvision-0.15.0.dev20230209%2Brocm5.2-cp38-cp38-linux_x86_64.whl" | ||
elif [[ $pyv == "3.9" ]] | ||
then | ||
export TORCH_COMMAND="pip install https://download.pytorch.org/whl/nightly/rocm5.2/torch-2.0.0.dev20230209%2Brocm5.2-cp39-cp39-linux_x86_64.whl https://download.pytorch.org/whl/nightly/rocm5.2/torchvision-0.15.0.dev20230209%2Brocm5.2-cp39-cp39-linux_x86_64.whl" | ||
elif [[ $pyv == "3.10" ]] | ||
then | ||
export TORCH_COMMAND="pip install https://download.pytorch.org/whl/nightly/rocm5.2/torch-2.0.0.dev20230209%2Brocm5.2-cp310-cp310-linux_x86_64.whl https://download.pytorch.org/whl/nightly/rocm5.2/torchvision-0.15.0.dev20230209%2Brocm5.2-cp310-cp310-linux_x86_64.whl" | ||
else | ||
printf "\e[1m\e[31mERROR: RX 5000 series GPUs python version must be between 3.8 and 3.10, aborting...\e[0m" | ||
exit 1 | ||
fi | ||
fi | ||
;; | ||
*"Navi 2"*) export HSA_OVERRIDE_GFX_VERSION=10.3.0 | ||
;; | ||
*"Navi 3"*) [[ -z "${TORCH_COMMAND}" ]] && \ | ||
export TORCH_COMMAND="pip install torch torchvision --index-url https://download.pytorch.org/whl/nightly/rocm5.7" | ||
;; | ||
*"Renoir"*) export HSA_OVERRIDE_GFX_VERSION=9.0.0 | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Experimental support for Renoir: make sure to have at least 4GB of VRAM and 10GB of RAM or enable cpu mode: --use-cpu all --no-half" | ||
printf "\n%s\n" "${delimiter}" | ||
;; | ||
*) | ||
;; | ||
esac | ||
if ! echo "$gpu_info" | grep -q "NVIDIA"; | ||
then | ||
if echo "$gpu_info" | grep -q "AMD" && [[ -z "${TORCH_COMMAND}" ]] | ||
then | ||
export TORCH_COMMAND="pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.7" | ||
elif npu-smi info 2>/dev/null | ||
then | ||
export TORCH_COMMAND="pip install torch==2.1.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu; pip install torch_npu==2.1.0" | ||
fi | ||
fi | ||
|
||
for preq in "${GIT}" "${python_cmd}" | ||
do | ||
if ! hash "${preq}" &>/dev/null | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[31mERROR: %s is not installed, aborting...\e[0m" "${preq}" | ||
printf "\n%s\n" "${delimiter}" | ||
exit 1 | ||
fi | ||
done | ||
|
||
if [[ $use_venv -eq 1 ]] && ! "${python_cmd}" -c "import venv" &>/dev/null | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[31mERROR: python3-venv is not installed, aborting...\e[0m" | ||
printf "\n%s\n" "${delimiter}" | ||
exit 1 | ||
fi | ||
|
||
cd "${install_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/, aborting...\e[0m" "${install_dir}"; exit 1; } | ||
if [[ -d "${clone_dir}" ]] | ||
then | ||
cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; } | ||
else | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Clone stable-diffusion-webui" | ||
printf "\n%s\n" "${delimiter}" | ||
"${GIT}" clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git "${clone_dir}" | ||
cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; } | ||
fi | ||
|
||
if [[ $use_venv -eq 1 ]] && [[ -z "${VIRTUAL_ENV}" ]]; | ||
then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Create and activate python venv" | ||
printf "\n%s\n" "${delimiter}" | ||
cd "${install_dir}"/"${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; } | ||
if [[ ! -d "${venv_dir}" ]] | ||
then | ||
"${python_cmd}" -m venv "${venv_dir}" | ||
first_launch=1 | ||
fi | ||
# shellcheck source=/dev/null | ||
if [[ -f "${venv_dir}"/bin/activate ]] | ||
then | ||
source "${venv_dir}"/bin/activate | ||
else | ||
printf "\n%s\n" "${delimiter}" | ||
printf "\e[1m\e[31mERROR: Cannot activate python venv, aborting...\e[0m" | ||
printf "\n%s\n" "${delimiter}" | ||
exit 1 | ||
fi | ||
else | ||
printf "\n%s\n" "${delimiter}" | ||
printf "python venv already activate or run without venv: ${VIRTUAL_ENV}" | ||
printf "\n%s\n" "${delimiter}" | ||
fi | ||
|
||
# Try using TCMalloc on Linux | ||
prepare_tcmalloc() { | ||
if [[ "${OSTYPE}" == "linux"* ]] && [[ -z "${NO_TCMALLOC}" ]] && [[ -z "${LD_PRELOAD}" ]]; then | ||
# check glibc version | ||
LIBC_VER=$(echo $(ldd --version | awk 'NR==1 {print $NF}') | grep -oP '\d+\.\d+') | ||
echo "glibc version is $LIBC_VER" | ||
libc_vernum=$(expr $LIBC_VER) | ||
# Since 2.34 libpthread is integrated into libc.so | ||
libc_v234=2.34 | ||
# Define Tcmalloc Libs arrays | ||
TCMALLOC_LIBS=("libtcmalloc(_minimal|)\.so\.\d" "libtcmalloc\.so\.\d") | ||
# Traversal array | ||
for lib in "${TCMALLOC_LIBS[@]}" | ||
do | ||
# Determine which type of tcmalloc library the library supports | ||
TCMALLOC="$(PATH=/sbin:/usr/sbin:$PATH ldconfig -p | grep -P $lib | head -n 1)" | ||
TC_INFO=(${TCMALLOC//=>/}) | ||
if [[ ! -z "${TC_INFO}" ]]; then | ||
echo "Check TCMalloc: ${TC_INFO}" | ||
# Determine if the library is linked to libpthread and resolve undefined symbol: pthread_key_create | ||
if [ $(echo "$libc_vernum < $libc_v234" | bc) -eq 1 ]; then | ||
# glibc < 2.34 pthread_key_create into libpthread.so. check linking libpthread.so... | ||
if ldd ${TC_INFO[2]} | grep -q 'libpthread'; then | ||
echo "$TC_INFO is linked with libpthread,execute LD_PRELOAD=${TC_INFO[2]}" | ||
# set fullpath LD_PRELOAD (To be on the safe side) | ||
export LD_PRELOAD="${TC_INFO[2]}" | ||
break | ||
else | ||
echo "$TC_INFO is not linked with libpthread will trigger undefined symbol: pthread_Key_create error" | ||
fi | ||
else | ||
# Version 2.34 of libc.so (glibc) includes the pthread library IN GLIBC. (USE ubuntu 22.04 and modern linux system and WSL) | ||
# libc.so(glibc) is linked with a library that works in ALMOST ALL Linux userlands. SO NO CHECK! | ||
echo "$TC_INFO is linked with libc.so,execute LD_PRELOAD=${TC_INFO[2]}" | ||
# set fullpath LD_PRELOAD (To be on the safe side) | ||
export LD_PRELOAD="${TC_INFO[2]}" | ||
break | ||
fi | ||
fi | ||
done | ||
if [[ -z "${LD_PRELOAD}" ]]; then | ||
printf "\e[1m\e[31mCannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage)\e[0m\n" | ||
fi | ||
fi | ||
} | ||
|
||
KEEP_GOING=1 | ||
export SD_WEBUI_RESTART=tmp/restart | ||
while [[ "$KEEP_GOING" -eq "1" ]]; do | ||
if [[ ! -z "${ACCELERATE}" ]] && [ ${ACCELERATE}="True" ] && [ -x "$(command -v accelerate)" ]; then | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Accelerating install.py..." | ||
printf "\n%s\n" "${delimiter}" | ||
prepare_tcmalloc | ||
accelerate launch --num_cpu_threads_per_process=6 "${INSTALL_SCRIPT}" "$@" | ||
else | ||
printf "\n%s\n" "${delimiter}" | ||
printf "Launching install.py..." | ||
printf "\n%s\n" "${delimiter}" | ||
prepare_tcmalloc | ||
"${python_cmd}" -u "${INSTALL_SCRIPT}" "$@" | ||
fi | ||
|
||
if [[ ! -f tmp/restart ]]; then | ||
KEEP_GOING=0 | ||
fi | ||
done |