mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
236 lines
7.0 KiB
Bash
236 lines
7.0 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# ensure we're in the correct folder in case user's CWD is somewhere else
|
|
scriptdir=$(dirname "$0")
|
|
cd "$scriptdir"
|
|
|
|
set -euo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
function _err_exit {
|
|
if test "$1" -ne 0
|
|
then
|
|
echo -e "Error code $1; Error caught was '$2'"
|
|
read -p "Press any key to exit..."
|
|
exit
|
|
fi
|
|
}
|
|
|
|
# This script will install git (if not found on the PATH variable)
|
|
# using micromamba (an 8mb static-linked single-file binary, conda replacement).
|
|
# For users who already have git, this step will be skipped.
|
|
|
|
# Next, it'll download the project's source code.
|
|
# Then it will download a self-contained, standalone Python and unpack it.
|
|
# Finally, it'll create the Python virtual environment and preload the models.
|
|
|
|
# This enables a user to install this project without manually installing git or Python
|
|
|
|
echo -e "\n***** Installing InvokeAI into $(pwd)... *****\n"
|
|
|
|
export no_cache_dir="--no-cache-dir"
|
|
if [ $# -ge 1 ]; then
|
|
if [ "$1" = "use-cache" ]; then
|
|
export no_cache_dir=""
|
|
fi
|
|
fi
|
|
|
|
|
|
OS_NAME=$(uname -s)
|
|
case "${OS_NAME}" in
|
|
Linux*) OS_NAME="linux";;
|
|
Darwin*) OS_NAME="darwin";;
|
|
*) echo -e "\n----- Unknown OS: $OS_NAME! This script runs only on Linux or macOS -----\n" && exit
|
|
esac
|
|
|
|
OS_ARCH=$(uname -m)
|
|
case "${OS_ARCH}" in
|
|
x86_64*) ;;
|
|
arm64*) ;;
|
|
*) echo -e "\n----- Unknown system architecture: $OS_ARCH! This script runs only on x86_64 or arm64 -----\n" && exit
|
|
esac
|
|
|
|
# https://mamba.readthedocs.io/en/latest/installation.html
|
|
MAMBA_OS_NAME=$OS_NAME
|
|
MAMBA_ARCH=$OS_ARCH
|
|
if [ "$OS_NAME" == "darwin" ]; then
|
|
MAMBA_OS_NAME="osx"
|
|
fi
|
|
|
|
if [ "$OS_ARCH" == "linux" ]; then
|
|
MAMBA_ARCH="aarch64"
|
|
fi
|
|
|
|
if [ "$OS_ARCH" == "x86_64" ]; then
|
|
MAMBA_ARCH="64"
|
|
fi
|
|
|
|
PY_ARCH=$OS_ARCH
|
|
if [ "$OS_ARCH" == "arm64" ]; then
|
|
PY_ARCH="aarch64"
|
|
fi
|
|
|
|
# Compute device ('cd' segment of reqs files) detect goes here
|
|
# This needs a ton of work
|
|
# Suggestions:
|
|
# - lspci
|
|
# - check $PATH for nvidia-smi, gtt CUDA/GPU version from output
|
|
# - Surely there's a similar utility for AMD?
|
|
CD="cuda"
|
|
if [ "$OS_NAME" == "darwin" ] && [ "$OS_ARCH" == "arm64" ]; then
|
|
CD="mps"
|
|
fi
|
|
|
|
# config
|
|
INSTALL_ENV_DIR="$(pwd)/installer_files/env"
|
|
MICROMAMBA_DOWNLOAD_URL="https://micro.mamba.pm/api/micromamba/${MAMBA_OS_NAME}-${MAMBA_ARCH}/latest"
|
|
RELEASE_URL=https://github.com/invoke-ai/InvokeAI
|
|
RELEASE_SOURCEBALL=/archive/refs/heads/main.tar.gz
|
|
PYTHON_BUILD_STANDALONE_URL=https://github.com/indygreg/python-build-standalone/releases/download
|
|
if [ "$OS_NAME" == "darwin" ]; then
|
|
PYTHON_BUILD_STANDALONE=20221002/cpython-3.10.7+20221002-${PY_ARCH}-apple-darwin-install_only.tar.gz
|
|
elif [ "$OS_NAME" == "linux" ]; then
|
|
PYTHON_BUILD_STANDALONE=20221002/cpython-3.10.7+20221002-${PY_ARCH}-unknown-linux-gnu-install_only.tar.gz
|
|
fi
|
|
echo "INSTALLING $RELEASE_SOURCEBALL FROM $RELEASE_URL"
|
|
|
|
PACKAGES_TO_INSTALL=""
|
|
|
|
if ! hash "git" &>/dev/null; then PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL git"; fi
|
|
|
|
# (if necessary) install git and conda into a contained environment
|
|
if [ "$PACKAGES_TO_INSTALL" != "" ]; then
|
|
# download micromamba
|
|
echo -e "\n***** Downloading micromamba from $MICROMAMBA_DOWNLOAD_URL to micromamba *****\n"
|
|
|
|
curl -L "$MICROMAMBA_DOWNLOAD_URL" | tar -xvjO bin/micromamba > micromamba
|
|
|
|
chmod u+x ./micromamba
|
|
|
|
# test the mamba binary
|
|
echo -e "\n***** Micromamba version: *****\n"
|
|
./micromamba --version
|
|
|
|
# create the installer env
|
|
if [ ! -e "$INSTALL_ENV_DIR" ]; then
|
|
./micromamba create -y --prefix "$INSTALL_ENV_DIR"
|
|
fi
|
|
|
|
echo -e "\n***** Packages to install:$PACKAGES_TO_INSTALL *****\n"
|
|
|
|
./micromamba install -y --prefix "$INSTALL_ENV_DIR" -c conda-forge "$PACKAGES_TO_INSTALL"
|
|
|
|
if [ ! -e "$INSTALL_ENV_DIR" ]; then
|
|
echo -e "\n----- There was a problem while initializing micromamba. Cannot continue. -----\n"
|
|
exit
|
|
fi
|
|
fi
|
|
|
|
rm -f micromamba.exe
|
|
|
|
export PATH="$INSTALL_ENV_DIR/bin:$PATH"
|
|
|
|
# Download/unpack/clean up InvokeAI release sourceball
|
|
_err_msg="\n----- InvokeAI source download failed -----\n"
|
|
curl -L $RELEASE_URL/$RELEASE_SOURCEBALL --output InvokeAI.tgz
|
|
_err_exit $? _err_msg
|
|
_err_msg="\n----- InvokeAI source unpack failed -----\n"
|
|
tar -zxf InvokeAI.tgz
|
|
_err_exit $? _err_msg
|
|
|
|
rm -f InvokeAI.tgz
|
|
|
|
_err_msg="\n----- InvokeAI source copy failed -----\n"
|
|
cd InvokeAI-*
|
|
cp -r . ..
|
|
_err_exit $? _err_msg
|
|
cd ..
|
|
|
|
# cleanup
|
|
rm -rf InvokeAI-*/
|
|
rm -rf .dev_scripts/ .github/ docker-build/ tests/ requirements.in requirements-mkdocs.txt shell.nix
|
|
|
|
echo -e "\n***** Unpacked InvokeAI source *****\n"
|
|
|
|
# Download/unpack/clean up python-build-standalone
|
|
_err_msg="\n----- Python download failed -----\n"
|
|
curl -L $PYTHON_BUILD_STANDALONE_URL/$PYTHON_BUILD_STANDALONE --output python.tgz
|
|
_err_exit $? _err_msg
|
|
_err_msg="\n----- Python unpack failed -----\n"
|
|
tar -zxf python.tgz
|
|
_err_exit $? _err_msg
|
|
|
|
rm -f python.tgz
|
|
|
|
echo -e "\n***** Unpacked python-build-standalone *****\n"
|
|
|
|
# create venv
|
|
_err_msg="\n----- problem creating venv -----\n"
|
|
|
|
if [ "$OS_NAME" == "darwin" ]; then
|
|
# patch sysconfig so that extensions can build properly
|
|
# adapted from https://github.com/cashapp/hermit-packages/commit/fcba384663892f4d9cfb35e8639ff7a28166ee43
|
|
PYTHON_INSTALL_DIR="$(pwd)/python"
|
|
SYSCONFIG="$(echo python/lib/python*/_sysconfigdata_*.py)"
|
|
TMPFILE="$(mktemp)"
|
|
chmod +w "${SYSCONFIG}"
|
|
cp "${SYSCONFIG}" "${TMPFILE}"
|
|
sed "s,'/install,'${PYTHON_INSTALL_DIR},g" "${TMPFILE}" > "${SYSCONFIG}"
|
|
rm -f "${TMPFILE}"
|
|
fi
|
|
|
|
./python/bin/python3 -E -s -m venv .venv
|
|
_err_exit $? _err_msg
|
|
source .venv/bin/activate
|
|
|
|
echo -e "\n***** Created Python virtual environment *****\n"
|
|
|
|
# Print venv's Python version
|
|
_err_msg="\n----- problem calling venv's python -----\n"
|
|
echo -e "We're running under"
|
|
.venv/bin/python3 --version
|
|
_err_exit $? _err_msg
|
|
|
|
_err_msg="\n----- pip update failed -----\n"
|
|
.venv/bin/python3 -m pip install $no_cache_dir --no-warn-script-location --upgrade pip
|
|
_err_exit $? _err_msg
|
|
|
|
echo -e "\n***** Updated pip *****\n"
|
|
|
|
_err_msg="\n----- requirements file copy failed -----\n"
|
|
cp binary_installer/py3.10-${OS_NAME}-"${OS_ARCH}"-${CD}-reqs.txt requirements.txt
|
|
_err_exit $? _err_msg
|
|
|
|
_err_msg="\n----- main pip install failed -----\n"
|
|
.venv/bin/python3 -m pip install $no_cache_dir --no-warn-script-location -r requirements.txt
|
|
_err_exit $? _err_msg
|
|
|
|
echo -e "\n***** Installed Python dependencies *****\n"
|
|
|
|
_err_msg="\n----- InvokeAI setup failed -----\n"
|
|
.venv/bin/python3 -m pip install $no_cache_dir --no-warn-script-location -e .
|
|
_err_exit $? _err_msg
|
|
|
|
echo -e "\n***** Installed InvokeAI *****\n"
|
|
|
|
cp binary_installer/invoke.sh.in ./invoke.sh
|
|
chmod a+rx ./invoke.sh
|
|
echo -e "\n***** Installed invoke launcher script ******\n"
|
|
|
|
# more cleanup
|
|
rm -rf binary_installer/ installer_files/
|
|
|
|
# preload the models
|
|
.venv/bin/python3 scripts/configure_invokeai.py
|
|
_err_msg="\n----- model download clone failed -----\n"
|
|
_err_exit $? _err_msg
|
|
deactivate
|
|
|
|
echo -e "\n***** Finished downloading models *****\n"
|
|
|
|
echo "All done! Run the command"
|
|
echo " $scriptdir/invoke.sh"
|
|
echo "to start InvokeAI."
|
|
read -p "Press any key to exit..."
|
|
exit
|