mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2024-11-30 03:18:57 +01:00
6d2c72b593
* Initial commit * Initial commit with new code * Add comments * Move GPTQ out of if * Fix install on Arch Linux * Fix case where install was aborted If the install was aborted before a model was downloaded, webui wouldn't run. * Update start_windows.bat Add necessary flags to Miniconda installer Disable Start Menu shortcut creation Disable ssl on Conda Change Python version to latest 3.10, I've noticed that explicitly specifying 3.10.9 can break the included Python installation * Update bitsandbytes wheel link to 0.38.1 Disable ssl on Conda * Add check for spaces in path Installation of Miniconda will fail in this case * Mirror changes to mac and linux scripts * Start with model-menu * Add updaters * Fix line endings * Add check for path with spaces * Fix one-click updating * Fix one-click updating * Clean up update scripts * Add environment scripts --------- Co-authored-by: jllllll <3887729+jllllll@users.noreply.github.com> Co-authored-by: oobabooga <112222186+oobabooga@users.noreply.github.com>
172 lines
6.4 KiB
Python
172 lines
6.4 KiB
Python
import argparse
|
|
import glob
|
|
import os
|
|
import shutil
|
|
import site
|
|
import subprocess
|
|
import sys
|
|
|
|
script_dir = os.getcwd()
|
|
|
|
|
|
def run_cmd(cmd, capture_output=False, env=None):
|
|
# Run shell commands
|
|
return subprocess.run(cmd, shell=True, capture_output=capture_output, env=env)
|
|
|
|
|
|
def check_env():
|
|
# If we have access to conda, we are probably in an environment
|
|
conda_not_exist = run_cmd("conda", capture_output=True).returncode
|
|
if conda_not_exist:
|
|
print("Conda is not installed. Exiting...")
|
|
sys.exit()
|
|
|
|
# Ensure this is a new environment and not the base environment
|
|
if os.environ["CONDA_DEFAULT_ENV"] == "base":
|
|
print("Create an environment for this project and activate it. Exiting...")
|
|
sys.exit()
|
|
|
|
|
|
def install_dependencies():
|
|
# Select your GPU or, choose to run in CPU mode
|
|
print("What is your GPU")
|
|
print()
|
|
print("A) NVIDIA")
|
|
print("B) AMD")
|
|
print("C) Apple M Series")
|
|
print("D) None (I want to run in CPU mode)")
|
|
print()
|
|
gpuchoice = input("Input> ").lower()
|
|
|
|
# Install the version of PyTorch needed
|
|
if gpuchoice == "a":
|
|
run_cmd("conda install -y -k pytorch[version=2,build=py3.10_cuda11.7*] torchvision torchaudio pytorch-cuda=11.7 cuda-toolkit ninja git -c pytorch -c nvidia/label/cuda-11.7.0 -c nvidia")
|
|
elif gpuchoice == "b":
|
|
print("AMD GPUs are not supported. Exiting...")
|
|
sys.exit()
|
|
elif gpuchoice == "c" or gpuchoice == "d":
|
|
run_cmd("conda install -y -k pytorch torchvision torchaudio cpuonly git -c pytorch")
|
|
else:
|
|
print("Invalid choice. Exiting...")
|
|
sys.exit()
|
|
|
|
# Clone webui to our computer
|
|
run_cmd("git clone https://github.com/oobabooga/text-generation-webui.git")
|
|
if sys.platform.startswith("win"):
|
|
# Fix a bitsandbytes compatibility issue with Windows
|
|
run_cmd("python -m pip install https://github.com/jllllll/bitsandbytes-windows-webui/raw/main/bitsandbytes-0.38.1-py3-none-any.whl")
|
|
|
|
# Install the webui dependencies
|
|
update_dependencies()
|
|
|
|
|
|
def update_dependencies():
|
|
os.chdir("text-generation-webui")
|
|
run_cmd("git pull")
|
|
|
|
# Installs/Updates dependencies from all requirements.txt
|
|
run_cmd("python -m pip install -r requirements.txt --upgrade")
|
|
extensions = next(os.walk("extensions"))[1]
|
|
for extension in extensions:
|
|
extension_req_path = os.path.join("extensions", extension, "requirements.txt")
|
|
if os.path.exists(extension_req_path):
|
|
run_cmd("python -m pip install -r " + extension_req_path + " --upgrade")
|
|
|
|
# The following dependencies are for CUDA, not CPU
|
|
# Check if the package cpuonly exists to determine if torch uses CUDA or not
|
|
cpuonly_exist = not run_cmd("conda list cpuonly | grep cpuonly", capture_output=True).returncode
|
|
if cpuonly_exist:
|
|
return
|
|
|
|
# Finds the path to your dependencies
|
|
for sitedir in site.getsitepackages():
|
|
if "site-packages" in sitedir:
|
|
site_packages_path = sitedir
|
|
break
|
|
|
|
# This path is critical to installing the following dependencies
|
|
if site_packages_path is None:
|
|
print("Could not find the path to your Python packages. Exiting...")
|
|
sys.exit()
|
|
|
|
# Fix a bitsandbytes compatibility issue with Linux
|
|
if sys.platform.startswith("linux"):
|
|
shutil.copy(os.path.join(site_packages_path, "bitsandbytes", "libbitsandbytes_cuda117.so"), os.path.join(site_packages_path, "bitsandbytes", "libbitsandbytes_cpu.so"))
|
|
|
|
if not os.path.exists("repositories/"):
|
|
os.mkdir("repositories")
|
|
|
|
# Install GPTQ-for-LLaMa which enables 4bit CUDA quantization
|
|
os.chdir("repositories")
|
|
if not os.path.exists("GPTQ-for-LLaMa/"):
|
|
run_cmd("git clone https://github.com/oobabooga/GPTQ-for-LLaMa.git -b cuda")
|
|
|
|
# Install GPTQ-for-LLaMa dependencies
|
|
os.chdir("GPTQ-for-LLaMa")
|
|
run_cmd("git pull")
|
|
run_cmd("python -m pip install -r requirements.txt")
|
|
|
|
# On some Linux distributions, g++ may not exist or be the wrong version to compile GPTQ-for-LLaMa
|
|
install_flag = True
|
|
if sys.platform.startswith("linux"):
|
|
gxx_output = run_cmd("g++ --version", capture_output=True)
|
|
if gxx_output.returncode != 0 or b"g++ (GCC) 12" in gxx_output.stdout:
|
|
# Install the correct version of g++
|
|
run_cmd("conda install -y -k gxx_linux-64=11.2.0")
|
|
|
|
# Activate the conda environment to compile GPTQ-for-LLaMa
|
|
conda_env_path = os.path.join(script_dir, "installer_files", "env")
|
|
conda_sh_path = os.path.join(script_dir, "installer_files", "conda", "etc", "profile.d", "conda.sh")
|
|
run_cmd(". " + conda_sh_path + " && conda activate " + conda_env_path + " && python setup_cuda.py install")
|
|
install_flag = False
|
|
|
|
if install_flag:
|
|
run_cmd("python setup_cuda.py install")
|
|
install_flag = False
|
|
|
|
# If the path does not exist, then the install failed
|
|
quant_cuda_path_regex = os.path.join(site_packages_path, "quant_cuda*/")
|
|
if not glob.glob(quant_cuda_path_regex):
|
|
print("CUDA kernel compilation failed.")
|
|
# Attempt installation via alternative, Windows-specific method
|
|
if sys.platform.startswith("win"):
|
|
print("Attempting installation with wheel.")
|
|
result = run_cmd("python -m pip install https://github.com/jllllll/GPTQ-for-LLaMa-Wheels/raw/main/quant_cuda-0.0.0-cp310-cp310-win_amd64.whl")
|
|
if result.returncode == 1:
|
|
print("Wheel installation failed.")
|
|
|
|
|
|
def download_model():
|
|
os.chdir("text-generation-webui")
|
|
run_cmd("python download-model.py")
|
|
|
|
|
|
def run_model():
|
|
os.chdir("text-generation-webui")
|
|
run_cmd("python server.py --auto-devices --chat --model-menu")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Verifies we are in a conda environment
|
|
check_env()
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--update', action='store_true', help='Update the web UI.')
|
|
args = parser.parse_args()
|
|
|
|
if args.update:
|
|
update_dependencies()
|
|
else:
|
|
# If webui has already been installed, skip and run
|
|
if not os.path.exists("text-generation-webui/"):
|
|
install_dependencies()
|
|
os.chdir(script_dir)
|
|
|
|
# Check if a model has been downloaded yet
|
|
if len(glob.glob("text-generation-webui/models/*/")) == 0:
|
|
download_model()
|
|
os.chdir(script_dir)
|
|
|
|
# Run the model with webui
|
|
run_model()
|