From c24966c5914e974b509e611f01527e1a2854b4c3 Mon Sep 17 00:00:00 2001 From: joachimchauvet <13382894+joachimchauvet@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:33:45 +0300 Subject: [PATCH 001/173] update API documentation with examples to list/load models (#5902) --- docs/12 - OpenAI API.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/12 - OpenAI API.md b/docs/12 - OpenAI API.md index b00a1f34..9b4f89bf 100644 --- a/docs/12 - OpenAI API.md +++ b/docs/12 - OpenAI API.md @@ -19,7 +19,7 @@ Add `--api` to your command-line flags. ### Examples -For the documentation with all the parameters and their types, consult `http://127.0.0.1:5000/docs` or the [typing.py](https://github.com/oobabooga/text-generation-webui/blob/main/extensions/openai/typing.py) file. +For the documentation with all the endpoints, parameters and their types, consult `http://127.0.0.1:5000/docs` or the [typing.py](https://github.com/oobabooga/text-generation-webui/blob/main/extensions/openai/typing.py) file. The official examples in the [OpenAI documentation](https://platform.openai.com/docs/api-reference) should also work, and the same parameters apply (although the API here has more optional parameters). @@ -114,6 +114,30 @@ curl -k http://127.0.0.1:5000/v1/internal/logits \ }' ``` +#### List models + +```shell +curl -k http://127.0.0.1:5000/v1/internal/model/list \ + -H "Content-Type: application/json" +``` + +#### Load model + +```shell +curl -k http://127.0.0.1:5000/v1/internal/model/load \ + -H "Content-Type: application/json" \ + -d '{ + "model_name": "model_name", + "args": { + "load_in_4bit": true, + "n_gpu_layers": 12 + }, + "settings": { + "instruction_template": "Alpaca" + } + }' +``` + #### Python chat example ```python From 1f288b40720bbef6ed32ad5dee1899b9e5949925 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:40:15 -0700 Subject: [PATCH 002/173] Bump ExLlamaV2 to 0.1.9 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 08b7d56d..a39a7c70 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,11 +53,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 52e36510..5ff86863 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -40,9 +40,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 18a81d04..c0d094e8 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -38,9 +38,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index af02904b..cbcf1175 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -36,4 +36,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 8cdd8519..d5cb3675 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -38,4 +38,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index d22eb72c..bfe57329 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -53,11 +53,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 41a8eb4eebf02cd5e7d75786229843748579c0b0 Mon Sep 17 00:00:00 2001 From: "FartyPants (FP HAM)" Date: Mon, 2 Sep 2024 22:00:15 -0400 Subject: [PATCH 003/173] Training pro update script.py (#6359) --- extensions/Training_PRO/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Training_PRO/script.py b/extensions/Training_PRO/script.py index 8f296462..5365154c 100644 --- a/extensions/Training_PRO/script.py +++ b/extensions/Training_PRO/script.py @@ -241,7 +241,7 @@ def ui(): stride_length = gr.Slider(label='Stride', minimum=1, maximum=2048, value=512, step=1, info='Used to make the evaluation faster at the cost of accuracy. 1 = slowest but most accurate. 512 is a common value.') with gr.Column(): - max_length = gr.Slider(label='max_length', minimum=0, maximum=shared.settings['truncation_length_max'], value=0, step=1, info='The context for each evaluation. If set to 0, the maximum context length for the model will be used.') + max_length = gr.Number(label='max_length', precision=0, step=256, value=0, info='The context for each evaluation. If set to 0, the maximum context length for the model will be used.') with gr.Row(): start_current_evaluation = gr.Button("Evaluate loaded model") From 4c74c7a1167defef1f9ea217507990974c8fde3d Mon Sep 17 00:00:00 2001 From: GralchemOz <68577430+GralchemOz@users.noreply.github.com> Date: Tue, 3 Sep 2024 10:00:59 +0800 Subject: [PATCH 004/173] Fix UnicodeDecodeError for BPE-based Models (especially GLM-4) (#6357) --- modules/text_generation.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/text_generation.py b/modules/text_generation.py index 75e5ef36..e7a2b43f 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -274,7 +274,12 @@ def get_reply_from_output_ids(output_ids, state=None, starting_from=0): if (hasattr(shared.tokenizer, 'convert_ids_to_tokens') and len(output_ids) > starting_from) and not reply.startswith(' '): first_token = shared.tokenizer.convert_ids_to_tokens(int(output_ids[starting_from])) if isinstance(first_token, (bytes,)): - first_token = first_token.decode('utf8') + #try to decode the bytes to a string + try: + first_token = first_token.decode('utf8') + #if it fails, which means it's not a string in this turn, just ignore it + except UnicodeDecodeError: + first_token = '' if first_token.startswith('▁'): reply = ' ' + reply From 9a150c3368fb61cfd77f3286590625467fdc5413 Mon Sep 17 00:00:00 2001 From: Stefan Merettig Date: Tue, 3 Sep 2024 04:03:15 +0200 Subject: [PATCH 005/173] API: Relax multimodal format, fixes HuggingFace Chat UI (#6353) --- extensions/openai/completions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/openai/completions.py b/extensions/openai/completions.py index 646dee2d..362620fa 100644 --- a/extensions/openai/completions.py +++ b/extensions/openai/completions.py @@ -154,8 +154,9 @@ def convert_history(history): elif item['type'] == 'text' and isinstance(item['text'], str): content = item['text'] - if image_url and content: + if image_url: new_history.append({"image_url": image_url, "role": "user"}) + if content: new_history.append({"content": content, "role": "user"}) else: new_history.append(entry) From d1168afa76900c8632a729984ed383ee9c83220c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:15:51 -0700 Subject: [PATCH 006/173] Bump ExLlamaV2 to 0.2.0 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index a39a7c70..076d8dad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,11 +53,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 5ff86863..b05cbebe 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -40,9 +40,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index c0d094e8..f30543c1 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -38,9 +38,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index cbcf1175..33760ab4 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -36,4 +36,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index d5cb3675..dda1e25b 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -38,4 +38,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index bfe57329..48b2e858 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -53,11 +53,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.1.9/exllamav2-0.1.9-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 64919e0d69bb5e6a653f866cde313c1ae1b668c9 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 3 Sep 2024 05:51:46 -0700 Subject: [PATCH 007/173] Bump flash-attention to 2.6.3 --- requirements.txt | 8 ++++---- requirements_noavx2.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index 076d8dad..db6f0061 100644 --- a/requirements.txt +++ b/requirements.txt @@ -58,10 +58,10 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 48b2e858..5d8ae640 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -58,10 +58,10 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.1/flash_attn-2.6.1+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 2cb8d4c96ea3272a7e5e8a6c94c0541b8af5bfbc Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 3 Sep 2024 05:53:18 -0700 Subject: [PATCH 008/173] Bump llama-cpp-python to 0.2.90 --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 12 ++++++------ requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 8 ++++---- requirements_apple_silicon.txt | 12 ++++++------ requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/requirements.txt b/requirements.txt index db6f0061..42eb0231 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,22 +35,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index b05cbebe..05b60c48 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -32,14 +32,14 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.89+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index f30543c1..5d885506 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -32,10 +32,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 33760ab4..674c2ffc 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -32,8 +32,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index dda1e25b..7a63a82b 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -32,10 +32,10 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.89-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 807c182a..42d56eb5 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -32,7 +32,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index e2a89936..aacdc82d 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -32,7 +32,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 5d8ae640..316576c2 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -35,22 +35,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.89+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.89+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.89+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From c5b40eb5558230fe5894cfd9388809429f5c799f Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:37:06 -0700 Subject: [PATCH 009/173] llama.cpp: prevent prompt evaluation progress bar with just 1 step --- modules/llama_cpp_python_hijack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/llama_cpp_python_hijack.py b/modules/llama_cpp_python_hijack.py index 64280dc9..3d42b2d7 100644 --- a/modules/llama_cpp_python_hijack.py +++ b/modules/llama_cpp_python_hijack.py @@ -61,7 +61,7 @@ def eval_with_progress(self, tokens: Sequence[int]): assert self._batch.batch is not None self._ctx.kv_cache_seq_rm(-1, self.n_tokens, -1) - if len(tokens) > 1: + if len(tokens) > self.n_batch: progress_bar = tqdm(range(0, len(tokens), self.n_batch), desc="Prompt evaluation", leave=False) else: progress_bar = range(0, len(tokens), self.n_batch) From bba5b36d332b2b3c0297c85cd7d07e5a50e3f86c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:40:53 -0700 Subject: [PATCH 010/173] Don't import PEFT unless necessary --- modules/LoRA.py | 4 +++- modules/training.py | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/LoRA.py b/modules/LoRA.py index 117022cf..4fd144ba 100644 --- a/modules/LoRA.py +++ b/modules/LoRA.py @@ -1,7 +1,6 @@ from pathlib import Path import torch -from peft import PeftModel from transformers import is_torch_xpu_available import modules.shared as shared @@ -85,6 +84,9 @@ def add_lora_autogptq(lora_names): def add_lora_transformers(lora_names): + + from peft import PeftModel + prior_set = set(shared.lora_names) added_set = set(lora_names) - prior_set removed_set = prior_set - set(lora_names) diff --git a/modules/training.py b/modules/training.py index b003fc8c..11c4b8c5 100644 --- a/modules/training.py +++ b/modules/training.py @@ -18,14 +18,6 @@ import gradio as gr import torch import transformers from datasets import Dataset, load_dataset -from peft import ( - LoraConfig, - get_peft_model, - prepare_model_for_kbit_training, - set_peft_model_state_dict -) -from peft.utils.other import \ - TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING as model_to_lora_modules from transformers import is_torch_xpu_available from transformers.models.auto.modeling_auto import ( MODEL_FOR_CAUSAL_LM_MAPPING_NAMES @@ -292,6 +284,16 @@ def calc_trainable_parameters(model): def do_train(lora_name: str, always_override: bool, q_proj_en: bool, v_proj_en: bool, k_proj_en: bool, o_proj_en: bool, gate_proj_en: bool, down_proj_en: bool, up_proj_en: bool, save_steps: int, micro_batch_size: int, batch_size: int, epochs: int, learning_rate: str, lr_scheduler_type: str, lora_rank: int, lora_alpha: int, lora_dropout: float, cutoff_len: int, dataset: str, eval_dataset: str, format: str, eval_steps: int, raw_text_file: str, overlap_len: int, newline_favor_len: int, higher_rank_limit: bool, warmup_steps: int, optimizer: str, hard_cut_string: str, train_only_after: str, stop_at_loss: float, add_eos_token: bool, min_chars: int, report_to: str): + from peft import ( + LoraConfig, + get_peft_model, + prepare_model_for_kbit_training, + set_peft_model_state_dict + ) + from peft.utils.other import \ + TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING as \ + model_to_lora_modules + global WANT_INTERRUPT WANT_INTERRUPT = False From 4924ee2901ce9ad17259ae817bbb46885d1ba8ba Mon Sep 17 00:00:00 2001 From: Jean-Sylvain Boige Date: Fri, 6 Sep 2024 02:42:23 +0200 Subject: [PATCH 011/173] typo in OpenAI response format (#6365) --- extensions/openai/completions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/openai/completions.py b/extensions/openai/completions.py index 362620fa..6bd8f409 100644 --- a/extensions/openai/completions.py +++ b/extensions/openai/completions.py @@ -235,7 +235,7 @@ def chat_completions_common(body: dict, is_legacy: bool = False, stream=False, p raise InvalidRequestError(message="messages: missing content", param='messages') # Chat Completions - object_type = 'chat.completions' if not stream else 'chat.completions.chunk' + object_type = 'chat.completion' if not stream else 'chat.completion.chunk' created_time = int(time.time()) cmpl_id = "chatcmpl-%d" % (int(time.time() * 1000000000)) resp_list = 'data' if is_legacy else 'choices' From 27797a92d051eef3289c510906e75827dbc4886c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:38:39 -0700 Subject: [PATCH 012/173] Pin fastapi/pydantic requirement versions --- requirements.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 42eb0231..7164ac80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ bitsandbytes==0.43.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -17,6 +18,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -69,4 +71,4 @@ https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310 https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From ac30b004efd7b9e2511d0baf619e8025c745ba09 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:38:39 -0700 Subject: [PATCH 013/173] Pin fastapi/pydantic requirement versions --- requirements.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 08b7d56d..51558a84 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ bitsandbytes==0.43.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -17,6 +18,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -69,4 +71,4 @@ https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310 https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From a50477ec85a7b5367e1ebe3658bb270735715bea Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:47:25 -0700 Subject: [PATCH 014/173] Apply the change to all requirements (oops) --- requirements_amd.txt | 4 +++- requirements_amd_noavx2.txt | 4 +++- requirements_apple_intel.txt | 2 ++ requirements_apple_silicon.txt | 2 ++ requirements_cpu_only.txt | 2 ++ requirements_cpu_only_noavx2.txt | 2 ++ requirements_noavx2.txt | 4 +++- requirements_nowheels.txt | 2 ++ 8 files changed, 19 insertions(+), 3 deletions(-) diff --git a/requirements_amd.txt b/requirements_amd.txt index 05b60c48..20ba9c79 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -46,4 +48,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0- https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 5d885506..e5c18681 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -44,4 +46,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0- https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 674c2ffc..e60937c7 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 7a63a82b..e1b726bb 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 42d56eb5..b0480c43 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index aacdc82d..a64d68a7 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 316576c2..cae98bb2 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -5,6 +5,7 @@ bitsandbytes==0.43.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -17,6 +18,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -69,4 +71,4 @@ https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310 https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index ffb45fe3..ec18464d 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich From f98431c7448381bfa4e859ace70e0379f6431018 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:47:25 -0700 Subject: [PATCH 015/173] Apply the change to all requirements (oops) --- requirements_amd.txt | 4 +++- requirements_amd_noavx2.txt | 4 +++- requirements_apple_intel.txt | 2 ++ requirements_apple_silicon.txt | 2 ++ requirements_cpu_only.txt | 2 ++ requirements_cpu_only_noavx2.txt | 2 ++ requirements_noavx2.txt | 4 +++- requirements_nowheels.txt | 2 ++ 8 files changed, 19 insertions(+), 3 deletions(-) diff --git a/requirements_amd.txt b/requirements_amd.txt index 52e36510..e9dfb128 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -46,4 +48,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8- https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 18a81d04..69a350ad 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -44,4 +46,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.1.8/exllamav2-0.1.8- https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index af02904b..0326916e 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 8cdd8519..70ee3d27 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 807c182a..fe2d796c 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index e2a89936..982a12a1 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index d22eb72c..fc253f5c 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -5,6 +5,7 @@ bitsandbytes==0.43.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -17,6 +18,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich @@ -69,4 +71,4 @@ https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310 https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index ffb45fe3..ec18464d 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -2,6 +2,7 @@ accelerate==0.33.* colorama datasets einops +fastapi==0.112.4 gradio==4.26.* hqq==0.1.7.post3 jinja2==3.1.4 @@ -14,6 +15,7 @@ pandas peft==0.12.* Pillow>=9.5.0 psutil +pydantic==2.8.2 pyyaml requests rich From c497a3237229db0de4a4704e829d75a45973c91f Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:55:51 -0700 Subject: [PATCH 016/173] Bump transformers to 4.45 --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7164ac80..913c2463 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,7 +26,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_amd.txt b/requirements_amd.txt index 20ba9c79..b9d74b69 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index e5c18681..ccacab29 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index e60937c7..dc1757e2 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index e1b726bb..a913a63c 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index b0480c43..b0dbc91a 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index a64d68a7..828d0c97 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index cae98bb2..458c1410 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -26,7 +26,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index ec18464d..e7cbc29c 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -23,7 +23,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.44.* +transformers==4.45.* tqdm wandb From 7424f789bf699c9b2efc874da2b84168bb9e7a6f Mon Sep 17 00:00:00 2001 From: oobabooga Date: Fri, 27 Sep 2024 19:03:25 -0300 Subject: [PATCH 017/173] Fix the sampling monkey patch (and add more options to sampler_priority) (#6411) --- modules/presets.py | 2 +- modules/sampler_hijack.py | 192 +++++++++++++++++++++++--------------- 2 files changed, 116 insertions(+), 78 deletions(-) diff --git a/modules/presets.py b/modules/presets.py index b00e829e..14c5a777 100644 --- a/modules/presets.py +++ b/modules/presets.py @@ -44,7 +44,7 @@ def default_preset(): 'dry_base': 1.75, 'dry_allowed_length': 2, 'dry_sequence_breakers': '"\\n", ":", "\\"", "*"', - 'sampler_priority': 'temperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat' + 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nencoder_repetition_penalty\nno_repeat_ngram' } diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 9fb661ae..9e865bb3 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -323,62 +323,141 @@ class SpyLogitsWarper(LogitsWarper): class RepetitionPenaltyLogitsProcessorWithRange(LogitsProcessor): - ''' - Copied from the transformers library - ''' - - def __init__(self, penalty: float, presence_penalty: float, frequency_penalty: float, _range: int): + def __init__(self, penalty: float, _range: int): if not (penalty > 0): raise ValueError(f"`penalty` has to be strictly positive, but is {penalty}") - self.penalty = penalty - self.presence_penalty = presence_penalty - self.frequency_penalty = frequency_penalty self._range = _range + def apply_repetition_penalty(self, input_ids_row, scores_row): + unique_ids = torch.unique(input_ids_row) + score = torch.gather(scores_row, 0, unique_ids) + + # Apply multiplicative repetition penalty + score = torch.where(score < 0, score * self.penalty, score / self.penalty) + scores_row.scatter_(0, unique_ids, score) + return scores_row + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: input_ids = input_ids[:, -self._range:] - - # We loop here because torch.unique() needs to process each row separately in the - # case that batch_size > 1. for input_ids_row, scores_row in zip(input_ids, scores): - unique_ids, counts = torch.unique(input_ids_row, return_counts=True) - score = torch.gather(scores_row, 0, unique_ids) - - # multiplicative repetition penalty - # if score < 0 then repetition penalty has to be multiplied to reduce the previous token probability - score = torch.where(score < 0, score * self.penalty, score / self.penalty) - scores_row.scatter_(0, unique_ids, score) - - # presence_penalty and frequency_penalty - raw_presence_penalty = (counts > 0).to(scores.dtype) - raw_frequency_penalty = counts.to(scores.dtype) - additive_penalty = raw_presence_penalty * self.presence_penalty + raw_frequency_penalty * self.frequency_penalty - scores_row.scatter_add_(0, unique_ids, -additive_penalty) + scores_row = self.apply_repetition_penalty(input_ids_row, scores_row) return scores -def get_logits_warper_patch(self, generation_config, **kwargs): +class PresencePenaltyLogitsProcessor(LogitsProcessor): + def __init__(self, presence_penalty: float, _range: int): + self.presence_penalty = presence_penalty + self._range = _range + + def apply_presence_penalty(self, input_ids_row, scores_row): + unique_ids, counts = torch.unique(input_ids_row, return_counts=True) + + # Apply presence penalty + raw_presence_penalty = (counts > 0).to(scores_row.dtype) + presence_penalty = raw_presence_penalty * self.presence_penalty + scores_row.scatter_add_(0, unique_ids, -presence_penalty) + return scores_row + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + input_ids = input_ids[:, -self._range:] + for input_ids_row, scores_row in zip(input_ids, scores): + scores_row = self.apply_presence_penalty(input_ids_row, scores_row) + return scores + + +class FrequencyPenaltyLogitsProcessor(LogitsProcessor): + def __init__(self, frequency_penalty: float, _range: int): + self.frequency_penalty = frequency_penalty + self._range = _range + + def apply_frequency_penalty(self, input_ids_row, scores_row): + unique_ids, counts = torch.unique(input_ids_row, return_counts=True) + + # Apply frequency penalty + raw_frequency_penalty = counts.to(scores_row.dtype) + frequency_penalty = raw_frequency_penalty * self.frequency_penalty + scores_row.scatter_add_(0, unique_ids, -frequency_penalty) + return scores_row + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + input_ids = input_ids[:, -self._range:] + for input_ids_row, scores_row in zip(input_ids, scores): + scores_row = self.apply_frequency_penalty(input_ids_row, scores_row) + return scores + + +def get_logits_processor_patch(self, **kwargs): + generation_config = kwargs['generation_config'] # Parameter sanitization if isinstance(generation_config.temperature, int): generation_config.temperature = float(generation_config.temperature) # Must be float # Get the original warpers - warpers = self._get_logits_warper_old(generation_config, **kwargs) + warpers = self._get_logits_processor_old(**kwargs) - # Replace temperature with our modified class. - # Currently, it behaves identically to the original. - for i in range(len(warpers)): + for i in range(len(warpers) - 1, -1, -1): + # Replace temperature with our modified class. if warpers[i].__class__.__name__ == 'TemperatureLogitsWarper': warpers[i] = TemperatureLogitsWarperCustom( generation_config.temperature, ) + # Stuff we don't need + elif warpers[i].__class__.__name__ in ['SuppressTokensLogitsProcessor', 'RepetitionPenaltyLogitsProcessor']: + del warpers[i] + # Add custom warpers warpers_to_add = LogitsProcessorList() min_tokens_to_keep = 2 if generation_config.num_beams > 1 else 1 + + if generation_config.repetition_penalty is not None and generation_config.repetition_penalty != 1.0: + warpers_to_add.append( + RepetitionPenaltyLogitsProcessorWithRange( + penalty=generation_config.repetition_penalty, + _range=generation_config.repetition_penalty_range + ) + ) + + if generation_config.presence_penalty is not None and generation_config.presence_penalty != 0.0: + warpers_to_add.append( + PresencePenaltyLogitsProcessor( + presence_penalty=generation_config.presence_penalty, + _range=generation_config.repetition_penalty_range + ) + ) + + if generation_config.frequency_penalty is not None and generation_config.frequency_penalty != 0.0: + warpers_to_add.append( + FrequencyPenaltyLogitsProcessor( + frequency_penalty=generation_config.frequency_penalty, + _range=generation_config.repetition_penalty_range + ) + ) + + if generation_config.dry_multiplier is not None and generation_config.dry_multiplier > 0.0: + dry_sequence_breakers = generation_config.dry_sequence_breakers + + # Support both JSON array notation and comma-separated strings. + if not dry_sequence_breakers.startswith("["): + dry_sequence_breakers = "[" + dry_sequence_breakers + "]" + + sequence_breaker_strings = json.loads(dry_sequence_breakers) + # Prefix with 'a' to get the correct encoding of the token at the end of a text. + sequence_breakers = {shared.tokenizer.encode(f'a{s}')[-1] for s in sequence_breaker_strings} + + warpers.append( + DRYLogitsProcessor( + multiplier=generation_config.dry_multiplier, + base=generation_config.dry_base, + allowed_length=generation_config.dry_allowed_length, + sequence_breakers=sequence_breakers, + _range=generation_config.repetition_penalty_range, + ) + ) + if generation_config.tfs is not None and 0.0 <= generation_config.tfs < 1.0: warpers_to_add.append( TailFreeLogitsWarper( @@ -454,7 +533,12 @@ def get_logits_warper_patch(self, generation_config, **kwargs): 'TopALogitsWarper': 'top_a', 'TopKLogitsWarper': 'top_k', 'TopPLogitsWarper': 'top_p', - 'TypicalLogitsWarper': 'typical_p' + 'TypicalLogitsWarper': 'typical_p', + 'RepetitionPenaltyLogitsProcessorWithRange': 'repetition_penalty', + 'PresencePenaltyLogitsProcessor': 'presence_penalty', + 'FrequencyPenaltyLogitsProcessor': 'frequency_penalty', + 'EncoderRepetitionPenaltyLogitsProcessor': 'encoder_repetition_penalty', + 'NoRepeatNGramLogitsProcessor': 'no_repeat_ngram', } def custom_sort_key(obj): @@ -482,49 +566,6 @@ def get_logits_warper_patch(self, generation_config, **kwargs): return warpers -def get_logits_processor_patch(self, **kwargs): - generation_config = kwargs['generation_config'] - - do_rep_pen_hijack = (generation_config.repetition_penalty > 1) or (generation_config.presence_penalty != 0) or (generation_config.frequency_penalty != 0) - if do_rep_pen_hijack: - generation_config.repetition_penalty = 1.1 # Set to value > 1 to ensure RepetitionPenaltyLogitsProcessor is created - - result = self._get_logits_processor_old(**kwargs) - - if do_rep_pen_hijack: - for i in range(len(result)): - if result[i].__class__.__name__ == 'RepetitionPenaltyLogitsProcessor': - result[i] = RepetitionPenaltyLogitsProcessorWithRange( - generation_config.repetition_penalty, - generation_config.presence_penalty, - generation_config.frequency_penalty, - generation_config.repetition_penalty_range - ) - - if generation_config.dry_multiplier is not None and generation_config.dry_multiplier > 0.0: - dry_sequence_breakers = generation_config.dry_sequence_breakers - - # Support both JSON array notation and comma-separated strings. - if not dry_sequence_breakers.startswith("["): - dry_sequence_breakers = "[" + dry_sequence_breakers + "]" - - sequence_breaker_strings = json.loads(dry_sequence_breakers) - # Prefix with 'a' to get the correct encoding of the token at the end of a text. - sequence_breakers = {shared.tokenizer.encode(f'a{s}')[-1] for s in sequence_breaker_strings} - - result.append( - DRYLogitsProcessor( - multiplier=generation_config.dry_multiplier, - base=generation_config.dry_base, - allowed_length=generation_config.dry_allowed_length, - sequence_breakers=sequence_breakers, - _range=generation_config.repetition_penalty_range, - ) - ) - - return result - - def generation_config_init_patch(self, **kwargs): self.__init___old(**kwargs) self.min_p = kwargs.pop("min_p", 0.0) @@ -547,13 +588,10 @@ def generation_config_init_patch(self, **kwargs): self.dry_allowed_length = kwargs.pop("dry_allowed_length", 2) self.dry_sequence_breakers = kwargs.pop("dry_sequence_breakers", '"\\n", ":", "\\"", "*"') self.temperature_last = kwargs.pop("temperature_last", False) - self.sampler_priority = kwargs.pop("sampler_priority", ['temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat']) + self.sampler_priority = kwargs.pop("sampler_priority", ['repetition_penalty', 'presence_penalty', 'frequency_penalty', 'temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat', 'encoder_repetition_penalty', 'no_repeat_ngram']) def hijack_samplers(): - transformers.GenerationMixin._get_logits_warper_old = transformers.GenerationMixin._get_logits_warper - transformers.GenerationMixin._get_logits_warper = get_logits_warper_patch - transformers.GenerationMixin._get_logits_processor_old = transformers.GenerationMixin._get_logits_processor transformers.GenerationMixin._get_logits_processor = get_logits_processor_patch From c5f048e912ffbb1c7fd4b72609a67bec8ad07b5c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:04:08 -0700 Subject: [PATCH 018/173] Bump ExLlamaV2 to 0.2.2 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 913c2463..f0360d53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,11 +55,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index b9d74b69..d6bf29e6 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -42,9 +42,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index ccacab29..5ce468c3 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -40,9 +40,9 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index dc1757e2..12786ade 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -38,4 +38,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index a913a63c..901c9f10 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -40,4 +40,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 458c1410..87e1bd7f 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -55,11 +55,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.0/exllamav2-0.2.0-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 78b87054004a18f788d4a52d72a8ca9358aca0e9 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:06:31 -0700 Subject: [PATCH 019/173] Bump llama-cpp-python to 0.3.0 (except for AMD) --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 8 ++++---- requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 8 ++++---- requirements_apple_silicon.txt | 12 ++++++------ requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 50 insertions(+), 50 deletions(-) diff --git a/requirements.txt b/requirements.txt index f0360d53..1041025c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,22 +37,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index d6bf29e6..b224ce14 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -34,10 +34,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 5ce468c3..3cdb8a7a 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -34,10 +34,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 12786ade..fd91464d 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -34,8 +34,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 901c9f10..8a50c8b4 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -34,10 +34,10 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.2.90-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index b0dbc91a..4e89b6ad 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -34,7 +34,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 828d0c97..2c00ccf5 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -34,7 +34,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 87e1bd7f..69d880ac 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -37,22 +37,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.90+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.2.90+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.2.90+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From 5c918c5b2d870f41a5215cfd5c45c652ad6d9b3a Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:40:48 -0700 Subject: [PATCH 020/173] Make it possible to sort DRY --- modules/presets.py | 2 +- modules/sampler_hijack.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/presets.py b/modules/presets.py index 14c5a777..06e2be70 100644 --- a/modules/presets.py +++ b/modules/presets.py @@ -44,7 +44,7 @@ def default_preset(): 'dry_base': 1.75, 'dry_allowed_length': 2, 'dry_sequence_breakers': '"\\n", ":", "\\"", "*"', - 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nencoder_repetition_penalty\nno_repeat_ngram' + 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nencoder_repetition_penalty\nno_repeat_ngram' } diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 9e865bb3..65503c12 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -537,6 +537,7 @@ def get_logits_processor_patch(self, **kwargs): 'RepetitionPenaltyLogitsProcessorWithRange': 'repetition_penalty', 'PresencePenaltyLogitsProcessor': 'presence_penalty', 'FrequencyPenaltyLogitsProcessor': 'frequency_penalty', + 'DRYLogitsProcessor': 'dry', 'EncoderRepetitionPenaltyLogitsProcessor': 'encoder_repetition_penalty', 'NoRepeatNGramLogitsProcessor': 'no_repeat_ngram', } @@ -588,7 +589,7 @@ def generation_config_init_patch(self, **kwargs): self.dry_allowed_length = kwargs.pop("dry_allowed_length", 2) self.dry_sequence_breakers = kwargs.pop("dry_sequence_breakers", '"\\n", ":", "\\"", "*"') self.temperature_last = kwargs.pop("temperature_last", False) - self.sampler_priority = kwargs.pop("sampler_priority", ['repetition_penalty', 'presence_penalty', 'frequency_penalty', 'temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat', 'encoder_repetition_penalty', 'no_repeat_ngram']) + self.sampler_priority = kwargs.pop("sampler_priority", ['repetition_penalty', 'presence_penalty', 'frequency_penalty', 'dry', 'temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat', 'encoder_repetition_penalty', 'no_repeat_ngram']) def hijack_samplers(): From 626b0a043702c9586478d9969184718d24ebf935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thireus=20=E2=98=A0?= Date: Fri, 27 Sep 2024 23:47:04 +0100 Subject: [PATCH 021/173] Force /bin/bash shell for conda (#6386) --- one_click.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/one_click.py b/one_click.py index 0a0412ba..d35ecc89 100644 --- a/one_click.py +++ b/one_click.py @@ -190,7 +190,7 @@ def run_cmd(cmd, assert_success=False, environment=False, capture_output=False, cmd = f'. "{conda_sh_path}" && conda activate "{conda_env_path}" && {cmd}' # Run shell commands - result = subprocess.run(cmd, shell=True, capture_output=capture_output, env=env) + result = subprocess.run(cmd, shell=True, executable='/bin/bash', capture_output=capture_output, env=env) # Assert the command ran successfully if assert_success and result.returncode != 0: From 3492e33fd50bcc78a81850fdcc995e097a79b8ef Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:59:30 -0700 Subject: [PATCH 022/173] Bump bitsandbytes to 0.44 --- requirements.txt | 2 +- requirements_noavx2.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1041025c..54bd414a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ accelerate==0.33.* aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" auto-gptq==0.7.1 -bitsandbytes==0.43.* +bitsandbytes==0.44.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 69d880ac..39bfb0bd 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,7 +1,7 @@ accelerate==0.33.* aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" auto-gptq==0.7.1 -bitsandbytes==0.43.* +bitsandbytes==0.44.* colorama datasets einops From 301375834e55fcda6fda96332cad187aab2c6f77 Mon Sep 17 00:00:00 2001 From: Philipp Emanuel Weidmann Date: Sat, 28 Sep 2024 07:20:12 +0530 Subject: [PATCH 023/173] =?UTF-8?q?Exclude=20Top=20Choices=20(XTC):=20A=20?= =?UTF-8?q?sampler=20that=20boosts=20creativity,=20breaks=20writing=20clic?= =?UTF-8?q?h=C3=A9s,=20and=20inhibits=20non-verbatim=20repetition=20(#6335?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/openai/typing.py | 2 ++ modules/loaders.py | 6 ++++ modules/presets.py | 4 ++- modules/sampler_hijack.py | 61 ++++++++++++++++++++++++++++++++++++- modules/text_generation.py | 2 +- modules/ui.py | 2 ++ modules/ui_parameters.py | 4 +++ 7 files changed, 78 insertions(+), 3 deletions(-) diff --git a/extensions/openai/typing.py b/extensions/openai/typing.py index 4015f6a1..f63c1f39 100644 --- a/extensions/openai/typing.py +++ b/extensions/openai/typing.py @@ -37,6 +37,8 @@ class GenerationOptions(BaseModel): dry_base: float = 1.75 dry_allowed_length: int = 2 dry_sequence_breakers: str = '"\\n", ":", "\\"", "*"' + xtc_threshold: float = 0.1 + xtc_probability: float = 0 truncation_length: int = 0 max_tokens_second: int = 0 prompt_lookup_num_tokens: int = 0 diff --git a/modules/loaders.py b/modules/loaders.py index 549de5fb..16a3106e 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -168,6 +168,8 @@ def transformers_samplers(): 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', + 'xtc_threshold', + 'xtc_probability', 'seed', 'do_sample', 'penalty_alpha', @@ -242,6 +244,8 @@ loaders_samplers = { 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', + 'xtc_threshold', + 'xtc_probability', 'seed', 'do_sample', 'mirostat_mode', @@ -304,6 +308,8 @@ loaders_samplers = { 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', + 'xtc_threshold', + 'xtc_probability', 'seed', 'do_sample', 'mirostat_mode', diff --git a/modules/presets.py b/modules/presets.py index 06e2be70..c8118fb3 100644 --- a/modules/presets.py +++ b/modules/presets.py @@ -44,7 +44,9 @@ def default_preset(): 'dry_base': 1.75, 'dry_allowed_length': 2, 'dry_sequence_breakers': '"\\n", ":", "\\"", "*"', - 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nencoder_repetition_penalty\nno_repeat_ngram' + 'xtc_threshold': 0.1, + 'xtc_probability': 0, + 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nxtc\nencoder_repetition_penalty\nno_repeat_ngram' } diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 65503c12..6d92978e 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -1,6 +1,7 @@ import json import math import pprint +import random import torch import transformers @@ -191,6 +192,53 @@ class TopALogitsWarper(LogitsWarper): return scores +# Exclude Top Choices (XTC) +class XTCLogitsWarper(LogitsWarper): + def __init__(self, threshold: float, probability: float, filter_value: float = -float("Inf")): + self.threshold = threshold + self.probability = probability + self.filter_value = filter_value + self.special_token_ids = [ + shared.tokenizer.encode("\n")[-1], + ] + + if shared.tokenizer.eos_token_id is not None: + self.special_token_ids.append(shared.tokenizer.eos_token_id) + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + # `random` returns values in the half-open range [0, 1), so setting `probability` + # to 0 means the sampler never takes action, while setting it to 1 means the sampler + # always takes action. + # + # Note that while XTC is most intuitively described as "if multiple tokens meet + # the threshold, then with probability...", reversing the two conditions is logically + # equivalent, and improves performance because processing can immediately be stopped + # if the random check fails. + if random.random() >= self.probability: + return scores + + sorted_logits, sorted_indices = torch.sort(scores, descending=True) + probs = sorted_logits.softmax(dim=-1) + + sorted_indices_to_remove = torch.full_like(probs, False, dtype=torch.bool) + + # This operation sets exactly those indices to `True` for which the next index has + # probability above the threshold. Since `probs` is sorted, those are the indices + # of all tokens that meet the threshold, *except* the least probable one. + sorted_indices_to_remove[..., :-1] = probs[..., 1:] >= self.threshold + + # Convert sorted_indices_to_remove to the original indices + indices_to_remove = sorted_indices_to_remove.scatter(1, sorted_indices, sorted_indices_to_remove) + + # If newline or EOS tokens would be removed, return the original scores + if indices_to_remove[:, self.special_token_ids].any(): + return scores + + # Otherwise, remove tokens with the mask + scores = scores.masked_fill(indices_to_remove, self.filter_value) + return scores + + class DRYLogitsProcessor(LogitsProcessor): def __init__(self, multiplier: float, base: float, allowed_length: int, sequence_breakers: set[int], _range: int): self.multiplier = multiplier @@ -474,6 +522,14 @@ def get_logits_processor_patch(self, **kwargs): ) ) + if generation_config.xtc_probability is not None and generation_config.xtc_probability > 0: + warpers_to_add.append( + XTCLogitsWarper( + threshold=generation_config.xtc_threshold, + probability=generation_config.xtc_probability, + ) + ) + if generation_config.dynamic_temperature: warpers_to_add.append( DynamicTemperatureLogitsWarper( @@ -534,6 +590,7 @@ def get_logits_processor_patch(self, **kwargs): 'TopKLogitsWarper': 'top_k', 'TopPLogitsWarper': 'top_p', 'TypicalLogitsWarper': 'typical_p', + 'XTCLogitsWarper': 'xtc', 'RepetitionPenaltyLogitsProcessorWithRange': 'repetition_penalty', 'PresencePenaltyLogitsProcessor': 'presence_penalty', 'FrequencyPenaltyLogitsProcessor': 'frequency_penalty', @@ -588,8 +645,10 @@ def generation_config_init_patch(self, **kwargs): self.dry_base = kwargs.pop("dry_base", 1.75) self.dry_allowed_length = kwargs.pop("dry_allowed_length", 2) self.dry_sequence_breakers = kwargs.pop("dry_sequence_breakers", '"\\n", ":", "\\"", "*"') + self.xtc_threshold = kwargs.pop("xtc_threshold", 0.1) + self.xtc_probability = kwargs.pop("xtc_probability", 0) self.temperature_last = kwargs.pop("temperature_last", False) - self.sampler_priority = kwargs.pop("sampler_priority", ['repetition_penalty', 'presence_penalty', 'frequency_penalty', 'dry', 'temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat', 'encoder_repetition_penalty', 'no_repeat_ngram']) + self.sampler_priority = kwargs.pop("sampler_priority", ['repetition_penalty', 'presence_penalty', 'frequency_penalty', 'dry', 'temperature', 'dynamic_temperature', 'quadratic_sampling', 'top_k', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', 'min_p', 'mirostat', 'xtc', 'encoder_repetition_penalty', 'no_repeat_ngram']) def hijack_samplers(): diff --git a/modules/text_generation.py b/modules/text_generation.py index e7a2b43f..654eff89 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -289,7 +289,7 @@ def get_reply_from_output_ids(output_ids, state=None, starting_from=0): def generate_reply_HF(question, original_question, seed, state, stopping_strings=None, is_chat=False): generate_params = {} - for k in ['max_new_tokens', 'temperature', 'temperature_last', 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', 'top_p', 'min_p', 'top_k', 'repetition_penalty', 'presence_penalty', 'frequency_penalty', 'repetition_penalty_range', 'typical_p', 'tfs', 'top_a', 'guidance_scale', 'penalty_alpha', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', 'do_sample', 'encoder_repetition_penalty', 'no_repeat_ngram_size', 'dry_multiplier', 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers']: + for k in ['max_new_tokens', 'temperature', 'temperature_last', 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', 'top_p', 'min_p', 'top_k', 'repetition_penalty', 'presence_penalty', 'frequency_penalty', 'repetition_penalty_range', 'typical_p', 'tfs', 'top_a', 'guidance_scale', 'penalty_alpha', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', 'do_sample', 'encoder_repetition_penalty', 'no_repeat_ngram_size', 'dry_multiplier', 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', 'xtc_threshold', 'xtc_probability']: if k in state: generate_params[k] = state[k] diff --git a/modules/ui.py b/modules/ui.py index 47f92cf0..76b1c009 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -158,6 +158,8 @@ def list_interface_input_elements(): 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', + 'xtc_threshold', + 'xtc_probability', 'do_sample', 'penalty_alpha', 'mirostat_mode', diff --git a/modules/ui_parameters.py b/modules/ui_parameters.py index eff62c20..a2665e0d 100644 --- a/modules/ui_parameters.py +++ b/modules/ui_parameters.py @@ -45,6 +45,10 @@ def create_ui(default_preset): shared.gradio['dry_base'] = gr.Slider(1, 4, value=generate_params['dry_base'], step=0.01, label='dry_base', info='Controls how fast the penalty grows with increasing sequence length.') shared.gradio['dry_sequence_breakers'] = gr.Textbox(value=generate_params['dry_sequence_breakers'], label='dry_sequence_breakers', info='Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.') + with gr.Blocks(): + shared.gradio['xtc_threshold'] = gr.Slider(0, 0.5, value=generate_params['xtc_threshold'], step=0.01, label='xtc_threshold', info='If 2 or more tokens have probability above this threshold, consider removing all but the last one.') + shared.gradio['xtc_probability'] = gr.Slider(0, 1, value=generate_params['xtc_probability'], step=0.01, label='xtc_probability', info='Probability that the removal will actually happen. 0 disables the sampler. 1 makes it always happen.') + gr.Markdown("[Learn more](https://github.com/oobabooga/text-generation-webui/wiki/03-%E2%80%90-Parameters-Tab)") with gr.Column(): From 46996f6519d483841a49c8a857104a6bf6e2ac7a Mon Sep 17 00:00:00 2001 From: RandoInternetPreson Date: Fri, 27 Sep 2024 23:26:03 -0400 Subject: [PATCH 024/173] ExllamaV2 tensor parallelism to increase multi gpu inference speeds (#6356) --- modules/exllamav2.py | 26 ++++++++++++++++++-------- modules/exllamav2_hf.py | 28 +++++++++++++++++++--------- modules/shared.py | 1 + 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/modules/exllamav2.py b/modules/exllamav2.py index a770e342..42b9ade1 100644 --- a/modules/exllamav2.py +++ b/modules/exllamav2.py @@ -7,6 +7,7 @@ from exllamav2 import ( ExLlamaV2Cache, ExLlamaV2Cache_8bit, ExLlamaV2Cache_Q4, + ExLlamaV2Cache_TP, ExLlamaV2Config, ExLlamaV2Tokenizer ) @@ -54,21 +55,30 @@ class Exllamav2Model: model = ExLlamaV2(config) - if not shared.args.autosplit: - split = None - if shared.args.gpu_split: - split = [float(alloc) for alloc in shared.args.gpu_split.split(",")] + split = None + if shared.args.gpu_split: + split = [float(alloc) for alloc in shared.args.gpu_split.split(",")] + if shared.args.enable_tp: + model.load_tp(split) + elif not shared.args.autosplit: model.load(split) + # Determine the correct cache type if shared.args.cache_8bit: - cache = ExLlamaV2Cache_8bit(model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache_8bit elif shared.args.cache_4bit: - cache = ExLlamaV2Cache_Q4(model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache_Q4 else: - cache = ExLlamaV2Cache(model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache - if shared.args.autosplit: + # Use TP if specified + if shared.args.enable_tp: + cache = ExLlamaV2Cache_TP(model, base=cache_type) + else: + cache = cache_type(model, lazy=shared.args.autosplit) + + if shared.args.autosplit and not shared.args.enable_tp: model.load_autosplit(cache) tokenizer = ExLlamaV2Tokenizer(config) diff --git a/modules/exllamav2_hf.py b/modules/exllamav2_hf.py index 53143d9a..febb2c64 100644 --- a/modules/exllamav2_hf.py +++ b/modules/exllamav2_hf.py @@ -9,6 +9,7 @@ from exllamav2 import ( ExLlamaV2Cache, ExLlamaV2Cache_8bit, ExLlamaV2Cache_Q4, + ExLlamaV2Cache_TP, ExLlamaV2Config ) from torch.nn import CrossEntropyLoss @@ -42,21 +43,30 @@ class Exllamav2HF(PreTrainedModel): self.ex_model = ExLlamaV2(config) - if not shared.args.autosplit: - split = None - if shared.args.gpu_split: - split = [float(alloc) for alloc in shared.args.gpu_split.split(",")] + split = None + if shared.args.gpu_split: + split = [float(alloc) for alloc in shared.args.gpu_split.split(",")] - self.ex_model.load(split) + if shared.args.enable_tp: + model.load_tp(split) + elif not shared.args.autosplit: + model.load(split) + # Determine the correct cache type if shared.args.cache_8bit: - self.ex_cache = ExLlamaV2Cache_8bit(self.ex_model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache_8bit elif shared.args.cache_4bit: - self.ex_cache = ExLlamaV2Cache_Q4(self.ex_model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache_Q4 else: - self.ex_cache = ExLlamaV2Cache(self.ex_model, lazy=shared.args.autosplit) + cache_type = ExLlamaV2Cache - if shared.args.autosplit: + # Use TP if specified + if shared.args.enable_tp: + self.ex_cache = ExLlamaV2Cache_TP(self.ex_model, base=cache_type) + else: + self.ex_cache = cache_type(self.ex_model, lazy=shared.args.autosplit) + + if shared.args.autosplit and not shared.args.enable_tp: self.ex_model.load_autosplit(self.ex_cache) self.past_seq = None diff --git a/modules/shared.py b/modules/shared.py index 43533a14..894ed6fe 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -146,6 +146,7 @@ group.add_argument('--no_sdpa', action='store_true', help='Force Torch SDPA to n group.add_argument('--cache_8bit', action='store_true', help='Use 8-bit cache to save VRAM.') group.add_argument('--cache_4bit', action='store_true', help='Use Q4 cache to save VRAM.') group.add_argument('--num_experts_per_token', type=int, default=2, help='Number of experts to use for generation. Applies to MoE models like Mixtral.') +group.add_argument('--enable_tp', action='store_true', help='Enable Tensor Parallelism (TP) in ExLlamaV2.') # AutoGPTQ group = parser.add_argument_group('AutoGPTQ') From 7276dca933626eef587ac0adf53ab8ea06c2e9ac Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 27 Sep 2024 20:26:36 -0700 Subject: [PATCH 025/173] Fix a typo --- modules/exllamav2_hf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/exllamav2_hf.py b/modules/exllamav2_hf.py index febb2c64..96a89429 100644 --- a/modules/exllamav2_hf.py +++ b/modules/exllamav2_hf.py @@ -48,9 +48,9 @@ class Exllamav2HF(PreTrainedModel): split = [float(alloc) for alloc in shared.args.gpu_split.split(",")] if shared.args.enable_tp: - model.load_tp(split) + self.ex_model.load_tp(split) elif not shared.args.autosplit: - model.load(split) + self.ex_model.load(split) # Determine the correct cache type if shared.args.cache_8bit: From ca5a2dba72817def91b616e9571d8490b9b64a13 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 09:39:37 -0700 Subject: [PATCH 026/173] Bump rocm to 6.1.2 --- README.md | 2 +- one_click.py | 6 +++--- requirements_amd.txt | 8 ++++---- requirements_amd_noavx2.txt | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 22ceeeb8..4449639d 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ conda activate textgen |--------|---------|---------| | Linux/WSL | NVIDIA | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121` | | Linux/WSL | CPU only | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cpu` | -| Linux | AMD | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/rocm5.6` | +| Linux | AMD | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/rocm6.1` | | MacOS + MPS | Any | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2` | | Windows | NVIDIA | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121` | | Windows | CPU only | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2` | diff --git a/one_click.py b/one_click.py index d35ecc89..9b813873 100644 --- a/one_click.py +++ b/one_click.py @@ -117,7 +117,7 @@ def update_pytorch(): elif is_cuda: install_pytorch += "--index-url https://download.pytorch.org/whl/cu121" elif is_rocm: - install_pytorch += "--index-url https://download.pytorch.org/whl/rocm5.6" + install_pytorch += "--index-url https://download.pytorch.org/whl/rocm6.1" elif is_cpu: install_pytorch += "--index-url https://download.pytorch.org/whl/cpu" elif is_intel: @@ -239,7 +239,7 @@ def install_webui(): "What is your GPU?", { 'A': 'NVIDIA', - 'B': 'AMD (Linux/MacOS only. Requires ROCm SDK 5.6 on Linux)', + 'B': 'AMD (Linux/MacOS only. Requires ROCm SDK 6.1 on Linux)', 'C': 'Apple M Series', 'D': 'Intel Arc (IPEX)', 'N': 'None (I want to run models in CPU mode)' @@ -294,7 +294,7 @@ def install_webui(): else: install_pytorch += "--index-url https://download.pytorch.org/whl/cu121" elif selected_gpu == "AMD": - install_pytorch += "--index-url https://download.pytorch.org/whl/rocm5.6" + install_pytorch += "--index-url https://download.pytorch.org/whl/rocm6.1" elif selected_gpu in ["APPLE", "NONE"]: install_pytorch += "--index-url https://download.pytorch.org/whl/cpu" elif selected_gpu == "INTEL": diff --git a/requirements_amd.txt b/requirements_amd.txt index b224ce14..9f46ed4f 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -40,10 +40,10 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.2.90+rocm5.6.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 3cdb8a7a..9c5fb5f2 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -40,8 +40,8 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm5.6.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From 85994e3ef0f75b408ef5b9a6995902eb600be970 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 09:44:08 -0700 Subject: [PATCH 027/173] Bump pytorch to 2.4.1 --- README.md | 14 +++++++------- one_click.py | 6 +++--- requirements.txt | 16 ++++++++-------- requirements_amd.txt | 4 ++-- requirements_amd_noavx2.txt | 4 ++-- requirements_noavx2.txt | 16 ++++++++-------- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 4449639d..350dd090 100644 --- a/README.md +++ b/README.md @@ -80,12 +80,12 @@ conda activate textgen | System | GPU | Command | |--------|---------|---------| -| Linux/WSL | NVIDIA | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121` | -| Linux/WSL | CPU only | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cpu` | -| Linux | AMD | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/rocm6.1` | -| MacOS + MPS | Any | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2` | -| Windows | NVIDIA | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121` | -| Windows | CPU only | `pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2` | +| Linux/WSL | NVIDIA | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121` | +| Linux/WSL | CPU only | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cpu` | +| Linux | AMD | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/rocm6.1` | +| MacOS + MPS | Any | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1` | +| Windows | NVIDIA | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121` | +| Windows | CPU only | `pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1` | The up-to-date commands can be found here: https://pytorch.org/get-started/locally/. @@ -150,7 +150,7 @@ Then browse to 1) For Kepler GPUs and older, you will need to install CUDA 11.8 instead of 12: ``` -pip3 install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu118 +pip3 install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu118 conda install -y -c "nvidia/label/cuda-11.8.0" cuda-runtime ``` diff --git a/one_click.py b/one_click.py index 9b813873..0f9c703d 100644 --- a/one_click.py +++ b/one_click.py @@ -16,9 +16,9 @@ import sys # Define the required PyTorch version -TORCH_VERSION = "2.2.2" -TORCHVISION_VERSION = "0.17.2" -TORCHAUDIO_VERSION = "2.2.2" +TORCH_VERSION = "2.4.1" +TORCHVISION_VERSION = "0.19.1" +TORCHAUDIO_VERSION = "2.4.1" # Environment script_dir = os.getcwd() diff --git a/requirements.txt b/requirements.txt index 54bd414a..25b4b49d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,15 +55,15 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 9f46ed4f..cd17a600 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -42,8 +42,8 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 9c5fb5f2..dd9bd893 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -40,8 +40,8 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 39bfb0bd..ec0bbb1d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -55,15 +55,15 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.2.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.2.2cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.2cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 1a870b3ea7f0b3337a0c0202fe4b4dddb4e559a0 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 19:38:56 -0700 Subject: [PATCH 028/173] Remove AutoAWQ and AutoGPTQ from requirements (no wheels available) --- requirements.txt | 9 --------- requirements_amd.txt | 4 ---- requirements_amd_noavx2.txt | 4 ---- requirements_noavx2.txt | 9 --------- 4 files changed, 26 deletions(-) diff --git a/requirements.txt b/requirements.txt index 25b4b49d..f42247a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ accelerate==0.33.* aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" -auto-gptq==0.7.1 bitsandbytes==0.44.* colorama datasets @@ -64,11 +63,3 @@ https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd.txt b/requirements_amd.txt index cd17a600..88fdcad7 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -45,7 +45,3 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/ro https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index dd9bd893..0ad440e3 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -43,7 +43,3 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7+rocm561-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index ec0bbb1d..61981ca5 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,6 +1,5 @@ accelerate==0.33.* aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" -auto-gptq==0.7.1 bitsandbytes==0.44.* colorama datasets @@ -64,11 +63,3 @@ https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ/releases/download/0.2.6/autoawq-0.2.6-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/AutoAWQ_kernels/releases/download/0.0.7/autoawq_kernels-0.0.7-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From 65e58640846d65200364b4a65a7975ce48eb4618 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:25:26 -0700 Subject: [PATCH 029/173] Update README --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 350dd090..fdd9c46c 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,17 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features -* Multiple backends for text generation in a single UI and API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp) (through [llama-cpp-python](https://github.com/abetlen/llama-cpp-python)), [ExLlamaV2](https://github.com/turboderp/exllamav2), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), and [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) are also supported through the Transformers loader. -* OpenAI-compatible API server with Chat and Completions endpoints – see the [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). -* Automatic prompt formatting for each model using the Jinja2 template in its metadata. -* Three chat modes: `instruct`, `chat-instruct`, and `chat`, allowing for both instruction-following and casual conversations with characters. `chat-instruct` mode automatically applies the model's template to the chat prompt, ensuring high-quality outputs without manual setup. -* "Past chats" menu to quickly switch between conversations and start new ones. -* Free-form generation in the Default/Notebook tabs without being limited to chat turns. Send formatted chat conversations from the Chat tab to these tabs. -* Multiple sampling parameters and generation options for sophisticated text generation control. -* Easy switching between different models through the UI without restarting, using the "Model" tab. -* Simple LoRA fine-tuning tool to customize models with your data. -* All in one folder. The requirements are installed in a self-contained `installer_files` folder that doesn't interfere with the system's environment. -* Extensions support, including numerous built-in and user-contributed extensions. See [the wiki](https://github.com/oobabooga/text-generation-webui/wiki/07-%E2%80%90-Extensions) and [the extensions directory](https://github.com/oobabooga/text-generation-webui-extensions) for details. +- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), [ExLlamaV2](https://github.com/turboderp/exllamav2), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), and [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). Also supports [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) through the Transformers loader. +- OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). +- Automatic prompt formatting using Jinja2 templates. +- Three chat modes: `instruct`, `chat-instruct`, and `chat`, with auto-prompt templates in `chat-instruct`. +- "Past chats" menu for easy conversation switching. +- Free-form text generation in the Default/Notebook tabs without being limited to chat turns. You can send formatted conversations from the Chat tab to these. +- Multiple sampling parameters and generation options for sophisticated text generation control. +- Switch models easily in the UI without restarting. +- Simple LoRA fine-tuning tool. +- Requirements installed in a self-contained `installer_files` directory that doesn't interfere with the system environment. +- Extension support, with numerous built-in and user-contributed extensions available. See the [wiki](https://github.com/oobabooga/text-generation-webui/wiki/07-%E2%80%90-Extensions) and [extensions directory](https://github.com/oobabooga/text-generation-webui-extensions) for details. ## How to install From b92d7fd43e6f39410d4fc486e6168160b449aacc Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:30:24 -0700 Subject: [PATCH 030/173] Add warnings for when AutoGPTQ, TensorRT-LLM, or HQQ are missing --- modules/models.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/models.py b/modules/models.py index b0e2346e..3e8ae3f2 100644 --- a/modules/models.py +++ b/modules/models.py @@ -70,11 +70,11 @@ def load_model(model_name, loader=None): shared.model_name = model_name load_func_map = { 'Transformers': huggingface_loader, - 'AutoGPTQ': AutoGPTQ_loader, 'llama.cpp': llamacpp_loader, 'llamacpp_HF': llamacpp_HF_loader, 'ExLlamav2': ExLlamav2_loader, 'ExLlamav2_HF': ExLlamav2_HF_loader, + 'AutoGPTQ': AutoGPTQ_loader, 'HQQ': HQQ_loader, 'TensorRT-LLM': TensorRT_LLM_loader, } @@ -302,12 +302,6 @@ def llamacpp_HF_loader(model_name): return model -def AutoGPTQ_loader(model_name): - import modules.AutoGPTQ_loader - - return modules.AutoGPTQ_loader.load_quantized(model_name) - - def ExLlamav2_loader(model_name): from modules.exllamav2 import Exllamav2Model @@ -321,9 +315,21 @@ def ExLlamav2_HF_loader(model_name): return Exllamav2HF.from_pretrained(model_name) +def AutoGPTQ_loader(model_name): + try: + import modules.AutoGPTQ_loader + except ModuleNotFoundError: + raise ModuleNotFoundError("Failed to import 'autogptq'. Please install it manually following the instructions in the AutoGPTQ GitHub repository.") + + return modules.AutoGPTQ_loader.load_quantized(model_name) + + def HQQ_loader(model_name): - from hqq.core.quantize import HQQBackend, HQQLinear - from hqq.models.hf.base import AutoHQQHFModel + try: + from hqq.core.quantize import HQQBackend, HQQLinear + from hqq.models.hf.base import AutoHQQHFModel + except ModuleNotFoundError: + raise ModuleNotFoundError("Failed to import 'hqq'. Please install it manually following the instructions in the HQQ GitHub repository.") logger.info(f"Loading HQQ model with backend: \"{shared.args.hqq_backend}\"") @@ -334,7 +340,10 @@ def HQQ_loader(model_name): def TensorRT_LLM_loader(model_name): - from modules.tensorrt_llm import TensorRTLLMModel + try: + from modules.tensorrt_llm import TensorRTLLMModel + except ModuleNotFoundError: + raise ModuleNotFoundError("Failed to import 'tensorrt_llm'. Please install it manually following the instructions in the TensorRT-LLM GitHub repository.") model = TensorRTLLMModel.from_pretrained(model_name) return model From c61b29b9ce143e778fc717accd70e0bbabede720 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:33:17 -0700 Subject: [PATCH 031/173] Simplify the warning when flash-attn fails to import --- modules/exllamav2.py | 8 -------- modules/exllamav2_hf.py | 8 -------- 2 files changed, 16 deletions(-) diff --git a/modules/exllamav2.py b/modules/exllamav2.py index 42b9ade1..0498c488 100644 --- a/modules/exllamav2.py +++ b/modules/exllamav2.py @@ -19,14 +19,6 @@ from modules.text_generation import get_max_prompt_length try: import flash_attn -except ModuleNotFoundError: - logger.warning( - 'You are running ExLlamaV2 without flash-attention. This will cause the VRAM usage ' - 'to be a lot higher than it could be.\n' - 'Try installing flash-attention following the instructions here: ' - 'https://github.com/Dao-AILab/flash-attention#installation-and-features' - ) - pass except Exception: logger.warning('Failed to load flash-attention due to the following error:\n') traceback.print_exc() diff --git a/modules/exllamav2_hf.py b/modules/exllamav2_hf.py index 96a89429..320a8d24 100644 --- a/modules/exllamav2_hf.py +++ b/modules/exllamav2_hf.py @@ -21,14 +21,6 @@ from modules.logging_colors import logger try: import flash_attn -except ModuleNotFoundError: - logger.warning( - 'You are running ExLlamaV2 without flash-attention. This will cause the VRAM usage ' - 'to be a lot higher than it could be.\n' - 'Try installing flash-attention following the instructions here: ' - 'https://github.com/Dao-AILab/flash-attention#installation-and-features' - ) - pass except Exception: logger.warning('Failed to load flash-attention due to the following error:\n') traceback.print_exc() From 3b99532e0268e7c516e58c1c83931c6843114cc2 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:34:59 -0700 Subject: [PATCH 032/173] Remove HQQ and AQLM from requirements --- requirements.txt | 2 -- requirements_amd.txt | 1 - requirements_amd_noavx2.txt | 1 - requirements_apple_intel.txt | 1 - requirements_apple_silicon.txt | 1 - requirements_cpu_only.txt | 1 - requirements_cpu_only_noavx2.txt | 1 - requirements_noavx2.txt | 2 -- requirements_nowheels.txt | 1 - 9 files changed, 11 deletions(-) diff --git a/requirements.txt b/requirements.txt index f42247a6..d3531b9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,10 @@ accelerate==0.33.* -aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" bitsandbytes==0.44.* colorama datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_amd.txt b/requirements_amd.txt index 88fdcad7..1be85205 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 0ad440e3..5026fa6d 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index fd91464d..eee8112d 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 8a50c8b4..fa244a93 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 4e89b6ad..4c970b91 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 2c00ccf5..4b22cb86 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 61981ca5..fe6adb46 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,12 +1,10 @@ accelerate==0.33.* -aqlm[gpu,cpu]==1.1.6; platform_system == "Linux" bitsandbytes==0.44.* colorama datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index e7cbc29c..5c840f56 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -4,7 +4,6 @@ datasets einops fastapi==0.112.4 gradio==4.26.* -hqq==0.1.7.post3 jinja2==3.1.4 lm_eval==0.3.0 markdown From 3fb02f43f648c7735f7ed8b340c3d36d344aa7b6 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:38:43 -0700 Subject: [PATCH 033/173] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdd9c46c..59cfb5fc 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features -- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), [ExLlamaV2](https://github.com/turboderp/exllamav2), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), and [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). Also supports [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) through the Transformers loader. +- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp/exllamav2).[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) are also supported but you need to install them manually. - OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). - Automatic prompt formatting using Jinja2 templates. - Three chat modes: `instruct`, `chat-instruct`, and `chat`, with auto-prompt templates in `chat-instruct`. From 3f0571b62bb020e19c122d0cd30d5c5df4aa2917 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:48:30 -0700 Subject: [PATCH 034/173] Update README --- README.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 59cfb5fc..954d7a7d 100644 --- a/README.md +++ b/README.md @@ -10,33 +10,29 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features -- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp/exllamav2).[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) are also supported but you need to install them manually. +- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp/exllamav2). [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) are also supported but you need to install them manually. - OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). - Automatic prompt formatting using Jinja2 templates. -- Three chat modes: `instruct`, `chat-instruct`, and `chat`, with auto-prompt templates in `chat-instruct`. -- "Past chats" menu for easy conversation switching. +- Three chat modes: `instruct`, `chat-instruct`, and `chat`, with automatic prompt templates in `chat-instruct`. +- "Past chats" menu to easily switch between conversations. - Free-form text generation in the Default/Notebook tabs without being limited to chat turns. You can send formatted conversations from the Chat tab to these. - Multiple sampling parameters and generation options for sophisticated text generation control. -- Switch models easily in the UI without restarting. +- Switch between different models easily in the UI without restarting. - Simple LoRA fine-tuning tool. - Requirements installed in a self-contained `installer_files` directory that doesn't interfere with the system environment. - Extension support, with numerous built-in and user-contributed extensions available. See the [wiki](https://github.com/oobabooga/text-generation-webui/wiki/07-%E2%80%90-Extensions) and [extensions directory](https://github.com/oobabooga/text-generation-webui-extensions) for details. ## How to install -1) Clone or [download](https://github.com/oobabooga/text-generation-webui/archive/refs/heads/main.zip) the repository. -2) Run the `start_linux.sh`, `start_windows.bat`, `start_macos.sh`, or `start_wsl.bat` script depending on your OS. +1) Clone or [download the repository](https://github.com/oobabooga/text-generation-webui/archive/refs/heads/main.zip). +2) Run the script that matches your OS: `start_linux.sh`, `start_windows.bat`, `start_macos.sh`, or `start_wsl.bat`. 3) Select your GPU vendor when asked. 4) Once the installation ends, browse to `http://localhost:7860`. 5) Have fun! -To restart the web UI in the future, run the `start_` script again. +To restart the web UI later, just run the same `start_` script. If you need to reinstall, delete the `installer_files` folder created during setup and run the script again. -This script creates an `installer_files` folder where it sets up the project's requirements. If you need to reinstall the requirements, just delete that folder and start the web UI again. - -The script accepts command-line flags, such as `./start_linux.sh --help`. Alternatively, you can edit the `CMD_FLAGS.txt` file with a text editor and add your flags there, such as `--api` in case you need to use the API. - -To get updates in the future, run `update_wizard_linux.sh`, `update_wizard_windows.bat`, `update_wizard_macos.sh`, or `update_wizard_wsl.bat`. +You can use command-line flags, like `./start_linux.sh --help`, or add them to `CMD_FLAGS.txt` (such as `--api` to enable API use). To update the project, run `update_wizard_linux.sh`, `update_wizard_windows.bat`, `update_wizard_macos.sh`, or `update_wizard_wsl.bat`.
From 57160cd6fa37c8367df3c674256af970b31e0add Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:50:41 -0700 Subject: [PATCH 035/173] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 954d7a7d..fb22d099 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. - OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). - Automatic prompt formatting using Jinja2 templates. - Three chat modes: `instruct`, `chat-instruct`, and `chat`, with automatic prompt templates in `chat-instruct`. -- "Past chats" menu to easily switch between conversations. +- "Past chats" menu to quickly switch between conversations. - Free-form text generation in the Default/Notebook tabs without being limited to chat turns. You can send formatted conversations from the Chat tab to these. - Multiple sampling parameters and generation options for sophisticated text generation control. - Switch between different models easily in the UI without restarting. From 055f3f5632f99f99409fd85d4e06c4c70acf8b33 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:55:26 -0700 Subject: [PATCH 036/173] Fix after #6386 (thanks @Touch-Night) --- one_click.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/one_click.py b/one_click.py index 0f9c703d..9bad25d1 100644 --- a/one_click.py +++ b/one_click.py @@ -189,8 +189,11 @@ def run_cmd(cmd, assert_success=False, environment=False, capture_output=False, conda_sh_path = os.path.join(script_dir, "installer_files", "conda", "etc", "profile.d", "conda.sh") cmd = f'. "{conda_sh_path}" && conda activate "{conda_env_path}" && {cmd}' + # Set executable to None for Windows, /bin/bash for everything else + executable = None if is_windows() else '/bin/bash' + # Run shell commands - result = subprocess.run(cmd, shell=True, executable='/bin/bash', capture_output=capture_output, env=env) + result = subprocess.run(cmd, shell=True, capture_output=capture_output, env=env, executable=executable) # Assert the command ran successfully if assert_success and result.returncode != 0: From 0f90a1b50fde3bc102bef1a034942ebb4b155845 Mon Sep 17 00:00:00 2001 From: Manuel Schmid <9307310+mashb1t@users.noreply.github.com> Date: Sun, 29 Sep 2024 06:08:55 +0200 Subject: [PATCH 037/173] Do not set value for histories in chat when --multi-user is used (#6317) --- modules/chat.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/modules/chat.py b/modules/chat.py index 00c4ffa9..b81cfea6 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -1059,7 +1059,12 @@ def handle_start_new_chat_click(state): convert_to_markdown.cache_clear() - return [history, html, gr.update(choices=histories, value=histories[0][1])] + if len(histories) > 0: + past_chats_update = gr.update(choices=histories, value=histories[0][1]) + else: + past_chats_update = gr.update(choices=histories) + + return [history, html, past_chats_update] def handle_delete_chat_confirm_click(state): @@ -1110,10 +1115,15 @@ def handle_upload_chat_history(load_chat_history, state): convert_to_markdown.cache_clear() + if len(histories) > 0: + past_chats_update = gr.update(choices=histories, value=histories[0][1]) + else: + past_chats_update = gr.update(choices=histories) + return [ history, html, - gr.update(choices=histories, value=histories[0][1]) + past_chats_update ] @@ -1132,6 +1142,11 @@ def handle_character_menu_change(state): convert_to_markdown.cache_clear() + if len(histories) > 0: + past_chats_update = gr.update(choices=histories, value=histories[0][1]) + else: + past_chats_update = gr.update(choices=histories) + return [ history, html, @@ -1140,7 +1155,7 @@ def handle_character_menu_change(state): picture, greeting, context, - gr.update(choices=histories, value=histories[0][1]), + past_chats_update, ] @@ -1151,12 +1166,17 @@ def handle_mode_change(state): convert_to_markdown.cache_clear() + if len(histories) > 0: + past_chats_update = gr.update(choices=histories, value=histories[0][1]) + else: + past_chats_update = gr.update(choices=histories) + return [ history, html, gr.update(visible=state['mode'] != 'instruct'), gr.update(visible=state['mode'] == 'chat-instruct'), - gr.update(choices=histories, value=histories[0][1]) + past_chats_update ] From e4b0467f9f4b054723528c93c4cda56a266f8687 Mon Sep 17 00:00:00 2001 From: Hanusz Leszek Date: Sun, 29 Sep 2024 06:14:19 +0200 Subject: [PATCH 038/173] Add beforeunload event to add confirmation dialog when leaving page (#6279) --- js/main.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/js/main.js b/js/main.js index 899bd8f0..71489f14 100644 --- a/js/main.js +++ b/js/main.js @@ -600,4 +600,15 @@ headerBar.addEventListener("click", (e) => { } }); +//------------------------------------------------ +// Add a confirmation dialog when leaving the page +// Useful to avoid data loss +//------------------------------------------------ +window.addEventListener('beforeunload', function (event) { + // Cancel the event + event.preventDefault(); + // Chrome requires returnValue to be set + event.returnValue = ''; +}); + moveToChatTab(); From 01362681f2f9e17b6e28ee99b5cf8551a5e62161 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sun, 29 Sep 2024 07:42:44 -0700 Subject: [PATCH 039/173] Bump exllamav2 to 0.2.4 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index d3531b9c..c7ba213f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -52,11 +52,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 1be85205..6ce5eb62 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -41,6 +41,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 5026fa6d..81ad6b23 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -39,6 +39,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index eee8112d..6c3a696a 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -37,4 +37,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index fa244a93..86ef7197 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -39,4 +39,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index fe6adb46..516b0639 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -52,11 +52,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.2/exllamav2-0.2.2-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From bbdeed3cf44d413eadb09a8f443b9d43ef0ce261 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sun, 29 Sep 2024 20:45:27 -0700 Subject: [PATCH 040/173] Make sampler priority high if unspecified --- modules/sampler_hijack.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 6d92978e..87f0b25e 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -602,11 +602,10 @@ def get_logits_processor_patch(self, **kwargs): def custom_sort_key(obj): class_name = obj.__class__.__name__ - # Return a large value if class name is not mapped or if the mapped nickname is not in priority + # Return -1 if class_name is not mapped if class_name not in class_name_to_nickname or class_name_to_nickname[class_name] not in sampler_priority: - return float('inf') + return -1 - # Return the index of the nickname in the priority list for sorting return sampler_priority.index(class_name_to_nickname[class_name]) # Sort the list using the custom key function From 9ca0cd7749f734bd5e7083d672dee8d400229257 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sun, 29 Sep 2024 20:47:04 -0700 Subject: [PATCH 041/173] Bump llama-cpp-python to 0.3.1 --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 12 ++++++------ requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 8 ++++---- requirements_apple_silicon.txt | 12 ++++++------ requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/requirements.txt b/requirements.txt index c7ba213f..5623f1f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,22 +34,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 6ce5eb62..d203c157 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -33,14 +33,14 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.0+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.1+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.1+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 81ad6b23..3a7a950d 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -33,10 +33,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 6c3a696a..61c5367f 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -33,8 +33,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 86ef7197..494c127a 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -33,10 +33,10 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.0-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 4c970b91..5838ac47 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -33,7 +33,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 4b22cb86..97d4eb90 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -33,7 +33,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 516b0639..d34a598d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -34,22 +34,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.0+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.0+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From 4d9ce586d31450d2ed692b1e7a72dbcdfd56e670 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:04:21 -0700 Subject: [PATCH 042/173] Update llama_cpp_python_hijack.py, fix llamacpp_hf --- modules/llama_cpp_python_hijack.py | 19 ++++++++++++------- modules/llamacpp_hf.py | 3 ++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/llama_cpp_python_hijack.py b/modules/llama_cpp_python_hijack.py index 3d42b2d7..2a9c10da 100644 --- a/modules/llama_cpp_python_hijack.py +++ b/modules/llama_cpp_python_hijack.py @@ -2,12 +2,12 @@ import importlib import platform from typing import Sequence +import numpy as np from tqdm import tqdm from modules import shared from modules.cache_utils import process_llamacpp_cache - imported_module = None @@ -57,8 +57,6 @@ def eval_with_progress(self, tokens: Sequence[int]): with tqdm to show prompt processing progress. """ - assert self._ctx.ctx is not None - assert self._batch.batch is not None self._ctx.kv_cache_seq_rm(-1, self.n_tokens, -1) if len(tokens) > self.n_batch: @@ -80,13 +78,20 @@ def eval_with_progress(self, tokens: Sequence[int]): if self.context_params.logits_all: rows = n_tokens cols = self._n_vocab - logits = self._ctx.get_logits()[: rows * cols] - self.scores[n_past : n_past + n_tokens, :].reshape(-1)[: :] = logits + logits = np.ctypeslib.as_array( + self._ctx.get_logits(), shape=(rows * cols,) + ) + self.scores[n_past : n_past + n_tokens, :].reshape(-1)[::] = logits + self.last_updated_index = n_past + n_tokens - 1 else: rows = 1 cols = self._n_vocab - logits = self._ctx.get_logits()[: rows * cols] - self.scores[n_past + n_tokens - 1, :].reshape(-1)[: :] = logits + logits = np.ctypeslib.as_array( + self._ctx.get_logits(), shape=(rows * cols,) + ) + last_token_index = min(n_past + n_tokens - 1, self.scores.shape[0] - 1) + self.scores[last_token_index, :] = logits.reshape(-1) + self.last_updated_index = last_token_index # Update n_tokens self.n_tokens += n_tokens diff --git a/modules/llamacpp_hf.py b/modules/llamacpp_hf.py index 327e3a7b..6611a7c1 100644 --- a/modules/llamacpp_hf.py +++ b/modules/llamacpp_hf.py @@ -127,7 +127,7 @@ class LlamacppHF(PreTrainedModel): self.model.reset() self.model.eval(seq) - logits = torch.tensor(self.model.scores[self.model.n_tokens - 1, :]).view(1, 1, -1).to(input_ids.device) + logits = torch.tensor(self.model.scores[self.model.last_updated_index, :]).view(1, 1, -1).to(input_ids.device) else: self.model.reset() self.model.eval(seq) @@ -205,5 +205,6 @@ class LlamacppHF(PreTrainedModel): Llama = llama_cpp_lib().Llama model = Llama(**params) + model.last_updated_index = -1 return LlamacppHF(model, model_file) From 6063a6641444da58dc6f38626bbd639cd114eeb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:50:38 -0300 Subject: [PATCH 043/173] Update accelerate requirement from ==0.33.* to ==0.34.* (#6416) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5623f1f7..f623372f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_amd.txt b/requirements_amd.txt index d203c157..67e63632 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 3a7a950d..9d1828d6 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 61c5367f..7e279163 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 494c127a..1f476657 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 5838ac47..fe671920 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 97d4eb90..32bfe9c5 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index d34a598d..85f94eef 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 5c840f56..5e566798 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==0.34.* colorama datasets einops From 617cd7b70514e97a96c365bb5eda481594d48028 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:06:25 -0700 Subject: [PATCH 044/173] Revert "Update accelerate requirement from ==0.33.* to ==0.34.* (#6416)" This reverts commit 6063a6641444da58dc6f38626bbd639cd114eeb8. --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index f623372f..5623f1f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_amd.txt b/requirements_amd.txt index 67e63632..d203c157 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 9d1828d6..3a7a950d 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 7e279163..61c5367f 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 1f476657..494c127a 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index fe671920..5838ac47 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 32bfe9c5..97d4eb90 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 85f94eef..d34a598d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 5e566798..5c840f56 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -1,4 +1,4 @@ -accelerate==0.34.* +accelerate==0.33.* colorama datasets einops From c6b50f88dab6435a0c27e5836b33f5b790c072f0 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:19:28 -0700 Subject: [PATCH 045/173] Lint --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6d939275..5623f1f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3- https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_amd.txt b/requirements_amd.txt index 7741849b..d203c157 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -43,4 +43,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/ro https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.1+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" \ No newline at end of file +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index e4765488..3a7a950d 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -41,4 +41,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" \ No newline at end of file +https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index edeae78d..d34a598d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -60,4 +60,4 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3- https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" \ No newline at end of file +https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From cca9d6e22d6cb3e2909121f6d6077af36b2116f5 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:21:06 -0700 Subject: [PATCH 046/173] Lint --- modules/text_generation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/text_generation.py b/modules/text_generation.py index 654eff89..86245098 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -274,10 +274,10 @@ def get_reply_from_output_ids(output_ids, state=None, starting_from=0): if (hasattr(shared.tokenizer, 'convert_ids_to_tokens') and len(output_ids) > starting_from) and not reply.startswith(' '): first_token = shared.tokenizer.convert_ids_to_tokens(int(output_ids[starting_from])) if isinstance(first_token, (bytes,)): - #try to decode the bytes to a string + # try to decode the bytes to a string + # if it fails, which means it's not a string in this turn, just ignore it try: first_token = first_token.decode('utf8') - #if it fails, which means it's not a string in this turn, just ignore it except UnicodeDecodeError: first_token = '' From d364aa0a3c0993b09d53966b53eae862f4deaae0 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:22:57 -0700 Subject: [PATCH 047/173] Lint --- js/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/main.js b/js/main.js index 71489f14..3028afac 100644 --- a/js/main.js +++ b/js/main.js @@ -604,11 +604,11 @@ headerBar.addEventListener("click", (e) => { // Add a confirmation dialog when leaving the page // Useful to avoid data loss //------------------------------------------------ -window.addEventListener('beforeunload', function (event) { +window.addEventListener("beforeunload", function (event) { // Cancel the event event.preventDefault(); // Chrome requires returnValue to be set - event.returnValue = ''; + event.returnValue = ""; }); moveToChatTab(); From 93c250b9b6b7d625c9cd698f99400d4fe650779d Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:16:15 -0700 Subject: [PATCH 048/173] Add a UI element for enable_tp --- modules/loaders.py | 2 ++ modules/ui.py | 1 + modules/ui_model_menu.py | 1 + 3 files changed, 4 insertions(+) diff --git a/modules/loaders.py b/modules/loaders.py index 16a3106e..deee00a7 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -90,6 +90,7 @@ loaders_and_params = OrderedDict({ 'cache_8bit', 'cache_4bit', 'autosplit', + 'enable_tp', 'alpha_value', 'compress_pos_emb', 'trust_remote_code', @@ -105,6 +106,7 @@ loaders_and_params = OrderedDict({ 'cache_8bit', 'cache_4bit', 'autosplit', + 'enable_tp', 'alpha_value', 'compress_pos_emb', 'exllamav2_info', diff --git a/modules/ui.py b/modules/ui.py index 76b1c009..c07beeb4 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -90,6 +90,7 @@ def list_model_elements(): 'cache_8bit', 'cache_4bit', 'autosplit', + 'enable_tp', 'threads', 'threads_batch', 'n_batch', diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 1883fdca..f87b680a 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -136,6 +136,7 @@ def create_ui(): shared.gradio['disk'] = gr.Checkbox(label="disk", value=shared.args.disk) shared.gradio['bf16'] = gr.Checkbox(label="bf16", value=shared.args.bf16) shared.gradio['autosplit'] = gr.Checkbox(label="autosplit", value=shared.args.autosplit, info='Automatically split the model tensors across the available GPUs.') + shared.gradio['enable_tp'] = gr.Checkbox(label="enable_tp", value=shared.args.enable_tp, info='Enable Tensor Parallelism (TP).') shared.gradio['no_flash_attn'] = gr.Checkbox(label="no_flash_attn", value=shared.args.no_flash_attn) shared.gradio['no_xformers'] = gr.Checkbox(label="no_xformers", value=shared.args.no_xformers) shared.gradio['no_sdpa'] = gr.Checkbox(label="no_sdpa", value=shared.args.no_sdpa) From 49dfa0adaf52bcff76b3ab9c33326812b281c2cf Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:20:48 -0700 Subject: [PATCH 049/173] Fix the "save preset" event --- modules/ui_file_saving.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_file_saving.py b/modules/ui_file_saving.py index ac72c623..3a27e1b9 100644 --- a/modules/ui_file_saving.py +++ b/modules/ui_file_saving.py @@ -74,7 +74,7 @@ def handle_save_preset_confirm_click(filename, contents): try: utils.save_file(f"presets/{filename}.yaml", contents) available_presets = utils.get_available_presets() - output = gr.update(choices=available_presets, value=filename), + output = gr.update(choices=available_presets, value=filename) except Exception: output = gr.update() traceback.print_exc() From e1338a1804d51d4e74146f2490586985ba499ce0 Mon Sep 17 00:00:00 2001 From: SeanScripts <64337075+SeanScripts@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:49:35 -0700 Subject: [PATCH 050/173] Add whisper turbo (#6423) --- extensions/whisper_stt/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/whisper_stt/script.py b/extensions/whisper_stt/script.py index e45c8b1e..d949e93f 100644 --- a/extensions/whisper_stt/script.py +++ b/extensions/whisper_stt/script.py @@ -96,7 +96,7 @@ def ui(): with gr.Accordion("Settings", open=False): auto_submit = gr.Checkbox(label='Submit the transcribed audio automatically', value=params['auto_submit']) device_dropd = gr.Dropdown(label='Device', value=str(startup_device), choices=["cuda", "cpu", "none"]) - whisper_model_dropd = gr.Dropdown(label='Whisper Model', value=params['whipser_model'], choices=["tiny.en", "base.en", "small.en", "medium.en", "tiny", "base", "small", "medium", "large"]) + whisper_model_dropd = gr.Dropdown(label='Whisper Model', value=params['whipser_model'], choices=["tiny.en", "base.en", "small.en", "medium.en", "tiny", "base", "small", "medium", "large", "turbo"]) whisper_language = gr.Dropdown(label='Whisper Language', value=params['whipser_language'], choices=["english", "chinese", "german", "spanish", "russian", "korean", "french", "japanese", "portuguese", "turkish", "polish", "catalan", "dutch", "arabic", "swedish", "italian", "indonesian", "hindi", "finnish", "vietnamese", "hebrew", "ukrainian", "greek", "malay", "czech", "romanian", "danish", "hungarian", "tamil", "norwegian", "thai", "urdu", "croatian", "bulgarian", "lithuanian", "latin", "maori", "malayalam", "welsh", "slovak", "telugu", "persian", "latvian", "bengali", "serbian", "azerbaijani", "slovenian", "kannada", "estonian", "macedonian", "breton", "basque", "icelandic", "armenian", "nepali", "mongolian", "bosnian", "kazakh", "albanian", "swahili", "galician", "marathi", "punjabi", "sinhala", "khmer", "shona", "yoruba", "somali", "afrikaans", "occitan", "georgian", "belarusian", "tajik", "sindhi", "gujarati", "amharic", "yiddish", "lao", "uzbek", "faroese", "haitian creole", "pashto", "turkmen", "nynorsk", "maltese", "sanskrit", "luxembourgish", "myanmar", "tibetan", "tagalog", "malagasy", "assamese", "tatar", "hawaiian", "lingala", "hausa", "bashkir", "javanese", "sundanese"]) audio.change( From 22baa5378f27de6427640a4ce3ba3a54bb3a9722 Mon Sep 17 00:00:00 2001 From: Luana Date: Thu, 3 Oct 2024 00:35:13 -0300 Subject: [PATCH 051/173] Fix for systems that have bash in a non-standard directory (#6428) --- one_click.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/one_click.py b/one_click.py index 9bad25d1..f1c91f47 100644 --- a/one_click.py +++ b/one_click.py @@ -189,8 +189,8 @@ def run_cmd(cmd, assert_success=False, environment=False, capture_output=False, conda_sh_path = os.path.join(script_dir, "installer_files", "conda", "etc", "profile.d", "conda.sh") cmd = f'. "{conda_sh_path}" && conda activate "{conda_env_path}" && {cmd}' - # Set executable to None for Windows, /bin/bash for everything else - executable = None if is_windows() else '/bin/bash' + # Set executable to None for Windows, bash for everything else + executable = None if is_windows() else 'bash' # Run shell commands result = subprocess.run(cmd, shell=True, capture_output=capture_output, env=env, executable=executable) From 9d8b1c5fd94d360da4ab55334442cfa64aaf40d0 Mon Sep 17 00:00:00 2001 From: Grzegorz Lippe Date: Sat, 5 Oct 2024 16:58:17 +0200 Subject: [PATCH 052/173] Fix intel bug described in #6253 (#6433) --- one_click.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/one_click.py b/one_click.py index f1c91f47..8fc1edf0 100644 --- a/one_click.py +++ b/one_click.py @@ -313,7 +313,7 @@ def install_webui(): if selected_gpu == "INTEL": # Install oneAPI dependencies via conda print_big_message("Installing Intel oneAPI runtime libraries.") - run_cmd("conda install -y -c intel dpcpp-cpp-rt=2024.0 mkl-dpcpp=2024.0") + run_cmd("conda install -y -c https://software.repos.intel.com/python/conda/ -c conda-forge dpcpp-cpp-rt=2024.0 mkl-dpcpp=2024.0") # Install libuv required by Intel-patched torch run_cmd("conda install -y libuv") @@ -329,7 +329,7 @@ def install_extensions_requirements(): print_big_message("Installing extensions requirements.\nSome of these may fail on Windows.\nDon\'t worry if you see error messages, as they will not affect the main program.") extensions = get_extensions_names() for i, extension in enumerate(extensions): - print(f"\n\n--- [{i+1}/{len(extensions)}]: {extension}\n\n") + print(f"\n\n--- [{i + 1}/{len(extensions)}]: {extension}\n\n") extension_req_path = os.path.join("extensions", extension, "requirements.txt") run_cmd(f"python -m pip install -r {extension_req_path} --upgrade", assert_success=False, environment=True) From 03a2e7005412efb7765ce3f0bfccd6b94e79a843 Mon Sep 17 00:00:00 2001 From: PIRI <34787507+ThisIsPIRI@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:25:14 +0000 Subject: [PATCH 053/173] Fix temperature_last when temperature not in sampler priority (#6439) --- modules/sampler_hijack.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 87f0b25e..97951dd2 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -571,11 +571,10 @@ def get_logits_processor_patch(self, **kwargs): if generation_config.temperature_last: for param_name in ['temperature', 'dynamic_temperature', 'quadratic_sampling']: if param_name in sampler_priority: - if param_name in sampler_priority: - index = sampler_priority.index(param_name) - sampler_priority.append(sampler_priority.pop(index)) - else: - sampler_priority.append(param_name) + index = sampler_priority.index(param_name) + sampler_priority.append(sampler_priority.pop(index)) + else: + sampler_priority.append(param_name) class_name_to_nickname = { 'DynamicTemperatureLogitsWarper': 'dynamic_temperature', From c9a9f63d1b9c4bd8a08dcef519728cd82b5dc4da Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:05:51 -0700 Subject: [PATCH 054/173] Fix llama.cpp loader not being random (thanks @reydeljuego12345) --- modules/llamacpp_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/llamacpp_model.py b/modules/llamacpp_model.py index a16230ca..96f7ed56 100644 --- a/modules/llamacpp_model.py +++ b/modules/llamacpp_model.py @@ -136,7 +136,7 @@ class LlamaCppModel: prompt=prompt, max_tokens=state['max_new_tokens'], temperature=state['temperature'], - top_p=state['top_p'], + top_p=state['top_p'] if state['top_p'] < 1 else 0.999, min_p=state['min_p'], typical_p=state['typical_p'], frequency_penalty=state['frequency_penalty'], From bb62e796eba0bfe4610ac879bf7b2f390d96cf92 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:24:13 -0700 Subject: [PATCH 055/173] Fix locally compiled llama-cpp-python failing to import --- modules/llama_cpp_python_hijack.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/llama_cpp_python_hijack.py b/modules/llama_cpp_python_hijack.py index 2a9c10da..f3872a74 100644 --- a/modules/llama_cpp_python_hijack.py +++ b/modules/llama_cpp_python_hijack.py @@ -9,10 +9,11 @@ from modules import shared from modules.cache_utils import process_llamacpp_cache imported_module = None +not_available_modules = set() def llama_cpp_lib(): - global imported_module + global imported_module, not_available_modules # Determine the platform is_macos = platform.system() == 'Darwin' @@ -31,6 +32,9 @@ def llama_cpp_lib(): ] for arg, lib_name in lib_names: + if lib_name in not_available_modules: + continue + should_import = (arg is None or getattr(shared.args, arg)) if should_import: @@ -44,6 +48,7 @@ def llama_cpp_lib(): monkey_patch_llama_cpp_python(return_lib) return return_lib except ImportError: + not_available_modules.add(lib_name) continue return None From f1a8eae04dec1c70f66fc2fd662011463003ffca Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:30:45 -0700 Subject: [PATCH 056/173] Remove optimum from requirements --- requirements.txt | 1 - requirements_amd.txt | 1 - requirements_amd_noavx2.txt | 1 - requirements_apple_intel.txt | 1 - requirements_apple_silicon.txt | 1 - requirements_cpu_only.txt | 1 - requirements_cpu_only_noavx2.txt | 1 - requirements_noavx2.txt | 1 - requirements_nowheels.txt | 1 - 9 files changed, 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5623f1f7..0d75c5f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_amd.txt b/requirements_amd.txt index d203c157..00bd81a1 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 3a7a950d..36ab65fe 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 61c5367f..2de71a73 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 494c127a..03cbf622 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 5838ac47..39c11b75 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 97d4eb90..224a0207 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index d34a598d..247b83ff 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -10,7 +10,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 5c840f56..c0ab9eed 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -9,7 +9,6 @@ lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* -optimum==1.17.* pandas peft==0.12.* Pillow>=9.5.0 From e784938654f31a1b5b8342d49e5a125cd19899f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:32:53 -0300 Subject: [PATCH 057/173] Update accelerate requirement from ==0.33.* to ==1.0.* (#6441) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0d75c5f3..b218ac8f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_amd.txt b/requirements_amd.txt index 00bd81a1..3baafb39 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 36ab65fe..dfdcc86b 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 2de71a73..59afc45e 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 03cbf622..2df573c8 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 39c11b75..2653ddbd 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 224a0207..35092d22 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 247b83ff..b5e0204c 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index c0ab9eed..47b0dcda 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -1,4 +1,4 @@ -accelerate==0.33.* +accelerate==1.0.* colorama datasets einops From 18f836b28050da93b054547b6d48214b52e56727 Mon Sep 17 00:00:00 2001 From: Molly Sophia Date: Tue, 15 Oct 2024 04:51:20 +0800 Subject: [PATCH 058/173] Add RWKV-World instruction template (#6456) --- instruction-templates/RWKV-World.yaml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 instruction-templates/RWKV-World.yaml diff --git a/instruction-templates/RWKV-World.yaml b/instruction-templates/RWKV-World.yaml new file mode 100644 index 00000000..bf65511b --- /dev/null +++ b/instruction-templates/RWKV-World.yaml @@ -0,0 +1,25 @@ +instruction_template: |- + {%- set ns = namespace(found=false) -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set ns.found = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not ns.found -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'User: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'Assistant: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'Assistant:'-}} + {%- endif -%} + From 6a0837451e1f88ad2db1de5aafda2b7155aab245 Mon Sep 17 00:00:00 2001 From: Paul Richardson Date: Tue, 15 Oct 2024 08:39:00 -0500 Subject: [PATCH 059/173] Minor Documentation update - query cuda compute for docker .env (#6469) --- docker/.env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/.env.example b/docker/.env.example index 2de9f0ab..bd0f8bcc 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,6 +1,7 @@ # by default the Dockerfile specifies these versions: 3.5;5.0;6.0;6.1;7.0;7.5;8.0;8.6+PTX # however for me to work i had to specify the exact version for my card ( 2060 ) it was 7.5 # https://developer.nvidia.com/cuda-gpus you can find the version for your card here +# Or for a programatic approach run `nvidia-smi --query-gpu=name,compute_cap --format=csv` TORCH_CUDA_ARCH_LIST=7.5 # the port the webui binds to on the host HOST_PORT=7860 From 386c0d82890c258b3552b0440befb1f744a99c22 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:09:09 -0700 Subject: [PATCH 060/173] Bump transformers to 4.46 --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index b218ac8f..5e5c1381 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,7 +22,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_amd.txt b/requirements_amd.txt index 3baafb39..b2a2b50c 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index dfdcc86b..5dc0de68 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 59afc45e..cc88d62b 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 2df573c8..3ddfcd28 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 2653ddbd..5d1ea2ce 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 35092d22..5eb08db3 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index b5e0204c..6ee676b6 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -22,7 +22,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 47b0dcda..782242f9 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.45.* +transformers==4.46.* tqdm wandb From e1061ba7e320727a3eab90d2c73c06e8eb740ec7 Mon Sep 17 00:00:00 2001 From: PIRI <34787507+ThisIsPIRI@users.noreply.github.com> Date: Thu, 24 Oct 2024 18:24:02 +0000 Subject: [PATCH 061/173] Make token bans work again on HF loaders (#6488) --- modules/sampler_hijack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 97951dd2..24dbcf2e 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -454,7 +454,7 @@ def get_logits_processor_patch(self, **kwargs): ) # Stuff we don't need - elif warpers[i].__class__.__name__ in ['SuppressTokensLogitsProcessor', 'RepetitionPenaltyLogitsProcessor']: + elif warpers[i].__class__.__name__ in ['RepetitionPenaltyLogitsProcessor']: del warpers[i] # Add custom warpers From 8deea2936d303e5543237004648e2d06b09478ae Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:25:42 -0700 Subject: [PATCH 062/173] Remove lm_eval from requirements --- requirements.txt | 1 - requirements_amd.txt | 1 - requirements_amd_noavx2.txt | 1 - requirements_apple_intel.txt | 1 - requirements_apple_silicon.txt | 1 - requirements_cpu_only.txt | 1 - requirements_cpu_only_noavx2.txt | 1 - requirements_noavx2.txt | 1 - requirements_nowheels.txt | 1 - 9 files changed, 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5e5c1381..2549c648 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_amd.txt b/requirements_amd.txt index b2a2b50c..78bdd3ca 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 5dc0de68..9420e861 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index cc88d62b..625021ee 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 3ddfcd28..3cb66cbc 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 5d1ea2ce..fbd6447b 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 5eb08db3..e9ab0fba 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 6ee676b6..99791ea9 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -6,7 +6,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 782242f9..f5c3966e 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -5,7 +5,6 @@ einops fastapi==0.112.4 gradio==4.26.* jinja2==3.1.4 -lm_eval==0.3.0 markdown numba==0.59.* numpy==1.26.* From 8d5cf7b134e227cedde9afc744c06ba94cffe86a Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 18 Nov 2024 06:51:06 -0800 Subject: [PATCH 063/173] Bump llama-cpp-python to 0.3.2 --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 12 ++++++------ requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 8 ++++---- requirements_apple_silicon.txt | 12 ++++++------ requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2549c648..fadbb961 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 78bdd3ca..9f44f53e 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -31,14 +31,14 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.1+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.1+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 9420e861..5e552d29 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -31,10 +31,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 625021ee..301e2fb0 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -31,8 +31,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 3cb66cbc..eb2ffed0 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -31,10 +31,10 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index fbd6447b..9a1ccc8d 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index e9ab0fba..7ffdc718 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 99791ea9..3333b81d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.1+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.1+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.1+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From 0c48ecf3599786a58a1b8360fcd398e382049823 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 18 Nov 2024 06:51:56 -0800 Subject: [PATCH 064/173] Bump exllamav2 to 0.2.4 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index fadbb961..127f63ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 9f44f53e..f8980191 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -39,6 +39,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 5e552d29..4c5d7574 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -37,6 +37,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 301e2fb0..aad1f59e 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -35,4 +35,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index eb2ffed0..52d5c7bc 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -37,4 +37,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 3333b81d..c5030617 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.3/exllamav2-0.2.3-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 5fa9336dab1666d125d1892b5d4f266444c57f56 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 18 Nov 2024 06:55:29 -0800 Subject: [PATCH 065/173] Bump flash-attention to 2.7.0.post2 --- requirements.txt | 8 ++++---- requirements_noavx2.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index 127f63ba..eb2c8ea8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index c5030617..57fa41f4 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.6.3/flash_attn-2.6.3+cu123torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From 9b3a3d8f12d3d4f2157965a203e3d0469cf90ec9 Mon Sep 17 00:00:00 2001 From: hronoas Date: Mon, 18 Nov 2024 17:59:52 +0300 Subject: [PATCH 066/173] openai extension fix: Handle Multiple Content Items in Messages (#6528) --- extensions/openai/completions.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/extensions/openai/completions.py b/extensions/openai/completions.py index 6bd8f409..2cefc22b 100644 --- a/extensions/openai/completions.py +++ b/extensions/openai/completions.py @@ -143,21 +143,20 @@ def convert_history(history): new_history = [] for entry in history: if isinstance(entry['content'], list): - image_url = None - content = None for item in entry['content']: if not isinstance(item, dict): continue - + + image_url = None + content = None if item['type'] == 'image_url' and isinstance(item['image_url'], dict): image_url = item['image_url']['url'] elif item['type'] == 'text' and isinstance(item['text'], str): content = item['text'] - - if image_url: - new_history.append({"image_url": image_url, "role": "user"}) - if content: - new_history.append({"content": content, "role": "user"}) + if image_url: + new_history.append({"image_url": image_url, "role": "user"}) + if content: + new_history.append({"content": content, "role": "user"}) else: new_history.append(entry) From f93196e3065a997fafad7fff503ddf0c96169798 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:00:24 -0300 Subject: [PATCH 067/173] Update accelerate requirement from ==1.0.* to ==1.1.* (#6515) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index eb2c8ea8..27aad7a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_amd.txt b/requirements_amd.txt index f8980191..63b00a38 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 4c5d7574..1a16ed0e 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index aad1f59e..74e3041a 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 52d5c7bc..42975d20 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 9a1ccc8d..dd7039e2 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 7ffdc718..c39d788f 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 57fa41f4..140d92f6 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index f5c3966e..44d58995 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -1,4 +1,4 @@ -accelerate==1.0.* +accelerate==1.1.* colorama datasets einops From 1c937dad72dfcd176bdc1f25938585e91a48d3d3 Mon Sep 17 00:00:00 2001 From: mefich Date: Mon, 18 Nov 2024 20:01:40 +0500 Subject: [PATCH 068/173] Filter whitespaces in downloader fields in model tab (#6518) --- modules/ui_model_menu.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index f87b680a..34d58177 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -260,6 +260,8 @@ def download_model_wrapper(repo_id, specific_file, progress=gr.Progress(), retur yield ("Please enter a model path") return + repo_id = repo_id.strip() + specific_file = specific_file.strip() downloader = importlib.import_module("download-model").ModelDownloader() progress(0.0) From 3d19746a5dd0d14768035b7287814ca6504988ce Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:14:09 -0800 Subject: [PATCH 069/173] UI: improve HTML rendering for lists with sub-lists --- css/main.css | 6 +++++- modules/html_generator.py | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/css/main.css b/css/main.css index cf3babdb..26e58b5c 100644 --- a/css/main.css +++ b/css/main.css @@ -404,7 +404,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .message-body h3, .message-body h4 { color: var(--body-text-color); - margin: 20px 0 10px 0; + margin: 20px 0 10px; } .dark .message q { @@ -456,6 +456,10 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { overflow: scroll; } +.prose ul ul { + margin: 0; +} + .message-body code { white-space: pre-wrap !important; word-wrap: break-word !important; diff --git a/modules/html_generator.py b/modules/html_generator.py index d0afd6b2..01b20866 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -104,6 +104,8 @@ def convert_to_markdown(string): result = '' is_code = False is_latex = False + previous_line_empty = True + for line in string.split('\n'): stripped_line = line.strip() @@ -120,13 +122,20 @@ def convert_to_markdown(string): elif stripped_line.endswith('\\\\]'): is_latex = False - result += line - - # Don't add an extra \n for tables, code, or LaTeX - if is_code or is_latex or line.startswith('|'): - result += '\n' + # Preserve indentation for lists and code blocks + if stripped_line.startswith('-') or stripped_line.startswith('*') or stripped_line.startswith('+') or stripped_line.startswith('>') or re.match(r'\d+\.', stripped_line): + result += line + '\n' + previous_line_empty = False + elif is_code or is_latex or line.startswith('|'): + result += line + '\n' + previous_line_empty = False else: - result += '\n\n' + if previous_line_empty: + result += line.strip() + '\n' + else: + result += line.strip() + '\n\n' + + previous_line_empty = stripped_line == '' result = result.strip() if is_code: @@ -145,14 +154,15 @@ def convert_to_markdown(string): result = re.sub(list_item_pattern, r'\g<1> ' + delete_str, result) # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) # Remove the delete string from the HTML output pos = html_output.rfind(delete_str) if pos > -1: html_output = html_output[:pos] + html_output[pos + len(delete_str):] else: - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) + # Convert to HTML using markdown + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) # Unescape code blocks pattern = re.compile(r']*>(.*?)', re.DOTALL) From 350758f81cfd27b32abe8ab6a8837f5bf0253479 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:34:36 -0800 Subject: [PATCH 070/173] UI: Fix the history upload event --- modules/chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chat.py b/modules/chat.py index b81cfea6..787277b9 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -1108,8 +1108,8 @@ def handle_rename_chat_confirm(rename_to, state): def handle_upload_chat_history(load_chat_history, state): history = start_new_chat(state) history = load_history_json(load_chat_history, history) - histories = find_all_histories_with_first_prompts(state) save_history(history, state['unique_id'], state['character_menu'], state['mode']) + histories = find_all_histories_with_first_prompts(state) html = redraw_html(history, state['name1'], state['name2'], state['mode'], state['chat_style'], state['character_menu']) From aa629e2809dd89b704ce37e1574ae6f0bd7b8f52 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sun, 1 Dec 2024 12:00:28 -0800 Subject: [PATCH 071/173] Bump exllamav2 to 0.2.5 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 27aad7a6..9be94f62 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 63b00a38..f03bfcd2 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -39,6 +39,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 1a16ed0e..06416fe6 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -37,6 +37,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 74e3041a..66bc6c1a 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -35,4 +35,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 42975d20..f76222d6 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -37,4 +37,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 140d92f6..43e92742 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.4/exllamav2-0.2.4-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From f7836c4bd844beae8f1158b205d4dbffd4d1f526 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:00:15 -0800 Subject: [PATCH 072/173] Bump transformers to 4.47 --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9be94f62..825b2c78 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_amd.txt b/requirements_amd.txt index f03bfcd2..7ceba1cd 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 06416fe6..275ab52f 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 66bc6c1a..9abe4cdf 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index f76222d6..0e7ad138 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index dd7039e2..a8478381 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index c39d788f..b3d54717 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 43e92742..090abbad 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -21,7 +21,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 44d58995..28144afe 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -20,7 +20,7 @@ safetensors==0.4.* scipy sentencepiece tensorboard -transformers==4.46.* +transformers==4.47.* tqdm wandb From baa566b0c6693d655717905cf82ad6c3af481ba1 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:16:33 -0800 Subject: [PATCH 073/173] Bump exllamav2 to 0.2.6 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 825b2c78..50108139 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 7ceba1cd..5ab89220 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -39,6 +39,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 275ab52f..3b9e7ab7 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -37,6 +37,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 9abe4cdf..98545639 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -35,4 +35,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 0e7ad138..2cecee5a 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -37,4 +37,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 090abbad..dc8409b4 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.5/exllamav2-0.2.5-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 27398428f606022fc5d1b454ff8795e999e9fab2 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:17:17 -0800 Subject: [PATCH 074/173] Bump flash-attention to v2.7.2.post1 --- requirements.txt | 8 ++++---- requirements_noavx2.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index 50108139..7b88f626 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index dc8409b4..96437260 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From 97f56156618fb2b15a87fcc1e324599ad975f6aa Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 11 Dec 2024 07:14:59 -0800 Subject: [PATCH 075/173] Bump llama-cpp-python to 0.3.5, remove macos 12 wheels (workflow is failing) --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 12 ++++++------ requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 6 ++---- requirements_apple_silicon.txt | 10 ++++------ requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 48 insertions(+), 52 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7b88f626..ea4de887 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 5ab89220..ddb6531f 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -31,14 +31,14 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.2+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 3b9e7ab7..90944e23 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -31,10 +31,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 98545639..9e72cfd7 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -31,8 +31,6 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 2cecee5a..c487ce50 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -31,10 +31,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_12_0_arm64.whl; platform_system == "Darwin" and platform_release >= "21.0.0" and platform_release < "22.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.2-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index a8478381..51280779 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index b3d54717..f416b0cb 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 96437260..48f1bf74 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.2+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.2+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From 25c640ec0ced52b6fba316ba3582a757537b04d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:58:50 -0300 Subject: [PATCH 076/173] Update accelerate requirement from ==1.1.* to ==1.2.* (#6583) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index ea4de887..663edb57 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_amd.txt b/requirements_amd.txt index ddb6531f..dd537a66 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 90944e23..275bbb22 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 9e72cfd7..daeab92a 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index c487ce50..99b5f3c2 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 51280779..446a47ce 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index f416b0cb..73b9f764 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 48f1bf74..0b811b0f 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* bitsandbytes==0.44.* colorama datasets diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 28144afe..f6ba93bd 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -1,4 +1,4 @@ -accelerate==1.1.* +accelerate==1.2.* colorama datasets einops From dc56fcff125fa0fff2be7e5c046bac51c24a534c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 19:48:51 -0300 Subject: [PATCH 077/173] Update bitsandbytes requirement from ==0.44.* to ==0.45.* (#6584) --- requirements.txt | 2 +- requirements_noavx2.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 663edb57..4e976d8e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ accelerate==1.2.* -bitsandbytes==0.44.* +bitsandbytes==0.45.* colorama datasets einops diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 0b811b0f..5ea4f654 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -1,5 +1,5 @@ accelerate==1.2.* -bitsandbytes==0.44.* +bitsandbytes==0.45.* colorama datasets einops From d76961859141762a067605447d0e389b96bf5fee Mon Sep 17 00:00:00 2001 From: oobabooga Date: Tue, 17 Dec 2024 00:47:41 -0300 Subject: [PATCH 078/173] Improved UI (#6575) --- .../Inter-Italic-VariableFont_opsz,wght.ttf | Bin 0 -> 904532 bytes css/Inter/Inter-VariableFont_opsz,wght.ttf | Bin 0 -> 874708 bytes css/chat_style-cai-chat-square.css | 2 +- css/chat_style-cai-chat.css | 2 +- css/html_instruct_style.css | 119 ++-- css/main.css | 585 ++++++++++++++---- js/main.js | 244 +++++++- js/show_controls.js | 4 +- modules/chat.py | 24 +- modules/shared.py | 3 +- modules/ui.py | 47 +- modules/ui_chat.py | 66 +- modules/ui_default.py | 12 +- modules/ui_notebook.py | 12 +- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 23 files changed, 884 insertions(+), 254 deletions(-) create mode 100644 css/Inter/Inter-Italic-VariableFont_opsz,wght.ttf create mode 100644 css/Inter/Inter-VariableFont_opsz,wght.ttf diff --git a/css/Inter/Inter-Italic-VariableFont_opsz,wght.ttf b/css/Inter/Inter-Italic-VariableFont_opsz,wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43ed4f5ee6cb01173b448af26edb9d7459f9d365 GIT binary patch literal 904532 zcmd>{cU)9Q|L?!2?AZb=#ia_kq9S(1uBh01H)>3x(O47PV~M7lX8MzuW@3yn8jU8# zSYqrQ3o0lAvUJ#`vvgS6?wBZ>?RoWbJb4!?zLtNyJy4;^eoFh#$dAoGg<& zTymK}Z;>nggOtqI;ve%PM0v^Xg$~)+;A%Wuy>{f?h!R4s2q11pMU3Lroi3R;A&fm{L;~u z0%*!bRD^J!kb+3jTa1zOX$Ny@6CXn#^53CXNFm^Mp2RHTWiR?(b|eciW9HAq$4%Cu35YOMbaXSp$CYtY1#4(gx*FuNPy)) zffYuU7@2#SsZpBH_)k9Lm$+n^K+pOcIxM#M>Ofoa=9T+o#n^M z2wOud^jW`Q-5M4GcRgHwqRA{`f+MRRX8`J1jX z*&O~T1pUUb6d+m8i1HP7kDS_c=bk4ikUos-zK7Wbhf=cs&=E!qbtRs)CpVNFZOGyJ ziVX`_qFs0jq3$$@#?TC!PtVfx^alNtcF<4sJ6)kzN})WYh5B*B9IfnV0WOk_J4ZNi z!yP#^g^wWEt22Bg@^02gk>5joG)l?BaR)bs^_o*3OXxMHK92Po%8z<-<5{oq=oRO+ z2^@OPsZV4*=hP>)h%;HxKMbGZuoTu}NCt76{zVEBOJ7vO`-xKP)H%{9MW@b_t5oOI z1?n!{a_S=aNynVJg8E4>J9P=+i=DcXW=S4ST}3L1^##jIO?pLvQ+I)W)2X|*(A~HY zalbQMOZ~*PPTik;#Cc6RD&Z%NaOxbniv66r4srBO-J1eMXI(fS>MW!5H!>I>A@9xxFQ-Gjz>VXu%H#qem^5UI!;eyG7H#o!FApE*h*Hc%%Ij^?l z$G_nW51|nLX{X+fy7S>qy*&l;K2E&@g>vOiJ(Rq-45!`^`W>epM&Vp@`hCfVd&?Q# zk3zUbPQ5?*aTA>SfJc3bc_4u6=?ou4!JL;cgRb?$k#>|In$Agx*}vQP7?C!;OZ%!5L=^^p#G1EXL7Xr#_A}G{vcp z$9Rl%>Ju=3_HpVHF*e&f^+`x4(5X+x*wi@nDbR>UAdiLg3_VAqX*2R(2j2)kt!hJPbMXFy*Djis`VCLwegEk`S3sNFiW*g}V>ef_8J*`KJvUXqV zXpNERw^h(te{Mj?2KsZzQiLo-j7KSqMZ8T8|8i*Sacv{g8{_ED4b%;3tZ}5i0XeNh zX_nAq@UL~0tDB=d>!ItB!XMLN91ngInOKc&bhIn08PnIG9hRVV z{&gydn#agr}B{m+`;YufrOjgg;j@E2h2R(&4O2uqt71CT!|1PITEz3sy zGOz)6%t0>ABmK{#lC?K0#dzf1WWO!PB%2#Hptsgzz0m{znRT(AW4*%SH;r5t!tAO$ zLf0YJrV+9p(*drJj1BWDI?alKnAXHX>MQ7GgEkWTOkwkF392j+2G(je#Xj zcf{O)HqoPe|2r-8=ewAdtpeR4m!O?zIC^>&EP|D4IBL<Ej*c zYObSVA}GkLKq;w`w1hwkQ7gqQOo}>qh+? z|NG#H@C>dj!vB`#Xqj5eyJw((CxgK)V*fGkmUli%k?R%*}C<3O0g34L%o<4 zvi^G%Ur*BzcMaCeOHe*G=MF~;GaF-e%UU|@U;49Y3@t~zMX2vHh`9>=)7<_&kaP36 z>4cT4;8;!LK`rbDd04%E1%APmU$LU&I6v-v$Pc-%A-~}akSSa}WFwEe`7ZoY$mRT7 zkX!k!kniyaAP@1sLLTLhL7wEVLEaDs5+_6mV<5)~vmqZB=0QFwJPA2p*a*2vxC(hq z$bifi@*xX_LdasF7_vfCV128^3YQaIMK?%y(F@XB^n(l#yFhjmyFvC4dqegWr$9~< zr$NpTXF@(EB42T?xBzmYxEb6n}*LS-b*yUAzf-OS}siC&od>iaDjAFctCn7P(p>T!WYtC5eONq&_jkP!XP^< zIzx6>bcgJz=mj}IF#vLqVi4q5#W={x3e-aJs^WFXcNFhJ)+*|VlXwaH3`vsOLbjJe zA;TrqTIw$igB&i+fP74v1NjVg44kw=dKPk(vk_PO5Z_#FMSWWSNZ|+ zC+R21!_r~MW76-C=cIFxH>JBINZC>@amv2RzK~Ot%ORgtJ_or@xejuJ5@!?250v{M z4=4{p9#I~FJf=Jb8Ldo$G$^r(SLUcj6Q>%dLXN7Fs#B0>RhMv1a8(6sQQcDAf=pJy z22=$q>;P1isw(I;DzvkzUeyR`!?uc3^J?sR)UImme$^gow7J?x?E~qr_J?e(Mw_dH z)xnS<>JZ3KHQGuYrVfMbtVa8*`>6Xsj#E#BoUMjUs-ILp4Y^3Y2=ZAqY+L=28ttRr zr-p^7e^O&~sE?^pBlYj<3y@dT*~Do&YbKGPnW~u$xm0r+@{Z;Xq(PI6s~MUM;x#3j z5`>g$N)b|~DTCgi!CptxsId|U!-0jns9j*;E}kx)keysQId-0GU&+o9*dE_oik5Ck zx1~E$4BG4*@>-@@u34dZR`Z-@rDm(0XVa0A3)U3 z3a)?y;8oCvDC9Iz+bZw{ksfC&dYrVi=|~iO0&K&f1Wp?y#Fs|kROKhk7bq9@W$awU z6K4i3PYt@s`{e%g1jWnH5QAwE@;WM&U!*hgQ2BXi|A2M|XA1@jCW9O!M{+0SujJR{ zLU|%xmb2w&a35iBL~?tka5!bKmpOJ7Bpc;d$)7UmYkQsi3U!jdGh%ZALPN1ny2+=k+4>sW`9 zNLxoj31=b09LfWFCsOW@IQQx8k@5h!8+M6r^_2(90@c&^ljRZi46Z%B-&r1Mzsb#_ zgM;Le@<7^6?@e$h-!o;b97-qY?Y0i(EWI5hk3+~QdMijCFZaP=%$x4=M0*tX7=7IZ z$~Epa+7=>Dk~L`M-5upwvP4<*i60atr=fS*QlMQ`ckEwY;OX-^;dU0Fc|^l1ku61w31 zKzYBsAN~C$Ohk@CSN$|iPLk=E)1cg=9dh1n(%`-Uv^$ty zlr!lodE;*Cjptko>qNJG&dqwEuRR-2|aI7B@?vG_7hB5{?5W(;bzX4GxLNBIXyrF4&FU>rkzb(K>_geaSw{Aa9U|(ZPX(<;}2$ z?=~pl4xs3jR(fClg|a`pg#9@?y=*#1V`q<}xUdgYD)~9O^@(DZ{2b@?iD!4Y12<=z z$y*-6J-#j3TYiiiv90G&*^?XgOqY((Y4BLe>wBS}ypeLh7dpwy=-QqN zUVehs>@)S1*VFgESbX8^Va_HxdbFsDIme2s?3LVz6M<1^;>6Sb7v$A+@&ftDld1G_ ziV42c(UnSh1n~yU*c7O!MTc2} zBg}Y{AmBeHeDulFm{)c~&jDL7csJ4(481M%ru+&DyIo#^%AJrWVh%r#$!8?p#C(Nb z#`M*n8e|DWyT3i!9?k8rFSRe_zOgT{FX67*huDYE1oXTD7J#Xq$)OI!MC`(;flirKNfV;8#j!*Q#E5+FI~*R3{6{NcLIPI3E= zH*$1!|K)}%syn#d*M;6W_>1pI`tE3qtfJixnR(`;&hGT)_52)}KECm7u9a@wI3lPi z1yV)7-MDObqjzs4X}i$-(Vtf5P(t+A_1&lnvJIz(BsvzoD^*F?ASL=V`nG#V`t??H zqlUKK-ddAR$8Y~uucVJ+zYLmBAKv@A=qvgvE=FigpWja{FQG5u-x3Pw>-cvI6X~4? zZ{>VXpBPTny2+~z#;`z2PyN6aK#8fJS{vzD>W(5m+Ml`y@@(oJgv6!pQ^eC7X+IQ& zQcT)GEihIj4U=hg)s|{XXs}mT(P`^3PEAMc z=g@jP)c5l5&x`Mg|UVDoyOR(F*^&xykRR~f(aHHi-<_UZ67=1rF{YsJqm+GhdwzOWm%JyYt1x9xOgAPrxQFeD+2|g& z|G?v|-1Z+_Z|}DM;3j*g{pZ%(JM2HVSq|NQbDSl3|Lv9Cy6=yRsO|jY!40-fKOUcv z>h&XUL2z={qgSdPCb5PR}bubMyEb-a;dfTfm3s=?S8^-oqvj%7INX|>CuFyDtuDfAn5Qw}@lLpwNQjJ2%SrjvqKRAPiz) zCnmZb|7Bj#o#Q7*D*GM3I)dwY{OU-En3rh%@ygN@ce=R^K5?&8+u{?c z{l%OU#?BS|iOQj6BTv*0EggBHabk)6gk3rs`TGyEI%od=;|uu#zh4jY>HGVQQ18LN z=Zq?`{%#pmJnH0)88xmaV`hfzIhj6E=ymFRh<3~=7IrFrl=r<;hAE|Wr&7G!dYnq{ zuhE~%=&#nF${A&DI8`*Ga-G+talJ z6g|&;^`dY5nVa3cx}CY(S=;N3VM>YROvbUW@H0ibAcD8{hIm(>#rM~u}^JQ)8x}UEf%7tBs>aOj4A*z?Q+l8B> z^5Z_tT?Se6!&%2Q4@9K4-aF&#Rp`?vH@Iq-D8^kO{{>9&>tJ+*V`9ed` z#e{y^+>6D*r7jmsTEkm1jW4)Z@(iDUk?U{mdeJS{=5Z;;uIPIyWtP!=39XiSDXX6< z^OAXdR^LnJ30ZwEl?K)aUb2K2PrCg380o>~><*3om$T;x*_X5D2|1Tdfz}R}3+JhG zE|&+_`d==eDd$|S=vW~dYZ^3Ip7qp}BH76;XbUHS5b!68>tW@Q&$DHtfU zyHYriZ+FEUU~O}yrhQeXEA>n?w6E-RMV2}4YW&DX&#NheJW{W+?!H>kS8ji`u)V$N zYHh2crYc-uMq1S4ex2|`M=QV3PbLcg>hI6^5jj*^}zuu1zxqiJr-}d^= zk!|l>PwcKKyeZN6cgS8uxk18IAs zv~?xKxO&^ooE|FE&DQd$wZCX&99Bq2K)(~B2 zZI}{W*r6dPy12a}C%QbiJSe&%xGX5Tc5Fr9t@t5sez%g^XgqIadDMs9%IPXq-zwKt zi?@{3y3*S*%iYD>@nPC_x8nzRW!}#7wU^&6Y^@2rZ5@_9^tM|^p~IbDRw}#Qx$4!c z_nljzAsz0-trWW5N$_oGdndDxBKJ$GjBcfHVi9w zjcFKOu8CLW^A znSeH=#3h#5Mr@BWW#M;EjIIp5dtshUe>b^bdBEMww5pDG^SxC5cMAqu^>>T)nxea9 zqf6CyYkKB*+^rp5t-fm?TBN?~>SAes?{p6-?%ur-)m`ox^sb}sC2#Z(x|h2UqGVV; zf3IXjsdTSoWU1m_$*5BCUJdTOS2MO+dC!Uj?pcSWLW?X?-g8w}cDTo^B<`#J9S6mI z_nfzD+`&mzZQ@S8Q0*I+(WfdX4wj>eGj%TTiZgX7@Qf?e+biOVrxm%zm9$0_7?LW^ zIygxcXX{?1ifbF4;d6iQGEcYrsSC;j?x((5?s`9Mh}r9Yp%7Ygzpz(m-u>c$TE+d+ zz$%~nwIi$4@h4xX^o~C@L@0>A-%B>eC-&r9$EQY^z2dV56??}U2Nd|km$XI{X1nps zcHPWRxYgy>1`^$Bs25D(gv`X^)#EcQ;w?#HPUvPTwqCYYEvr(eEL zLe9VTI{V)Que-9%<=fSnH9+eNSP4K9Bz)bXkVMu}dgVZ(ws$g8jJ@!Pc|6MW5NwaO@zi^Y|RUXf)TZDhT>_t8bhg~x~-vX zxKeK@n_#pX$|f=~$!Imyw=%UdG>p&I7__E*hLHtFS$l?&+_MQQ7dV{L8LjI;fEWMo`jVROld zT4wdkxc+QiZN`nMVo}D8X<}gpv*!$E&lz#gTB|Z1bT9DBNEw}`%t#wj?3s}_B+osg z)U(<EYfA>Pb}1B76<0} zXO?)@cxRThl6^AkCg!of2OuJ>&7yOn3WKT zJ#xLXl6&RqvXa?_*8lvvLO)w#v%uUC=r!Z!9k456<<>${(7e%_;~g^vf#H=k?1f9FIH- zryvhA3o8jKfS8?Z&#LQNsLb-nKonmKUz)|nR@P`u%A%|>A7*)EpL?>^&Fss|tqs|i zS6J(_Z@yMvoy`iKo!q*{JKHok*F8J8M{Zy?D@Jxc6GcHex@@y|Zcw(_H@9`R*+17m zyQEcao9t>e!m8cit?q8tW!H|uy>)Vq&Uoh8x^m;0RdrRy^FcLMG__)*9Oz%|1E)#?tP{vQo;?8|x%^8(i}>#zxmXjnT^Ef|#4%!>D@l z&P}6Raejd5#9CXW>BM?ljVXF%on(qxUZgU`FfDdvtz?QD#2HP==n7Nvz&t-wT5zSO zDWiR^n<-15=Vi)jhYO~UYHbQO$*LU87RsEM71dHs>X;NoPU_ec zF(+eiEuWL;ksFv(F(KQUQ=`rf%#jt@9y#i{H*VyF6`mZQdwpJ(S8iIZ$tAbcJx9zf z^~zD^R<|?ga=D5e-(0_T3A$W;x%BqVol*Q)@j6(jtpa7i9I6a|=wZ()$;f zeAD|CHjlN%ke! z%+qv6bII`$a_^F~u8k!n<-P`MNx7e)u|%jfxRhSqR9IJfb#q~DX>4aNvDD;|Qd?>Y zGIT7>afMc?eo$MM?q_XPmKBoPp)A|?LAUY;y>qL|Gg}u3Au_C2eUW|mY{XX+B`tMgmeYO9OfD%`3|T<%v@ zv)ig+2hiN&>Z>bNxKOJSE33JN%FflQ+62#o@x!2_TLa^Iv*c~-BWiBo? zH8n0SmMG1bFiWf@0zx+?++y^)Z?+h{@0VF}ePW9(`Mw3RrO4Y*W-+5rEZCLnAaoW> zx%O_Er9vB9W~m-}w%CHsGXjmqVnLr92_T6DNtdt+9;wKlbFwM%VL zK)Fk8ndV-7ZG~HrTx%<86;i9rb5Yf$wk>R|D{=KGt*fe1y47*Dr9pKrm2I^3_j^dL z^|g(S?dn}BgWVd~=C+}REAww)^=+uv2o()%n+p+8-yrC3yEd?GZsXC>oT~BqSgvQ| zjWvPAjWOXiFYECo?w-~gYg!jsvjd__tZWZ!t?hV6VdZ+dCtHPt;Cd?#OY5x~`KH?H zQW_X+JHABgVLLlSR@&|jlY7`Q^;#dBIpDU*RxaHvv(+2?ax$mt!do>d^zR`Jh%a~tH_Qn$TO1sT&3AS@g z@b;QuIlUv!8OzZUa>ei}QLb)vJzuU4vMJ^Idd^L*cjM~ihRWWha$||MLYCdR3K@Og zMizV&jk2;qZs2|$+JWN=f^L|&619s5SE?=LxpEhcCs!Vzv2itAl^<6lR<-6V6&ej^ zsnn=BOO-~&S*kTk&Z0)-TA!;Xt|7mJAJ@>(tC)!ruCWeL8m$_UvlXiSIGa^~Cf2v+ zL|a*FPFw1t zG`aDOb!sKwXjKcmtx)9)q4wi#jqOF=W^2dub{j5eOEs-{e=l_zA8bes<-?6}UP9E^ zD>=fA$4>t&qy+jF3Tf65UZ~4gss)ycVB>`VW^Kzsgz#c@iON;1ml~_Z`W}~TqEKg3h*AxQPlcLPO0j#D zwNde4L0!EfX+cAcg59R5E>XHD#D+$tl=_6lB5}L|ouCjJlpHVGRlhz~5};~O@b#)* zWf~640TZt-YIinCU8~ObP}gem-PH>J+8WK?Crevt_AV&((d;*dhiQyDa}>r;7$!oE z1wx0hC$~GpX*g?+heoNaFL8`EjV9P))VL|D8#Owt*EN_iEgGF$WtAqF4ao5Qu{Sm0 z;n4;x;=|1@ag)x*yWC$JQ|FTTba|OeL!H*@;^J9TaE8I#a+%9*k9Cf=|%N~$gzRgLywr`sUMeY|SRR_2$YZ@xu!?cYB9_I$zNZ_qR~THQ(pnmQ0bv_Gv|BsZ<|o)d1^>q0fbQC86R4&@>F#Bt-+JU^9*aS-18g| z5?|o8Z?VzEYu^&1#w$LwPT8v7Pnp$x_or;9#S% zO?r5dv5k9{pHiP5UYMF}*BnjG0h7i!nmSp0^saF2Y=1;^J=Esf)0fEre-2tRX+tzo9a`q@f|) z3`(^&-+V3aSKyWG(n^Pi0iFb;!`3j^VlanW48{m^lo20CVmY!8aO35}&LfLA@4Kog zIbsYCJ~epUxKkU)jXPrq)|@epi8y<9^yu>gZJo~#vUR;AT;ZY&8e%n#vP5X2KkVN= z_HOv#yVbpX5+qw?;+tXJlF~bMGwcoPYcPlD3_4?MT8hq|btlUs>yCa_R+dI@EX)Zu z)ddCReI5{)mla^mE6wyMd{eigup%_SxVV$IITl065~efP=`@vUZ7txc`=6<-DUkCp zP}stQ8a|iiHspEg8}mHc*lbm8Y&uNg6+GEdKD*k7qr{|Al6A=>73#>WcJK0C=D~4 z4Rpke*{!m00?RD8{#Fkk>*+b!6pzn97{g-89A>2QNMa^PurX@DC!i6Ng5e)ywkS?_ z6D1p2S!EnwTwvDbu<+RZ!DH@sxmTX5jkue2CZNt}jwmwXyww;StjWn3Tc3A%O^u_1 z1~XY;g%%^aU1v1%zYcAW!#c-Qq6yZ;>I`Gdp#hn8!j~|bU)a67dGiMwH||)vbmtk( z&c(rdpL*(tC!hRjw&94ujB$Kqn(oN7X-B6{{e8lOQ{%=(MHpjs#=8bhf=dw=u?DnX zm?hb0NaMJykTA?yC{b?hk43yttnn+>`I#}ASoi2kU8M?7-)h%_8jaRsFkoEPs?{=w zS5>a$7?hk#5t_oax}g;e$bd%#Y+8qZ0UQ_PYHptv7G|_`N-Y?2)c{KwS6R7Y`*!N! ztOe^gVd%RC+Pn9uz4R2u-`SE@XKC~$Vdw+uY%qiwF#as&ybAXk(l(O9di{>oCfZU2 znY3IX&ctO-lKFB04`p7k^Gd?2Prj91XeEnEe59bURFS!1rbTIMC! zc432uj2=7fsl|Bd>v$2n_iU1}M%HM9yY~toJ^d+srqE%u?|ty$!L!${-%m`>Fy$2# znoDXMtaeGIc5!w0)cFSKL)vxk(|6G5G1KQfwS2=y6c29$Bk{lGzvgcrHH9@@WwJT^ zQ3zfpM$(Vs5x8&5N&n9|K}rRX;weWeqGTxS1MEb5}^Npl$Dz5lE9VfiVFDMso-g;F0% zR<5QTG;l51CinnM#yZ$fbI*oFkmPd;Ym)a|8(H?(~e;}R%iRd2;=5MJxu2-U5 zl_Ub@{tMDTdX0tSds&WaN+ZotIpZnaC`LJ%3YD`dS+$LFR0rU0hr0{)s^D4yPvs77 z2aCtj`0wJfID9DTJE_TKIzDgPjSrO{bLhq<4|D(22WfByh>U@j}+Je%*8ZgSquaTFQ~{aXZ5 zC_ZIB@&7R+TIR1DNgZ1v=F{+pWYCC*It$N}t>R~xlRhIar_1#JntWVqhSeLo)RE>Z zUTzWId>yXpBk-Qn6&!Im@f)}fWaA^fIqW~~ZsH5&5xiBN$$xLJ<3E-=^H0HrF0Fw3 zI$+nCi#XC*d8SxE{(p){me5n~#v_fU z>+%kMEz{+EC*$DyI-c*(P$++xy6|i8UG16FOK6X0K6~!>kyH6g4m}KhAioFZvh;+0 z)LO~Ya3{~gWiD;im!$Q{IU7#Gfd`mbE+XBw_(g?KTr(TB)(@p?=De^_UE z{h1h);bD3He*Q`m#%&x;RJX@H`IrZ?0CWEUy9O}U1^h+^@DN1#M{tk9U!k@9Wwg5_ z2^* zjFCUWH;3StOZe}pweuRg9`s0;Z{zw7hyQhYoPV7<1LgwR?$jqjKLlQ4e%QsDhtxnn zCfo3=_IMc9^7{V?o#pXo&eB@gJ~T=E9(J@| zPQse)L&b3F$@VB%lXO;UXp_=~DkMGWr8?~EWULp5VZAsGYlb(mPQ_@P)^hz--X+(xQccCZ0rkm&^^T|z}y`)SLs7We4}lS5^<&X zu@7Z?yk6Mf6%k&#K~JOws$jUGayGujH%FBLJ&FFI%%*kt7Ts_~4eX_cW-9hjEWS@? z6c5l?#Wbu>|1Th3lWh)LJA`>+BK30c9z{CbNi^j)N`WD2;%vKQ4YFpK@?oJ|%TVd4c#lNWk^yoI3NL zK>BBCw&FFcO*>-_+6rzog=38ELOFIZSNZ~JusmMC{bBUDA{Tlo@&U?aa;&l|{GU*N z=@Q)K@@?@k8lhYO{Zq7A1dUgW#d!IE+{7C4Mw*|oeH+%zui~2oD@7xD3BmHK;$=Kv zzoQVvY&^3b!ycq7{ib%qIG#?66lZ9PayNysxQ??n4_YpTAuc=rX+9H+$DEJ7ol6@E zkuoU~<9M#(9u2~`O6MqIVc!Yzxrb+IF0@t{LC3^wJWCmD?&wBS#q%^v%%tbVDwOLz zT7>WkVl^$nw|>_O;gpK<&veAwhj>5G5$qMe0&jz-!3r=9Yz6Ou-@$V52562q6Z%xA zzlIN$6LGFG3`Bwj%rEFES7;-f;LZ~C4)<%JE&5zfH3+YQyBOijJ&5pXMNe)DVELa0 z&w;g0euT^T8Jq#zobDR92LZ~-jfI=gq|-Za8CRTKhnolvIo)^RMuFYnCdy0A;LL8Y z=uOx7$!NnJG!cU70$+r>7h{Yw%yI=oc#b|5 zo|Vg$Cy_=m#Uf5F++{qzlZ|V8glF;NWG88Z!jmEtcktUlM)@#*kmm87s1Mf23BnQj zMC5Uf+>@55;4&~S>Oq~jh3gLV=;JpqcAh|3DdO)zd@sb`gt%U~&hP|d!9c|Q25~n) zSMtj!-N90>y>JF3QMwZ~!T~o(Na6-@(R4ugfDR}o(*dPB9pIvI=>Gw}{4^Pd^<|ud zI1)cuE@W*bb$lak}jKr{HsN75oOia1sZXkpN8Kg45j&_ZKI*!hZQ(d`thLP(&MqYZ$LQ z9mCn(HN`CYNI9L(H6!Lwh8RoVE54u%MIPpieAY&CK821bF_-9bg=aL6XLzmS2m3q(i97{Q^a0=-vA?w9ce)Zt!=EBQ z!G)CY2f*J~@TbQFElm>wXcC7p&za?TE{VEwNpdP&51>W*uQ8CvHRN#?d2Ga26Sp9b z*OC594CL_@(tH)!_3Uj0i+9IXF{|jwYzC>HF9(+lPhJOovB~{_N0s1C{e+>V7SX<&6 zd$uT3x&E48x&Cf%a{V#hXQ?DQtGo`9>5%dS>~cTt7V5b+{Ab)?zBA`5p5?xg=5yZ& zQ!!>-xTl49ZjPX#M&T=J#QebVi|D8@mD4Dm;lANJ$o1%pXnY6r0uk*d$FB@>_@zN^ z4tSa?lXHlyF-#el*6&VTxrgI5XE@$_BgZ2w7uR#8zH|Za$3B<( za-nd)W%p>Q>0ahahp>)6L=UizSPl10{8mFUsKfmQh+Ba43z~JL?}_w1k-jIws&SoB zfOH&jnTtG*Ag{4-FCgy}Wh<&w`fyLH@OcQ852>-ve?$2gjdJ=`5B+^)lX4mzcFbMV zXc2VA;$~FKX-f-USA9rP4!Tnzo@MzCp5#<2#xOEGgrjrP2u_ej&~<4z-I3sS zAXN{Vk2;h#qdr4-zFJJ`&PifA z?Q#hwF9)vj7k_Y@!~cJAS^fV%#Ie?8?=hY4veJ1cjbk+(QQb)H4Db7vq|JIG1e~!-#FdJg$EbP38?bjUk!p?VaHsd(k!dVVG zw_*K*Hr~Yc$`AL+tbMRQWqVn+cV%ZuI7f(V&YSOxH5twzn*GehSYd1Q*`QOii}m_! zz6*_H`x=Cu>~~n47g4?uz`KRJ6yduRbGW_D2(NQ4c=GNA_-zvh-Qfb9k)GxD zauuA1w1C^o-XpMgDrmbZmN&Z}W!j2$(RV@wCj#vCxm_SlJOcL!+-Cn-_|I}_SXX=k zX5e#{PcZ(*{BZ?+BOo6(e_VCWAEVJ%*y&;IiQm7%FKsjKf;jl^f;i5O{pu~sRYcNU z&0X{nK3jrc#+uAr^wT7TE8f*wXqneVNTeiUW4`XH?)p7(mLT=+5tP9;W#H{XQfTJIM#M- zPG<8co5R_B$Y+Z{o~TkKgy2%jSROYv_}B8m{hy`xju}jWb>a&NnsR(g%+7 zlIHuJ^Cde6MV@om_+)3Vj`P(P;}!K?fU{P|7#;KeX2;Bw}qoLhJ@V&f(ZOl4E>ho@H&~Ja2!Goinkq?>M_cpa08T!18FG zFI&tBjyddYoO547+u#|iNI-d69pSP*XYVq^WAu_^9(k3Xa=2p<#_YidXIeUX5_4jt z;ud|0K6@U0(UG11I?i2@C+|G_bmZ+kbChtF=vd=posT~ImbD-I%#XAV?f5gwz@AY* zQ>;3UVqI#Xe}gdASKr8K>dTl1x5Dpy7PIFlA42^EBgzwx_CwmRt9KOF=^fQV`b;we zbM{mgCL5%wa*ire&SCEWVW)&KI)gn^uooYqh@m~wHu{up3@`?~uphjFakX6d0ej7F zkfr1#`loDcMpw#c`{8C(Fy=^=z2!n@5Eg+!duWWd&e z@SQwg*hOjVy)GZZ%|-eK*s~Gsm4Y_-3M_@bh|k3yFN-9;6YZ4%pY6HwMme0$8(9ms$--p#j{cMCh^SYf+- z2m4+F(pfkuV2{R}aXJ~Q4 zVz?_Qjvs^b6aYK-;7&qRrPsRQc&!%qxK1@m|8;4IkQzJMEEbzbDggq9| zhkC&FsU?Vl{2O&B2f`bFLpe4>XB+@%A8P`_(Kc2+(!oC~t9Kn>_po>yz{`kp4i^ss zRK_|9{(Vrt0xUjg%trlh;@TDXk*5`TacD~p{lQ#PBWxpB20llexqu}X2|x0)W&u0W z!LQ;qvUCb??H#xSKsa=4pKW6S(sT5~NVsPJ%3!^Yd#*KwGo7X5u#H}D5zh+yVEx{R z_Os%XtqrVBb;3Pf;4`^C%uZozDx7PE@|k$=(UCGh7~hfW3VXdGe8qVQU(;O{k9&^p z2=SQXn{59e_Z<6OJ?o2n1Q$tiby+xV0GXi@1MdU(Ghf`UdA9qxmm6KR!&3#;=Oa6MD-(L%+k1k)!!B z_M5yQpXA5d(H{*-u%~gvSy!SR_v7rZ7-wf_bE^veG_VV8jo%7wjDZ^kK4&(J^~)|JkRXZCShD)>{>6wWqtYgL<)luvZ3tZ;-gz0CNVn z73>1P1B^Q^4<|mTHy;f8fhk}qcolpJ4uk6;16XhZs0E>5D3}dagRNjcxBwo2QalkP zfOuj*fH5g90-M1n-~hM;44@oO74(xr4+elK;4p{+3BZhBniN3@hy+iAEnqje1hTN= zAm9gP0hB|Dawt&_WgbqoFs4N|@n9i%0ib<+(Qdw}0PW+4_VH^627{U4Ya)N#>yLZ= zaj*YofVT8U`TK=%?2YG-n5D8G%pw(b2*adzEu^mUOlZW}EK1w+AXfVgcCx6M%y4YENkk=`A21n4V0`bv+!(xb2R-+`0h zF31Nmex=nH^Z;YQ0i9bN8XN`D0A=fl>tQHcSSK(XU`%#e4sL)Yx zI`|qK1<@cI)Dw001f9Te@Hlt@Yy$_uWsnRih=qqrUXfWzOcmkLQekO_t1{gaL7&{Rd4-ps-5g0oW z7&{TyK?cCs8G^AhBoqt<7&}8&gRNi}_#MQ8JYXjp>I1riFjyVEu0?cD55{>l(u=}yF`>{`h&EOM&cw-T7EQ?o1G)@cJ zgFyf`F%C8`?hUX5zy`*_2F4jd1JQWczNTY8t@L- zPBaO5ObP{ui6)~glTnt*xNq_SqA8sK+GHxqFcmgF6*fM#o@g3uWg4zc8x9tNe}LCP z4bgNr@EiW-*K$xoH1irr2e>v1*JgD9L%?HT713j`)5kCw%vOOgfP81e7UoO`D*)1+ zgE2VgS8xMlf?A@vsMlPiH5X~kMOt&81Bg2papxWdaiEasaSr%`9srI1IPBr^O#pR& z{6_$LcsvoHtn*fbc>EmpIDj%d84eKVNyK?F3FHGCewx}FbOW%7r;x||DaL1aX%l?oz~EinvP=cj-#-7T5#MfP0{TXc+<6-m>ms0)U+?dl7sJ(C*8w zgAAhOXxrr-0qVE>DX<=V0MM?>VVlb>L@O487r-`f5TK1#pdDA#5Is8-Am3;2gCe5m zcn|=>!Al?tWP@6wmB?!)`f=qy0K!(m23NrbSHT8X?FXpmss{jhuGWH3@C-oSt3L+& zh}Lukqrj739e5w0?rW}q6i`Vx4hA9M5WYSJyZQ&xTlYDDe;vxRE{$k?4}dzaze%)V zJdlYtz79~wji}?s%ODw45IwI3ZNWe=9iaTr#}I8oe{Pxx76RDWW>3%w3;-jAvZ z+JGToCV-qr9mY2civff;x+OrKkH&SQaorfCW2^%9fRo@JcuN%0lW1I40C|ni08r+} zF9r9BCLm4|)&PVtu`Fl|;D6#cun6n`$G~myooEu$GYPVpgs>)eBbpLS6q*V60LU&B zvJ1ueP{=NH1%Nz4&w@upVH!X@!jR^v1wbOvG{}A03~-BRdM~0GB|r#3-!KDlpJ@-= zK}mr8o7o*8ZZi?LnTY=^l*3slhqF))XF)!*VgO`0>jlwl732o}z+`|l&v62X+Z>el zaFn%hl=pCy_wecfVTB{CaL76wVTB{CaMay!_?=4t`7*ZAe9I+Y11Ne=2Mc6_CAcKX-mxT+!R&a!9Q7~u%E&!x& zF=VkAvRDjREUp1MfJAT$yd!MS0;54PK)x)U2EGz4L*6e#-Y-MmFT*{S^#@^K6*vHp z_sfu`Wgm%_qwFou3y`Mei@|Pi0^9{(h*ls@D+U6Dz2X|SVIXZQA=j1X0OX1wX%*zU z$`2sFR;>d`0P$Hp3hV>8*BZoq&1-ymv?)LxSc`bBLp;|Zp6e=smH_uzhx@EU*F2M7c>zY%p~QxQ-TK*pPKelyN*_5q#2 z9-=Lf@0K>8510%f+pRsp1aO{c8_LEul#OjD8{0M!ZFc}DYui!Qw#NXJ>mA-;2hq;l z0O{XV4y*)_(=NzqcQc|r@UsVg_u{&}y})J=PqeQifLtQ&0LoS*@*%Q5K-r2M2Nr={ z;5fKLw4VX^+g|~+2jjph5C`sn&qPs<0O^jZ2D$>2k*Fm^2arDpP#zCLJ_j#>XGDjl z0_6MQQs6pKG-MKe65In{iDEJV$SbB2XbBz>#g+yQ0pt`5ImIIESX>v2>tbKj;Kde&WLcWEF1#kY7C7 zkOb791jsre2-E^7TM5Ge%0R+K0KW;>z$>C7{fUk`1B8F{F%hZ{CAtDXu!-oHJ3u;) zjRbSR1`rFbf|o=|8ps2R1H>~4X-OIjBESxC6eNSUM91yHGNKb+U>4CyPf!Ll0?6}| z6Twoj7n}n3!8f8)nL$wif2Rh4d0;QN1l|#y&J2nIr1dnyIgM~muO&K@1so(g>kI0G zaRBl=3)!ASJv-MIApG-1KwS_9(2iX|oxjiotO5@J{9i;^7xRI#pf>0Xb`o964$%Hw zY6WobOSt|r|+sBB*<3~h)AWcuY0LbSl?)@|tT*b0(Z!n4IInw{D5#jOar*)!xnG|%b*nj()%$2Aif{>gJa-#fV6#LAO|Q0s({7-ar-l> z@%elJ90$1WGp_sm8EeY+AQvbMkk4OggVq3P{xTZO0L#EO5DiX)Wbhp5Sl@L9c>(VI zwHjy+kdCjo_AAo(brnE)F#a3(3R!-|eZS(qzw*t3wP3{eyB7!sW55EeNf!X+K{N0K zYv0p};mf;>27*K2J~5UHR0U&+VMUtpHN+%*$4N>ASHMH?ff&|lnd}1aEhKp;;j2`j z8t4M%0DR{N|LQU9hF~f-CaVZn#rL(;ZUAAacY&3dRuxPG8v(xLq$PoC;4#2Ahy=b` zgePN|@Bj6T=Igcz)CDDOjpFqbri8|IRX4;!#%Sj zjoA@)_NByfAg(zPpIqg^OmLW3?%bd)xJN8cArL{#O$CsJ+ZAH&H307IQ48RDj~m3W z2FUUb2MdUKB7Dzw0Dki22Z(RJYs9=z-n zyvu^4#C#C8&kztvtdJMjL#(h5XhO^v@$#KdtO)+EDS|MIOa>@}MJ^FTH^lsqZoldP z-{|s#eEg6He#iqqq}gvTNCb$RAM(KO8!><6fxjC-9{3{<{BaNeZUFh^EnCy7L?IqlO0R0=UT7v-m)keH)FC|t7 z@vHNUSY61rF4A8wGe92HgIoQ@#2TO;HHZR9;2J=FG=R(-Laq&6K><(#R0qvKH!uu@ zf`wo+K$&ZJ20*5b5Whz7-w5%-IvQ()ve5{6-3aF!eIVA@9YCIq7Xaj6la>H-ZL*43 zQ{-V&gxgF8o?rynO00P;VlB!Owwi%?;0}0AtW`k(|E+cdgx$I=u{Nk*Z4ho-l>N3< z0OZmR;k7Fbju2}P`L>TD)*&P41K_{I6Ji|$K`*ctARV1@f+hg@-3f8;oE@ONcZR*o zY+_v{kO|}k2)irN+qEY^UUXdo_JEV%9{5VE8~k>Ith-eLEx|xA4Xgo&z(w$sSa%8J z0D+(;=mUDP0$gH1arYA5DTt?=fno1%npX%!TtdC8EbZI@D^f2@`BQ!Ay^O4#ty9m5dP5b z#D--B#X(ch7fb;wz%4C zmjTMiM3j+<`9N9F81x1c0Pa0;7dQrz0n#%G>6wJ|OezWLgYIA)fZs`o=Op-@1izEs z6Pug?Al%6acQV4AjBqDU0?R-&!2KuV{!?)ODLH^Y_zfWKQwD=+U=26~&I8CP6mkm9 z2H-aoenZ=X;b0Ef1meIQ@R?YcBghYM|1gyEFr+^W_YYeF5N6m#@RZn8ggG@UC<3a1 z)?gsO{ihaS6yCXmtv$ug*@SfNl4d5PgP_O5p4Vse(Zh;TP!X1DY2nJ06;vPO3ECuM#!qIPq zqaOh7V(W?n7kJ&Jx@B8)y$;--LYM1pk}hXR{lCthb;pY&lG9Yj5y7v28s-6tV4H!DC`OkggpG z#CCQfw#$#$Zlq<83E=#mp#bsRI}AjF)5P{cHv5ndkw|;wXkz;d1IRQgC%`pPtBD=( z1<11l$fE;@%Yl!?4mtvq--ELN?#>WyMtAuj^vO0o%I^qf-rz6!tJ8+%YQKb7Q{3JF92=^GuMiS(jGz3fs z7&9dy50Wkcl(nR9#ExeMg+OJ1x_P_@Ks=8x1lz$8fUu8$Aa=qGJU~T&_?$$!JXs6u zC3eaOR01sl%KoX5;3TorD5Ixw{TY;*GlpzK`O3UIFr zH^Dn%7fk^7x>yP{0Np?cI0O*xr78er?-I(>r5ONWU)l#yHZDCUb~y_u3{Vy?!{6n> zU=o-Q;P>)AfN(CqCUzx1KzLW+?+W}~!TBo>h+UOHCJ+cZf`I_>y*d}HA$H9P%mGNB z!S5*Rzt<*q-3PP*C}YL$umayfu9myG;NMjj`B zB6drFq5$!{?FCQ{ZbKHg_kc&lQu2VNU^+kcyT<|Q;@!8z?jis0^#O}P0)PzfLoW9lf*BwZq!4?6GVq`T=mchiIARYu=m4$& zo!FxV#2zE9kHd*!`HTHg4y*t#h&^cpP7r(Q0wBkymx(*xp!3n>f}4b?R{JDhSBf*ar|aV0-E4?YlA1*ikM13ZDFUL~&O0?ok$ zupOKOZ-`^av7;6Cx(9v}ojK6%Wb zAHZ=Qlz}|(p9eC@V*%$t3V21_4Ki}W7n9u@g8|?mad(sv_d(z=aSz7yBQp%yJedCnrazOir22#m&{y!*fZq{oQ$0wkfIc4<+W> zY<;D_Q?6pP7zyp<4&b8d4UHKUrBA2e6u`~SgpKVNJTd@)}vLJj?& zs!DvZxg7kes=GO>Iiop;Ij8EN<~ICGS&TC{@A+>i$t=u@naucKz$}|J;|izTX4NqH zQodBmXXv8hPbFuUv&n@;Makc${L)P0sF%r^SN@A?!T)R3jJHtjrB-RGQ@ZVk%fDlG zl71-o#;0jA%2~|?%=yed=0akg;qo(7d7~6;Q-#G8DVRIqObe;o->5pGoK!<9_fJ%5 zlRaPXXC*uHhG{Nccz@pIKUDp3jZI08a#5QqA^)oUWhmhx=D;j1O3J1GL3NT#o6F0k zRS$C}b1pTHabAotT;wwUsQ4mY`2Ua!=BcVUH&i2=UYwWZ`TkZF<%TM3=wh(VZgWvH zh!8acUjr9Er~sR8*#2WB6*5=g!YLPT%Y`}ElvOHZ%4)7)4&c6jqdM{qyiS^`#cS~q zypG&KZkF!$<6Ip+gU?VM4gKFxv-m726Q5v$t&S#rlH$Zgj7xT`&A(gKUK|N>^4``#PNM5o662h zrP)%C|6RQlu1i(f|HbwG@^XA#DM-r6gVIznUJSYJ_(Mrmr7AqbkE37AXHre>!d>Jp zhWv0?jn6|P8Aye_YcYoY%$ zC6D~6{?U)@n5s+}|EgrKRK>kzC#VoPqs=tzf3JLHLpgCDlk#_phw(O|s?>_hJkn(1 zaeSs!M3{tx?|NxwH**%VyV*m{CM%NtKe!a(`$Q&T2G#jS-cG76+X*+3U8*e?k_+&W zyg5SMEc;4z<#FD zzsR@p0sjp(T6W~&oN;E7pmUQfvKdFesK&hJf2gkW^8d9`J-MB{ikC=J6?k8<;2-n# zA6?|U!dcGmApK`bwBhA=SE;R`r8#k1-M}&KH==@F^mhZrH}Dm3AB6COi6LGLcll4qGRnX-UPCMT1VoKwytuTFDGJL2c% zx_q@9AnNiM{!I$Oy+WiAnK_WmWX3=8575)x|LkfEYUNCV%o)s%W=9-JW(T>Fxr*7# zDb3_N%$3zFY8EH%WHwAFn<+U7JD~|7RDSZmqomPt8@ajYBDdxD_!g|*MgXfSMeyzU8H(aA1O>;DNU2cN(#Pn zh>UW;YkvOoE6hP=Z>JpQVuG2g3NB=kMPv{zW&H(Ts%C*}ZX&)!DrU+cD$2#AR&q)|4`3oI_vdFN zZ~mUY|2zLb{H0!nE2H=vxuM)Zt}i$JVM6!J7bo`jk!rVj1(g<+N*_8l8czddl03z7iK53vzk-QWiDd2hwhv{ul zW6TXO?#69ZGKJo@m0dx;>E!UE3@$I~;2o_yMXE9Xd5w-Xz zeod|?YKRW91I9P*Vm^PUx`+Xi#uv&}_#=LU$Meg)O{$U$@ko@>zI*{j!v4Zt@)c!K z{@e43@?buY&y9#nu;55&bz1PtJL4fQQ2SWD*2|4xKc-2qOj~Km6gYe zMPf3qF6YM>sRYj_<{Kk-FwtrU#2&3|kqLH6RU_;=K&0T?R{kiF%a+#O}4 zA4rzH#czD22ol}o>ihx5zYJqlqr_x0%8rA?|A0Dbto%4-F_)B!noF9qJK32_$o}RM z=4@D5=_|SN%2Gzv(aBj=uw*mLYTS*!CanX}MlIzHIAmd&9jcCDl zqGxfC28rVQHGjh&^T+ZM$xhZpWqw5Tl^e^AMPKCAAkl~KYeBjpuSaSv?2 z`QQ6VL!br=C!vVU!d_k^FLKH&Tpb)mbJ0w~9_ar!e&(|Lvt%bKi4yz^Pl7tlpNLVS zzhvTfQO6;DytRtt8BQKzhSWwH#Y5!zVu^_0Rk$0*`7=Zh(OT|}5yLpSGFp$`(in4T zuFHMoKE@G76TNZ7(XwntC|&<7FTPteLmy(N3VuTBD0MJplV&=(%RWwd4B1KJNs~k6 zP}0cAMopRk-7H*rEtpIiNs@6)j(C@hYA#I~NWnFO;Hr|0YmCn_n#BsE^}_d{%~Ccg z8-Gjq&qZpEe{Ae=tqCZ2GuH^QP%M=f%00w#d4s%0UhkkfWN^^r={!YrG}fwJUKsDI zalxOv4*1i|bdSjH94>8u6ir9UiXu8|5mq7cM0kh=t}*^ilE2o2o#dVJPHQQ>8Z*;Q z(yVRu2%bT|sAsUY({tk8#|rsaJLwZ>8%?I%)~>o8#o?9?)^MvG%fX7UlGa0dN%p&5 zpTew%tt06)J!g*A>$*E@uh*tI*84hV1t^ldtPicvX)JA_2i7P0LDojUtGBV)M!?p< z`WfHFcBd&cMK@c|vTn4L8tA#KS6CfdLWOh>y$!3Ox1nLWr|w7(X(jd0^I0#jx-^Y) z!FG`irwNo<&!>mdRQOx17uQV`g;470rS+_MTkS$>qL}`PTX*WCsC)>g=?Hbi0*Pkmhx8J7 zB}^}TjnikJA7bB2*OLxX7rnLq_{t?ZuaDKcq_|UpK2jfbKOZe4Ss(KvjFyw4k9rvj zQ_@Gi3}fZtUY{1zcRE7Z@ve_&da&-3*BvP;uiq;lOWk4aFK?mWZ1G7i2iE@9t<1gG zQ0r9d4klVwgt?OiG%RU7rm~SbO%=6<%;#4o{?3|cu7~RCt2C0R_*^y;yz-W~CZ z4fcXrjYc;3!I(+BHgS8O& z)nM*mGhmLeexcZ=B~ed0vaT7OP%5iYXi^=*zl^r_MNVyD^nx^TZ{0(BGphB>cObPu5qA>XL3PxN6_XR)t2w)MKBkEJThN9kxYW+XSU>W66a(I-c3|E*&W0n&m7 z8#SsOs}k}eP9H#tA>|9{S!mn1QC-l)+#HwuQFo@@6a9pqi|$V>>Sg_%c}?;uk5G5R zFpegB+l~yQGu;cl@(Pz92rKeQFUmZpMrP0p(aLF!i|N17qnR0s>)DxU_P0w2?9%KK z-}MIcX7;OIdIfqg$NCWhnlbNwEj_1YUAdTEN-u(z1?37fg`S_x}U-f`2_;(8Od zbd$10FTjd!z7nJlWzJi&eztbtBeq^Ds%K@Lw?4F@IMm$gQAaP!Xj`!y$m}!Q+;ixS z>BY7WfqG-saNFA))*xPe`-K2pHy(zbo7FOmMlAdG^M$ROn6~4*zx6Ad0t4S&9%&dw z>Hf}he)?z{v(xo5DtiB2XNw>yeRrLyOi$?Pu2bIDFKqGdGrqbL>t+}(tc77zWe%xE zM#Jbyr+44;N4vRX_gR0G1B>D4Ob_;)F0AKg84Safb=Z5V5acq*FuKv6z4smTY^>wH zlRkP~dbiIbKp)Ji?K_zbW#o^2uV3nd4U0VCt((~>!x%sl4Py-TgJF$jllC7kXnoH{ z8^(9G3P%fzjWvcbmSSO`!3>E?DgdA1hT+Sq8pa5kXc!usa^P5g zJr^?{IOYPw;lMFhJuho(IJT!A2c#!@dp6EE>dWdHMt@2+jErp5!9*{;BFk(T9jKFG zbfTGtF_JnSOe}y7J~IapcWP8Ac6yV~KOq>(O}QXegbq#1%yE&?wGAsYY(SA4SFO zaMfGTx}!}^dJmQ%@v|Qa-<{)Vp_YRe>{D}i0*_le^}7_hh56(h2}Wy`o{BNWM%h}QjI6|-x>j@`=XNI7MSodqSB1u?ftCf8<6y)^RI;EDe_t0}5+a#?!}+M* zl)}URD5W>2l^cD%A+VcpZ!` z=H|S4^$cV2{Dx?W(~RZ&U%DasJNCZ0idwca^3@d>JCa}TfDxVidXwRJ>(zD`yKcSO z1_AAe`d~E3Q=+FggpvI6{$^zBjtkE>p-}C-{A2?p^T&!ix%Ck&aK+nqINGs4{22yB z)92r-3ggQB_c>u4-+!A>=axRnzKu3P6vpt$7_gv0rjU@$Uc0P2Lnx#?#g0pUu!OdZ zyL&5`rjM5rXVUdaQ4b$eNLUmrL7S#8IgpDDoVjGlLW-RI^!O_pAHFJgIEBtza#QTpBD869*wx}>*&Kc) zh*oX3T=Au;TN3e5@QN*$FK442TW(w~#`10TzSNNRZeRMWAT8a#^;$6+zjJl&SCqJG z-nr_Ov}@G^M?A;A{agS&+I8w21_isP=37a7_C&~zv~SP((}n5F-q2UCXy)GarwY;3 zz0Xd$(dB*PKH~+A`zD?Ap-ub3pkLj$=;ceBZl-In+tc`cdrlUj#K`F{UZ9m*dBU3x zMy`dP7`YoRlOoTY^rmh5C*a!gQK3l%&|FQ2zAI`j^vO}Hp+`m$^n?Qwj^(Ev2PQ#3 za9|4b2?xTU&o~ePJ@jCBq8Cj$xB~X^2RFjL;-H>v!dnU=j^?9rhc+F}$3`Fe3j6fK z>yLQS#KRk*huZXshquB$*`_ZzY;VoT`bN)B$V-c&S3nPo-UR(j^xjW`wTu3g)QHx_ zM8xN%c`>WwJ!opoX6O@Rw#R$0_A#H2HKdy{Ry1IJVj95xT^=xIM9XXkHvU;-D9fGsWbg`SBZKbJMAWnb&X9 z-Xp6EJY@XH-VYsV*0GC^{3tGI?T0t0s?jeBP|C^G?>*?+$@neVXyK_hm!8qK)2rU) zrI6F>p8C@LGY22%rHHdPZXAN)&Z%dgf5Nl)O@DLhF*ZB|jqT zt;r)i$dckVc_!X_FvsfyMOliun|Mdi(T7X1(Ju5!=yMmg_UU=bLh;XHADAfg z)$H%>Sgkj^9n2K+E_wCu&~L52PB9;DnoM-KXk&+^3HIRyb) zQc@_f+`-xB7#@+f4KC9ruj68y+T9u#Ut4K5KCX`3c*2?i+51d*JNQ}6iQ7kb?4NwJ z<(DQ?wvT@76c#@CLya)m`Ca*`ah)?IPL1!9@#wUNm0mucxnSt)8nX@#`o42^#Nb!8 z=1ds$d%-zTqn!Qc#P&;k7yc#thdT2PG|hiv-l0bMPs~3w!rp)WnX20L1si(jJ-*;_ z;FGEgt_1#3H6pZ2*;5gR8hV{sc(_5nvkR}4%wK)c;rgEE7F{j&N2NtB-JfS!$ohce3sJ7 zVk+baSQb+aTEc+eD=s@z>_MevUtU6E#qL#Fez1Z2+2yg7aukP_v-omL#T+FKt@LtB zrR*h_pQIt+#}W?%SKcd~QeoAav9G*V?W^Qk ze3hlrZNJsV;p!K?Zs%EZr~K_wYqQuVmxFe@+**%1hsv(o(dvf%y4OQ*WH+=N>)s5# z4sF==?CTA;^=}4W&$(e|C;L4ccJ+4Nu_3ad^SKQP4NleCkW|Cjf5ZLOmrHI885CD! zpV8_HE zTE!hV%U|%=IZ2yeWar8O=lpiws(!+6*N#pf19$z={EWwL=W7dm_N?yzyy%`??N1lp zv%l$Sr#<^Sil{w@swMdCT{iS|;k~;CpFXj7@1RqK_8uB|vf$oC-wTEJp6P+Zr-2uW z>|5Pay}IvEw*YwD0^-*seD_QDEPVoDY5XJsEf+-@cb0&U^2BIT|NeCTJ$} z$!w8p$DHtvJlq6YbU(H(($Xl&JMu)I69pnq7dsIUd9Ke%pUC^|PIyIr_y8{->YVW2 zKdsf#y!$tdK3;IYr9Z9RpU}YByx+KD|EWH3yEFt|uKAt_+J7S-4j&c0QFQ;?w<&|8 zrnOG=jGEd1O@^qABa#Y4ZEXf^Zx3iuC7xxAIyelrv!2f~MVj~{ZcW4LuK#OhI^QpeE@g2=>vGJYk^TZx+9_Jo=A!odM z>~*)#)notAarl`fxy3Rbn>*I0P3#BD0yngi+xr;W5NLZoxqDdl4z;*iB1hoxU_WS< zZidzaT6`;LM>;@DY6tDqeQ4Lq8(LLpw@MjWSxauqonf%u4S;sv1KMNb#1l_wFL_)+ z%V&pUSuCH69(!r|!V>dXzNr=u3$4Xjx?pHV!wt>dk})G}x#1Q!ZfI3ClaUUna4gPGJTO75t)Q+Ft>WF82OuOiS_){%n+~Uvs$7YIu5ER4XUlF?P zFLbd%!WQM2lyFvxUkIs~Mt=(gXV-I^qJ0xA|vf=6R zBLR_Zj$iAs|KjnNwfAH@5uG>Q^JHSt$W~_#x7E*|J=k79bM{aN>*=#Mz4h`J&-c2Y z`{MPU+nQXw(_?GnOV~=v)^aZygV?KDqVA{)Nl!&HYY2y}iBNs#Uim%Vj-#`)~i;Y#%28O>rBf( z-w)}Ov+VtGopO|Yc(?MR$j6sGKfQQ-!y&uFIn?K$i7n>SuFKfHaLf5!U{S3Tc8|8S3Tvrngk#g|X# zD~gYwK7A76^Y$v)lRxjQ;+p(*Sr5hc+t!}W?%$^eNz(VTwYdDfSrtjr?__)PO}AP( z({;?|b#kkfLa?EOrVn_r$ZM-32J1MF2N$gJxuW>01GF1jw6Dtt`{ZozzB=scwCKI# zoA-<20vF~!{RQizSf+-OVOZ5K;*-N0*T>l(=DzEe;+0Y$rBI4*N3~RKNDl~GVgSG3{ za-(hy>ehB67ecbg%XXD*#T)|=6>Ikb>+L42(VMZV?|>D4Cvv8YlnMT`VsMiU>tH#s zLY#|oQyy|7ck-aTSbNWhkn;bBA!hkM9%ANyBShqbEuQ)Q?Ueu5=`PT|eXl|MR!2j> z(6Rl%&iquzj=k~!X~!Xc{(K|!06q_TAP<3Fl=p&Oj5mWG#4AHD&i$a5;5ng}`8XFUq1i_3GXgj{^4T+na6fGN64&HoaHhj=k7qn;v4*NAwxodjK2M zcR;5;tXDrAur31;E7opc_dZ=%i-80E{8>Hd0jw(YKvo8NQ5FEb7%Kohh~19k|*4r%Q7;?ok_V*awvUGu-fR9o~%e^Jlo#gj>#^POzzvhVhS`QTI(aW>gru zOukfv0w@r6ZgXwc*rDEuy6x(g3Vs-TBzSY_TBZF;yOanjk-J3h;x~&QF1|GAR!~Tg zci^kQyMgh6;equ)0LT~^9`FjB0_(vT&hA1DM?z4Jt{$x z%rD?S=*(!9r?VE!i^+JM+is-9NR0rhh9?;DekeT0m*&RFjWXcc?${5}Q|g7CVSVr~ zdq1f^{(&7W#vsiS{;h0*W%70sp31@g$PSRs&#SQk5IbLc@!kT@wZYyEJNE~OGQar9 ziIN$C|K=9qU#lhfw{98!%UVGzMFE7(X$IllR@yu5-Je2r!54zOl~Ssg+EneUhH8T} zBNak%Q~cF@Y7@1OIz{WL8H+}#DdVVZ9>$U~J)`IJf?lF4evSJ1mfq2ObXXth6Md#H z^c9~@`HoMapd(`p+h!$fUR3akD~$@Zqgt4($pvI6S;{n ze5u|&{hp8}>`)S(vP_RhGb$*}m6k|5rM1$0X|*&@S}1Lm7Dzj!&C+%$LRu*;m6l5@ zkY8J*WzueGk+e(NCasdzNb95x(ne{Mv|fxAAz~bMxMOb&cF0T?Q*5~~KpKo(7%GL6 zEINvw$hV(&^(04rj-N;FU&LPH%lrzz%CBLM<8|y5xhX~nJe!5QiQ`95h!c4t>`DAA zDcE6B6Ya#$a16N@R?4bH)OPAHb&fVv+lRA4$*&Ywebu(=P<6J}U)%AQD+(!PR3EjK zI!K+N4bk@6uJBZfs@`f#b)Y(3>!WS`%N0IKX|;gbT6CuswTS2ih|vBI!T!83S2edB4$N7_T}k@ko7K)bI!(VlA0wCCCj?UnXgd!xP7-fHi} z@1lUXu6@uxYVT1RK5JjJuP6@%g}3m*9^tv-hW1U|)V^z0O&27R1+(pgH1@Ab*uiQN zw}d_Rl4lUNu~*7TI0$Ev5j)E>i)`2{nH75-T|`ciUE~nCL~iT=a>LUt?%18;De?&~ z?0+tdor6V$pYRs}*hN%S6vG~x;-aJ|B}$7DVwgB8%80U}oG6c7L>2IiQYGwbsVu6B zBO*mq7r%)+Mowd=%Uz=^h+3kyxF_m}y4c~=L^Q%K!^WbixG$Pv-$)DbK(rQZuv@wn z_Rl;N?L`OF`A0@ufEJ;n=q5UeF1DRYJ+U{c$3K=;(M$9eeMDc;U-T0Luy1OR7%YZ} zWnzU`E_RDuVvpD-_KGcHtJomci_K!A*eN!NZDO4|PF*bGM1qJH`^96Ch@D5r#C8!W zqQn7lP#hA6MYM?v>=27( z7M93Pu(RwOJI^lSD>*mWEtbOGu=h;oD)tSV@!W?4c9s_4{&-3#m{-R>s203E+S7h$ zM~Ct0*r7KQJO1Zm&*3V*9(#;-^Mlw~mc&o+Q`jeS8TH(#<@d3h>V<8G(kIC*IZ9cu zFU}8p!YX3NV`Zr>cKX)GuJnf3`P%`zTsmQ|S87Y&AA5qwN#msn(nRd`oF+||!qIju zMayKgQ7h3dtw-w=DMd-qQj8QQ#Y>6ODe0_qPkM;m_Yv|!C0Hq^lvgS!6_o+X5aqBE zt;8r6B~D3DjwnafvFbwgka}2+SC6Vm>KVJ`cF*lzVW(X?Q+rbfQx{WL(-c#82^gbjNhh^uYAc^vLws^u#`+eJ1;Y_TKhB_P+Lb#yY))T|m{fY1(vchBi~1rOnpn zXyMviZJst?TcAZ~3$;bsVr_}GR9mJk*H&mNwN=_`ZH=~8Tc@qpHfS5QP1aDZm!nwisFtY3YYEyBo9&qK z)c=7L1W@3&k8}np^SOqqejbR~d2EN&}ktMN{>;k*SUMV@1 zTuN^AYwn7N;;H0QywKJbPzs{=^HB<+EjFY&T?to~D<_px%30;SazVMMTvDznzbiMD zTgq)EMY*GPQy;0%)X(Y{^{c9DvgWL1{6%8(sG3$stE<)1>T3oLYqAV zeZw$qxHdu?2{lR^t&P#fY9ZQqZNguU#%WWuP;H_%Ntt)0=% zYUi}`+6C>Rc1gReUD2*;x3t^ZO)Xiwr`^?3v^(1G+I2NVU8G&p@J<5E0p`*&v}(qV zuJJ4!?Z^qV9xu>J)J3b%%jg@?Gj3OQC_9y1%5K!<1Y7-0vU~MQEP7xp{J$t2l>HJY zV|cb3qsD(2hy61tp%&#NUj>SapwxCFKh*X0&tCCxKohqf2R?1+M%?M+RZs6RJ*CXJGX6qnxL;4+zc8R#QDuNBxxmr6@*4`7mbj#@MI{MlLNe zLh6I@%Rr2irl?`+bc~ja+S3R1#%Oi6{yK8PyBt>j-MILFDqTCr)baSgDuaJF-v6JD zT7PM?N-94joHt#@jnbvuD_zc$(k1<~O-XN!G2SYOk&Q84vCTyOW~6~Pgg}Nf@b}X! zyfMT0D&<_f#(q9#6i016`f>afb&^hDKj0ZUOXui3`uK}^z}C>8SmD(O(}GT z?$SNHKlcH49X_JR^aop%JXsMch2cpYqsN^g&6H+Iv!yvw zIQjykCosxak@OPgkzU3crkApw>E&!qu}#xY}spr`uaSP7GrkIE+lxZ;5)^lM-FN6dtb z*|8_)a1z{$0%LW-xUM{O_<|qf4BpZ5=QB8mcQufN8jM*xQttsf(r=qv{kW?!D?z)U zx~mP;9_j>J`(VsUaw@*6n_6G(u8v2oUvImgkrGZJ_)@7aWawv;Vjya2F(pVTj&fN^ zsjO5}sw-8Ls>*Ll4W+hHN2#gQQtB%8ei_TuR~je{l}1Wq1z%TInkmhd7D`K{mC{;i ztF%+vD;<=MN++eW(naa2bW^%3J(QkG8>N@hTj`_p#r>WCF+FH~yvd}DQpS+I5~75V zgEC&3K#s~JWh(rKE8&zCz5H@=HAYdC%@{@D17`_J0_8&Ae;?mTexf|366!hiJe5*! zsyFG^S+|$iY%dDWozOQn3G-A6`!6qpGT= z3hcBtsrGojF9Y7v;HWyO&UgnzCOnyuMRhTr6;ZRP+0`7zlRRo}H4k#vL-n+k|AJ^` z3#ogx`sgz?1iuj;EGa;vZ-LstKi)_u#JFiK)T!TbhjZk z+W=({##n}HYDgUO11Yr){pp4^IJ|KO@7($63+o!Z$KSQ2hBVNAbi-`jSUF*6CAy;Y zs|a7FYuG34jTjoWAsGCqCnaDvuEOex?VQIi=YkNTv1dGe6~-uGc=iXYjhHo5AeC3; zRS}zRygQkVwHR`+h2w;0)nf3CUJJiT*`#7paeV)`v{Z#k+QO=gc=e~M(jI9KHIw#9 zQPf;Ih&P3|#%j_P>LJ~bZqjgDTsj~wM$I+a2YeI^I^*HcIquj4K8$*5)brFaXAo>z zFlU*|=kbMj|Hcx$Ib#)`i(ZeXs5kM=d<&j^-p+T}<}&+uBz!Z-$_P2N?)Je~yHjlC z(Gc7^Pm#0PN`^VW@+?Y2XE8z5Y;5a+JJMo+*!#yWwfVQnH(DmOe5b_P&aA{4 z*liL|Ju|{|&1B4(C*$quhM9T=Bct~8f$t6`OS&t^cRkzS2;*3}mML|W#t4PWMX4&> zQ4UN-*+>n8n?{*N;m8}VhWR7pw9;g}zuo3$tfE%rIO6v!>tshV@t|&})Xv>SE z#Vo0m#fr8>n&$FT(RjR#-dM~15x%N^`k|;3a@G3FImKu>ZLMc@oVokU85y%wD2)D@ zlJtwaq;6I><9{Ef>`Zq>e3dCiJk*&#l`S5|vur=((GR0Ro3h2@)i381tYz60W{ym` z^vfApEoCTMJP!WiE}<>-u*G9_x~mb7Fk3v(y#Dyv;t`bY2Q82C_=hs$p}PKZPQk3w zrfl)}_RAR=a{wq?Jbsmvq%2kz+v0H|-M0~sNr;E74Um3@Z{+ACWg2pHxw4To)Yv%6 zh+2CewdpB(GdIjuov@~g^2y$@ces+_o3rV5gl{XMm?>Z5-*7G-;{}^7{Y(st!P7yE zZv-&Y+&Np%PrwB=f~`-rr=OY5cjC+tgk-a&yAR?E;f}Ixm}#zzqipf&2&D~cW7yN( zd%)cfVN^v6_|vr!Tv4_;%ru`U4O}G!t39a-_2cIm_Kalq%uw9xPwtm+$4l%IH+r&E z86X@MgZss>Pk(aT4EOu#E)45fj4gz}h3o>Z#4{;arLrmXJB*=*GmFh#W_=8WwRi@d zv5huYi8W)*C=|!dK)B6~v&u$G0G+WhHWx-6U=IMjQjb|H*gatX5nIM;z{Pkb#tW)^ znlGbg_=Z}Z5&g6=USt?O+)g`ZvpKW*4eq>rs2~KD-Y; z`PPq*qF#8;ZY~YS+So#xiGF4UK8=MnGJKA#}nA^DS>~K3et5vbzO{QkcvyCnX6P*s={)it)JclI0l z%B!rilq@}BQ}Mj-XEtB{Du3lI)d%VW-U@52k9cc4C%bCAv)x#`)qI)VM!Q%Zhm_jc z`WLeGFOsc)k!}5pX6s+D*1x#f`WJUx>1JFF8QEi2BaAgA%y5ojo$>(I zmcr;J{^wc4TCsKP1slX(u`et}x+Yy`$EC+I{x6lkDcQIy#)V~hkkU`-$D3h232!b@ zW+}6HN9C*Xm3LB?s7rZgb-B8ncU4!at9UncgSvtDP&cVtc~5nR8p->rDQXHIs%6q# z_%JPpmWz+l@@hVOtmdl)@=z^E3+6MiLVg=>>UnMFz?a)Ku^Yn=+pV$Nz#pItXsp{$ zmDZ~uNjRgjIzJSiq_X{!XmeLsP^!Y(EyFlB)wj&t429CeP^yfd(Qe?CT^REjEsyat zTA~n}KE}8+{tNo4Qu{N*moXZiS*1q2Ir?1&8;A}V%7REna4VsF?G z8zP8eLu`nMy?5+1!Cnz|X`Vw?t-9j(tLVPXvT>&A}yKY*a3cHPM#JF@%vy<7%bmS`J81aq@tWy|%kZ$K>KCFO< zk8I}FyT>O77w{`0~)+-U|9AD`Tn`$;JE%fqqX%uiezj$@Sl z2*(&@M^l}afkuUboN2_Wl!UFw(jiKW=qo)w^`I;H(UCjW*4S({u~Z=xn?zrTjS4}8 zRp>$fJPkiD;%Qyd%{^{_$`Q!{+NXJ3yXVt3E$6x|W8+!Q7%4gO+)Z9Ytmzp}Ot*|w zmP4Gcc}Pxt!tZ0#JLkakqBpTReHxPM!8VjV*`uN7PD+d8_uVs}E}2g&t`L@dk#OvX z=Vd7+?`OYOr_U*R4YAVhrQs~clTfo)rDyf_rlQHjCe=-<8_#GwwDHi&>81r!C?-{2 zQ+avi`IV<-wJ`DtD>ergG!Tj+MpA=G!L$GS^c1`lK1omUyYt^lw_ROf~$?S@@en4S#bM{^n4_Pt3y8{-yEg z3(8c(Pt3wk%)*b)!jI3wkI%x7&-On)3qL*!KQ0SDE(<>{3s0+?9%oz@eq0uQY!-fO z7M{A6hU2+7Q$1gLt_sr2f_;dQyKXMKCYD{}%dT-{R~}carEzcOc)2T&D>lph^0;C* z^%KkGt~{<-FZaviiUo7OJg!(#{lt#BD~~I-%>DAXVo&uGi{`F8u2?nq%j1e=bH6;U zSXceTzPT%pD>lyk^0>L3L3 z3000OWmM89etF!9<>TgdmS6MZ=62=?<+xH}buYP{<=6bUxt&Q#`M6ScHAZe{`87Y^ z+|J^cA2+u%XHkwTC0X~9+gX0ikDJ?>v(1hxE^pm)c5P8dqFuE6%YTH@CC+ z<#BU6i(ei$w=-5L$Ib05etF#7&f=HH&FzdG%W-o%i(ei$x3l==adSK4Q;wV4S^V<2 zxt+x?kDJ?>eU#(ob{4-pZfdO#V?PW+gbebxVfDHU)Dyz6;lzm)#bGkCr}hF+|LnXl6`TFzbH_;fptt>+x&FVXz( zvFYEONv7)0S)_lH%1qUt6h@zNb(GpazU&%TcICgy{xlqxDZBDtWv}`x=U#T{uf)uL z6_@@huKd@0&uQ6CeV3Zl-a?mH(RWInA%^ zSIMu=%s%VEOp{HyU$17h_(t5V|HO>7CETmO&glBn+^J7-6B#kO)QxbbFoxCN$;#6^ zagW}Gm04T6HCzQFAK%d{I>)|bpSBO%X||2&%su~CZW(KNzR3vvv+iN;_a`w|?sD$- zPouB!DDL%pF*>#lclsS!k+r!?oUuR9_BQ1SqMEgt8#!lxq8Dz7{gByy zuaLqAnddc;QJPDc^>qsS?oZ!pPrDO67@IO5tetIbo6~m{P)<)XCl+}5o#*v0*v{eT z=eXfKsq|xQ>^*r->B@?7?RZLIAwByWvj>+mi|}p6fTlCkaGJf9zTVOHLVJcCY6p=1 z-nNI`j$?GP)wTskaLj#fV0OcY%z${s@FFg&7EPw#_Zs>aX_sq&1#YNN&ugpGA6Sw6BM8+GNH5cjL75FAV=b9;eMy zZRr7Poc2A*Ie5N)J%+QPH`3mko|*LTGAi-s5Yo>Y9G~?jDC%(fiNob%(-IXEXW z+w0`$6lQ##9-R@L8J!iK9i79xxf}kp4=ffi_k)`M_y5zRxhHLk?aMS1ke0J4;E4{Y{TgdpeS_1VW`FleC-&Ukys{a}9#*|+D)#;78FdCW8 za=MJZsnOAu(U@p#G%mV28c%Q4wb6t$Y+5GW^nVjxLQWv;)e`fsM`VmJ9knDCjPa8D zgUb7}ZYx^NJblisM+^TI<8O|ztC=m>l@~j%`gvhW@F3<`jY!| zchQ4h&9qd>zSIBu#Tj}p`AhbsD)}M*Wcd>bC%@#bRlf!4Z~E&h_p0AzO)LE`@&EkS zsxVPGjPB>Jf3FHx_)|Cy`FEdHVWq76`M(_fU;S2vkN*-{VoHpE@?8}t`Ik5v>!1Bs z#glnR|N38!_wRnuxHcS}#&hXRv!b!->@=IsN?^Q&u@gcN#-;PMtn`!P!~ASLS{hqR zwlf_mm;cmeNNaH}?ZuhWdJs?Mjs5FqQ1qGuA=IFfaKmNC=m-%dJn^oftwAyJ23@T(i z;wApFym|Q#zq=Xv?~K&ub=@+P(J|&GdvSIxexbhzyQh0f|6+a2Kl`z7$(N?-R*x+2 z6H=S)7}nnHx9Z4YgW1;2WlrgnobhDlMvZl&{`cMvg_iq>w>cD{IY9A*>!H%A(atWr7_H3wn5CDw&MUi^ zub27pow>|)TG@4K*~J`=?AMdauHj|ZNoCiGW!JE>YiQZUe9dex%yr6Kd`B#E4Jo_$ zu3YAKOxZQK>>5;d4J^9`lwC)cT}PE&N0wdv%dR8Ju6|_~-#W{V%lqt^>#(xx(6Z~0 zvg_co>!7lW`C3_AzSowy`jlOKpDpv-uk6~l?BYvp*{}PQUA@Y#y;E1YX89K=S$1DX8 zlwG`Ik@?+McHLWc-BWf=E4%J4yQY?1ca>dJ%C0-huE}NB9c9<;W!G(G*R5sOEoIlF zvg_uuYhu}TQ`vQ6*>ywNb$!`&UD-9E?7Ft>x~A+JUv^zxcJVfFW}&Oft}$iTm1P(A z09m*z%C5^Z*S7y_Z#j+T8SO9cg#Gy~u=EYEa_us5zpr)jvNTFb2L& zyeyu^yRHvc+{)XZeJdIjJ}h))mQd@0W3Jc4Yz%pBcy)M2*ov{?`N8$UnBbIPy>x81 z4`aH{O?T(eFLOP2);;YuyqR%-cI~2OhF$r#=y0i{VaL>!&Nv8|!H^6HDwx4Ale3Vy zGBOWz0Gy*qd6n=?zI6Ynt;O)LKz zVUG24(vW;-GMeMxVEdYX9iJh7Ub@e@Y-jmd_zd#22FU>b5!+#YCjKDvA!rZ9pLQV` z$Wz#+R;a4T=TUc%UmQbAOP0 z?k~Z1P5mggwfo@+kmej3|Zl-a-JiCM!BOhXP} zZ%zHtY^(fHgq-V-#D5_7SuPps`{OgiAAx)DKkR|)T4g7{Pa3ON8mp&-^n0hV_Dc7# zC)+`O4}50+!ya}{kGo^KhwkYfcEBh0-SC<1w@>%BUAnhz(>-W8=#qxqF!lL!-mQ(# zT)!6E*L*9&4Dl^-&+;wOkd$>+@|Scp|DWZa>Es)cnhkv=`}*7`Y(Mon0IUk`_wdvK+*?A1OvE9#+)DiCxSwzja6jXI&HaIUkoz6? zOy=fFZpF;X+K!n<8?UN^?mPC;lvVG^DfbPb=DM$mH_&}0G2EB92fGH`Gu#(!XF6&u zW!tB1QU$XIC5F`5fo`$&#uh`$eIo|w!}`rA1>t|`fKcRTxw z-EG94?QTuu-NAMUvsA^J6Y-zpxDH`Qt~}WECbomzjrh!TH?W;mw!sAURO=?=H`m=l zs9}F^Md-nhv|q`#(oy5t8}*OS)IZMqGPZ-A)agNgZ5I2v|b^8%(sFQjZJMJa1$f0asbBEwR#2t)# zuA@G3{9bH_xxLvAbW$sianwiB*aPn(?Q!&xt^o#NRD;V0t|3#Y`vGdYUb0waAE#2!Jd_BY!;%n=6L=hNd%$7im62=_4iAYnrL0PbV${cMl1_wnl- zdoSD9>^=Alu+!KMvUlS%(@teO%RXm(G>2cFMPI}BapRK#_&+AfaUMd%Osr*j|XwYSsQTWWYN3wm*_9x5`dj#%TwqF{OmdhTUy4GPFxX!%K_}2_G zoj0TI=U!+M{oMa0x9z^^aeJjH+?zekwzNj%=ALW^TiPv-co6<`c{hUg!qPI4%d|}7 z?{4_dvE6YGush;@jZsCh)ULQ^+FjVrvIk23^49^W&Z6(0d?x(^_>$wl6w}Jsu`X8V*hWo@Eb7b*A};>#*I7v^BMxvaPb4aP+x$W70FwZj`2^3+};o zL)QWg(@r+0LTO zNUi(ZlLaM+t1TblKKI^oG_LpTjao&xakytt4kf14 ztz)=5m*aEhtWhJrEg7|0HDdc;@7>J_sU41I+teJ(9>iv1lffKmHmlIfnVyLM5Z1ww zRMUQvj)824@hl)mq|T5IsatbcFGtQ#>ee75b!#S13u2Sw(h@t9=Ladlv&^Y!$$O1F zN=u|UIsJPUt*DgLzuS)MKB=SraPHKf$|`xAkhE~O!14RA{o8fgQ2X%fnf@+ya1i+~ zso4kjaI**7@^zZ~G1;Tkxw$;k$sV0tWwJLMMpuFigEnl%D)r1UAHqr=D8IK(btdPKwg;^Ar`B(k{yj_H zluWH}#SW&i`Oke3JK3FCqb6UW=B`z1)X-PooG+oS>aRaO>#-lloDJ!-e_ea+nTzo& zJ@&{1C^^)GJ3#U1B@I+|>`&gqzJ>Txi6?7F@!mBdSGSWO@P9B5{~N!;FY|T&T|bvMlV4yq{-eB~Je8I0Ze&LOXx6bfpEWK{Va32> zcw@OQGxK}%wb@;KH)iK=z});6e8ue#=F%)d$Ok>W@B>IT1X6DN%dp>8; z_phtl{G0KmCn>G6>Wz#tHI&DhwqvAeZ^oMX^KQX^8*f^*-j$5X$;gwes4(^)R?m4x z-g;vF2I-^wH!CZY*Vl1{k1Fn^XYT!q<<$J^qU+g?h|XiY>GQBJ+a=*)Y!`=zvRxF? zeuniS?I-WaAH*9s0~ifIBU~7579Pl7M>EEKdbl9kG^9Oc#fCok4P@l|Oy1ntJlr3@ zkHY=fei-h{_JgoD+xJ86EyC`F4=e8CuN^Ax=db6(ZWU8_U+3EBoN)UJN**KV=Z4!A zKB%~pl-A3NdWE`*FWD}t_>}G9iqF`7T(N@f{EE-nF05!^yP)C=_Bk=64d-3{UD#d{ z?#zCV3P(koggtN_8D1Q19PUaw`!i0@`(V*V;ZFQ@1S9-sg%?F#LR$0i#fpd7K40+& z+vyb#v3;iE0k*s!L)s2!R=}x|tU(bn;&>%9GS&|_$9)(x22PIF3pc}k2=fO{iaLdx z;yyUKEIKh-H{1mGfzc(rrQIRi7>jO!`<;rV zxOa^OIh$lD3Q@M69uDT}I)t#f};ZOYjR>fle+KF*qt~ZRla=j_MS+R)i z8x{5VbdR|96ke~W!@WbqHG?tQrWLzj*X_ffqb3zQ;J;nOb%+sMu0xFE%5`Y#i0dCC zyIhSJ;pJ+?NN<6-TSQU#Bm0|Iv5@WDiUn+6tN57hoQnBuXIFg0c2>oQY-d({K+VhA zbb4*K34i>r>nL{o_iHE?ek-q^Xe(U!6W@_uwSHo{dZHcszrK26zINhE>AH!sa?a`H zH5327Vq&^pqThSfdWpV&wqD}@E2|~4mdZcP2IwSn5B_)7ajCdFSy3^K^)~*zGR{A( zywQtw8(FdOKdgo`q`Z>jE4nI9wDP~N$C0l1_)C%^@$tt0u-ap@@=A}g z&f^Y$S?N*Nc^vbYu3MCl_+0xa;~mVl)kb0Y4ln2Iq$fB5j8|#^5)~$(Kpez z(Rb1J(GSs&(ND5A<^R#jlr(_pJt%imJ+IE(?I?@1jQs6+&M=JBG?HLFhsu_rwo$6- zR$9<%C3+pLQ9^kGyp0l0L)$9h2D>6jre@ zMpgoc@C{VfWPtE#R93zQW^NnCt5R5#%CHi43UiwbBV~r3eiODvWp(V$a95+U^2nCB zC5>At;dE5iMhDijGK}h^@J6oTsU#(whi<2YbI|RT@D#M05?+YzkRf-s-7~~*#|&0m z=NVAh58XNAaCDc9OVC|2u0Z8Idf^t3_`=JuyJ95|_fTw8bWep@KSov@Pgfn6^X;iv zvE|;1m9+Iz?5QX#o(sIqZs^BIu_I7cOc$)AN74=U29y=o(^c1}pnViO17*c_!HNwJ zRP3ARL5h7JWyL7LeuW;QgmT57-~bB5wSM$c5j^U<@E@JjS-g|*-eqp~UCd*~!3dIP;hkr~j8;-&<@ zqqix+O7wOml=5?j68wQqR>Cppok}Qirzp`==v_+q1v*vXF3|8L=ag_JI!y_eqW3D{ z3iLiDdJdI*g763Q0VR9~eGsr&Bz5FrB@(+mqIj|Eqe>{{N`8azB~E76o|5dmtLjohu##SrziW^&_FfMIu8-;!zW7{h3bhMo!ZK17I80|K;y&`R! z?Vz|z(2k1KPrI(-u0<&ag49>rSz(;s$hADZp1+Q+uP};l>;_6&hd0Cx^wJsIMUgtq z=t_!{G)taAg_N016n8JWX@=zaW(so*jNLqAHB|Bsn2lg;S0$D-ZkZvr-%4SIgRxs@ zNIpoJ0Omg!yKM&fVYgG53t{Z`3Zpf~c2k%&VdUN=Me>0*NMKGy+BQl1l-gh?6qvtZ z?9Lftk6jdIcNj*!6tPVYg}EQb?w%p%w};|BMWxONyMdHZU9+7GR{X2P`udbz>EvfgB0fZ7{&mV(dZ$Hmoyxj zaV2_~;^ln$W{g1(SG=5GzYM7hM<`y-wSUHq=#h$-uu_MGn?ULPnk^2jKtzu@P6Ea$&*D3A^^m@g;h~A*Y>!CL)afC`4 z6~sOh6}JMtIYY|Dq>P=>TNL*zdaDv!^fo2l0KGj!^7{_Oi~nRL=7jB?8Is;9itmHo zrBwWgPF3Po=-rAx7@d|O$Gk_0H%0HwkYnDLA^Veh0$$4U14E=tCJFpbsnl zRrHYz$;U?(zW{wqsrVUvT&WP7h~1y0ju+9Vl(2+8t%PmSXOws|^jRgYMW0jRUD4_A z0{iKSO8!B-7y7ay&w|XJNpU-&l2)kr1D%l}$CB~^PSQI|iKV>F&gh2DQCM@)Fn1?~ zu~K8_D$b+x6!RAPy5c1N-^kb#eN*ucm2iUC@@>VBK;Ov_yS}ShP@{Q0Ql zhal?evl16`i6I{K;Nq%3@vA^G^Z;>ETrG9<6RP`s4M2BqQ`^h+gf zjeey#vF+DN#W!e%ISlu=itCPkr!cp{*zXm0Ci;US&x`g)B`%;+)`g8g$~QPUrlbQ5 z1xWfA1lJP%O)=Y}zbmc=m9i)t4J#GD4sqCpV6cy)?MR`mb9f4j*&8WyDdNT!>2uFu zG|cFYMvC-9q>F=*cDFB7DDuqaNNdV%s2l_2`AwdeQf@~n6KT2F8*Qw3IZhKr?q8&Q z2wsj!xe??##Rx+rp=D9>Pmm%QCrkv70>qWIb9rWvoIn`L~4Zm#%4(JeBjpmNSzQp`cF@q&@G zh>bw{2jy8VMbf^lV#R*jDRQl2mTQXN9qp$0I#kL8#FFOjN-X={Q87ECJ1NqpJNX;p zN^}=R`mvH4N9|Q*zW-as(!1lrZ=wV7AVf!k9 z#6LXaF0^09aP$Zz7Mu6aI2%1u30_2xQsOnxqccXL17ILr0E05FM+Ymx8R#(?_o2sT zyo3(Pcm+K!<7M=CC8q4U6JRLR!>|m=_Y*TdM^DOFj>`E6w8wH?5xm&*6vcN!PgUX# z(bJTeaxc%=f)_hWx*?W&aHit7M9)#Yl(BOazZE(H&Li$F==qA5awB$uxCMHl5=$CJ zDsfBnV#P~djZ(bi=Ov1l^j->=u^%bFQqI6Xj9#JmC(zM~e-FJ<@$=C!iWeJ>RpNEf zaY|f;UaiD!(eX;$5xquOjhD8&^wh__A^ECQa|p>ka9FtiL24O zVH$Sc7QIJ_YtVZ^%CF?r{R%S;jC(+d<$UFQAZm&}q(m)I$tQ@VZa$*K`=XC3ac}f7 zC2Ea6u0%yt^7To&Y(egOgyco^X(g1jKcgfspwBAFEL3a?$xL)QJdgV&RKlSw5M-Rx zH%Kh{iW15GUR5FqKSN2xPxdvN@RFW6O2XgnH6@X-bCpE)H&002Pl-iKOdI zg+*tLdrL_Y^lc@nLf=u65PerkD$w_oq=3G!M6%Bh;6w64&h;ZDlJw74BC*rQN+kA{ zG6zXJbfJ<+U8qyy-_Uv`S{+@aM6J-p3UgwNTcRYj=u#yqqRW(|8vR5`+Mvsoqz3&| zNlNHv@Hy#`yjTHW;BJIAD4~?cFO?)hzk(kL(**rVNn-S8ScyOFk2gw0*^oXXAtFEJ z8AD)BrjdJSAtFEJzFCOKXSr7snA@4&XUM$x_+f45vD7*f0CGFc9jT_{d$zPfA zEjmUCB#l=oGOq5&Dy9cI4z7kzVZ34_{56U^llW^Db00b(gYxIEQw;UVU$02NxW7S> z@oj&jV%J4)Qly{NPs~_>-mKUG=%ftFw7*43`><}qEi}OGiu7&xI}~|#^pi8bMCCV- z=UqPq?gHw8pQ@OTP{}ip=Sx3L2{uRXQG$KZdzFCl;pO}xkbIH+fIw_RJ1+#Ap%20% zxc5dMg~xFBLm!7HaG#D!Ie=Kw^^_7wem)J<=~&YGtP)&-K9|uNl`{7{`;k0<0Vpql z>Y72_*gRDzVr@@&ID7-+U#Oy!=>+#l~O3*MxZp{YH`J3IDAk*GB)HB7Ls@ zdnFeCAC$zPKPyJ^?ia;&LVr_&vFPuxl4DVJ0^$U;b!H^$GB!cI5+8sPC}n*#RHQFZ z`nKe}Wvnl#P;3)41`-prhsum>`jj5Fd^<&1i|PrkF11>KU@XH59We z+DwW2pv^O6e`_k{BD6(@>|6FL$o{CSf{djEYbi2*60Dse$5|&s_DA^>WLzkqtOzpZ z926Dl^A1WtdlnypwuN>e$Ej7~eyG?*kmGd7kbQTA^?)`i5L<5u;wR@1^6VXK1d=~5 z0p%k_%J*i9Jflb*PML*n0djtn@jz@1@%gBnr!Wt;&UhQ$CgVMH+l&v;?G(AT1lwmU zK)Wek(zSyk&%QzTjD_fqiqw^0r;IvuXT`sW?vk+>m3$SJLJ!ytmc#C_2Ye2DW_*V3 z1$)ES&~&=mfr^| z@x|yMC6=&*m3S0-j1o({W0m+4bchnmK8{o3OVQ(%SoU{<5?_W6RbtuqFeSbmJu#yN zdXnO6(cu{zqbFzlik_mxlCD#g_zLtiC6+XvuK3RA2qiun6}v-xD|)^X|Bi~?u|Xo` zK+c)-OQc-L`GAah267IR^JjM?Y}B_4uar^J$$>lGP;4{peK1HCb$8G2L3o9HCPu8H1~ zA>~l)1?Fz_wu}$a+ZA&UdPl}b=;Vy`&^t4}N2g?LfZmnyBRW-yk3;1c5R3h$De>{B z90Ovp<-JNQ3KS1L-d)9pV4QPco_Pe5=;J1hvzxR6VVrxSjxhS8O_m`GG0et zR^s94D;aW*QntW|U1wy>M`tQV>^dvsV^qoz#3!S3lz2S)nj-TZ(sDl+eIMp2@|+h) zI>2m%zM)9}ZXo3eWPWELWeB9NH+Wky-B3v@NS|)-u41JAy{AZjSb97;W*7KCiKQM$ z`GfcrRLUI0QYYj*AwCtA^g%oUU7*CLp$nB*>PlUPq`yAn7j%(gw?-E$@%88uMdm}K z*O;a3{|4MrKEO)eNtpn7j!LgR%kh^y`c#Q;L_brk*!*)Pz6o8S#HXWQDDgzJLGfaX zFO~G(@hjZm#Wr6naxWQtqj<5?w~E|X2Hz?18R+*)d^7rk5+8{EsKg`CpOpAa^k*fW zgo=%X#_(D>g}%CUaW5WD`N#Al%^m6$drq;3e3|4p`6!nKX5GD_S7vf(OT#sN+iec zuSBG`>PRJ$V{%QcqRd8;Hu6}ADp2etM3v}MN>oChQ)23T)pU4~>&`VObzI;rLQ_Q@ zucF>2*Q3-~A=v_*4R7MU8KrJjVZWp+`ks>9iM|h%!(d zxeNUbR^ood7^-TD!6rqk$T&~YDW*H>71sd`6hodAL&bGO$s57!gpxOcjI|W8i(try zVywt`NHI|iwl88YLB=kM1Qo&s>nRT;%18UxfVB9WZqwK3q|@zi(M5f_S;gCzS81WiWOUKtw_IV zaT~>oUAI-F54E_RV#Q`sZb14Si`^6}_LK4f(g#_Tat~H)DP&(tN149eu_N}m1BUH{FMEIJsp*OftS3M_+Uq(QjWokZKS?|y%?1` z2GUnpJXEox(8CljHtVa%oTlR8iWmF!Q)JFj@d(AsIrUfU)##Cmm-9PHvE$LB6))#H zK(W`L0~IglJxH1ZY(yv(@qS#63af+8?90MadhGKF;D9ip5%*!cCxDNwKe|xytS*|o#HaZK97E)_$$!mik1BQRFSct;%ADLy!~8}v7q7##Y#SZp~$#Uu|ctt=U*x^ zMpXPtv6BB^D>7bG{6?{IuHPy$K2ZElv2xzuD>7D4{6Vo|gC7+cHz@w3$Q;1p&x(vC z6n|0TM(D3fyaW215;sPFSK{vIA4=Q=U8%%78mWe+L^~nr<7vJyXzo}vUJ(NmT93G_6@w?j`?;-}Cv6zMN3ovFl6qh~47&r}lILHsN_ z0xl-~Vw+KLr7>m`bPQaJ{}6Nn+>F2MXA<0rznseyxR3Mw9lakO#=i$Dzj02|w_TER zc#^oCQAr;d@~I^I0<$&xjFKFPN}3>k4$Vjoz&%|_jz+0hLed|70jM9+Ut6NwmtMs! zcA5dSapnS)wyi|FX2foD6hoZSYf5r3N_`NLL(zFk(ieRl-ejNHsPvW+b3Uba;XV8> zMc;>y*#8prVTHLrD%Yrkc~PuB30_ZFDtQoxEe;)oUo>)o3#%9EUas>T)<9ZK1@ZtGcBU zbNuR7uohwNLf3|MaNm!%h9Yk2T6IYYA4Ew+bq)U5tGbO6UW>L>!t2p?N{r2_Yn71l zRoz|*u~l^kCC0whlu;pi6YT;U;g&RP44ZPShtSPn3*3*PU6q*jp?XW$3jbHpt(BPk zsoq8jPeQj5nM!P97`Ch$)64T~XcUNM{MfHwKcpbWv5)DFkR>E`9 zU6k-VbXVv>+D=7xQ^J$c-Ib8Gs(KG4B=4*DguMuV1KLxGzd`p_;;+zNun+nEE!ta2 z)$aiqPNhYN+fwG$A+j0I$Vh)Pb7V(;4k}>bf1oUJydLW7H;yR zn)*R`l{vpA(C{R4;SDjebpB#(ShhiFcSZR(Tm{{+=rpm^XkiS zAB|oCqj4XBj!~j5(5sY4@_eikNj{8IBC+4qN-TCAuSAmn*8q7K?SNjdM3Qe}_Z#t- zyqcsW9no8quqk@060VNkri5#uw<}?S-l2re(aB2K7`;;oBXo)qwnXnz!Wf;ZglnRA zD^AijO$j}Ej}lg(_riUYnKjS{l(2w4sDzTg55dEPq3x)CLFs2}Rv0OO`s2(MKLc}@LU^^k=oNBO_5G_KRDM@>jv#B{;up{hlz0(Jof6`m(2HOsZb|1QN^}!C zMu|Q_uTr9)QSwHJR-ogQ=oggy6Qb`?@=1t(L#aD8*WnhMNct$R(eLQ}@BsPS9eqeC z?0`z1K|#{?h*Ic=QpReY!hcKjbtU=?eN%}fzus1&A5qFq%|gQOiY|erxOYb7e4wx) zD)FJv#h5lu30I<_5(Q|ac*3=5szerDUEycbW(_4IEp66TBFbVL%8wBKfl?NPNRG3) z625@;P{Man@=FLgzcxp~(YRkjv1J?VSRgOkT&on$M<*zS^SBk~ctT-glynP)O;OH8 zC~SgK_k_YmXsuEpEp6LF2mH4|NuyApT(%vd6gERIRtj67mnns==v<|+JvvV*Y-dcn zwo1Z&+i_0q2C>h<=%YZmLQfQ%3I%?vodmby#$L5km5_2+`=C;2j#5s90_RZ6euP2` z^f9G??Q1C~Lh4U>sg*J#{8F_=H4&=Dnm`-t%Cq2z~9z=rLQPzvj! zM=OO+D0UMH>#!sb=Oz>=n;keep+MQ}&_^k>LyuAl;#GjzwE75ZF z2POIf{ZWa;?#tN;Ez@k!N(s+2X7bHSvY#<`5=MykG3G9gC&bH) zsWVEUJxZOdtHk44v=Lw%^BGDy1a}>}r{X4|w9|sS6Qvvr?rwB%#XW%bfdEXD5UnJ-H zAUuToNc3SPqAb-tqC|2|kHTYwISzeXiH4$20QEFF5v7jSQ75C5(HTH~MyI3mm58>k z?qemo5M2NZ2{RI{Q=&`IdRT=2W$0p9ihDFF`3;fS?OULHCm*mpNu(qkr#^-Re~wd6 z8K`fHn`6|k4wTP?{nfXGR=C+$eGRn1y&P?)B$S!@P6}(cn)=SL1!b6XtjE6fTjD1D z^;^NVxXI&s@~^%R?#bu@a4_!a=poP-_sb~u6`~gCi%LlT)xQa12g-Ln=Po2GP;9Vh zIB}Pt)Q3f{@^0O!D7IbnK5kLYe-Ytj+(_&s`TiV45tHQHV&Ci)cZonj)s|GVbpo<30Wx@Xb1lIIDm#;Ei?r-t$`H%e% z{+HnN;HF?@xM7p+tC-PIwNBNJRl8N~Rn@Dich!Mahg2P1bz{|}s;8=ERlQmDUeza6 zpH_WewX%3aab>AcYFb*eR8{Iw+OV`mY5UU7rM*fAlnyE#QaY@3cxhnigwolii%VCQ zt}WeMy0dg&>EY5#rMF7&l|CwcS^BQ@M|EX&hwA;S52!x8dRX=7>Km)?tA3>V$?E5- z7gR5={;I~-_?oCDu4z`&vZhT<`tZNs*$+IDE$ zx$TIy7q`8v?Ywqv+YM?ruia<0x7JRreW>=a+GlE?uYI+4cI~{{Wwl?jEOpd=oAyVv zKf3*-4$V5W?9ivfQ5{Bg__D(<>o)7uwR6Z11-&2K0)Bn@jcG;e6xP}{I`!>$d(8ZKiw$a zRi9P;R%8sVM89-twNk56b*W>iOQ~zATd7B>SGgSYD-9|QEsZFRDvc>kC`~F&DcxUs zwDd~p-O~G|k4xW_eyFC8ta`(=91N`06`+!aybb9r5uc)9DJXZgEjuK9Jsnhb$itHsymEwaBSUq zb))LW)?Hh7d)`E}n?4&wSo^{dyntglJSLFf9e_1o1SP=82T4&JP%AS^m_(TqhO zG}wl?p;1~6sv6o;4tg}4NI4kQFotq)6XoFThJ{%F5RMjou#|gAH8(P`b(DftiOHnf<@I!cV9Gm(G`m>Uv$~hy_V2!Ety_- z_mcVb?UuG!vj36^5^KrBa?M{d$Czd8kG&kejO)W+|9yJTr!$v6vXnM>=?9-SliwE2 zUi!q+#}^*FHH1n*M9KQJ7>;+?Y$$9eB_AU z{T}bozIwd$rL-9V4eg$(4QjcQsNDe`;0}G+y6>+0_PTGa`{ugy)_rx|SJr*LJ=fFr zgW3;ne@wfF+AghKf8EOVuJ*U~ruK79OY;%U?^<)uHIHlYOAD@2tp~2PPwT_i+NO2i z)?w?zj9D$@{)jT*0yo{gA2bU7h+4CT_=&7`J(WD)s?a+>BT;z{%>Na76!t9i!LMIo zWTBz(6)QIXQSp+$Gw$YvZl>CSv!-JN-T0pF^b~H~72H-~Vphiv6W^ zF%6&n)%Z`juqwts`x3u<8kegSl6EQdW|zXnBB~N=5TX~xx(CHUbcyCYS*&u?0T%De5yUC z{7s1&cD8-fzHh%`-TbRqIsemeS@gueS*ia&e+l~h@Jd$Qe=m9?93K46J;@cpAK{qr z_voqci}1&AX1Fw55j_|F5WW+&i)y3C{3+qD;Y-mgtl$1qI4hbI-5A{xo^C?!j0z?& zo_nNi%^s$oIl}ZeN1EAYj^TSS72n(S`3A+V+&ArLyN7Sto$OS5H{Tw($A0LS`vcr+ z_BZO#+OE>I;QJUG@b!W{+@7w7yMeDd-{i&zo4QZjZ|--#fAF*WDSX@g;!pFZb2UB5 z&vc#qD}2SFnQ3HyH;r9$v!~n8?B%+co^B(vx7*nCaobdU>$WgQxxLKMuBRE`_BI1u zFEhyPW5&2s%vJ7GGuEAE#<|nYZSGQYm%GHwb=R7CZlZbJ-E7`)x0pBGxQgH1y|&Ul zWLI-f#+~ijZl+zw&9bfC?246chOKcg*bUqlc0<=-ySOjy7VcBKn_FpjXZhkiytSwJ zb?te6TYJ9W&R*cRx1;?Y_Da8}eAC)q<$Ky2eLs7XKO%PiaC@&GZtwGF+WY-k_5pvk zebAp{AM)qgIsQrek>?v=_G`b$e&ZM0Z~YQ?ylZE6srcH}#-5e4dYj$d`sPrxf5mrh zD^|KXqv9vlvbr=h=E@*(7n%3XOxw~u;a-f_izByu zTbT{aK5jkR#!mLT`?@$`MUb8CtE~BPy4%e*a#QWOep7q7-@-2TGu%4yYVqo>ecXkw zacmi{8Lt(u9qb?U2@VVnaCf=kaT|Ab@M63McaRtGJaK(+hP#h%n!n;+j@NhfZjq~V zpS$Jm2jAXziZ_fm@?GPN{g!@fz6!F7-_`FHw}?B%E%{!^A^y~O=Xe+Yuz!N*jQPGk zUMH@K+r}N^4so++X}nFapF1bsjc=Ab=N9-);&yR+x1-xR-Xh+_ALdSstK)6s?cy4D zu^SaNj`xe2MlIw0<9*}aT+@o-li^dzi{aGdg=AJTldsgioVdg%L1Lq4qL-3alP8m> zlBbi|$&BQci5DJ9P&&nAtM#^Jq5#OmQKl9oxUWUXZFWSyjSG>fmG@trQd;dV?ikZ;cnNsf)? zB}0>8@gMO@yInjzzB`^4-xI!K8%Iw@FVn64vN_A#Z$7k3{kOckTw{9pPwCe_)BbGk z^Pig!Y%8;kUDs~!SJ(mm3wxGtuy@)e{!9BF_vK%kkL)tO;<9hhKR7G6HrOoKJLnbc z6Z8)H1xN7gc1AoUxIDfqo*G=?TL+_qD}!;t)xr4SnqZ25DVQ4E9h@CZ@KwQe!L<1H z`2P5Tpb%69ad21sV0>SETYPW)Q2eml)IDNPh#yIe+1GXo#>RKVljA$hNON(pNqj)C zzMWu}n@??%pncFGsE!Y|TgHd;)@2vo2HiF8!@Hgr1x5g*e$L9t=`2G0; z&OPqY;LG4EcV2v9e1U%}SP~x*UljKb8sa14k?~RS#qrVcsCYnpNjxyVG#(UR77vau z4_f%zVB_G|_?Y;L_*maLK0CfO{+;g%^-A_hdMEoPdnG;Xw!z%^oZt(4hF_ois#oKK z;`4&e!FR!G!R&ZQJleJh-UylnZ`w6^qvmejfVn65C|ED}KG-1mF+MK7GCn>Y6Q2-Y z6%UQa+INCQ!8*ZDK~=DfZ}NN+l-yOphQZJAuy|a2Vti73bMdHHTqGJ)?VjZ3aiZb)uSZb~L5Tks90Et9R1t&=;G zDZIDP+^uE0^WMRZykoEv?-TTLo0tQ5PvAheojJ&DZw_|d%pqlwGsRtLX1NJwhP%eD;hwh5+%vYhd)D$L zSX*?j*^--UtKB?X>lWMgZi(&SmfDTo*LD;4jos9JYd3S>+5LT`?c*ES1AJq9pl@PN z^BdaJeHS~@cefY&9qlN;lfA_6Y{&Ut_G-V69q)VFYy7_UTECyY*&k^q`J?PD{%Cuv zA7G#I7u%=(DEo}R#6IgUwa@v>>`ecNo#h|3ulc9!T>rG4=O4GP`)BMM{#pB$f8M_B zU$6`O9Q&PLYQOi(><|7EH^vY2&-vHfnr>*ky}dr}X4Z5~Obcd^wsfIsbD}%Moa7EQ!P3afh2zT|aZ0JHoun zEXMcTWP6ZrY7h3S*+cy5_E5iuJQ?siuidmH;;uhSot?UfyroxFqGhrJnIlQ+lcF?w-J_#&JWJyAJH zxnFredEA@n9pW8koND~hIL&>)o8=wq%{Hzwt~Rc5AHtpD=NQ)-*QsBrU#s8X?x^!*7}3B zy*1HFTNPHN6}J*rIc^!+A2$#kh}(%~;^v}5ajVg6-0d_McRAJLo}>(J@X1;GxO?Gl zpBmf&RA*&zZ_pHL4{vL;)EsPXVtVEfv)HuE;ihX2)qGPo9ka|VH*K@TjG0B|Ak#Dr zQ#FT~8t!5r<(==H3+--i>n`g~>wWWEb(wm)`ET<-=D)1#t(&b|aC`gZ)|J*(*45TE z*0t7k)(zHQtsAYItV`Vw-K_hO`!R0W_!;+Wtiz2O>+KplYfrKa{Yy(R*VxC|OYIZv zyV<+iL+lauFngr@mD|JZq4p;7H`X3!nf9jE=eVuoN8H-+FY71m zVr_-IEADo^Qr{W3Q_)RawYVYcXWWgHv{Jais2VpK?TmYlCgT>Sskob|!D_@!P4jV! zQ#)>W>cZ_$y|@`_5$?Pu&~?dR<0?HBCT_KWsQ_RID^ z>{skp?KSpm_6MZmSss+d}&7ON%Dtp=%s)iSkQ9ik3ZhpEHW5zw|qs-x7=@(!EL)h*O9kn+Yt z0~@D~S0|`jLuS}k-46QL_Uc4+2Q{uHRB_8qTCGsdRx8zvTBVFrtJNLVoz$JxUDRFG z-IVd_B&AX56F1=~8=(J)+W~!Lg4Bklz<#)=x|h1Qx{o?l-B;Nf8dH<LKc(>S5|^^>DRbouf9WjcSuRS8Y~X)K+z#I$v#57hqO) zsGaIUwF{DckJ_tjqaFd>aj~+kxvHuB+y{4-dbWCwdak^!=K}Rl>V@h>>czM#?o##7>SgL*)XQ;m+!gAT>Q(C1 z&=anO1a-Z7L!j9ye^75xo>y;GZ&PnqUJ!a9ZkxMPy-U4YS*PBk-izDk?pGgBA5{OQ zK7_mI9#&VWkEoBTkExHVPpD6-f5)wfPphk;=RT`Gr#`Q~puVWS1fBO~^&jdh>Z|H& z(0<>*J$7$F8+u25SA7q++I^sYsD7k=tbU??s(z+^u706@DfpJMz2scqs{c|Zs{dC1 zqke~5@P1H#RM)CMK_1)zx8nVxu2=iiyt)Ad_MxVN-^Vo_8mS4pzpXh~6B5uHJ?N)J zS~2d@E7b;RgS9fP9QQd6h0Z!$8=-9i{dJT!T1hI+%B|2UH&tF%UWE3z88q50v@zP2 zxc6}@Z5;07o1ks2ZKG|gZKwS~+aB8P4q9AG;HJJ5WWoxqQp*TULEBN=N!wZ51-JO^ zrcKgnv|32(SuLme+GJ?PQ?xxG-=?IVytlTGHWeCe8X9edHci_fzKQ9uO3%;^(hk;U zYO`=B;Gs&Tb{N*GUzCrv!?k*Cj+Eq@w7FWd)}mx0GqPRl&^on+S{Lr7>`|(qmA$I` zLwN=I@)6o1ZLzjQI})CcqqSpT^*&BpsvWPLAT^hhp}|0R&`#4%*OqC^wKKFcAxTuj zLvoI?Bdp`+Y3FO=UZx9`op6id#kfZi+P$)~cA4@OH0=kq%fXed(5}?3f=A^V*wU}V zEtWUne#0B3oOuhhqTAqY-Ua&0oyw=$UE=0N?OxoPc|X2imWB5BAZ|o_NLvZ*W|j5` zw75sL$Dl_&0Zr=fkbj=ip2mHJ&p<;Iw?RFxy#Q}@yY`Z{Mtd2O(Lc0Tv{$v)loi_R z8t#cwa@t$k+uA$YySU%*edV8uFElZwL&<9&LE=%gPjKtuXUb$%g=Y4J_9Zm5ueEP* z58}7*0EqjgzSF+fe$akYc89F6R#~WYLT>m8whP?r$##qlx}vMPrt9z=neZ9dx}&@B zA;sW5DAr5hNgAXN*2|PB@F)#|PidGwTpyutqK|}kX|%G3zNx;MzPa+VzJ)#pcSDZV zx6;SyGR{aEhV`zed{6Z8||GdWp5ML!icWS#~; z+A?@h&VUc)ESy1@1}*OxNn{(>$m8);x5kH^*eCW>RtNXxS8`_{XXc? z59kjnx8tVHhm`&Gm5?4+>5u4-DhKF~>5nVZ^(XWv^}pjT&!_d(`ZM~o`g6G1^9B7y z{Uv>k{xW3$SM*nv1EGt*4lUqKWxetV*1)&n0en|~5BGq6pns^GrhlZ&&_C8c!Oftb z!4md`{-ypE?g{-y|EK<~&_r=-=y&?}`Va6LuEiaqKkMuCUzCHC;~{tT;a1TN%5m^V zE;STGH8evv48t@m);2vO2F^Zxrl>}Dx=!iQJHD%WbAD0V(e<{W=t|_ zj9O)uQD8iyE% z8iyIPg_f;+2Hm>>UvK%wXfoy+%|?sSYRog{8*Rn{quuB*I*o-!m(g92XN6vF90h&- z7~@#uIQZ3$H%>54G)^*3Hclbg);Qf*W-K?(kQ%#?YtIe!_6v=RpsinGTx$Fop4q<` zmm4dLD~u~i3KsIOalLVa)a-9EZZ>W)ZdJZCZZmE-?lA5&?lSH+?lJB)?lbN;9xxs> z{$@O6tTY}rRtXu|c#QS!zZ*{(PebE=M(Ete^U%3pga*6Dcp19)E5@tPzh5`rFy4d~ z`?m3p@viZn@xJka@uBgN@v-p<^w!U$CjO<=#lJEBDYS0V$e|PeVEkyTg?{_9vCjC# zSPwgH9+q4M5~&7R)qr$rK~{B?OCi5{QerKJliWXLA>pDQnDHv(C(# zx&JTs+;u`5=z_M;gPr3xw3$CCCo9*&k}fobCFYUlQPKu~EVPHE&>v2Ko%^JIcj7HG zmz!rOYhjx|ODR`|C_~M&m0`+oWrTT-vWYTM8KsPd?fyJ@bKakRb$8z7<_hx)^Gfq7 z^J?=N^IG#d^LnZC+z2ng%~IzP+Rq)V;oL(yj*gDZYrctt5N|10nQz0&^^W#7Rp&liSn)TFXcYvJmos2-YSOPRto#aU|2xP zts$_246}yAHn@p$wNk5`pgannNU=3iIbB(1jj~27%dJhV&8*F#?~Q>5dztbVYfEda z@<(ecSkBH>E>bR5E>Unhr8Q2u-x?2%aBHa(ZpT{T4pJjbLc<~bFvFV8PEyy|71ozY zp$?dX7C0H!m?^kv78V)kLHkHeXg_Nj^vMIHMmYmI<-t;`JcRYi!=+ByU^QAz)?BOE zYJt`?4|-FZ)SNn?J1vyjQxEG;i>)Qrk=9Yx(bh56vAD%}sdYSbsuQ7Aoh zpz;ft+HtV`jExlC%7E37N}X_wcB`sK~gJ#Q6S zw{-_J)4Qy@t$VC{t^2I|tp}9vtp}~YSq~{cC_lnV`!FoFk4T&Clxfr|D5%_^@8;xyj1Tgb=FJDnbsP37T!?aRNk^)R^C?L!G^PcDDNuoTd!EJ zTCZ8JTW?rzT5nlzE4uZL^{(}v^}h9i^`Z5V^|AGd_37`qRT3KUI_no}z13&sH+loA zYkPLgF0za561&tMWDmB>;Bg-UEqEC8;Stb>N7|$8(e|eHX7=Xx7WNo>OM9%nl|9ZL zZ%?qdwzsjjwYRhXU~g|vw0E%Mb^l$!P_fv#;YvzOav*k{^j*=O75K&w8_KHt8;{*!&7eUW{!eTjXk{b&0! z`!Dw8_6qw7`%3#N`)d0d`&#=t`+EBZ`>*zm_D%N9_AU0U_HFj<_8s<}_FeYf_C5B! z_I>vK_5=2V_TTJ>?3MPz_A2`k`%(Kb=xiiEW>I`#+J0qM; zoRQ8bXSB1avzfEGvxPIp+0q&7Y~_q|#yb<7t(|S0ZJq6$KRDYv6P+ELxRY>_PRdC; z6;7p-ajKkZXGdozXJ=;@XIE!8XOdIn)H-!e*2y`(GdaBDcrRyfN8E0_ud|;s&Dq~M zz?tqG=*)2B4ad$b=MZ_v@oeXCdB1Uk)95rgbDd_V#c6fsIrE)1XMxl1bU2;PLZ{2= zc6yv%=Llz!vzTvBKH3pCA|K~0b&hvVa87hia!z(maZYvq=$z)9?ksbbJ7+j&I%hd& zJLfp(I_Ej(I~O>AaxQc(!i~U}IF~wqb}n=N;#}^maISE!bgpu)cCK-*b*^)+cW%H< z#5X!O;Wpx1oLimSoZFo{oI9PnoV%TSoO_-7oco;zoClr1IS)B2orj%OxRv-(=P~DT z=LzRY=kLx_&eP6n=Nac&=Q-zj=LP3Q=Ot&2^Rn{~=N0Ew=QZbb=MCpg=Pl=L=N;!= z=RN0r=L6?M=OgE1=M(2s=QHPX=L_dc=PT!H=Nspr&bQ9LoPRt2alUiDcYbhwbk@R) z`Lnam`Ndi9^f`HFgR3ZCz-Ot!=V`d6Yq_@Tz>DX(F<3~8VI3_MUN^VQEq8~&=Qhk8 z?v4u%+abH}?A;3wM#p0w@Y7v0{S2v1wwO}I%n<)-1~ ztb~`WN_hUYz5k8W+@Q<{>H!{zi5AVhTcrQBOxmYN@6Fu-o907mB zV)zt}g#X}Z_)Cs;kApAac=rVNM0j3KhOgyR_*qVak7b#=9A1?(;Q=`t-j8$P;W*#D z06vQg;jg&Zy~MrL{WH81e}Ok*g?k13E?2=rB|T5>^}?e?el&QfZWVqj_^aTla_@HU zaqo5SbMJQ_a36I4=04=EbRUM#?Gg7;_c8Zz_X+n&_wVjg?$hpS_ZjzD_c`}@_XYPw z_a%3Y`?C8F_Z9b5_cix*_YL<=_bvBr_Z|0L_dWN0_XF5FVeNE3aX)oGb3b>#fW7xC z_iOhXSbx8TefQt6^1{YT7GBttVPSTEao4+j!t3Y3tjIn{6COhwenuA_$C&UTdL>?| zH^>|8m3igf5N~LIZz8;so5A0>1-y=1dSl^_9OsSqCU{$W+j!f0+j)QRw)ZA_J9u#~ z;U&G4m-Z^W%82J>XKxp8S8q3Ol2_x^dUamb%Xz*x+1uTl;_cz>>Fp)_R}pX40p4`) zKv>@o@(zZjeHLu(hkA#3vpr!)pW`)njb4*C*K77#yjFNO=fk(Tz-#w9gm=^H^18hq zuh%=mTjVYFmUu^cM|nqk$9Ttj$9YS={@8Qz)R zS>D;+Io`SO9-Z%95c-k|o}|mY72XxzmEKj})!sGUwbGw-gZEeOM(-x?X73j7R_`|N zcJB`FPVX-7ZtouNUhh8de)jSTPwm6-@IC@>@MF>!{3JZUPr)y|8Xn+hz305=y%)R} zy_dW--pk%UyjQ$ez1O_gy*Io!y|=u#y?4BKz4yHLy$`$(y^p+)y-&PPz0bVQy)V2k zy|28ly>GmKdf$5g^8W4p$NSFv-uuD((Oc{N3qzaI7p=9vc!H8XFcH9vczcBsMZODmFT{X>7CD=CLhe zV`5vz#>Tdajf;(sO^9tB+a|VcY`fSWV%x_i#&(FsV~JQYmWrig6|u@#CRP=zj_nxR zDYmn)M8|fEO^VgTYGZY=Y%CY^W0PaM$EL*gi0v8ME4FuRpV-vczOnsc(_;I_4)AKa zTHBlJ8+v=1V)C`4xud;lzFo7RzM-q5-Kv?>)pSIYUBlqs_SSf!E^EtYHb>7~Tt1WW z;F+XwvQj(~If5s0H8LJg8INb0;%hivO%;c0_*utKSx+KY%lT_Le=X;)tu$-eI$P>J z`M0N|y`x)Z^y5^ZAFt*x73{}rIZPG!aoM4SAE%1^xKHu5oWGXy*UJ3yWQxnFmF2|K z3F>${8$79jeii4h;`~*duZruh;`*z&{wl7&DyYBC+N*xSoW^?5oOmLav}u z<^IPRAMqe8@flC1QKa4czU)doQB`AQ8|pzJoSb@=i}R2%CUb12kYg1QKcPlf@6n84coeCHoae;)N;!dTwQz`CLiaV9% z{8`SQWu#;oc|2{?@r*uYVj?yrs68Z>TtGn8nGjY7>YCErRewa2c#-@M)H$U$#G%e2YG|@50u*%%CzO%C)E07QlWF?7It+iLkK@vGC8_%F@CO#q) zEFO|fATR{+L@v2Bw;?UtfQg*d_U@H6qo-caEpArV5Ui&M_KjiH@f-mD)bkq(ohN+8il?^pLUQWrUC>tF+e7%t@&cEmUVwrmJW0zUW+%<@Br&0Ql9&&k3=ak; zP4g_5W`tER!YX*s>NviR<4N#HY~GYT58c#78?pT&qY@qeJd(wG|Zc_LK+ znVc$klq-mo(Jfu(O^XmtMWr>ZKsZU3)RGBCR0SiZ zBB+WHQy~$XOeB15+F}~Rbe*-oEI79Rz_}Ml8|#duDfQ{UZWA3&I(hNp7+0rkD+ zbV0+`bXroTGbvA(q-;(XNsneRE)%t>*ujPJ8Nb}es+@JOtdEKh#4De> z#8V)NIX#_)M}EqARmy>WZS*U6epT?is^Ixl!3!?q$-F+_hT4cUa;(JWSb5DQ z7+(o$Eo2TNSH@qWuF`B=($U;vGTu+LR*`do|?kCv7XUbCxafd zkewqP2099lA?rdp)`4;?MCVws&XFPw+F=^0Wg4sFKGZRW>zI}TO&~?}r)hnRrz?n7 z(%FpJBnG)?c4vK8&&0X21y|JPPE6p}YU0NdSuO!N%$nQO-aIj3LY-^wj&;jNPglqM zrV{yHzJ;0ZEJR>tv4 zL_{b=S7=(KX~{Dt;-bf>MUySuf&vf^8KeCgL2DynvMoC4X{Cns2%pEqCxs4{ zC2D}r;+f9~_A@L1XHrH-Fl*CfM1Z)TF*}+9N=RpDUZu$v3elFws3LgMd`puq8Baog zUC0xtD>{+VS+h&>N%@yzin`{ucDD#V3FEdTlw>C7bTPSET@i|@$XHzkih)8v$!Sr= zNHC?ae3oPRELY(hU7{-xM2-;8?r4)zzSS+Oh;Y?eT6!CNJ)hYl6TpkyMji=fD0?X3*#BDu=I8j{N-f>>byvU(+FG<)T| z6H_bB(q&SZ)OjBE%6Vw^N*$)R|7`5H%#ehe2n?yD6l3|3ItZRphk))Pag8U>nhcLY zhQ}Ziz&dt$ikLd+*_cO z07Drzk%<<=BGemb4q?8)vXskUK*+EgSe8U@Ll|3@&_a~s^s=c<8n1FWRANi~2i4{R zGgZzH2P+p2YAzhq90s+t-*9k+K&*J9(F;n=$P#F{M2%uFMPnoZgo(ncGia%Kgdk$# z*crxc#&;J5crX{qdB3QDIcpK=gNwom4(*Rei+waXw(I8DN0TGp45ac3y&=>BSyxK? zu_cAli8BQ2J^OHS)z#LLs8+~C;&ZiuA%uN3X)-*38A>97@+oH;o+)!l&|SnzH5gD5 zPSQ{vAj%8Jov{S$#yB#V*hv!b;0ub|M-nfvj+DLkj>P&N_4ovSg=!{u2$+-W7c8ik z-AYxb%>!DX5^4vvYWudD`?oePsMq&xY1Q}bCe=8_`ke3AdQ%rPHAijmWcPr5o@R{C z<_w?Ni_c~azmi7LXY+>7?8YafV8Ukyp&wLLL)HVIR7k{=6~Jdz)2|_GfzK+d@7Fo3 zWs|Cv;)OcJYF{dwwq&0f>CElZq$>m6#3|Bj8H&@ih59@C;;cqOvq8!mvjKa9%{&8<{3?8Tl9HxcG?NIyqdHW*Kub3Pk< ze4g??`;&dPVEF7;_Sur*vwztq#3%gPj4=mOz-$)N!fb46gD2(NWSK?|I}w?-e=QeovnjZacs|>Wd}bFu+mC!^8$MADL~BMm%?*Tk z@Yu8Jvr6x?ht($!Yr?O~m_35g7_DGWgTU&6Eu?>$pNtE(ELc% zCCzThE_>>G?Oq~=A^hyux6%Q?A`VAJksSd(YXUwy1bo&Ad^VN)EG7G-{KDuEOdaN! zZ1DG4;`hl70yDbgF?eS5&X!gOzh>by)X{3QLvVFZ{*APVZQedhtUlYmeU@B(wt@RB z!TM|q_gRwl*>dai<`AFEecDm11`x#5l zTW0M6qD*qX%Jbe;^*waKmiH`N^SzbX-4qvJmEW5_|K$r(84fl-tKtVM0fOcM>IP>%1eIx;iFG?c0GsCk!PCyQc-S5K{2mj$WvhfH>W)i{*>k-Wnv5 z8GGhhA{QP#i#qUdC~MDLTjmwdRyfiTFG@gsH@0`Ri
=9V73*s{c)xy4)_wIxQS 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
  • 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±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 Z45&OeSD3Au{DRD*>1T?{E}>lZ{{Y=nJdywa literal 0 HcmV?d00001 diff --git a/css/Inter/Inter-VariableFont_opsz,wght.ttf b/css/Inter/Inter-VariableFont_opsz,wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e31b51e3e9388ae61767c692885e5d77ff7b5346 GIT binary patch literal 874708 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≷9WK0CApUWn4bB=meh;stxvU@ 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 z

    s4ToVzzbdvnbS5gPVjeiI(+NtNy7mq)^rsP1mqy3Sn%D9xu@W#K(+eEpkqZQcH zqy6lHst|2Y4Vr=jU2OdzKGm}FMk7_Sud83TcCZjZ`^m-Ax`K?CHkLh;chN6v$WwDX z4O0tP)~g#Q@6G-c50H(SIo$RO>0zS>yDx0{WkuG9$E5BL|2cEM=Y)OP1js&rR0YIL zosD{%0rxy^goIcqJ3W-j`&Snn2v!DLy$z`sLm3?%lUUr<($lQxsXWiZRrxbl#yl~6 zf5i*Ta>EAsfxJiCaKBbx{$TdsoDToQte5y#JU7iJd3_OEF~om`{Nv}|r{!lcywHRq zkCAqOrwu>3PH)s=)YPHZ@-1mF>G z^wPA#y!Tep7c(hcisU+g`$Xmm-p1KOylquH^c^>+ToiDA=-ec5^Nn2Ih_#9JDCP|kQo z+fu+2Wm2U)+PhxpVb~~-zaw-%D1Cni_mY195Yc}$Dk0AaTO7PR#oMczX}HsE+M%eCOV~y9kH{ z5JW`!(xff0NUuwk-aAMKX#&zkR76EVEWwVbSYnBaMola)y&7X;G|^~!G3A+NqVApj zow;`xvAy@cpU?mE&wIFgXXnnGnK^U%nep=Ky?fTQ`B0TxbaQaR0-xw++IHWp4cC_T zeYBup_uIvDcB1KDZ81M+Si0?l&aRF_>A{_u)tfS5dMbg}Lbfh^n;@9Z^$hzDGNQ$> z5!GUdYPrW>EHsV!0zLmL+hT}cM(;Q*X8%C5^0sAXZ_6v)l9IDE*DpQYFEHI!PPx)U z_dh@x^i@TLoW6eFC~I3@?$(^b?WuWNv(LoG#KV7XVU{pj_5XX>o=orTpdT078cGoPZJSqckS7|!SqW_%H6 z^ryfO2TpCK5&|V*NeE@+Zx+{=!V#*jL=2$FZA(1aRh_#)jZ}2WbtfM?K1nyYv$FS- zmgXz_%GSUwx)mk8Vd1L{!*gaGVseg~WQFx&_UJLJShKVCd_%)a^Gi>+wVkUVDR8bjV z66)H&L^9JZd#+1ZsI$2j6W3|%ZR!|V02iiMnOH4a=Ne|>H@~taDs3g5)ajEoclEhC z_mu;ICG7{0y`e?*i52P9QitqLOMBlP8={w#SWdS+&|VU_c9pF5T<_dWSh^f6r|$v4 zgu0Q7LwR0G;-2|cv{0`W+4>=QtKgi?=GPiVu9lTw+uij_75$oMQDs%LlVdafxh^qp zPw|Gk1L*d^-y6%0*XFFKJ(P*3WgM!3iIL+TMi2TiC7cie*MI{B3CmXX!yS+h*UMYL zp?tJzpL3U)8}NIEUctJd)7qi&X2b6;_;l0e>-80HteB#$ZJ(8yXc6MoR+!)FJzuVC zV^p%lANTB>5)?UO1=8KGH^TOKB zDPU!SAf{hoK_mhaKE#nxD}A9#jTmDDB60*Ow=A%i3Bi+qaL0-LD{5sz*6d09knzMBQfH&tnnuQfhTcm)*)nO# z<^{!7&*#tEky+G!Fx`6Y9OvXk;baY;$M@DFuc+qG=^O1+mdEHYO%rti{C3>Lv=Q6B zFhU@}xPKf8o8WC^{v&IkamiBECOoHL7Em(2aP0-u61bsI?#9 zY}>d6QE^QnK1tR;H~-?2?(OIlU{^`F1I3HJGA{&v8-fW zRzZn1lhcWHx=`eU*X6MmDUlhw%M#Y*1(wA7>Q9w;&Grn~9l0b$UJ~i9r|%gE(*UMc z;bLH{P9PSLY2amQUPza~@la~ArQVKuuw7MR6*akOPx5G18oJQ1Dn9Yd;QGp!7B1LX zG<}yrMP=c#jDr1x1J!RXN#4`Ml8# z8b1AulGHq(;goT(x+Xb)Ptk_I);g{IYr_cpDJ6j+sQaLS4_NZUfHnP(q8%+~TW&n7 zGb9}z{_~mrfg}yymv6w8%lGEy$Z#uZ!l(ojYj@sCK&Ft^bx+JrbieGLkdxqEaemRd zw@W^tqpD@4HFoR)Wabj&;Tc_%2$$qt^^23a2INQOtxqi7lNp&}nMkK@+5{7-8XVXI zz?&!#Yvl{(v)>am2O#bNGVziuI9&)5t09o^S5)&fjcBdZ6c=Z1GWRaJP$hg-qph;K z)!Dg~xlG?0+4%QBc0b{*)mba*4y9#h9jZZp;ECuD(u->OW^$~Yn129G$M96m#`WRQ z9_}oX5EqvxnD|s#&6JCj#mI)g*Sf%>l>iH0UVAXj#d%Rv9Q!#XVLyd_y5UrjD?pkJ zh*%|a=XWM&YTy|K42+S1z^6Z1Amo4j{NOLGg?WJm9v931we-a+r||K&Dry_>V!Zs# z->X9}ZnA6NnVX*HnB-NtJ@v({D}Q?a?Na-5Yp?=elJ0bDJJMXxGmdRqb8HhPSGj=A z0*u-YYJwrq5OONiM8GJrDS(a;F&K_;N*JYE*kAr0LVa4eET5XjI&)rHNA&}AF7`TUmESwn3tC|uTxC~sqAf_Q)`Y!8?4jGup zQ|C-|oDyjp)1GgRDoo^Qo>Ltshs}#6?V;$ZXY^ z=uwxc2#<-<(Pp-Yb>IOVta!aJ@4ZsC3_u#iA+YBLUlO)^~%P6#N+Vlmd%556< zWzg^47ch4_5LynfRDlIx2Ea0dWY{Bpm2^&|An*L$t$i=QP`xF`KJF0GfBki&cPP$2XLI$DvuhA)N{q|0&i#_99BKV% zNy@JB4aZ+T^DD+#n@(mle|@5SWTgDW*UcFxH)SE}*E27_Fj&4TWywdaz#h0A4e$Y% z)K%LVpQ@a~9?W@F6gWS$Y@v%=b6LYejaP*g|5`SDt)l9aEgi4dqs%#(?zIOqJPMB2 z4b-+@s2pSmJz$3ylluk-aXqsPkYFl^K_DIKsyDNWb~sXC?jq6-Y(c(r9ZDA#ZLsC5 zEnB~AZvJv>{h6hqm#iYIBOd^|n`TY-m6zBXi49ifg{F&+$5j|W_Wrh*D^LPjwoZAoR@a1>$Q6szQN!9)n z+)(J+Iz5lW!i4(*(FH~nP#bBy_*$1Hyl)N2)hyD3LFog65zz-IE;+`Yh_)UoQ4?fM z3;Gc$S4@uV212Hm$f-N5$N9@rznOBGct&GL(LyOz`yP7jfN7xF1U(O<#Ch+%_u7G3 zfu zhf0tjNDg$AU_EEZgIinOQTJ#VbqFI9^QJki2QyO7Z4TSeKKCuuk-M;>x+)=8AAg9h z>QKo?e=xA5=(Gb(WzQGc#I+_&j?HS!%&GULypA4)o;^UkvE+#6bQtI}jFA>*uk`-< zS^)}NdNMcnN` z*#cpvc_9+;mt&E@wH~v8@kW7X8o;Dr0o!_i?ZCaQhFic8c5l>h^Gh#nHXJ;Au0MS+ zJ2$K5c=>aG4@lPjv$6a{Rc2n+U^-n>@cO#V?-drlyJ^Gg^S1V{h5y#|ui0x?Ra8-L zv6(42v3TS0n3&@myH4aYn=R@q3ajklBtqDJqO08gHwOyfC4g9a#ET7}I|FMa;{c-| zhl^tHY>=(QoleHZ;&238Uxy}x9J7nN^V+=VYQ^g-ayOI*YELdbxuoZnvdhS$sc_NC zX)~90&1-aHT`!$yP0C*FS#qLOM=PLWLtfA8<(J$W3l}dn)?2x#u*rjR)7!0F8`1kt zm+!$pyH+bN=v5ytKhS=??Lg_Vn+(41NSW##RIcv&^Pq3nJG~KWm8bNoj+Gv0yWaME z`EfEdoF}>p1XKtnUK=<=GYW<_MJ9zayVXR_;2EHktBQamJbMOc*_4C2iroJMy>RG1 z4j(M3vp>9a|1y2y*<+}F_V{5V^nxt*J`9hz-vzp3auHx07tzISXMF=;>%Em1+Rt8( zJ+{u%aY1%YRY^_5rAyS=l^2SxU95SbaPf+oy1~Ad``8zxOCspZ0v%Jtd;`)Y!>K6w zoQR-0I?#&H2ckkrEeLT1<}A!t{6K56236G073m7in9-4u5!zniw1IwmWCYc724W3D zeCS5uF<1*tpnduPvMJDLU^qxuDu&<=FdWeEm3$Lh&=UHorHEdcqq#c4Cs&;LJe8ci z{rRlCK9sydWAy38^snf(71*DO#6I2RAM_e~l6yd}F2DZ?y08rUQsFqDhx~&su&1~O z^y)I0TL70j57r7orUho4+xekcL`LRd$A_;ToE0)lOIK=?lKTa_m)U#toQ7zGVG477 zHgAThl!Il^9Hvgh)ZB!@3m~MKG2y0?k4Aw;h^L4sSB#0m4z-`8Y)%MWhlhvAlyTF> z+k26Sx4Qlh_Ffycz4vINSJ=Rpo5IWYHw6%TZ=Fx%Blh06O6Kf9Mt{5+J?Qb=oA(EU zIu3)qH>+xpu&4rX^j!eD%|N&d;TgKR5~Qo<4`4VjATmFPZeVeQD~hCWISjh}ZRRLm zdBHy|%|8$w<n;B4b&;~ZevyfSbq6dDG140vVEvkPsg zEc2WZAM3GaqJxu1PSN6w$aT#T5iRQ?G8Px*csMys+~W}!H^Z~6vLV#2FoRsi4%dOv zp8$MXL_D_w+pXFy1p+B3v*54+3$I##fYar{7&W`~T;;_%`M&=7G6x4^56kJ!E#3v` z(<{#p9?W@nH?@b&1RvDFgU%fbP-}>{rpAs*Gqcu2<0ZS_&4CV2fk!9o%1ASROG>f60OXtiAw1cX)maIIRKmUDv<3(y85)XQ}7NpdN&};5r7GfL` z)Bf7Z@KyKsIB)%OXQOmPvh2!`bIIYdm`;9^F&2Pms+$O;AeaHg<@6qM@~$;n^#vMu z_2bEs*)y!HeT?2Wq{4`5Mddqp3>U7u63y;FW*asD#uBP!z)2coTZ>R8vbE@5c8mQe z-8@RI1#0v@QOwAn%KEYjz5xva&!{e#gdtu)rb}KT#vrgf5xPVGGNJXSY)3juL(3Tk zS|*y)W>^|3(9{!%qL7|}otxF4+yAz5vo|nAG=%`kH+mIkrO&oc%_;Gw$^qQ)Id%1o zKI#2^>4e0j^{q{p)-^SIv!?(E5N7BR00Ml@TqFlXm7t}#pB}&i^x2&|6~y&g1-fu3 zgcT8M*?6U%3wlu5ZF%91AOpHkccidte`e#3IBGtQNk~i2TbM0RGjEh^MLqKl)tD|h zm0x0$lFB(*K(B_Be<08XDUpyQp&-Ep_@_X438t6RcTvHx@X~!} z;U%aFAx@CpbqS(*7Q6*EhzSb>*NBf@Ir^|1*aw&Oh4hGx0x`+yIp@!%HC7Q)zrtXEp{$b3ZtEEYPrO;mx)q%d_h6T(`H7s(O zI#Gg%LT(Xc=xQ7v>Fiq`swesK^lA?JrfdTJNvdA)1t15kG~*AP*RLgD}(ty1MT zi0l&RU+e+KQd(e3VibsSXa$$N0SW*QnhK&g&?)fwLYxta{ejbEO(=psLLY@#_{Z7F zbE~@}mR;-UxV9{!yL#^Av-%Z7Z`Pj2R}O&N?tJx|L-X&)pQFP^Mo!Vu4Y9V%@x2S@ z@%`mCaShRQ-DpS9X_Wf&FDUg)VEYM_tMc>1%#r+VfQSzpfZj+nh6T7=Il_$y;ihMu zVLzZ|-k>bs!mrJoE3@>7HNx-9DVB0#KO}!dyrJt8{yKNzUbLbY-Gsw}`7@uRxTeJ* zAChfM8h@e#P~r4Z-8rV{G<%UUxla0ceMYP&-v>4oTJW-yB71yS(f7|k>`F-Zg@^=7 zlWt64(@6*mAe)SfIDsxmFLzi$J2WT(2s?Xt4B`|$v(=@}U40fMfj_=}oP7b(7vPNJtMwow1t zy&H%=Y!i)DDnN)y)f%`F@di8_7yyBw;-f%OfALU#Sa}wpGF(2uqI0w9qm?i3Wq-Vh z{$)%+yT;yrI%s6RsFfolY~xdbqy-%~fc{e40Ftn~zz=qUIxOd*o?)g7!6}@|1gJ?| zOK=q-V5A3$_TcOa7P=&c8_>l4G_qg)SzFt!jqCch^>nYsS5~gOi}c$*>y<_ZdPW&1 z2Dita-e#BD60mD?-~7Wz*5lvG@SnoVIR_i+59f8PDz03_{`tngmY*;7cX11IoY-xg zxg@o#GpH%PtA~02;6ZJON1dY06ChCvM z2uXD0Nf*T>ERp_2no!T0fga#}AI6HSza3xTf;X%g5Obm2mw{9pT45Ex<|BYPd`BdIQgH$ae~4EQ>j@4#a%A>tW2%;-F5r^49JZd`Ttm71EF zO8uR$UuCaTf!FZ^J1^H+wkA?<2Yiousk@sEr2|*fCipdZURHpAR=ynhC~o&EPN5d! zL-tP3^vB)MKLnZzoxn_QNkU7lIO(4!tdGRK0$PI{phF44en(wwzPcxOH=22}^1`NK z-E+FNJ2N}pX=r?>J!_~|H!8Aw6wT2%xgzJda_AG}w%4bAq#~omf8lo{d%tb;Z%)e^ zZVg=lV>k_q@>D(mz9o|kcYh~KXZ%K$IES;{5-B)^rPTB-##p&7gzsRzF!1JRp9=R1tt z5!eDSNp!DxTiR%4R(8c`MP^p{Xxf(I`CAf^N8(n!-2GLQf)(b~*5*+U#y**<{ka7P z%F7Or>#>b8U(IL`1vtF@w_9(q%`?sx& zzS*?!LbJ{Z?cn**`Rfzn*Uc+jGwp=Vg0ocT@G!c`DFrJxAZG9LNVq<2sM0mvv-ot! zqI0FCnZ-MaN(`nqQj78~ofg$@n-i^;(!6u*ER1#2u+a$S%_ zlbJ;3;JYEzo>2X#b|>`ax;uS;$H_$W&o*_Rav%0NbaHDszQ*@SlpeHn%NE==uJ^Fe zhrQ=P?~c&>c#cR2IM8~1650wDJz$7rkWVn5yx%@Xp&$J=8q$)0UrJ~VMVZH6#TA!P zvA)j~l=CT`hn=W9!+*a0_MgMU^P63qo2!PYK=wR(mD<9tu(YFU*&_50+%h00Qy`84 zAPhMtrX>hHyp0#Ma$0KT@ia)D&JNpSo0n7=BHv%H9Ot2G3t{JvhS53Z09xf`RHW}S z8Rc99(447%_csj}yX!IZx1Wx|$4%Giks%!TR7fd7287e}gLz0M2mpLk+e60G4b>Nj zsZi-19II4W+<6u$g)|*?UK4twW>l2>xH=4VCC(UQC) z&5`N(McIza_*^5LBkxL2?~*4*&rKXkoI5vRD6%Izr@`GhuroKeH#*qQFL+3NN}Y>D zc0SG#Zh=$&M9kaV&L#-mLw2?h&{-f7-Tr_ug&Y{xAX5(X;U_2s<|g-7)LI5 z9jwEo9A$Flz_f_=3Q~IwDcABvoA}nDJ~?wh#8f}>Y)zh_UcR74L9_%tfGUBs3#oEk zyHqY$AMEEMp6>j}mG`03Tsbf^W<4N?wUFWaqd~HVb{+}rQ9p|)bzZXOs)u>Wq?FG~ z2A1?C_coW8%$1W-i!@h_%S(onF8I7;(NFcHCqPl4prj2#L7^_!0++2!#=)QHL9&&h zE>}wGa;2&qX3bR(bC}6*d=9hbs>|xu5m!pa2dzKMVHSZ+^3fb-=(`_kQT$m8Fe}_8 zv^>icBPn<(4J?37$vBn?(IlLFF0Q5P6ghCi6wbZ8$|Ke;$39H9<|58UCqCTmKG!za zR_-x^?sj)$O=`(Xs_4_Cfsl}aq)*v(%h;6<5>^KWu11FI3>P;4Y*oy^w*)|yQD2^fNT~Ki{;hqQ_7Q`SaL4-_!p1# zqH<4k_8z-b6YHI$X{vL>kL7Hn|%kzl%sI!?s^4D zpynhTkPta$$D4y-e?L9TGKDwLEvg#IRj|N@dk2fm#HL_T>3ey3@0U=|Js5`OxD0$)e)W{VwdpV=svuVo%p{!E zkPCjLW+x0Zr5GI4c8$pKtm&7_`)g!bVXoST3{n>M#}9tn+4-%ZePTnD%j{^GN&VTX znsW^^-NWr&A{NBj_2UOe4q`<=K{zm`0|f$GC|Cl3;1b>htVvHqk0Bn2h`eshX&`Fd zm@4p?JJ$pLq+DNv@%;-^3=V0#hGofkXgqTwT(u8QOKloJ2f2z+8T<4j=HL+|?6-?u z5aD7U?mn~OTus&4dJ|dnY?r8pM0)^9Jqb?%39#fpO^K-rB-{TwHE8b`NP+)#mOw58 z`u!$Q0@yaXW7}psZOg8r8rW5k&?4B0lXrr+0WuYi;UZduPh-o z$l3QrS5*4m;I6!a=aQ11E9lz@xZ4fT_QQ6T0;~qahG#hzz{J_mEynEZgp2bAH&sx* zAH^)6U>+W3{v!TqOZv9rEoZ7LrK9RX6y9`}j-DvII6DMo*DRxh( z-JbO7aaKO?ens8Il}L`yEZfxAN4;E{6z) zXc9A%Dg#AgJ=IFe$CN(;CAaZJZuhN6-wBm+4?C41`Yq8J8}thJmnx)Rw>{(+AK%IPImzi=+i z3~6dW@59)dse|69LEw-dES&|2q!2#^IA)+PBEj!85yPNlEETC___8uzyn4ZjE{XO`{RN+G-uziZ#akx}+Pu8l3JTi1z1y(0 z)XQAQpzZ?FKb1kJ@4UVuT5qy>Km$6GyDe*`^K3)Cy%@s3NAy>H(KV8}AyvQTSZV38 z8vWD_BYzBmE_j-T!!-{!ZtI5mI8 z-r6&=_U@o$@Q*bkCHv<|@()#@&vx(Tr3)eAbh9MF3N-&f-5lwMYz_K5uDn)N4h9bu zOW<|9PE~m?Uk;~{%;4&S>;^K&ABIp{`6iUwit|9uA*EuiDEtFgo0n-oZscSd((5u+ zE94v*cb#-PU=vZJPSCzvlJEWZa z&O~!_1@DO$j{Po%TZ!OzXx|Oq1Dh+Dkigl(Ka2h*^~f`MU&yZk)SCb&>8Q$~eNs+- z7eB9lPb>I|-=QA)oz$D~;TRkwUr7Z&T-3nBF$drnvyKBC@GSbCYmZpV;eBBP_db+Q zm^fAr?UQm2jxFl;xzu|Rn$A6|g&noE9_E2N(^y3EqWSsd&d3!ZOYRwT4OAhb;e?7~ ze-e!Cy-RAf!K|0?rO=zTW-kREDC!uxL;8kn&)>Osp_VZ98MP#QE$)<{FZj3Uuhege z<~;V67|sNTwxMS`5Wak2i;L*XoV*Ut!dOz9Jaesq>5srbf5z1Z-Anu(|2vcejLahP zsoBdc=AT8JmZaG$f*lO)L;VS#{MY*MKB-UI(*P}s^rw+O2K~e*pueSp-W{Ny!a;wF zgC2A*;T5j8TYPKq8`m0>$F&B(i(h}@cLF{9PI?z{226lPC5pmoB@pbTzTn5%Wx4rvFQpCur^cA^RK16|w0`uJWA=irs-bXG6+CT3fIM(&U-~j-`BmSV`Be=>2 z?CXHUy5JQh_h^#fVq^e`b;Q1fEI@bBqr#;-*fq5C2ecbIu*-!?py#knN2!Cf=>Eq- z2gM(3=21A-5($jZZ;T%uNMw9uL7YS&h;te6CKThh+b}3?L1cVGlDGa|)57kN{DQs9 z3(;@pA#*G&y+TZbnsQ|xxy{f@I9`ozie889DlmYXL1l3FV)%_4OVL#P>mN6Sou75# zU+>+IS+>;-g8lm=)YIPU!4^dZzxxzDdn##tp%! z4}VjDe?Y6ka4k*orS)T_y>cj}**7S!mdEO%nmqg^S|5Td7f_z;TlHuie5LIl7J9L7 z@P#<>Vc}R!z=9n1b6T$40c!y=G@>C-QgB-R1o1GD@O@SX`LlY6u&Q}Cn_fRc=>vJ`_A!2M}54! z{QSJUeAJ)l2t1Jzznk5(agX9V+NekI4T^IK4t8-248RReK|xMV!NK$O$o9`_Cw>JlFRF{0W{J)s+wzl3x%UH+Kn17pqft(*4vM zkR1oOp!gG@@q;F%qAAeiELb=XSS+!%rG+^OjPbD41x@0SPF&wWHt+l9l;E>>?%)rK zs-oXQM(;kQW6@+3w0mn%PiZ^y6r-ID64x6#b{*shp3hiIpqu$Y9! z(Xe591P%0c`mHf~AW-jjpk=U$0LiW^4$+A(u=|UtRD63KeH1>6(UpFjK;;#)JE;TY zXT`rusN7;WH%Wv|sSm`*!0L4v_=;F~7&&lQZ9~~oC*g`Hk?`ms!SY9*1(XuwJbEX* z!S6;AsRw`bPDM7oOOcJ0J9Z$nV+Z`2Cb&X}K@bGl>CiI79zyt$uI|H}X0V*8(q_5X zH;F{bXV{9+m67-GtwmjX92enRsMbHjMXaNpv&m)JtjSZS8B8`eoxL?(Yof>{lip70 zaB(HS<6mjh2e$U{b0(SE8eebqjCR%4H#E|nnVq=s%5;0HDRbiOVF~Ji6>k;#k&r_~ zL#7^t!dS_K+@BPlfdwFoaQyknBVXcMawK^R--<%!rw@LEtfOfgJb1A4AijXszy~Vd z*L48Y&GG{sFhgI^>(Oz-VTGS2K+BN$pM#Dn&%qoBge2WVk7 zuE@xt3lh+&EL4_kPLDSuCdL5dTGk<>5hZIb#TSt)(Oa&K;EU%dvpu;x3vCK_=8mlX zd96+VFRRhJ;OYj-N`=wBLQ@rGC5L|z;;M@_$qyaHpZ4LaN1qR;!q7DIDl4Hr#lHA9 zyp%^J(mp~d|B@~&r4XF(LSY_tgNx?0M26@!dQBU$J$?vxBD>az=O2FwSy@56s=Jky zKJ9~VV=w9kYl+@K)95v!hmPZ`IO6E@5v@;vM-%@JxN~T#_YjbL32TOITf?6R_+CT$ z9DF}vA9!n6@H{98GkIhq^FnytFxr8?-h$Tj^?i-%FvtXu!6(FZy_}lm;ri;yJ$zikOO66m{eo}o@S92 zm_Xn;fT~7eU>g)`f*QcS1HBL6TzZ`zpMk#0dGkiuXAzs5_6psjG5~fj4Z}JCw2V1kmysFhN8`R7G78Bqs_YuOEVX zXdYS@99$O~S{o8l8|oSw>gpOQXYcry`1_Uk`j+_lm-yBNIXMOeIXaPq$Gd{NR1{?l zboxg@o`R^Smzg{CN^ll|m&J!n_}H`NpEhJa7UOU@yfKS}ya)}rh$4=V>q|I*I7&{v zu-to|uQbGcj;*c73a=tRyFf30iLKXe?Wk(s8CEm=XN#ih0^kdgN1~Z_bVH<~fFxK% z0*D#?+;gZOeprIr|Lp5~ycRK+TR|-pxCPfdRu5aC8%lzTfN-QW3w3MoLpN^W8yjDV zGzJ7i-Pl+)8Ys^k+ETfVYfB4;4#+~}XfybuHsK=OP1M0H_{ENn@94(*IVEZRYB=Fw3Y?5%HUlwN%M{UlgO2 zg+;iv5Op)li_xk=T#NcjajgI;|3vesa9T{nR9f;d=N$w=Yl#MfY9>x|_0%-iG&2q~ zk4Sf$N=deaCRBTBQrjnLhg1<%EQZKN7vUMsqboq13PnshkT=T32N5B28ju%vDb*-W zi_D6PD6|09k(0ZtxL{`<{{7S`X02arO?LMDO(Av21CUH1PQx5L z8YBmZ6Ij6^06s?xcP^TnGw+bxFR4CNe(BtX=W^Qo8b8M0j4b!%8glfbBLNoc839T3dqH<4jJEsE%p`CZFVwN^5(gzW$B2)3+v`)vhm%s0|FN zqpjG3PN%6p_5qc|9;D{2Yq-?2apec~r(a%Jke{^aUuM_Aqo6-IQ2!8U(C18NZA>!H+ZMx$`-$#DRnDZS5W1I#7F2 zUaMGhxmZi5M(Sf{KRa1xa%yC9QP%>YBbVd8vYe+yfZk*qSBJhg=zKJk(?*VY90XUO~QwOj; zg0E!WARwRpAfry!v8<|z>7=9{ww}huGCL;^QKzt*8ID;Lp;xoJDSnpE>?lV)r@0PJ zrqQ(mT5$ndKQDd@z|`dyhX5)jR$XoeAoGfX86YPMs+I`P>8{^j+}2WBSw2A|&9Rrt zCuzz(y#xG(M$}=&?a4z;+U?uAT0-M%y{mkDYPx`kcq;1S-*v?D{7JV^)em54yGgKKP zDo6n=dJlTP$YBw&bP#bAv};`h_K0=S`q!IY@2@atj=h6&2tMOskO~zTW{80o2;&B+ zkk+-3h(WPqcjn~nJaBk>QSr7z`$eA}IDmh}w+|fxK^_jIV*}XFaE-DXrj>w6#wb&d zk(*2QwWUSxPBMi-dZ4TVo#{#e(A5#DeS$b_i>ks zromvr8>V{XLi5?GI#iq&TqNs6?)DZ^G^Yo(7X;?JS0f*LCmUf^VS!7!4-gbL)fY!t zcO7O}nFxz82`G0MbnqDYk~}0_>J(i--~WNo6xlcs($-O!+tvb9&EC#FT~mKrQ3N4t zs4}sUP@&dFoPn%e{e3;d0-Zvqhs~%Eo-A;1QW3m(M~>D>Z6e$v2(811LYrg8D3mlL zJ5et>VV0%bCRo65!yvdshT$d%`acYWcSb#xB#n(BuazHzUAorT7%CbDf*WJT5v>0V zI}o$vMe--88CigRN&{{e7zvyKZi0xC$5!D#F%cFoTmN-)ih8>9S~av*@SMcnj&PFn zaE_BSqkQ&S-JfH#`}M3~vvKUiGFZh<4g+z0Rs1gTaB>H%aVjstI5j5~dvFAc=Vbt= zH5*``zO5jdvIiU1uVwjt0ndA5eB zEIrUCE;GfoY#<9z{9&Jjfs!=8|K6*WP-69;dq$r4xDAT^uK+lmlbwf+FiKy;=SAc= zKyz*#9=huxWtJp5NL1VvC?I5}JWjpYW8RBw1I!a`!sI$l(JiULmHsOWLv!54V%Hq| z;DAY5;r_uve)Kgb*A!cGPhYgRh5a_M*zr>2qFC*=?SU<+GvZrAD}y|1yaRx)$3TLX zVg#1rf>=Xf3X}4XZ>SCN{3#4FccP8}gF3x%>z4Y3t>RWq4?jN$JVde-H~)#Ph|*od z?CUA-s907JXK&>gX&WDutf!q&`TGoC81!2}1m6)~1S&dqu7{8oOJp)#$OL0!y3zGt zS5C>@WOgj>p7^5T8`}6!{6}9)?NMN+R0iHHKx`dzjJ?Y-A0SRsEZDlGO9_Jk(nmqt z>%<~x8^lMo+=tiU>qgx|)2b@;9msY`07D+o)d^5f1eviqP?M*`7Cd6Jn0P?*6V9?ZklCEb)~4}+triD7C0p!-pH>j=Cx1A;XLM3m=MX97P7 z9@P_xMUX(QLs`gp?<+wbSVQ7}Wj}j)hqbet`I2rlp|mk3OiY1MVuIMsH6q@OnIP`b z5jhE0&3CqvSYjh8DL2t8QIFDr1ECly(KgheJwojB0t#2|pE6yjwPcPis zS86HI$MIil{S4QTD$W2NZh)NuUQh%fzZ@+fVgQecM8f4FJ9)muF(RzvA&+Qn%bwTW zE|N-Z>^8;xzbr|fps zu@!2TIE8I5U)(W2EPb{}?3yMC44pDDA~4wB|LvA(lQkLbsk04z+?jnF8#I>ei)f9S zmC_PWnHoMLGOr{>BRUamTXnN$GMU=Kqy!=}DE866;D3pSA=JYOz#uct`5vstol{|< z%a@L!8+h^o;ebZ7i=*lnuV{2D4RsQwMg;{&xck``b}ySZ+uqYN$ki^cJElpLTAwz* z(JC>-*gD$ZJKP6tEK1AHk975z?ID}Xx>N5a7dr_w?i=7&&?zuJ6Vcrk93`QGL_xj) zT(d|e20{o5h^`Qc!U=^I9AD5?|HeJh>L*oAUVP;7X6!v~U1^o5$+xK%Jo%bzV;!oS zms?lu=q8&@CDzsE7c8hlvt@1$FD*duP*;Z>WUh{H^0lfQ-QAto^L3~;uV6tf{Nm=o zp0BSfD5$GJvpw7#j@O{Nym<@i9O3&&Equ>kP(y0jGk?aHmBrim_~F+Q%gPdMy?xlP z;>t;h4|^$oenq0h-ygq}SW%H^;}^i(jJO1PM#6e8P*OO*r^5?th>;fZtA!a`AL7vDL*+`GDSg^#0sZq2GR2jO;0 zN6WJL)|1^`;0tW!0--+66lH*&00!?a6&qlUk@H{(*MGZh%>wv+7=GWZ`W+aLM2a_$ zB=|5Fgg4&~S+E9Ra2*c=NTa-MkU#-wXF}n(hK@*MV+z6@Q+qaa#a1VT3%7Se*G{s@ z)&=#JP8J{>u7`mV-G*=?Ywq|dc%3`Ymfzz9f7RrSi-=KaeO3^F!=5;9*o}T^SR1r( zu19Hb6XRn$+iQk@u!l3eB*`RLaNdQPIj{t$9xMm(g z^01ln>SmqB_B;j)+}y*D=}mPrPeMbQc?6oxTsw~d!?h!Txsi+0VQ#<< z_9QsEJpPI~!pNDniFx7txW%n`#&tg9fkxXOy)6Xbf27|h;eUF+X!*EBp8Cv=ACB^g zj%lPPG-P5#e}h`gh4`tu=5W@G$13hSx12rBAtBE2N13a>;Gbblg@#-q`9bw}n!6cE z)iNal;SNZYppCgl>%h%Oq$k1|$F)Abr>9@TLJhje0Zv^&-J4g$h8sMP;1&$S=Q4=ygIGdtr++0hqitaCi$p)eIN;0# zp*}qV`3z(n&m0Bq{5ZTq{l~$Az273#M-AYB0(n(;+|Ya(JXVjmzrZl!jto?n{7h3P)j-90 z%mZpKG)RnsoKb>T3b};0W${a5mZpb>rZ1hlgn1CPI5s3TH6*r^Tqb76?4dkGTj90; z=6P}nZwd=*3XfO_ie-d*M1;FrL8OnDWy9u`+IJ--^r4c!melikFf(Nq&4p5iVWfQ{?9wov#U&ufmKs7xoa)}I4JGpa7o*wWa4*X$4o9Rjgb>JZ9(f$`=sHeVc~3{ z;gRBEX72d6mMqE1+|1EZ5CHY5xO%qnG+$`J7_aPr$IG^m3h zc=j;qI9>QXM=eC0^rLUhZ5o`O(%PEh;N|7OWT48_)cPD0;Ara)Q`^m~#XpL6z$@UY zCK32#_IUMYe83p~ad&WJbkOdR-Zi^$s-LHqpO25HpK!Hza*9{e=FONTabB=;fW$`Z zulN@wA2S5++@TMAWU#LzV=dBe6 z&-y{(hq|&d7B9-m=`1&Pw{Z3McXbQ+8Fgjmc6McFc9omBnYji9xw-`5-_l!J($kun z(v02ALuWgNg*m3Tw5O;FL6MWl8V9jDzji4+I_ATxA|Qab)3Lg zj>9Ae;Zo`iiHL_Huhu2K0 zoAi7~HU0yCg@5=vJG`8^Y3x@Sq;F!PKgZvys9n#*M9+&G%r+RzMNZFqEOeH7W4Ccd z|AFl61O4SQciZ-y{Jdk)=O=rZZ8Q8l%*{RgX82SkySgTW0fmiWKc*AMwmWC?1GWKM zTqvf#yg#40K8jlBVe?UBSB$^T&c?r?>0Y;PxdDa^356PiB3%I&tRsYzScNy>8cFUG z0>Y+};2pR|l3eifvCx*nsw)k7w+{&B6x_{skz8d6ck>PM_ZX5UMUhWw5}G1Sl1_1y zC{mfucS`P?B%PA`CP@wWq!kpiRq4Y8lJKGm1joTqM7%x*#B)4JXIH;^4Bs6H@Pfck zPp<$f+RxL+$Ir{tPb7d#9c}+{4Gea6^z$2V^@mWIfB*sg;5%sC92(bB$wA{928#e1 z-#B)Lc1Z+j06zTcKX5BzzB;y4sNozO>}($xC?c0fZg2|ncXbSaqt#gr_G6r>+)H+t zkhi+1&TZq*Z{y5qO=26SEo)C9WZU_MY}mK2GreFz?B^y^g+)@PByHonjd> zbG4C?x0R{+6zvHUG$$Gv8XIX%m>|{`#)w@UXBcW~!2c#1OfxXipFCmW1cOOHH9uxf zD(8u2@Qj)^5K1I6q4@S(+!*s>3__8j8B4xeGG)p7C4l2O%vI$?m=j_wprr=D&pki; zItZ;KcViB~hESY>3I(bP?qG3J|V~Ut|=a8Ebbhf)Ngq0V8{u_k6qu$y-fiHtLzZ z^b+B(M4;Cd>Wjf8;%?fUCI@k-$roQ%jRWDo7a z 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

    Bd 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≠1AU|K%)`OS25Z{|o%e%0D+5{>04U9*Q*1!q^8U;HJTG%Y?XTKK#Ml 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 literal 0 HcmV?d00001 diff --git a/css/chat_style-cai-chat-square.css b/css/chat_style-cai-chat-square.css index d626dbb1..854fff60 100644 --- a/css/chat_style-cai-chat-square.css +++ b/css/chat_style-cai-chat-square.css @@ -16,6 +16,6 @@ } .message { - padding-bottom: 30px; + padding-bottom: 2em; grid-template-columns: 70px minmax(0, 1fr); } diff --git a/css/chat_style-cai-chat.css b/css/chat_style-cai-chat.css index 618184cf..d7b1ba88 100644 --- a/css/chat_style-cai-chat.css +++ b/css/chat_style-cai-chat.css @@ -1,7 +1,7 @@ .message { display: grid; grid-template-columns: 60px minmax(0, 1fr); - padding-bottom: 15px; + padding-bottom: 2em; font-size: 15px; font-family: 'Noto Sans', Helvetica, Arial, sans-serif; line-height: 22.5px !important; diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index 50b9402f..f1eb2531 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -1,21 +1,52 @@ .chat { background: transparent; - padding: 24px 19px; - padding-right: 19px !important; + padding: 0; padding-top: 0; } -.chat > .messages { - padding-top: 18px !important; +.chat > .messages:first-child { + padding-top: 0 !important; } -.message { - display: grid; - grid-template-columns: 60px 1fr; - padding-bottom: 25px; - font-size: 15px; - font-family: 'Noto Sans', Helvetica, Arial, sans-serif; - line-height: 24px; +.chat > .messages > :last-child { + margin-bottom: 1.7rem !important; +} + +.chat .message-body p, .chat .message-body li { + font-size: 1rem !important; + line-height: 28px !important; +} + +.dark .chat .message-body p, .dark .chat .message-body li { + color: #d1d5db !important; +} + +.chat .message-body p, +.chat .message-body ul, +.chat .message-body ol { + margin-top: 1.25em !important; + margin-bottom: 1.25em !important; +} + +.chat .message-body p:first-child, +.chat .message-body ul:first-child, +.chat .message-body ol:first-child { + margin-top: 0 !important; +} + +.chat .message-body p:last-child, +.chat .message-body ul:last-child, +.chat .message-body ol:last-child { + margin-bottom: 0 !important; +} + +.chat .message-body li { + margin-top: 1.25em !important; + margin-bottom: 1.25em !important; +} + +.user-message, .assistant-message { + font-family: Inter, Helvetica, Arial, sans-serif; } .message:first-child { @@ -26,49 +57,43 @@ display: none; } -.message-body p, .message-body li { - font-size: 15px !important; - line-height: 24px !important; -} - -.message-body p, .chat .message-body ul, .chat .message-body ol { - margin-bottom: 16px !important; -} - -.message-body p:last-child, .chat .message-body ul:last-child, .chat .message-body ol:last-child { - margin-bottom: 0 !important; -} - -.gradio-container .chat .assistant-message { - padding: 20px; - background: #f4f4f4; - margin-top: 9px !important; - margin-bottom: 12px !important; - border-radius: 7px; - border: 1px solid var(--border-color-primary); -} - -.dark .chat .assistant-message { - background: var(--color-grey-800); -} - -.gradio-container .chat .user-message { - padding: 20px; - padding-left: 0; - padding-right: 0; - background-color: transparent; - border-radius: 8px; +.chat .user-message { + padding: 1.5rem 1rem; + border-radius: 0; border-bottom-right-radius: 0; } -.gradio-container .chat .assistant-message:last-child, .gradio-container .chat .user-message:last-child { - margin-bottom: 0 !important; +.chat .assistant-message { + background: #f4f4f4; + padding: 1.5rem 1rem; + border-radius: 0; + border: 0; } -code { +.dark .chat .user-message { + background: transparent; +} + +.dark .chat .assistant-message { + background: var(--light-gray); +} + +.chat .user-message .text, +.chat .assistant-message .text { + max-width: 40.25rem; + margin-left: auto; + margin-right: auto; +} + +/* Create space between two assistant messages in a row */ +.assistant-message + .assistant-message { + margin-top: 1.5rem; +} + +pre > code { background-color: #f3f4f6 !important; } -.dark code { +.dark pre > code { background-color: #1f2937 !important; } diff --git a/css/main.css b/css/main.css index 26e58b5c..a886bcd9 100644 --- a/css/main.css +++ b/css/main.css @@ -1,7 +1,41 @@ +:root { + --darker-gray: #202123; + --dark-gray: #343541; + --light-gray: #444654; + --light-theme-gray: #f4f4f4; + --border-color-dark: #525252; + --header-width: 112px; + --selected-item-color-dark: #32333e; +} + +@font-face { + font-family: Inter; + src: url('file/css/Inter/Inter-VariableFont_opsz,wght.ttf') format('truetype'); + font-weight: 100 900; + font-style: normal; +} + +@font-face { + font-family: Inter; + src: url('file/css/Inter/Inter-Italic-VariableFont_opsz,wght.ttf') format('truetype'); + font-weight: 100 900; + font-style: italic; +} + .tabs.svelte-710i53 { margin-top: 0 } +.padded.svelte-12cmxck { + padding: 3px 0; +} + +div.svelte-sfqy0y, +div.svelte-iyf88w { + background: transparent; + border: 0; +} + .py-6 { padding-top: 2.5rem } @@ -19,7 +53,7 @@ height: 39.594px; align-self: end; line-height: 1em; - border-radius: 0.5em; + border-radius: 0.375rem; flex: none; } @@ -46,10 +80,6 @@ min-height: 0 } -.dark svg { - fill: white; -} - .dark a { color: white !important; } @@ -62,14 +92,20 @@ ol li p, ul li p { border: 0; } +#default-tab, #notebook-tab, #parameters, #chat-settings, #lora, #training-tab, #model-tab, #session-tab { + padding: 1rem; +} + .gradio-container { max-width: 100% !important; padding-top: 0 !important; } #extensions { - margin-top: 5px; - margin-bottom: 35px; + margin: 5px auto 35px; + max-width: 880px; + padding: 1em; + padding-left: calc(var(--header-width) + 1em); } .extension-tab { @@ -86,20 +122,29 @@ div.svelte-15lo0d8 > *, div.svelte-15lo0d8 > .form > * { } gradio-app > :first-child { - padding-left: var(--size-4) !important; - padding-right: var(--size-4) !important; + padding: 0 !important; } .header_bar { - background-color: #f4f4f4; box-shadow: 0 0 3px rgba(22 22 22 / 35%); margin-bottom: 0; overflow-x: scroll; - margin-left: calc(-1 * var(--size-4)); - margin-right: calc(-1 * var(--size-4)); - display: block !important; text-wrap: nowrap; z-index: 90; + position: fixed; + display: flex !important; + flex-direction: column; + height: 100dvh; + width: var(--header-width); +} + +.header_bar button { + margin: 0; + padding: 0.75rem; +} + +.header_bar button.selected { + border: 0; } .dark .header_bar { @@ -113,23 +158,23 @@ gradio-app > :first-child { } .textbox_default textarea { - height: calc(100dvh - 271px); + height: calc(100dvh - 201px); } .textbox_default_output textarea { - height: calc(100dvh - 185px); + height: calc(100dvh - 117px); } .textbox textarea { - height: calc(100dvh - 241px); + height: calc(100dvh - 172px); } .textbox_logits textarea { - height: calc(100dvh - 236px); + height: calc(100dvh - 205px); } .textbox_logits_notebook textarea { - height: calc(100dvh - 292px); + height: calc(100dvh - 221px); } .monospace textarea { @@ -149,24 +194,6 @@ gradio-app > :first-child { color: #efefef !important; } -@media screen and (width <= 711px) { - .textbox_default textarea { - height: calc(100dvh - 259px); - } - - div .default-token-counter { - top: calc( 0.5 * (100dvh - 236px) ) !important; - } - - .transparent-substring { - display: none; - } - - .hover-menu { - min-width: 250px !important; - } -} - /* Hide the gradio footer */ footer { display: none !important; @@ -227,11 +254,13 @@ button { .pretty_scrollbar::-webkit-scrollbar-thumb, .pretty_scrollbar::-webkit-scrollbar-thumb:hover { background: var(--neutral-300); + border-radius: 30px; } .dark .pretty_scrollbar::-webkit-scrollbar-thumb, .dark .pretty_scrollbar::-webkit-scrollbar-thumb:hover { - background: var(--neutral-700); + background: #ccc; + border-radius: 10px; } .pretty_scrollbar::-webkit-resizer { @@ -239,7 +268,8 @@ button { } .dark .pretty_scrollbar::-webkit-resizer { - background: #374151; + background: #ccc; + border-radius: 10px; } .pretty_scrollbar::-webkit-scrollbar-corner { @@ -251,20 +281,26 @@ audio { } /* Copied from https://github.com/AUTOMATIC1111/stable-diffusion-webui */ -.token-counter { +#default-token-counter, #notebook-token-counter { position: absolute !important; - top: calc( 0.5 * (100dvh - 218px) ) !important; - right: 2px; z-index: 100; background: var(--input-background-fill) !important; min-height: 0 !important; + width: 0; + text-align: left; + direction: rtl; + right: 5px; } -.default-token-counter { - top: calc( 0.5 * (100dvh - 248px) ) !important; +#default-token-counter { + top: calc(100dvh - 200px) !important; } -.token-counter span { +#notebook-token-counter { + top: calc(100dvh - 171px) !important; +} + +#default-token-counter span, #notebook-token-counter span { padding: 1px; box-shadow: 0 0 0 0.3em rgb(192 192 192 / 15%), inset 0 0 0.6em rgb(192 192 192 / 7.5%); border: 2px solid rgb(192 192 192 / 40%) !important; @@ -272,15 +308,15 @@ audio { } .no-background { - background: var(--background-fill-primary) !important; + background: transparent; padding: 0 !important; } /* ---------------------------------------------- Chat tab ---------------------------------------------- */ -.h-\[40vh\], .wrap.svelte-byatnx.svelte-byatnx.svelte-byatnx { - height: 66.67vh +.h-\[40dvh\], .wrap.svelte-byatnx.svelte-byatnx.svelte-byatnx { + height: 66.67dvh } .gradio-container { @@ -310,7 +346,13 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #chat-tab { - padding-top: 0; + padding: 0; +} + +#chat-tab > :nth-child(1) { + display: flex; + flex-direction: row; + gap: 0; } #chat-tab button#Generate, #chat-tab button#stop { @@ -322,7 +364,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #chat-tab > :first-child, #extensions { - max-width: 880px; margin-left: auto; margin-right: auto; } @@ -342,61 +383,49 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .chat { margin-left: auto; margin-right: auto; - max-width: 880px; min-height: var(--chat-height); overflow-y: auto; - padding-right: 15px; display: flex; flex-direction: column; word-break: break-word; overflow-wrap: anywhere; border-top: none; - border-radius: 0 0 0 8px; + border-radius: 0; visibility: visible; } .chat-parent { - height: calc(100dvh - 98px - var(--header-height) - var(--input-delta)); + height: calc(100dvh - 98px - var(--input-delta)); overflow: auto !important; border-radius: 0 !important; margin-bottom: var(--input-delta) !important; } -/* On desktop, automatically hide the chat scroll bar - * when not hovered. */ -@media (hover: hover) and (pointer: fine) { - .chat-parent { - visibility: hidden; - } - - .chat-parent:focus, .chat-parent:hover { - visibility: visible; - } -} - .chat-parent .prose { visibility: visible; } -.old-ui .chat-parent { - height: calc(100dvh - 192px - var(--header-height) - var(--input-delta)); - margin-bottom: var(--input-delta) !important; +.chat .message { + width: min(100%, 48rem); + margin-left: auto; + margin-right: auto; + text-align: start; + padding-left: 1rem; + padding-right: 1rem; } .chat-parent.bigchat { - height: calc(100dvh - 98px - var(--header-height) - var(--input-delta)) !important; + height: calc(100dvh - 98px - var(--input-delta)) !important; margin-bottom: var(--input-delta) !important; } .chat > .messages { display: flex; flex-direction: column; - padding-top: 25px; } -.chat .message:last-child { - margin-bottom: 0 !important; - padding-bottom: 15px !important; +.chat > .messages > :first-child { + padding-top: 20px; } .message-body h1, @@ -423,12 +452,12 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { padding-inline-start: 2em; } -.message-body li:not(:last-child) { - margin-top: 0 !important; - margin-bottom: 2px !important; +.chat .message-body li:not(:last-child) { + margin-top: 0; + margin-bottom: 2px; } -.message-body li:last-child { +.chat .message-body li:last-child { margin-bottom: 0 !important; } @@ -460,7 +489,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { margin: 0; } -.message-body code { +.message-body pre > code { white-space: pre-wrap !important; word-wrap: break-word !important; border: 1px solid #666; @@ -471,7 +500,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { color: #1f2328; } -.dark .message-body code { +.dark .message-body pre > code { background: #0d1117 !important; color: rgb(201 209 217); } @@ -481,8 +510,18 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { padding: 15px; } +.message-body :not(pre) > code::before { + content: "`"; +} + +.message-body :not(pre) > code::after { + content: "`"; +} + .message-body :not(pre) > code { white-space: normal !important; + font-weight: bold; + font-family: unset; } #chat-input { @@ -492,6 +531,15 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { border: none; } +#chat-input textarea { + padding: 0.65rem 2.5rem; +} + +#chat-input textarea::placeholder { + white-space: nowrap; + overflow: hidden; +} + #chat-input textarea:focus { box-shadow: none !important; } @@ -504,6 +552,14 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { display: none; } +.chat-input-positioned { + position: absolute; + bottom: 0; + max-width: 54rem; + left: 50%; + transform: translateX(-50%); +} + @media print { body { visibility: hidden; @@ -539,7 +595,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { #show-controls { position: absolute; - height: 100%; background-color: transparent; border: 0 !important; border-radius: 0; @@ -548,7 +603,8 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { #show-controls label { z-index: 1000; position: absolute; - right: 0; + right: 30px; + top: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -630,7 +686,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { position: absolute; bottom: 80%; left: 0; - background-color: var(--background-fill-primary); box-shadow: 0 0 5px rgb(0 0 0 / 25%); z-index: 10000; min-width: 330px; @@ -641,7 +696,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { width: 100%; background: transparent !important; border-radius: 0 !important; - border-color: var(--border-color-primary); justify-content: space-between; margin: 0 !important; height: 36px; @@ -663,7 +717,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { opacity: 0.333; } -#chat-tab:not(.old-ui) #chat-buttons { +#chat-tab #chat-buttons { display: none !important; } @@ -694,23 +748,37 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #chat-input-row { - padding-bottom: 20px; + padding-bottom: 1.5em; + padding-left: 1rem; + padding-right: 1rem; } -.old-ui #chat-input-row, #chat-input-row.bigchat { - padding-bottom: 0 !important; +#chat-input-row.bigchat { + padding-bottom: 1px !important; } #chat-col { padding-bottom: 100px; } -.old-ui #chat-col, #chat-col.bigchat { - padding-bottom: 80px !important; +@media screen and (width <= 924px) { + #chat-col { + padding-bottom: 100px; + margin-top: 32px; + position: relative; /* Ensure positioning for the pseudo-element */ + } + + .chat-parent { + height: calc(100dvh - 98px - var(--input-delta) - 32px); + } + + .chat-parent.bigchat { + height: calc(100dvh - 98px - var(--input-delta) - 32px) !important; + } } -.old-ui #chat-buttons #clear-history-confirm { - order: -1; +#chat-col.bigchat { + padding-bottom: 80px !important; } .chat ol, .chat ul { @@ -725,26 +793,36 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } /* ---------------------------------------------- - Past chat histories in a side bar on desktop + Create the sidebars ---------------------------------------------- */ -@media screen and (width >= 1327px) { - #past-chats-row { - position: absolute; - top: 36px; - left: 0; - width: calc(0.5*(var(--document-width) - 880px - 120px - 16px*2)); - max-width: 300px; - margin-left: calc(-0.5*(var(--document-width) - 880px - 14px - 16px * 2)); - } +#chat-controls, +#past-chats-row { + width: 260px; + max-width: 80vw; + padding: 0.5rem; + height: 100dvh; + flex-shrink: 0; + box-sizing: content-box; + z-index: 10; +} - #chat-controls { - position: absolute; - top: 16px; - right: 0; - width: calc(0.5*(var(--document-width) - 880px - 120px - 16px*2)); - max-width: 400px; - margin-right: calc(-0.5*(var(--document-width) - 880px - 14px - 16px * 2)); - } +#past-chats-row:not(.negative-header) { + max-width: calc(85vw - var(--header-width)); +} + +#chat-controls { + padding: 1rem; + padding-bottom: 0; +} + +#chat-controls > :nth-child(1) { + padding: 0.5rem; +} + +#past-chats-row + * { + width: unset; + flex-grow: 1; + flex-shrink: 1; } /* ---------------------------------------------- @@ -761,12 +839,12 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { position: fixed; bottom: 0; left: 0; - width: calc((100vw - 880px - 120px) /2); + width: calc(100vw / 2 - 600px); + z-index: 10000; } .pfp_character { position: relative; - z-index: 100; } .pfp_character:hover { @@ -780,10 +858,14 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #past-chats { - max-height: calc(100vh - 195px); + max-height: calc(100dvh - 90px); overflow-y: scroll !important; border-radius: 0; - scrollbar-width: none; /* Hide scrollbar in Firefox by default */ + scrollbar-width: auto; +} + +#past-chats::-webkit-scrollbar { + display: block; } #past-chats label { @@ -794,6 +876,24 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { border-radius: 0; padding-top: 8px; padding-bottom: 8px; + position: relative; + min-height: 42px !important; +} + +#past-chats label::before { + content: url('data:image/svg+xml;utf8,'); + position: absolute; + top: 12px; + left: 12px; + margin-right: 8px; +} + +.dark #past-chats label::before { + content: url('data:image/svg+xml;utf8,'); +} + +#past-chats label span { + margin-left: 29px; } #past-chats > :nth-child(2) { @@ -801,23 +901,264 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #past-chats > :nth-child(3) { - gap: 0; + gap: 0.25rem; } -#past-chats::-webkit-scrollbar { +#past-chats input { display: none; } -#past-chats:hover { - scrollbar-width: auto; +#past-chats label { + padding: 0.75rem; + font-size: 12.5px; + font-weight: 400; } -#past-chats:hover::-webkit-scrollbar { - display: block; +#past-chats .selected, +#past-chats label:hover { + border-radius: 0.5rem; } -@media screen and (width < 1327px) { - #past-chats { - max-height: 300px; +#past-chats label:hover { + cursor: pointer; +} + +#past-chats-buttons, +#delete-chat-row, +#rename-row { + width: 100%; + justify-content: center; +} + + +#past-chats-row, +#chat-controls { + width: 260px; + padding: 0.5rem; + height: calc(100dvh - 16px); + flex-shrink: 0; + box-sizing: content-box; +} + +.sidebar-hidden { + width: 0 !important; + padding: 0 !important; + overflow: hidden; +} + +#past-chats-toggle, +#chat-controls-toggle, +#navigation-toggle { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + user-select: none; + border-radius: 3px; + z-index: 1000; + position: fixed; + width: 2rem; + height: 2rem; + top: 0; +} + +#past-chats-toggle svg, +#chat-controls-toggle svg, +#navigation-toggle svg { + pointer-events: none; +} + +#past-chats-row:not(.negative-header, .sidebar-hidden) { + margin-left: 112px; +} + +@media screen and (width <= 408px) { + #past-chats-toggle.past-chats-open { + top: 28px; + } + + #chat-controls-toggle.chat-controls-open { + top: 28px; + right: calc(16px + min(260px, 80vw)) !important; + } +} + +#past-chats-toggle.past-chats-open.negative-header { + left: calc(min(260px, 85vw) + 16px); +} + +#past-chats-toggle.past-chats-open:not(.negative-header) { + left: calc(112px + min(260px, calc(85vw - var(--header-width))) + 16px); +} + +#past-chats-toggle.past-chats-closed:not(.negative-header) { + left: 112px; +} + +#past-chats-toggle.past-chats-closed.negative-header { + left: 0; + top: 28px; +} + +@media screen and (width <= 924px) { + #past-chats-toggle.past-chats-closed.negative-header { + left: 28px; + top: 0; + } +} + +.header_bar ~ *:not(#chat-tab) { + margin-left: var(--header-width); +} + +/* Positions for chat-controls-toggle */ +#chat-controls-toggle.chat-controls-open { + right: calc(min(260px, 80vw) + 23px); +} + +#chat-controls-toggle.chat-controls-closed { + right: 7px; +} + +@media screen and (width <= 924px) { + #chat-controls.sidebar-shown { + position: fixed; + right: 0; + } + + #past-chats-row.sidebar-shown { + position: fixed; + } +} + +/* ---------------------------------------------- + Dark theme +---------------------------------------------- */ +.dark .header_bar { + background-color: var(--darker-gray) !important; +} + +.dark .header_bar button.selected { + background: var(--selected-item-color-dark); +} + +.dark #chat-input textarea { + background: var(--light-gray); + color: white !important; + border-color: #292c3b; +} + +.dark #chat-input textarea::placeholder { + color: #9ca3af; +} + +.dark .hover-menu { + background-color: var(--darker-gray); +} + +.dark .hover-menu button { + border-color: var(--border-color-primary); +} + +.dark #chat-controls, +.dark #past-chats-row { + background-color: var(--darker-gray); + border: 0 !important; +} + +.dark #past-chats .selected, +.dark #past-chats label:hover { + background-color: var(--selected-item-color-dark) !important; +} + +.dark #past-chats-row, +.dark #chat-controls { + background-color: var(--darker-gray); +} + +.dark #past-chats-toggle, +.dark #chat-controls-toggle, +.dark #navigation-toggle { + color: white; +} + +.dark svg { + fill: white; + color: white; +} + +@media screen and (width <= 408px) { + .dark #past-chats-toggle.past-chats-open { + background: var(--darker-gray); + } + + .dark #chat-controls-toggle.chat-controls-open { + background: var(--darker-gray); + } +} + +/* ---------------------------------------------- + Light theme +---------------------------------------------- */ +.header_bar { + background-color: var(--light-theme-gray) !important; +} + +.header_bar button.selected { + background: white; +} + +#chat-controls, +#past-chats-row { + background-color: var(--light-theme-gray); +} + +#chat-controls { + border-left: 1px solid #d9d9d0; +} + +#past-chats-row { + border-right: 1px solid #d9d9d0; +} + +#past-chats-toggle, +#chat-controls-toggle, +#navigation-toggle { + color: gray !important; +} + +.mobile-top-bar { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 32px; + z-index: 2; + opacity: 0; + pointer-events: none; +} + +@media screen and (width <= 924px) { + .mobile-top-bar { + opacity: 1; + pointer-events: auto; + } + + .dark .mobile-top-bar { + background-color: var(--darker-gray); + } + + .mobile-top-bar { + background-color: var(--light-theme-gray); + } +} + +@media screen and (width <= 408px) { + #past-chats-toggle.past-chats-open { + background: var(--light-theme-gray); + } + + #chat-controls-toggle.chat-controls-open { + background: var(--light-theme-gray); } } diff --git a/js/main.js b/js/main.js index 3028afac..997701f5 100644 --- a/js/main.js +++ b/js/main.js @@ -18,16 +18,18 @@ document.querySelector(".header_bar").addEventListener("click", function(event) if (extensionsVisible) { if (extensions) { extensions.style.display = "flex"; - extensions.style.maxWidth = chatVisible ? "880px" : "none"; - extensions.style.padding = chatVisible ? "0px" : "15px"; } + this.style.marginBottom = chatVisible ? "0px" : "19px"; if (chatVisible && !showControlsChecked) { - document.querySelectorAll("#chat-tab > div > :nth-child(n+2), #extensions").forEach(element => { + document.querySelectorAll( + "#chat-tab > div > :nth-child(1), #chat-tab > div > :nth-child(3), #chat-tab > div > :nth-child(4), #extensions" + ).forEach(element => { element.style.display = "none"; }); } + } else { this.style.marginBottom = "19px"; if (extensions) extensions.style.display = "none"; @@ -132,8 +134,7 @@ targetElement.addEventListener("scroll", function() { const observer = new MutationObserver(function(mutations) { updateCssProperties(); - const firstChild = targetElement.children[0]; - if (firstChild.classList.contains("generating")) { + if (targetElement.classList.contains("_generating")) { typing.parentNode.classList.add("visible-dots"); document.getElementById("stop").style.display = "flex"; document.getElementById("Generate").style.display = "none"; @@ -255,7 +256,7 @@ for (i = 0; i < slimDropdownElements.length; i++) { // The show/hide events were adapted from: // https://github.com/SillyTavern/SillyTavern/blob/6c8bd06308c69d51e2eb174541792a870a83d2d6/public/script.js //------------------------------------------------ -var buttonsInChat = document.querySelectorAll("#chat-tab:not(.old-ui) #chat-buttons button"); +var buttonsInChat = document.querySelectorAll("#chat-tab #chat-buttons button"); var button = document.getElementById("hover-element-button"); var menu = document.getElementById("hover-menu"); var istouchscreen = (navigator.maxTouchPoints > 0) || "ontouchstart" in document.documentElement; @@ -290,12 +291,6 @@ if (buttonsInChat.length > 0) { thisButton.innerHTML = newText; } } -} else { - buttonsInChat = document.querySelectorAll("#chat-tab.old-ui #chat-buttons button"); - for (let i = 0; i < buttonsInChat.length; i++) { - buttonsInChat[i].textContent = buttonsInChat[i].textContent.replace(/ \(.*?\)/, ""); - } - document.getElementById("gr-hover-container").style.display = "none"; } function isMouseOverButtonOrMenu() { @@ -339,6 +334,8 @@ menu.addEventListener("mouseleave", function () { // Add event listener for click anywhere in the document document.addEventListener("click", function (event) { + const target = event.target; + // Check if the click is outside the button/menu and the menu is visible if (!isMouseOverButtonOrMenu() && menu.style.display === "flex") { hideMenu(); @@ -361,10 +358,9 @@ for (var i = 0; i < 2; i++) { parent.insertBefore(elementToMove, parent.firstChild); //------------------------------------------------ -// Make the chat input grow upwards instead of downwards +// Position the chat input //------------------------------------------------ -document.getElementById("show-controls").parentNode.style.position = "absolute"; -document.getElementById("show-controls").parentNode.style.bottom = "0px"; +document.getElementById("show-controls").parentNode.classList.add("chat-input-positioned"); //------------------------------------------------ // Focus on the chat input @@ -444,20 +440,10 @@ function updateCssProperties() { // Check if the chat container is visible if (chatContainer.clientHeight > 0) { - var numericHeight = chatContainer.parentNode.clientHeight - chatInputHeight + 40 - 100; - if (document.getElementById("chat-tab").style.paddingBottom != "") { - numericHeight += 20; - } - - const newChatHeight = `${numericHeight}px`; + const newChatHeight = `${chatContainer.parentNode.clientHeight - chatInputHeight + 40 - 100 - 20}px`; document.documentElement.style.setProperty("--chat-height", newChatHeight); document.documentElement.style.setProperty("--input-delta", `${chatInputHeight - 40}px`); - // Get and set header height - const header = document.querySelector(".header_bar"); - const headerHeight = `${header.clientHeight}px`; - document.documentElement.style.setProperty("--header-height", headerHeight); - // Adjust scrollTop based on input height change if (chatInputHeight !== currentChatInputHeight) { if (!isScrolled && chatInputHeight < currentChatInputHeight) { @@ -568,6 +554,8 @@ function moveToChatTab() { grandParent.style.display = "none"; } + grandParent.children[0].style.minWidth = "100%"; + const chatControlsFirstChild = document.querySelector("#chat-controls").firstElementChild; const newParent = chatControlsFirstChild; let newPosition = newParent.children.length - 2; @@ -586,6 +574,7 @@ function restoreOriginalPosition() { document.getElementById("save-character").style.display = ""; movedElement.style.display = ""; + movedElement.children[0].style.minWidth = ""; } } @@ -612,3 +601,206 @@ window.addEventListener("beforeunload", function (event) { }); moveToChatTab(); + +//------------------------------------------------ +// Buttons to toggle the sidebars +//------------------------------------------------ + +const leftArrowSVG = ` + + + + + +`; + +const rightArrowSVG = ` + + + + + +`; + +const hamburgerMenuSVG = ` + + + + +`; + +const closeMenuSVG = ` + + + +`; + +const chatTab = document.getElementById("chat-tab"); +const pastChatsRow = document.getElementById("past-chats-row"); +const chatControlsRow = document.getElementById("chat-controls"); + +if (chatTab) { + // Create past-chats-toggle div + const pastChatsToggle = document.createElement("div"); + pastChatsToggle.id = "past-chats-toggle"; + pastChatsToggle.innerHTML = leftArrowSVG; // Set initial icon to left arrow + pastChatsToggle.classList.add("past-chats-open"); // Set initial position + + // Create chat-controls-toggle div + const chatControlsToggle = document.createElement("div"); + chatControlsToggle.id = "chat-controls-toggle"; + chatControlsToggle.innerHTML = rightArrowSVG; // Set initial icon to right arrow + chatControlsToggle.classList.add("chat-controls-open"); // Set initial position + + // Append both elements to the chat-tab + chatTab.appendChild(pastChatsToggle); + chatTab.appendChild(chatControlsToggle); +} + +// Create navigation toggle div +const navigationToggle = document.createElement("div"); +navigationToggle.id = "navigation-toggle"; +navigationToggle.innerHTML = leftArrowSVG; // Set initial icon to right arrow +navigationToggle.classList.add("navigation-left"); // Set initial position +headerBar.appendChild(navigationToggle); + +// Retrieve the dynamically created toggle buttons +const pastChatsToggle = document.getElementById("past-chats-toggle"); +const chatControlsToggle = document.getElementById("chat-controls-toggle"); + +function toggleSidebar(sidebar, toggle) { + const isCurrentlyHidden = sidebar.classList.contains("sidebar-hidden"); + const shouldClose = !isCurrentlyHidden; + + // Apply visibility classes + sidebar.classList.toggle("sidebar-hidden", shouldClose); + sidebar.classList.toggle("sidebar-shown", !shouldClose); + + if (sidebar === headerBar) { + // Special handling for header bar + document.documentElement.style.setProperty("--header-width", shouldClose ? "0px" : "112px"); + pastChatsRow.classList.toggle("negative-header", shouldClose); + pastChatsToggle.classList.toggle("negative-header", shouldClose); + toggle.innerHTML = shouldClose ? hamburgerMenuSVG : closeMenuSVG; + } else if (sidebar === pastChatsRow) { + // Past chats sidebar + toggle.classList.toggle("past-chats-closed", shouldClose); + toggle.classList.toggle("past-chats-open", !shouldClose); + toggle.innerHTML = shouldClose ? rightArrowSVG : leftArrowSVG; + } else if (sidebar === chatControlsRow) { + // Chat controls sidebar + toggle.classList.toggle("chat-controls-closed", shouldClose); + toggle.classList.toggle("chat-controls-open", !shouldClose); + toggle.innerHTML = shouldClose ? leftArrowSVG : rightArrowSVG; + } + + // Mobile handling + if (isMobile()) { + sidebar.classList.toggle("sidebar-shown", !shouldClose); + } +} + +// Function to check if the device is mobile +function isMobile() { + return window.innerWidth <= 924; +} + +// Function to initialize sidebars +function initializeSidebars() { + const isOnMobile = isMobile(); + + if (isOnMobile) { + // Mobile state: Hide sidebars and set closed states + [pastChatsRow, chatControlsRow, headerBar].forEach(el => { + el.classList.add("sidebar-hidden"); + el.classList.remove("sidebar-shown"); + }); + + document.documentElement.style.setProperty("--header-width", "0px"); + pastChatsRow.classList.add("negative-header"); + pastChatsToggle.classList.add("negative-header", "past-chats-closed"); + pastChatsToggle.classList.remove("past-chats-open"); + + [chatControlsToggle, navigationToggle].forEach(el => { + el.classList.add("chat-controls-closed"); + el.classList.remove("chat-controls-open"); + }); + + pastChatsToggle.innerHTML = rightArrowSVG; + chatControlsToggle.innerHTML = leftArrowSVG; + navigationToggle.innerHTML = hamburgerMenuSVG; + } else { + // Desktop state: Show sidebars and set open states + [pastChatsRow, chatControlsRow].forEach(el => { + el.classList.remove("sidebar-hidden", "sidebar-shown"); + }); + + pastChatsToggle.classList.add("past-chats-open"); + pastChatsToggle.classList.remove("past-chats-closed"); + + [chatControlsToggle, navigationToggle].forEach(el => { + el.classList.add("chat-controls-open"); + el.classList.remove("chat-controls-closed"); + }); + + pastChatsToggle.innerHTML = leftArrowSVG; + chatControlsToggle.innerHTML = rightArrowSVG; + navigationToggle.innerHTML = closeMenuSVG; + } +} + +// Run the initializer when the page loads +initializeSidebars(); + +// Add an event listener to handle screen resizing +window.addEventListener("resize", initializeSidebars); + +// Add click event listeners to toggle buttons +pastChatsToggle.addEventListener("click", () => { + toggleSidebar(pastChatsRow, pastChatsToggle); +}); + +chatControlsToggle.addEventListener("click", () => { + toggleSidebar(chatControlsRow, chatControlsToggle); +}); + +navigationToggle.addEventListener("click", () => { + toggleSidebar(headerBar, navigationToggle); +}); + +//------------------------------------------------ +// Fixes #chat-input textarea height issue +// for devices with width <= 924px +//------------------------------------------------ + +if (isMobile()) { + // Target the textarea + const textarea = document.querySelector("#chat-input textarea"); + + if (textarea) { + // Simulate adding and removing a newline + textarea.value += "\n"; + textarea.dispatchEvent(new Event("input", { bubbles: true })); + textarea.value = textarea.value.slice(0, -1); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + } +} + +//------------------------------------------------ +// Create a top navigation bar on mobile +//------------------------------------------------ + +function createMobileTopBar() { + const chatTab = document.getElementById("chat-tab"); + + // Only create the top bar if it doesn't already exist + if (chatTab && !chatTab.querySelector(".mobile-top-bar")) { + const topBar = document.createElement("div"); + topBar.classList.add("mobile-top-bar"); + + // Insert the top bar as the first child of chat-tab + chatTab.appendChild(topBar); + } +} + +createMobileTopBar(); diff --git a/js/show_controls.js b/js/show_controls.js index 1ff88e52..1a87b52d 100644 --- a/js/show_controls.js +++ b/js/show_controls.js @@ -1,4 +1,6 @@ -const belowChatInput = document.querySelectorAll("#chat-tab > div > :nth-child(n+2), #extensions"); +const belowChatInput = document.querySelectorAll( + "#chat-tab > div > :nth-child(1), #chat-tab > div > :nth-child(3), #chat-tab > div > :nth-child(4), #extensions" +); const chatParent = document.querySelector(".chat-parent"); function toggle_controls(value) { diff --git a/modules/chat.py b/modules/chat.py index 787277b9..92808fb7 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -352,13 +352,17 @@ def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_mess for j, reply in enumerate(generate_reply(prompt, state, stopping_strings=stopping_strings, is_chat=True, for_ui=for_ui)): # Extract the reply - visible_reply = reply if state['mode'] in ['chat', 'chat-instruct']: - visible_reply = re.sub("(||{{user}})", state['name1'], reply) + visible_reply = re.sub("(||{{user}})", state['name1'], reply + '❚') + else: + visible_reply = reply + '❚' visible_reply = html.escape(visible_reply) if shared.stop_everything: + if output['visible'][-1][1].endswith('❚'): + output['visible'][-1][1] = output['visible'][-1][1][:-1] + output['visible'][-1][1] = apply_extensions('output', output['visible'][-1][1], state, is_chat=True) yield output return @@ -374,6 +378,9 @@ def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_mess if is_stream: yield output + if output['visible'][-1][1].endswith('❚'): + output['visible'][-1][1] = output['visible'][-1][1][:-1] + output['visible'][-1][1] = apply_extensions('output', output['visible'][-1][1], state, is_chat=True) yield output @@ -606,9 +613,9 @@ def find_all_histories_with_first_prompts(state): first_prompt = first_prompt.strip() - # Truncate the first prompt if it's longer than 32 characters - if len(first_prompt) > 32: - first_prompt = first_prompt[:29] + '...' + # Truncate the first prompt if it's longer than 30 characters + if len(first_prompt) > 30: + first_prompt = first_prompt[:30-3] + '...' result.append((first_prompt, filename)) @@ -1087,9 +1094,8 @@ def handle_delete_chat_confirm_click(state): def handle_rename_chat_click(): return [ - gr.update(visible=True, value="My New Chat"), + gr.update(value="My New Chat"), gr.update(visible=True), - gr.update(visible=True) ] @@ -1100,8 +1106,6 @@ def handle_rename_chat_confirm(rename_to, state): return [ gr.update(choices=histories, value=rename_to), gr.update(visible=False), - gr.update(visible=False), - gr.update(visible=False) ] @@ -1209,7 +1213,7 @@ def handle_delete_template_click(template): return [ f"{template}.yaml", "instruction-templates/", - gr.update(visible=True) + gr.update(visible=False) ] diff --git a/modules/shared.py b/modules/shared.py index 894ed6fe..599d6492 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -81,7 +81,6 @@ group.add_argument('--model-menu', action='store_true', help='Show a model menu group.add_argument('--settings', type=str, help='Load the default interface settings from this yaml file. See settings-template.yaml for an example. If you create a file called settings.yaml, this file will be loaded by default without the need to use the --settings flag.') group.add_argument('--extensions', type=str, nargs='+', help='The list of extensions to load. If you want to load more than one extension, write the names separated by spaces.') group.add_argument('--verbose', action='store_true', help='Print the prompts to the terminal.') -group.add_argument('--chat-buttons', action='store_true', help='Show buttons on the chat tab instead of a hover menu.') group.add_argument('--idle-timeout', type=int, default=0, help='Unload model after this many minutes of inactivity. It will be automatically reloaded when you try to use it again.') # Model loader @@ -191,6 +190,7 @@ group.add_argument('--gradio-auth-path', type=str, help='Set the Gradio authenti group.add_argument('--ssl-keyfile', type=str, help='The path to the SSL certificate key file.', default=None) group.add_argument('--ssl-certfile', type=str, help='The path to the SSL certificate cert file.', default=None) group.add_argument('--subpath', type=str, help='Customize the subpath for gradio, use with reverse proxy') +group.add_argument('--old-colors', action='store_true', help='Use the legacy Gradio colors, before the December/2024 update.') # API group = parser.add_argument_group('API') @@ -213,6 +213,7 @@ group.add_argument('--pre_layer', type=int, nargs='+', help='DEPRECATED') group.add_argument('--checkpoint', type=str, help='DEPRECATED') group.add_argument('--monkey-patch', action='store_true', help='DEPRECATED') group.add_argument('--no_inject_fused_attention', action='store_true', help='DEPRECATED') +group.add_argument('--chat-buttons', action='store_true', help='DEPRECATED') args = parser.parse_args() args_defaults = parser.parse_args([]) diff --git a/modules/ui.py b/modules/ui.py index c07beeb4..f8a2d8ab 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -50,6 +50,49 @@ theme = gr.themes.Default( button_secondary_border_color="var(--border-color-primary)" ) +if not shared.args.old_colors: + theme = theme.set( + # General Colors + border_color_primary='#c5c5d2', + body_text_color_subdued='#484848', + background_fill_secondary='#eaeaea', + background_fill_secondary_dark='var(--dark-gray)', + background_fill_primary='var(--neutral-50)', + background_fill_primary_dark='var(--darker-gray)', + body_background_fill="white", + block_background_fill="transparent", + body_text_color="#333", + button_secondary_background_fill="#f4f4f4", + button_secondary_border_color="var(--border-color-primary)", + + # Dark Mode Colors + input_background_fill_dark='var(--darker-gray)', + checkbox_background_color_dark='var(--darker-gray)', + block_background_fill_dark='transparent', + block_border_color_dark='transparent', + input_border_color_dark='var(--border-color-dark)', + checkbox_border_color_dark='var(--border-color-dark)', + border_color_primary_dark='var(--border-color-dark)', + button_secondary_border_color_dark='var(--border-color-dark)', + body_background_fill_dark='var(--dark-gray)', + button_primary_background_fill_dark='transparent', + button_secondary_background_fill_dark='transparent', + checkbox_label_background_fill_dark='transparent', + button_cancel_background_fill_dark='transparent', + button_secondary_background_fill_hover_dark='var(--selected-item-color-dark)', + checkbox_label_background_fill_hover_dark='var(--selected-item-color-dark)', + table_even_background_fill_dark='var(--darker-gray)', + table_odd_background_fill_dark='var(--dark-gray)', + + # Shadows and Radius + checkbox_label_shadow='none', + block_shadow='none', + block_shadow_dark='none', + button_large_radius='0.375rem', + button_large_padding='6px 12px', + input_radius='0.375rem', + ) + if Path("notification.mp3").exists(): audio_notification_js = "document.querySelector('#audio_notification audio')?.play();" else: @@ -232,10 +275,10 @@ def gather_interface_values(*args): def apply_interface_values(state, use_persistent=False): if use_persistent: state = shared.persistent_interface_state - if 'textbox-default' in state: + if 'textbox-default' in state and 'prompt_menu-default' in state: state.pop('prompt_menu-default') - if 'textbox-notebook' in state: + if 'textbox-notebook' and 'prompt_menu-notebook' in state: state.pop('prompt_menu-notebook') elements = list_interface_input_elements() diff --git a/modules/ui_chat.py b/modules/ui_chat.py index 57143cd8..e372f5c2 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -12,7 +12,6 @@ from modules.utils import gradio inputs = ('Chat input', 'interface_state') reload_arr = ('history', 'name1', 'name2', 'mode', 'chat_style', 'character_menu') -clear_arr = ('delete_chat-confirm', 'delete_chat', 'delete_chat-cancel') def create_ui(): @@ -21,7 +20,27 @@ def create_ui(): shared.gradio['Chat input'] = gr.State() shared.gradio['history'] = gr.JSON({'internal': [], 'visible': []}, visible=False) - with gr.Tab('Chat', elem_id='chat-tab', elem_classes=("old-ui" if shared.args.chat_buttons else None)): + with gr.Tab('Chat', elem_id='chat-tab'): + with gr.Row(elem_id='past-chats-row', elem_classes=['pretty_scrollbar']): + with gr.Column(): + with gr.Row(elem_id='past-chats-buttons'): + shared.gradio['rename_chat'] = gr.Button('Rename', elem_classes='refresh-button', interactive=not mu) + shared.gradio['delete_chat'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu) + shared.gradio['Start new chat'] = gr.Button('New chat', elem_classes=['refresh-button', 'focus-on-chat-input']) + + with gr.Row(elem_id='delete-chat-row', visible=False) as shared.gradio['delete-chat-row']: + shared.gradio['delete_chat-cancel'] = gr.Button('Cancel', elem_classes=['refresh-button', 'focus-on-chat-input']) + shared.gradio['delete_chat-confirm'] = gr.Button('Confirm', variant='stop', elem_classes=['refresh-button', 'focus-on-chat-input']) + + with gr.Row(elem_id='rename-row', visible=False) as shared.gradio['rename-row']: + shared.gradio['rename_to'] = gr.Textbox(label='Rename to:', placeholder='New name', elem_classes=['no-background']) + with gr.Row(): + shared.gradio['rename_to-cancel'] = gr.Button('Cancel', elem_classes=['refresh-button', 'focus-on-chat-input']) + shared.gradio['rename_to-confirm'] = gr.Button('Confirm', elem_classes=['refresh-button', 'focus-on-chat-input'], variant='primary') + + with gr.Row(): + shared.gradio['unique_id'] = gr.Radio(label="", elem_classes=['slim-dropdown', 'pretty_scrollbar'], interactive=not mu, elem_id='past-chats') + with gr.Row(): with gr.Column(elem_id='chat-col'): shared.gradio['display'] = gr.HTML(value=chat_html_wrapper({'internal': [], 'visible': []}, '', '', 'chat', 'cai-chat', '')) @@ -60,25 +79,6 @@ def create_ui(): shared.gradio['send-chat-to-default'] = gr.Button('Send to default') shared.gradio['send-chat-to-notebook'] = gr.Button('Send to notebook') - with gr.Row(elem_id='past-chats-row', elem_classes=['pretty_scrollbar']): - with gr.Column(): - with gr.Row(): - shared.gradio['rename_chat'] = gr.Button('Rename', elem_classes='refresh-button', interactive=not mu) - shared.gradio['delete_chat'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu) - shared.gradio['delete_chat-confirm'] = gr.Button('Confirm', variant='stop', visible=False, elem_classes=['refresh-button', 'focus-on-chat-input']) - shared.gradio['delete_chat-cancel'] = gr.Button('Cancel', visible=False, elem_classes=['refresh-button', 'focus-on-chat-input']) - shared.gradio['Start new chat'] = gr.Button('New chat', elem_classes=['refresh-button', 'focus-on-chat-input']) - - with gr.Row(elem_id='rename-row'): - shared.gradio['rename_to'] = gr.Textbox(label='Rename to:', placeholder='New name', visible=False, elem_classes=['no-background']) - with gr.Row(): - shared.gradio['rename_to-confirm'] = gr.Button('Confirm', visible=False, elem_classes=['refresh-button', 'focus-on-chat-input']) - shared.gradio['rename_to-cancel'] = gr.Button('Cancel', visible=False, elem_classes=['refresh-button', 'focus-on-chat-input']) - - gr.Markdown("Past chats") - with gr.Row(): - shared.gradio['unique_id'] = gr.Radio(label="", elem_classes=['slim-dropdown', 'pretty_scrollbar'], interactive=not mu, elem_id='past-chats') - with gr.Row(elem_id='chat-controls', elem_classes=['pretty_scrollbar']): with gr.Column(): with gr.Row(): @@ -180,29 +180,39 @@ def create_event_handlers(): shared.gradio['Generate'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( lambda x: (x, ''), gradio('textbox'), gradio('Chat input', 'textbox'), show_progress=False).then( + lambda: None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.add("_generating")').then( chat.generate_chat_reply_wrapper, gradio(inputs), gradio('display', 'history'), show_progress=False).then( + None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.remove("_generating")').then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['textbox'].submit( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( lambda x: (x, ''), gradio('textbox'), gradio('Chat input', 'textbox'), show_progress=False).then( + lambda: None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.add("_generating")').then( chat.generate_chat_reply_wrapper, gradio(inputs), gradio('display', 'history'), show_progress=False).then( + None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.remove("_generating")').then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Regenerate'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda: None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.add("_generating")').then( partial(chat.generate_chat_reply_wrapper, regenerate=True), gradio(inputs), gradio('display', 'history'), show_progress=False).then( + None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.remove("_generating")').then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Continue'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda: None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.add("_generating")').then( partial(chat.generate_chat_reply_wrapper, _continue=True), gradio(inputs), gradio('display', 'history'), show_progress=False).then( + None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.remove("_generating")').then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Impersonate'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( lambda x: x, gradio('textbox'), gradio('Chat input'), show_progress=False).then( + lambda: None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.add("_generating")').then( chat.impersonate_wrapper, gradio(inputs), gradio('textbox', 'display'), show_progress=False).then( + None, None, None, js='() => document.getElementById("chat").parentNode.parentNode.parentNode.classList.remove("_generating")').then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Replace last reply'].click( @@ -234,21 +244,21 @@ def create_event_handlers(): ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( chat.handle_start_new_chat_click, gradio('interface_state'), gradio('history', 'display', 'unique_id'), show_progress=False) - shared.gradio['delete_chat'].click(lambda: [gr.update(visible=True), gr.update(visible=False), gr.update(visible=True)], None, gradio(clear_arr)) - shared.gradio['delete_chat-cancel'].click(lambda: [gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)], None, gradio(clear_arr)) + shared.gradio['delete_chat'].click(lambda: gr.update(visible=True), None, gradio('delete-chat-row')) + shared.gradio['delete_chat-cancel'].click(lambda: gr.update(visible=False), None, gradio('delete-chat-row')) shared.gradio['delete_chat-confirm'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - chat.handle_delete_chat_confirm_click, gradio('interface_state'), gradio('history', 'display', 'unique_id') + gradio(clear_arr), show_progress=False) + chat.handle_delete_chat_confirm_click, gradio('interface_state'), gradio('history', 'display', 'unique_id', 'delete-chat-row'), show_progress=False) - shared.gradio['rename_chat'].click(chat.handle_rename_chat_click, None, gradio('rename_to', 'rename_to-confirm', 'rename_to-cancel'), show_progress=False) - shared.gradio['rename_to-cancel'].click(lambda: [gr.update(visible=False)] * 3, None, gradio('rename_to', 'rename_to-confirm', 'rename_to-cancel'), show_progress=False) + shared.gradio['rename_chat'].click(chat.handle_rename_chat_click, None, gradio('rename_to', 'rename-row'), show_progress=False) + shared.gradio['rename_to-cancel'].click(lambda: gr.update(visible=False), None, gradio('rename-row'), show_progress=False) shared.gradio['rename_to-confirm'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - chat.handle_rename_chat_confirm, gradio('rename_to', 'interface_state'), gradio('unique_id', 'rename_to', 'rename_to-confirm', 'rename_to-cancel'), show_progress=False) + chat.handle_rename_chat_confirm, gradio('rename_to', 'interface_state'), gradio('unique_id', 'rename-row')) shared.gradio['rename_to'].submit( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - chat.handle_rename_chat_confirm, gradio('rename_to', 'interface_state'), gradio('unique_id', 'rename_to', 'rename_to-confirm', 'rename_to-cancel'), show_progress=False) + chat.handle_rename_chat_confirm, gradio('rename_to', 'interface_state'), gradio('unique_id', 'rename-row'), show_progress=False) shared.gradio['load_chat_history'].upload( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( diff --git a/modules/ui_default.py b/modules/ui_default.py index 112acd23..af418ed7 100644 --- a/modules/ui_default.py +++ b/modules/ui_default.py @@ -20,12 +20,12 @@ def create_ui(): with gr.Column(): with gr.Row(): shared.gradio['textbox-default'] = gr.Textbox(value='', lines=27, label='Input', elem_classes=['textbox_default', 'add_scrollbar']) - shared.gradio['token-counter-default'] = gr.HTML(value="0", elem_classes=["token-counter", "default-token-counter"]) + shared.gradio['token-counter-default'] = gr.HTML(value="0", elem_id="default-token-counter") with gr.Row(): - shared.gradio['Generate-default'] = gr.Button('Generate', variant='primary') - shared.gradio['Stop-default'] = gr.Button('Stop', elem_id='stop') shared.gradio['Continue-default'] = gr.Button('Continue') + shared.gradio['Stop-default'] = gr.Button('Stop', elem_id='stop', visible=False) + shared.gradio['Generate-default'] = gr.Button('Generate', variant='primary') with gr.Row(): shared.gradio['prompt_menu-default'] = gr.Dropdown(choices=utils.get_available_prompts(), value='None', label='Prompt', elem_classes='slim-dropdown') @@ -63,20 +63,26 @@ def create_ui(): def create_event_handlers(): shared.gradio['Generate-default'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['textbox-default'].submit( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Continue-default'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, [shared.gradio['output_textbox']] + gradio(inputs)[1:], gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Stop-default'].click(stop_everything_event, None, None, queue=False) diff --git a/modules/ui_notebook.py b/modules/ui_notebook.py index 79932844..fccb1c98 100644 --- a/modules/ui_notebook.py +++ b/modules/ui_notebook.py @@ -23,7 +23,7 @@ def create_ui(): with gr.Tab('Raw'): with gr.Row(): shared.gradio['textbox-notebook'] = gr.Textbox(value='', lines=27, elem_id='textbox-notebook', elem_classes=['textbox', 'add_scrollbar']) - shared.gradio['token-counter-notebook'] = gr.HTML(value="0", elem_classes=["token-counter"]) + shared.gradio['token-counter-notebook'] = gr.HTML(value="0", elem_id="notebook-token-counter") with gr.Tab('Markdown'): shared.gradio['markdown_render-notebook'] = gr.Button('Render') @@ -48,10 +48,10 @@ def create_ui(): shared.gradio['tokens-notebook'] = gr.Textbox(lines=23, label='Tokens', elem_classes=['textbox_logits_notebook', 'add_scrollbar', 'monospace']) with gr.Row(): - shared.gradio['Generate-notebook'] = gr.Button('Generate', variant='primary', elem_classes='small-button') - shared.gradio['Stop-notebook'] = gr.Button('Stop', elem_classes='small-button', elem_id='stop') shared.gradio['Undo'] = gr.Button('Undo', elem_classes='small-button') shared.gradio['Regenerate-notebook'] = gr.Button('Regenerate', elem_classes='small-button') + shared.gradio['Stop-notebook'] = gr.Button('Stop', visible=False, elem_classes='small-button', elem_id='stop') + shared.gradio['Generate-notebook'] = gr.Button('Generate', variant='primary', elem_classes='small-button') with gr.Column(scale=1): gr.HTML('

    ') @@ -66,22 +66,28 @@ def create_event_handlers(): shared.gradio['Generate-notebook'].click( lambda x: x, gradio('textbox-notebook'), gradio('last_input-notebook')).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['textbox-notebook'].submit( lambda x: x, gradio('textbox-notebook'), gradio('last_input-notebook')).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Regenerate-notebook'].click( lambda x: x, gradio('last_input-notebook'), gradio('textbox-notebook'), show_progress=False).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( + lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Undo'].click( diff --git a/requirements.txt b/requirements.txt index 4e976d8e..24c92391 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_amd.txt b/requirements_amd.txt index dd537a66..b7093d50 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 275bbb22..88682aea 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index daeab92a..6588278d 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 99b5f3c2..1fc9795b 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 446a47ce..53fedd7e 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 73b9f764..9f52b172 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 5ea4f654..9ad138d8 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -4,7 +4,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index f6ba93bd..e2daebd9 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -3,7 +3,7 @@ colorama datasets einops fastapi==0.112.4 -gradio==4.26.* +gradio==4.37.* jinja2==3.1.4 markdown numba==0.59.* From 517fcc1f2324c02b952030c99b2e34cbda9e4283 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:12:16 -0800 Subject: [PATCH 079/173] Better centralize the chat tab --- css/main.css | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/css/main.css b/css/main.css index a886bcd9..7d090e57 100644 --- a/css/main.css +++ b/css/main.css @@ -968,10 +968,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { pointer-events: none; } -#past-chats-row:not(.negative-header, .sidebar-hidden) { - margin-left: 112px; -} - @media screen and (width <= 408px) { #past-chats-toggle.past-chats-open { top: 28px; @@ -1007,7 +1003,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } } -.header_bar ~ *:not(#chat-tab) { +.header_bar ~ * { margin-left: var(--header-width); } From c43ee5db1152c82a97b1fff13d32e66b0e452c46 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 07:59:55 -0800 Subject: [PATCH 080/173] UI: very minor color change --- modules/ui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui.py b/modules/ui.py index f8a2d8ab..9ef958ab 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -56,7 +56,7 @@ if not shared.args.old_colors: border_color_primary='#c5c5d2', body_text_color_subdued='#484848', background_fill_secondary='#eaeaea', - background_fill_secondary_dark='var(--dark-gray)', + background_fill_secondary_dark='var(--selected-item-color-dark)', background_fill_primary='var(--neutral-50)', background_fill_primary_dark='var(--darker-gray)', body_background_fill="white", @@ -82,7 +82,7 @@ if not shared.args.old_colors: button_secondary_background_fill_hover_dark='var(--selected-item-color-dark)', checkbox_label_background_fill_hover_dark='var(--selected-item-color-dark)', table_even_background_fill_dark='var(--darker-gray)', - table_odd_background_fill_dark='var(--dark-gray)', + table_odd_background_fill_dark='var(--selected-item-color-dark)', # Shadows and Radius checkbox_label_shadow='none', From addad3c63eff903f853055a95eb9487df6143a3e Mon Sep 17 00:00:00 2001 From: Diner Burger Date: Tue, 17 Dec 2024 15:43:48 -0500 Subject: [PATCH 081/173] Allow more granular KV cache settings (#6561) --- modules/exllamav2.py | 20 +++++++++--- modules/exllamav2_hf.py | 26 +++++++++++----- modules/llamacpp_hf.py | 10 +++--- modules/llamacpp_model.py | 38 +++++++++++++++++++---- modules/loaders.py | 12 +++----- modules/shared.py | 65 +++++++++++++++++++++++++++++++++++++-- modules/ui.py | 3 +- modules/ui_model_menu.py | 3 +- 8 files changed, 140 insertions(+), 37 deletions(-) diff --git a/modules/exllamav2.py b/modules/exllamav2.py index 0498c488..be5ef8d3 100644 --- a/modules/exllamav2.py +++ b/modules/exllamav2.py @@ -2,17 +2,19 @@ import traceback from pathlib import Path import torch + from exllamav2 import ( ExLlamaV2, ExLlamaV2Cache, ExLlamaV2Cache_8bit, ExLlamaV2Cache_Q4, + ExLlamaV2Cache_Q6, + ExLlamaV2Cache_Q8, ExLlamaV2Cache_TP, ExLlamaV2Config, ExLlamaV2Tokenizer ) from exllamav2.generator import ExLlamaV2Sampler, ExLlamaV2StreamingGenerator - from modules import shared from modules.logging_colors import logger from modules.text_generation import get_max_prompt_length @@ -57,12 +59,22 @@ class Exllamav2Model: model.load(split) # Determine the correct cache type - if shared.args.cache_8bit: + kv_cache_type = 'fp16' + if shared.args.cache_type: + kv_cache_type = shared.args.cache_type.lower() + + if kv_cache_type == 'fp16': + cache_type = ExLlamaV2Cache + elif kv_cache_type == 'fp8': cache_type = ExLlamaV2Cache_8bit - elif shared.args.cache_4bit: + elif kv_cache_type == 'q8': + cache_type = ExLlamaV2Cache_Q8 + elif kv_cache_type == 'q6': + cache_type = ExLlamaV2Cache_Q6 + elif kv_cache_type == 'q4': cache_type = ExLlamaV2Cache_Q4 else: - cache_type = ExLlamaV2Cache + raise ValueError(f"Invalid cache type for ExLlamaV2: {cache_type}. Valid options are: fp16, fp8, q8, q6, q4.") # Use TP if specified if shared.args.enable_tp: diff --git a/modules/exllamav2_hf.py b/modules/exllamav2_hf.py index 320a8d24..f6b943c8 100644 --- a/modules/exllamav2_hf.py +++ b/modules/exllamav2_hf.py @@ -4,18 +4,20 @@ from pathlib import Path from typing import Any, Dict, Optional, Union import torch +from torch.nn import CrossEntropyLoss +from transformers import GenerationConfig, PretrainedConfig, PreTrainedModel +from transformers.modeling_outputs import CausalLMOutputWithPast + from exllamav2 import ( ExLlamaV2, ExLlamaV2Cache, ExLlamaV2Cache_8bit, ExLlamaV2Cache_Q4, + ExLlamaV2Cache_Q6, + ExLlamaV2Cache_Q8, ExLlamaV2Cache_TP, ExLlamaV2Config ) -from torch.nn import CrossEntropyLoss -from transformers import GenerationConfig, PretrainedConfig, PreTrainedModel -from transformers.modeling_outputs import CausalLMOutputWithPast - from modules import shared from modules.logging_colors import logger @@ -45,12 +47,22 @@ class Exllamav2HF(PreTrainedModel): self.ex_model.load(split) # Determine the correct cache type - if shared.args.cache_8bit: + kv_cache_type = 'fp16' + if shared.args.cache_type: + kv_cache_type = shared.args.cache_type.lower() + + if kv_cache_type == 'fp16': + cache_type = ExLlamaV2Cache + elif kv_cache_type == 'fp8': cache_type = ExLlamaV2Cache_8bit - elif shared.args.cache_4bit: + elif kv_cache_type == 'q8': + cache_type = ExLlamaV2Cache_Q8 + elif kv_cache_type == 'q6': + cache_type = ExLlamaV2Cache_Q6 + elif kv_cache_type == 'q4': cache_type = ExLlamaV2Cache_Q4 else: - cache_type = ExLlamaV2Cache + raise ValueError(f"Invalid cache type for ExLlamaV2: {cache_type}. Valid options are: fp16, fp8, q8, q6, q4.") # Use TP if specified if shared.args.enable_tp: diff --git a/modules/llamacpp_hf.py b/modules/llamacpp_hf.py index 6611a7c1..79098250 100644 --- a/modules/llamacpp_hf.py +++ b/modules/llamacpp_hf.py @@ -9,6 +9,7 @@ from transformers.modeling_outputs import CausalLMOutputWithPast from modules import shared from modules.llama_cpp_python_hijack import llama_cpp_lib +from modules.llamacpp_model import get_llamacpp_cache_type_for_string from modules.logging_colors import logger @@ -196,12 +197,9 @@ class LlamacppHF(PreTrainedModel): 'flash_attn': shared.args.flash_attn } - if shared.args.cache_4bit: - params["type_k"] = 2 - params["type_v"] = 2 - elif shared.args.cache_8bit: - params["type_k"] = 8 - params["type_v"] = 8 + if shared.args.cache_type: + params["type_k"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) + params["type_v"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) Llama = llama_cpp_lib().Llama model = Llama(**params) diff --git a/modules/llamacpp_model.py b/modules/llamacpp_model.py index 96f7ed56..c8b3456e 100644 --- a/modules/llamacpp_model.py +++ b/modules/llamacpp_model.py @@ -10,6 +10,35 @@ from modules.llama_cpp_python_hijack import llama_cpp_lib from modules.logging_colors import logger from modules.text_generation import get_max_prompt_length +llamacpp_quant_mapping = { + 'f32': 0, + 'fp16': 1, + 'q4_0': 2, + 'q4_1': 3, + 'q5_0': 6, + 'q5_1': 7, + 'q8_0': 8, + 'q8_1': 9, + 'q2_k': 10, + 'q3_k': 11, + 'q4_k': 12, + 'q5_k': 13, + 'q6_k': 14, + 'q8_k': 15, + 'iq4_nl': 20, + 'bf16': 30, +} + +llamacpp_valid_cache_types = {'fp16', 'q8_0', 'q4_0'} + + +def get_llamacpp_cache_type_for_string(quant_type: str): + quant_type = quant_type.lower() + if quant_type in llamacpp_valid_cache_types: + return llamacpp_quant_mapping[quant_type] + else: + raise ValueError(f"Invalid cache type for llama.cpp: {quant_type}. Valid options are: fp16, q8_0, q4_0.") + def ban_eos_logits_processor(eos_token, input_ids, logits): logits[eos_token] = -float('inf') @@ -75,12 +104,9 @@ class LlamaCppModel: 'flash_attn': shared.args.flash_attn } - if shared.args.cache_4bit: - params["type_k"] = 2 - params["type_v"] = 2 - elif shared.args.cache_8bit: - params["type_k"] = 8 - params["type_v"] = 8 + if shared.args.cache_type: + params["type_k"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) + params["type_v"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) result.model = Llama(**params) if cache_capacity > 0: diff --git a/modules/loaders.py b/modules/loaders.py index deee00a7..4cb7e349 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -31,8 +31,7 @@ loaders_and_params = OrderedDict({ 'llama.cpp': [ 'n_ctx', 'n_gpu_layers', - 'cache_8bit', - 'cache_4bit', + 'cache_type', 'tensor_split', 'n_batch', 'threads', @@ -54,8 +53,7 @@ loaders_and_params = OrderedDict({ 'llamacpp_HF': [ 'n_ctx', 'n_gpu_layers', - 'cache_8bit', - 'cache_4bit', + 'cache_type', 'tensor_split', 'n_batch', 'threads', @@ -87,8 +85,7 @@ loaders_and_params = OrderedDict({ 'no_xformers', 'no_sdpa', 'num_experts_per_token', - 'cache_8bit', - 'cache_4bit', + 'cache_type', 'autosplit', 'enable_tp', 'alpha_value', @@ -103,8 +100,7 @@ loaders_and_params = OrderedDict({ 'no_xformers', 'no_sdpa', 'num_experts_per_token', - 'cache_8bit', - 'cache_4bit', + 'cache_type', 'autosplit', 'enable_tp', 'alpha_value', diff --git a/modules/shared.py b/modules/shared.py index 599d6492..41865e22 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -142,8 +142,6 @@ group.add_argument('--cfg-cache', action='store_true', help='ExLlamav2_HF: Creat group.add_argument('--no_flash_attn', action='store_true', help='Force flash-attention to not be used.') group.add_argument('--no_xformers', action='store_true', help='Force xformers to not be used.') group.add_argument('--no_sdpa', action='store_true', help='Force Torch SDPA to not be used.') -group.add_argument('--cache_8bit', action='store_true', help='Use 8-bit cache to save VRAM.') -group.add_argument('--cache_4bit', action='store_true', help='Use Q4 cache to save VRAM.') group.add_argument('--num_experts_per_token', type=int, default=2, help='Number of experts to use for generation. Applies to MoE models like Mixtral.') group.add_argument('--enable_tp', action='store_true', help='Enable Tensor Parallelism (TP) in ExLlamaV2.') @@ -166,6 +164,10 @@ group.add_argument('--hqq-backend', type=str, default='PYTORCH_COMPILE', help='B group = parser.add_argument_group('TensorRT-LLM') group.add_argument('--cpp-runner', action='store_true', help='Use the ModelRunnerCpp runner, which is faster than the default ModelRunner but doesn\'t support streaming yet.') +# Cache +group = parser.add_argument_group('Cache') +group.add_argument('--cache_type', type=str, default=None, help='KV cache type; valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') + # DeepSpeed group = parser.add_argument_group('DeepSpeed') group.add_argument('--deepspeed', action='store_true', help='Enable the use of DeepSpeed ZeRO-3 for inference via the Transformers integration.') @@ -213,6 +215,8 @@ group.add_argument('--pre_layer', type=int, nargs='+', help='DEPRECATED') group.add_argument('--checkpoint', type=str, help='DEPRECATED') group.add_argument('--monkey-patch', action='store_true', help='DEPRECATED') group.add_argument('--no_inject_fused_attention', action='store_true', help='DEPRECATED') +group.add_argument('--cache_4bit', action='store_true', help='DEPRECATED') +group.add_argument('--cache_8bit', action='store_true', help='DEPRECATED') group.add_argument('--chat-buttons', action='store_true', help='DEPRECATED') args = parser.parse_args() @@ -270,6 +274,59 @@ def fix_loader_name(name): return 'TensorRT-LLM' +def transform_legacy_kv_cache_options(opts): + # Handle both argparse.Namespace and dict here + def get(key): + return opts.get(key) if isinstance(opts, dict) else getattr(opts, key, None) + + def set(key, value): + if isinstance(opts, dict): + opts[key] = value + else: + setattr(opts, key, value) + + def del_key(key, fallback_set): + # only remove from user dict, can't delete from argparse.Namespace + if type(opts) is dict: + if key in opts: + del opts[key] + else: + setattr(opts, key, fallback_set) + + # Retrieve values + loader = get('loader') + cache_type = get('cache_type') + cache_8bit = get('cache_8bit') + cache_4bit = get('cache_4bit') + + # Determine cache type based on loader or legacy flags + if not cache_type: + if not loader: + # Legacy behavior: prefer 8-bit over 4-bit to minimize breakage + if cache_8bit: + set('cache_type', 'fp8') + elif cache_4bit: + set('cache_type', 'q4') + elif loader.lower() in ['exllamav2', 'exllamav2_hf']: + # ExLlamaV2 loader-specific cache type + if cache_8bit: + set('cache_type', 'fp8') + elif cache_4bit: + set('cache_type', 'q4') + elif loader.lower() in ['llama.cpp', 'llamacpp_hf']: + # Llama.cpp loader-specific cache type + if cache_4bit: + set('cache_type', 'q4_0') + elif cache_8bit: + set('cache_type', 'q8_0') + + # Clean up legacy keys + del_key('cache_4bit', False) + del_key('cache_8bit', False) + + return opts + + def add_extension(name, last=False): if args.extensions is None: args.extensions = [name] @@ -298,10 +355,14 @@ def load_user_config(): else: user_config = {} + for model_name in user_config: + user_config[model_name] = transform_legacy_kv_cache_options(user_config[model_name]) + return user_config args.loader = fix_loader_name(args.loader) +args = transform_legacy_kv_cache_options(args) # Activate the multimodal extension if args.multimodal_pipeline is not None: diff --git a/modules/ui.py b/modules/ui.py index 9ef958ab..ff5bc165 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -130,8 +130,7 @@ def list_model_elements(): 'no_xformers', 'no_sdpa', 'num_experts_per_token', - 'cache_8bit', - 'cache_4bit', + 'cache_type', 'autosplit', 'enable_tp', 'threads', diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 34d58177..eb61cd82 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -118,8 +118,7 @@ def create_ui(): shared.gradio['flash_attn'] = gr.Checkbox(label="flash_attn", value=shared.args.flash_attn, info='Use flash-attention.') shared.gradio['auto_devices'] = gr.Checkbox(label="auto-devices", value=shared.args.auto_devices) shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') - shared.gradio['cache_8bit'] = gr.Checkbox(label="cache_8bit", value=shared.args.cache_8bit, info='Use 8-bit cache to save VRAM.') - shared.gradio['cache_4bit'] = gr.Checkbox(label="cache_4bit", value=shared.args.cache_4bit, info='Use Q4 cache to save VRAM.') + shared.gradio['cache_type'] = gr.Dropdown(label="cache_type", choices=['fp16', 'q8_0', 'q4_0', 'fp8', 'q8', 'q6', 'q4'], value=shared.args.cache_type, info='Valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') shared.gradio['streaming_llm'] = gr.Checkbox(label="streaming_llm", value=shared.args.streaming_llm, info='(experimental) Activate StreamingLLM to avoid re-evaluating the entire prompt when old messages are removed.') shared.gradio['attention_sink_size'] = gr.Number(label="attention_sink_size", value=shared.args.attention_sink_size, precision=0, info='StreamingLLM: number of sink tokens. Only used if the trimmed prompt doesn\'t share a prefix with the old prompt.') shared.gradio['cpu'] = gr.Checkbox(label="cpu", value=shared.args.cpu, info='llama.cpp: Use llama-cpp-python compiled without GPU acceleration. Transformers: use PyTorch in CPU mode.') From 3030c79e8c6ff24c1b51047faa648f7e36b64eef Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:37:19 -0800 Subject: [PATCH 082/173] UI: show progress while loading a model --- modules/ui_model_menu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index eb61cd82..024ba189 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -194,13 +194,13 @@ def create_event_handlers(): shared.gradio['model_menu'].change( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( handle_load_model_event_initial, gradio('model_menu', 'interface_state'), gradio(ui.list_interface_input_elements()) + gradio('interface_state'), show_progress=False).then( - load_model_wrapper, gradio('model_menu', 'loader', 'autoload_model'), gradio('model_status'), show_progress=False).success( + load_model_wrapper, gradio('model_menu', 'loader', 'autoload_model'), gradio('model_status'), show_progress=True).success( handle_load_model_event_final, gradio('truncation_length', 'loader', 'interface_state'), gradio('truncation_length', 'filter_by_loader'), show_progress=False) shared.gradio['load_model'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( update_model_parameters, gradio('interface_state'), None).then( - partial(load_model_wrapper, autoload=True), gradio('model_menu', 'loader'), gradio('model_status'), show_progress=False).success( + partial(load_model_wrapper, autoload=True), gradio('model_menu', 'loader'), gradio('model_status'), show_progress=True).success( handle_load_model_event_final, gradio('truncation_length', 'loader', 'interface_state'), gradio('truncation_length', 'filter_by_loader'), show_progress=False) shared.gradio['unload_model'].click(handle_unload_model_click, None, gradio('model_status'), show_progress=False) From ddccc0d657bde02e294232fc3ec3126315de3bc2 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:39:00 -0800 Subject: [PATCH 083/173] UI: minor change to log messages --- modules/ui_model_menu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 024ba189..189bedfd 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -298,7 +298,7 @@ def download_model_wrapper(repo_id, specific_file, progress=gr.Progress(), retur downloader.check_model_files(model, branch, links, sha256, output_folder) progress(1.0) else: - yield (f"Downloading file{'s' if len(links) > 1 else ''} to `{output_folder}`") + yield (f"Downloading file{'s' if len(links) > 1 else ''} to `{output_folder}/`") downloader.download_model_files(model, branch, links, sha256, output_folder, progress_bar=progress, threads=4, is_llamacpp=is_llamacpp) yield (f"Model successfully saved to `{output_folder}/`.") @@ -318,7 +318,7 @@ def create_llamacpp_hf(gguf_name, unquantized_url, progress=gr.Progress()): links, sha256, is_lora, is_llamacpp = downloader.get_download_links_from_huggingface(model, branch, text_only=True) output_folder = Path(shared.args.model_dir) / (re.sub(r'(?i)\.gguf$', '', gguf_name) + "-HF") - yield (f"Downloading tokenizer to `{output_folder}`") + yield (f"Downloading tokenizer to `{output_folder}/`") downloader.download_model_files(model, branch, links, sha256, output_folder, progress_bar=progress, threads=4, is_llamacpp=False) # Move the GGUF From 60c93e0c66210ec7e3f99684858697abec8002a6 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:44:20 -0800 Subject: [PATCH 084/173] UI: Set cache_type to fp16 by default --- modules/exllamav2.py | 4 +--- modules/exllamav2_hf.py | 4 +--- modules/llamacpp_hf.py | 2 +- modules/llamacpp_model.py | 2 +- modules/shared.py | 5 ++--- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/modules/exllamav2.py b/modules/exllamav2.py index be5ef8d3..9b6da83c 100644 --- a/modules/exllamav2.py +++ b/modules/exllamav2.py @@ -59,9 +59,7 @@ class Exllamav2Model: model.load(split) # Determine the correct cache type - kv_cache_type = 'fp16' - if shared.args.cache_type: - kv_cache_type = shared.args.cache_type.lower() + kv_cache_type = shared.args.cache_type.lower() if kv_cache_type == 'fp16': cache_type = ExLlamaV2Cache diff --git a/modules/exllamav2_hf.py b/modules/exllamav2_hf.py index f6b943c8..62d1e054 100644 --- a/modules/exllamav2_hf.py +++ b/modules/exllamav2_hf.py @@ -47,9 +47,7 @@ class Exllamav2HF(PreTrainedModel): self.ex_model.load(split) # Determine the correct cache type - kv_cache_type = 'fp16' - if shared.args.cache_type: - kv_cache_type = shared.args.cache_type.lower() + kv_cache_type = shared.args.cache_type.lower() if kv_cache_type == 'fp16': cache_type = ExLlamaV2Cache diff --git a/modules/llamacpp_hf.py b/modules/llamacpp_hf.py index 79098250..f9964fe8 100644 --- a/modules/llamacpp_hf.py +++ b/modules/llamacpp_hf.py @@ -197,7 +197,7 @@ class LlamacppHF(PreTrainedModel): 'flash_attn': shared.args.flash_attn } - if shared.args.cache_type: + if shared.args.cache_type != 'fp16': params["type_k"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) params["type_v"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) diff --git a/modules/llamacpp_model.py b/modules/llamacpp_model.py index c8b3456e..6a76ee4e 100644 --- a/modules/llamacpp_model.py +++ b/modules/llamacpp_model.py @@ -104,7 +104,7 @@ class LlamaCppModel: 'flash_attn': shared.args.flash_attn } - if shared.args.cache_type: + if shared.args.cache_type != 'fp16': params["type_k"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) params["type_v"] = get_llamacpp_cache_type_for_string(shared.args.cache_type) diff --git a/modules/shared.py b/modules/shared.py index 41865e22..cab61226 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -166,7 +166,7 @@ group.add_argument('--cpp-runner', action='store_true', help='Use the ModelRunne # Cache group = parser.add_argument_group('Cache') -group.add_argument('--cache_type', type=str, default=None, help='KV cache type; valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') +group.add_argument('--cache_type', type=str, default='fp16', help='KV cache type; valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') # DeepSpeed group = parser.add_argument_group('DeepSpeed') @@ -295,12 +295,11 @@ def transform_legacy_kv_cache_options(opts): # Retrieve values loader = get('loader') - cache_type = get('cache_type') cache_8bit = get('cache_8bit') cache_4bit = get('cache_4bit') # Determine cache type based on loader or legacy flags - if not cache_type: + if cache_8bit or cache_4bit: if not loader: # Legacy behavior: prefer 8-bit over 4-bit to minimize breakage if cache_8bit: From b051e2c1614d5641c9b4841ff5b5b7377f254a0d Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:58:09 -0800 Subject: [PATCH 085/173] UI: improve a margin for readability --- css/main.css | 5 +++++ modules/ui.py | 1 + 2 files changed, 6 insertions(+) diff --git a/css/main.css b/css/main.css index 7d090e57..4affff0d 100644 --- a/css/main.css +++ b/css/main.css @@ -36,6 +36,11 @@ div.svelte-iyf88w { border: 0; } +/* "info" messages without a title above */ +.block > .svelte-e8n7p6:not(:only-of-type) { + margin-bottom: 2px; +} + .py-6 { padding-top: 2.5rem } diff --git a/modules/ui.py b/modules/ui.py index ff5bc165..4bfea9fa 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -83,6 +83,7 @@ if not shared.args.old_colors: checkbox_label_background_fill_hover_dark='var(--selected-item-color-dark)', table_even_background_fill_dark='var(--darker-gray)', table_odd_background_fill_dark='var(--selected-item-color-dark)', + code_background_fill_dark='var(--darker-gray)', # Shadows and Radius checkbox_label_shadow='none', From ac0f60eb1a09e59d98214239bb21fc63fe195c4c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:02:04 -0800 Subject: [PATCH 086/173] UI: make dropdown menus more readable --- css/main.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/css/main.css b/css/main.css index 4affff0d..0fba06df 100644 --- a/css/main.css +++ b/css/main.css @@ -835,6 +835,8 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { ---------------------------------------------- */ .options { z-index: 100 !important; + border: 1px solid var(--input-border-color); + border-radius: 0px; } /* ---------------------------------------------- From e83235a0cc4d11eee8da2f5192842369b7894149 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:11:51 -0800 Subject: [PATCH 087/173] UI: fix a font color --- css/html_instruct_style.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index f1eb2531..f6ceb932 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -17,7 +17,9 @@ line-height: 28px !important; } -.dark .chat .message-body p, .dark .chat .message-body li { +.dark .chat .message-body p, +.dark .chat .message-body li, +.dark .chat .message-body q { color: #d1d5db !important; } From b27f6f8915295da37ee6466d2ce05e63d8bf1273 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:13:32 -0800 Subject: [PATCH 088/173] Lint --- css/main.css | 2 +- modules/ui_default.py | 12 ++++++------ modules/ui_notebook.py | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/css/main.css b/css/main.css index 0fba06df..f33b5a59 100644 --- a/css/main.css +++ b/css/main.css @@ -836,7 +836,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .options { z-index: 100 !important; border: 1px solid var(--input-border-color); - border-radius: 0px; + border-radius: 0; } /* ---------------------------------------------- diff --git a/modules/ui_default.py b/modules/ui_default.py index af418ed7..ccae9a5e 100644 --- a/modules/ui_default.py +++ b/modules/ui_default.py @@ -63,26 +63,26 @@ def create_ui(): def create_event_handlers(): shared.gradio['Generate-default'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['textbox-default'].submit( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Continue-default'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then( generate_reply_wrapper, [shared.gradio['output_textbox']] + gradio(inputs)[1:], gradio(outputs), show_progress=False).then( lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Stop-default'].click(stop_everything_event, None, None, queue=False) diff --git a/modules/ui_notebook.py b/modules/ui_notebook.py index fccb1c98..b234ac57 100644 --- a/modules/ui_notebook.py +++ b/modules/ui_notebook.py @@ -66,28 +66,28 @@ def create_event_handlers(): shared.gradio['Generate-notebook'].click( lambda x: x, gradio('textbox-notebook'), gradio('last_input-notebook')).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['textbox-notebook'].submit( lambda x: x, gradio('textbox-notebook'), gradio('last_input-notebook')).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Regenerate-notebook'].click( lambda x: x, gradio('last_input-notebook'), gradio('textbox-notebook'), show_progress=False).then( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - lambda : [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-notebook', 'Generate-notebook')).then( generate_reply_wrapper, gradio(inputs), gradio(outputs), show_progress=False).then( lambda state, text: state.update({'textbox-notebook': text}), gradio('interface_state', 'textbox-notebook'), None).then( - lambda : [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( + lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-notebook', 'Generate-notebook')).then( None, None, None, js=f'() => {{{ui.audio_notification_js}}}') shared.gradio['Undo'].click( From c48e4622e863230eab574fe55baf807b27caddda Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:28:14 -0800 Subject: [PATCH 089/173] UI: update a link --- modules/block_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/block_requests.py b/modules/block_requests.py index 886930f0..6adc385a 100644 --- a/modules/block_requests.py +++ b/modules/block_requests.py @@ -47,7 +47,7 @@ def my_open(*args, **kwargs): if len(args) > 1 and args[1] == 'rb': file_contents = file_contents.decode('utf-8') - file_contents = file_contents.replace('\t\t', '') + file_contents = file_contents.replace('\t\t', '') file_contents = file_contents.replace('cdnjs.cloudflare.com', '127.0.0.1') file_contents = file_contents.replace( '', From 0c069e5b3f7be5a4f6f0d11308458a1a417ee795 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:16:26 -0800 Subject: [PATCH 090/173] UI: remove obsolete js event --- js/main.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/js/main.js b/js/main.js index 997701f5..fd2fe758 100644 --- a/js/main.js +++ b/js/main.js @@ -463,18 +463,6 @@ new ResizeObserver(updateCssProperties).observe(document.querySelector("#chat-in // Handle changes in window size window.addEventListener("resize", updateCssProperties); -//------------------------------------------------ -// Keep track of the display width to position the past -// chats dropdown on desktop -//------------------------------------------------ -function updateDocumentWidth() { - var updatedWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - document.documentElement.style.setProperty("--document-width", updatedWidth + "px"); -} - -updateDocumentWidth(); -window.addEventListener("resize", updateDocumentWidth); - //------------------------------------------------ // Focus on the rename text area when it becomes visible //------------------------------------------------ From 636a6621cc85b4ba089a22984c78e716eadf2320 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:16:59 -0800 Subject: [PATCH 091/173] UI: fix sidebars closing when typing on mobile --- js/main.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/js/main.js b/js/main.js index fd2fe758..06a44c79 100644 --- a/js/main.js +++ b/js/main.js @@ -740,9 +740,6 @@ function initializeSidebars() { // Run the initializer when the page loads initializeSidebars(); -// Add an event listener to handle screen resizing -window.addEventListener("resize", initializeSidebars); - // Add click event listeners to toggle buttons pastChatsToggle.addEventListener("click", () => { toggleSidebar(pastChatsRow, pastChatsToggle); From 0a15cff6a08db744cfb89e0fa63d8ee28c8d3525 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:27:06 -0800 Subject: [PATCH 092/173] UI: close sidebars by clicking outside their areas on mobile --- js/main.js | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index 06a44c79..a8018175 100644 --- a/js/main.js +++ b/js/main.js @@ -344,6 +344,21 @@ document.addEventListener("click", function (event) { if (event.target.classList.contains("pfp_character")) { toggleBigPicture(); } + + // Handle sidebar clicks on mobile + if (isMobile()) { + // Check if the click did NOT originate from any of the specified toggle buttons or elements + if ( + target.closest("#navigation-toggle") !== navigationToggle && + target.closest("#past-chats-toggle") !== pastChatsToggle && + target.closest("#chat-controls-toggle") !== chatControlsToggle && + target.closest(".header_bar") !== headerBar && + target.closest("#past-chats-row") !== pastChatsRow && + target.closest("#chat-controls") !== chatControlsRow + ) { + handleIndividualSidebarClose(event); + } + } }); //------------------------------------------------ @@ -656,7 +671,26 @@ headerBar.appendChild(navigationToggle); const pastChatsToggle = document.getElementById("past-chats-toggle"); const chatControlsToggle = document.getElementById("chat-controls-toggle"); -function toggleSidebar(sidebar, toggle) { +function handleIndividualSidebarClose(event) { + const target = event.target; + + // Close navigation bar if click is outside and it is open + if (!headerBar.contains(target) && !headerBar.classList.contains("sidebar-hidden")) { + toggleSidebar(headerBar, navigationToggle, true); + } + + // Close past chats row if click is outside and it is open + if (!pastChatsRow.contains(target) && !pastChatsRow.classList.contains("sidebar-hidden")) { + toggleSidebar(pastChatsRow, pastChatsToggle, true); + } + + // Close chat controls row if click is outside and it is open + if (!chatControlsRow.contains(target) && !chatControlsRow.classList.contains("sidebar-hidden")) { + toggleSidebar(chatControlsRow, chatControlsToggle, true); + } +} + +function toggleSidebar(sidebar, toggle, forceClose = false) { const isCurrentlyHidden = sidebar.classList.contains("sidebar-hidden"); const shouldClose = !isCurrentlyHidden; From 2bea4dfa966ace5b5c879fc5dcecb979caf5df77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alu=C3=ADsio=20Pires?= <88967089+Aluisio-Pires@users.noreply.github.com> Date: Wed, 18 Dec 2024 18:16:56 -0300 Subject: [PATCH 093/173] Fix an issue caused during the installation of tts (#6496) --- extensions/coqui_tts/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/coqui_tts/requirements.txt b/extensions/coqui_tts/requirements.txt index 747f99a0..b0b691e8 100644 --- a/extensions/coqui_tts/requirements.txt +++ b/extensions/coqui_tts/requirements.txt @@ -1 +1 @@ -TTS==0.21.* \ No newline at end of file +coqui-tts==0.25.1 From d01dd2e1c87121a3d3b70a54e68df8bda15458cc Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 13:35:09 -0800 Subject: [PATCH 094/173] UI: fix a margin --- css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index f33b5a59..65c96316 100644 --- a/css/main.css +++ b/css/main.css @@ -37,7 +37,7 @@ div.svelte-iyf88w { } /* "info" messages without a title above */ -.block > .svelte-e8n7p6:not(:only-of-type) { +.block > .svelte-e8n7p6:not(:only-of-type, #chat-mode *) { margin-bottom: 2px; } From 228caf0f3c0375b561516a762fec586ca45cc546 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:33:05 -0800 Subject: [PATCH 095/173] UI: add a scrollbar to the right sidebar --- css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/main.css b/css/main.css index 65c96316..fef3d3f1 100644 --- a/css/main.css +++ b/css/main.css @@ -818,6 +818,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { #chat-controls { padding: 1rem; padding-bottom: 0; + overflow-y: scroll; } #chat-controls > :nth-child(1) { From 9fd12605aca9f530b6c5ee0d7b34d5d5824d96f3 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 17:58:53 -0800 Subject: [PATCH 096/173] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fb22d099..1429e691 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ A Gradio web UI for Large Language Models. Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) of text generation. -|![Image1](https://github.com/oobabooga/screenshots/raw/main/print_instruct.png) | ![Image2](https://github.com/oobabooga/screenshots/raw/main/print_chat.png) | +|![Image1](https://github.com/oobabooga/screenshots/raw/main/AFTER-INSTRUCT.png) | ![Image2](https://github.com/oobabooga/screenshots/raw/main/AFTER-CHAT.png) | |:---:|:---:| -|![Image1](https://github.com/oobabooga/screenshots/raw/main/print_default.png) | ![Image2](https://github.com/oobabooga/screenshots/raw/main/print_parameters.png) | +|![Image1](https://github.com/oobabooga/screenshots/raw/main/AFTER-DEFAULT.png) | ![Image2](https://github.com/oobabooga/screenshots/raw/main/AFTER-PARAMETERS.png) | ## Features From fee23df1a55fa8a8ab7b0b9d468857fdef9ad51e Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 18 Dec 2024 18:13:01 -0800 Subject: [PATCH 097/173] Update README.md --- README.md | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 1429e691..0e16aa30 100644 --- a/README.md +++ b/README.md @@ -202,18 +202,19 @@ List of command-line flags ```txt usage: server.py [-h] [--multi-user] [--character CHARACTER] [--model MODEL] [--lora LORA [LORA ...]] [--model-dir MODEL_DIR] [--lora-dir LORA_DIR] [--model-menu] [--settings SETTINGS] - [--extensions EXTENSIONS [EXTENSIONS ...]] [--verbose] [--chat-buttons] [--idle-timeout IDLE_TIMEOUT] [--loader LOADER] [--cpu] [--auto-devices] - [--gpu-memory GPU_MEMORY [GPU_MEMORY ...]] [--cpu-memory CPU_MEMORY] [--disk] [--disk-cache-dir DISK_CACHE_DIR] [--load-in-8bit] [--bf16] [--no-cache] [--trust-remote-code] - [--force-safetensors] [--no_use_fast] [--use_flash_attention_2] [--use_eager_attention] [--load-in-4bit] [--use_double_quant] [--compute_dtype COMPUTE_DTYPE] [--quant_type QUANT_TYPE] - [--flash-attn] [--tensorcores] [--n_ctx N_CTX] [--threads THREADS] [--threads-batch THREADS_BATCH] [--no_mul_mat_q] [--n_batch N_BATCH] [--no-mmap] [--mlock] - [--n-gpu-layers N_GPU_LAYERS] [--tensor_split TENSOR_SPLIT] [--numa] [--logits_all] [--no_offload_kqv] [--cache-capacity CACHE_CAPACITY] [--row_split] [--streaming-llm] - [--attention-sink-size ATTENTION_SINK_SIZE] [--tokenizer-dir TOKENIZER_DIR] [--gpu-split GPU_SPLIT] [--autosplit] [--max_seq_len MAX_SEQ_LEN] [--cfg-cache] [--no_flash_attn] - [--no_xformers] [--no_sdpa] [--cache_8bit] [--cache_4bit] [--num_experts_per_token NUM_EXPERTS_PER_TOKEN] [--triton] [--no_inject_fused_mlp] [--no_use_cuda_fp16] [--desc_act] - [--disable_exllama] [--disable_exllamav2] [--wbits WBITS] [--groupsize GROUPSIZE] [--hqq-backend HQQ_BACKEND] [--cpp-runner] [--deepspeed] [--nvme-offload-dir NVME_OFFLOAD_DIR] + [--extensions EXTENSIONS [EXTENSIONS ...]] [--verbose] [--idle-timeout IDLE_TIMEOUT] [--loader LOADER] [--cpu] [--auto-devices] [--gpu-memory GPU_MEMORY [GPU_MEMORY ...]] + [--cpu-memory CPU_MEMORY] [--disk] [--disk-cache-dir DISK_CACHE_DIR] [--load-in-8bit] [--bf16] [--no-cache] [--trust-remote-code] [--force-safetensors] [--no_use_fast] + [--use_flash_attention_2] [--use_eager_attention] [--load-in-4bit] [--use_double_quant] [--compute_dtype COMPUTE_DTYPE] [--quant_type QUANT_TYPE] [--flash-attn] [--tensorcores] + [--n_ctx N_CTX] [--threads THREADS] [--threads-batch THREADS_BATCH] [--no_mul_mat_q] [--n_batch N_BATCH] [--no-mmap] [--mlock] [--n-gpu-layers N_GPU_LAYERS] + [--tensor_split TENSOR_SPLIT] [--numa] [--logits_all] [--no_offload_kqv] [--cache-capacity CACHE_CAPACITY] [--row_split] [--streaming-llm] [--attention-sink-size ATTENTION_SINK_SIZE] + [--tokenizer-dir TOKENIZER_DIR] [--gpu-split GPU_SPLIT] [--autosplit] [--max_seq_len MAX_SEQ_LEN] [--cfg-cache] [--no_flash_attn] [--no_xformers] [--no_sdpa] + [--num_experts_per_token NUM_EXPERTS_PER_TOKEN] [--enable_tp] [--triton] [--no_inject_fused_mlp] [--no_use_cuda_fp16] [--desc_act] [--disable_exllama] [--disable_exllamav2] + [--wbits WBITS] [--groupsize GROUPSIZE] [--hqq-backend HQQ_BACKEND] [--cpp-runner] [--cache_type CACHE_TYPE] [--deepspeed] [--nvme-offload-dir NVME_OFFLOAD_DIR] [--local_rank LOCAL_RANK] [--alpha_value ALPHA_VALUE] [--rope_freq_base ROPE_FREQ_BASE] [--compress_pos_emb COMPRESS_POS_EMB] [--listen] [--listen-port LISTEN_PORT] [--listen-host LISTEN_HOST] [--share] [--auto-launch] [--gradio-auth GRADIO_AUTH] [--gradio-auth-path GRADIO_AUTH_PATH] [--ssl-keyfile SSL_KEYFILE] [--ssl-certfile SSL_CERTFILE] - [--subpath SUBPATH] [--api] [--public-api] [--public-api-id PUBLIC_API_ID] [--api-port API_PORT] [--api-key API_KEY] [--admin-key ADMIN_KEY] [--nowebui] + [--subpath SUBPATH] [--old-colors] [--api] [--public-api] [--public-api-id PUBLIC_API_ID] [--api-port API_PORT] [--api-key API_KEY] [--admin-key ADMIN_KEY] [--nowebui] [--multimodal-pipeline MULTIMODAL_PIPELINE] [--model_type MODEL_TYPE] [--pre_layer PRE_LAYER [PRE_LAYER ...]] [--checkpoint CHECKPOINT] [--monkey-patch] [--no_inject_fused_attention] + [--cache_4bit] [--cache_8bit] [--chat-buttons] Text generation web UI @@ -232,7 +233,6 @@ Basic settings: file will be loaded by default without the need to use the --settings flag. --extensions EXTENSIONS [EXTENSIONS ...] The list of extensions to load. If you want to load more than one extension, write the names separated by spaces. --verbose Print the prompts to the terminal. - --chat-buttons Show buttons on the chat tab instead of a hover menu. --idle-timeout IDLE_TIMEOUT Unload model after this many minutes of inactivity. It will be automatically reloaded when you try to use it again. Model loader: @@ -291,9 +291,8 @@ ExLlamaV2: --no_flash_attn Force flash-attention to not be used. --no_xformers Force xformers to not be used. --no_sdpa Force Torch SDPA to not be used. - --cache_8bit Use 8-bit cache to save VRAM. - --cache_4bit Use Q4 cache to save VRAM. --num_experts_per_token NUM_EXPERTS_PER_TOKEN Number of experts to use for generation. Applies to MoE models like Mixtral. + --enable_tp Enable Tensor Parallelism (TP) in ExLlamaV2. AutoGPTQ: --triton Use triton. @@ -311,6 +310,9 @@ HQQ: TensorRT-LLM: --cpp-runner Use the ModelRunnerCpp runner, which is faster than the default ModelRunner but doesn't support streaming yet. +Cache: + --cache_type CACHE_TYPE KV cache type; valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4. + DeepSpeed: --deepspeed Enable the use of DeepSpeed ZeRO-3 for inference via the Transformers integration. --nvme-offload-dir NVME_OFFLOAD_DIR DeepSpeed: Directory to use for ZeRO-3 NVME offloading. @@ -332,6 +334,7 @@ Gradio: --ssl-keyfile SSL_KEYFILE The path to the SSL certificate key file. --ssl-certfile SSL_CERTFILE The path to the SSL certificate cert file. --subpath SUBPATH Customize the subpath for gradio, use with reverse proxy + --old-colors Use the legacy Gradio colors, before the December/2024 update. API: --api Enable the API extension. From 836a868abcca409eb9c7f8539dad1b8942b204c2 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:21:28 -0800 Subject: [PATCH 098/173] UI: improve the heading fonts --- css/html_instruct_style.css | 19 ++++-------- css/main.css | 58 +++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index f6ceb932..5591f7d1 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -17,28 +17,19 @@ line-height: 28px !important; } -.dark .chat .message-body p, -.dark .chat .message-body li, -.dark .chat .message-body q { +.dark .chat .message-body :is(p, li, q, h1, h2, h3, h4, h5, h6) { color: #d1d5db !important; } -.chat .message-body p, -.chat .message-body ul, -.chat .message-body ol { - margin-top: 1.25em !important; - margin-bottom: 1.25em !important; +.chat .message-body :is(p, ul, ol) { + margin: 1.25em 0 !important; } -.chat .message-body p:first-child, -.chat .message-body ul:first-child, -.chat .message-body ol:first-child { +.chat .message-body :is(p, ul, ol):first-child { margin-top: 0 !important; } -.chat .message-body p:last-child, -.chat .message-body ul:last-child, -.chat .message-body ol:last-child { +.chat .message-body :is(p, ul, ol):last-child { margin-bottom: 0 !important; } diff --git a/css/main.css b/css/main.css index fef3d3f1..7b3910f9 100644 --- a/css/main.css +++ b/css/main.css @@ -433,12 +433,60 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { padding-top: 20px; } -.message-body h1, -.message-body h2, -.message-body h3, +.message-body { + font-size: 16px; +} + +.message-body :is(h1, h2, h3, h4, h5, h6) { + color: black !important; +} + +.dark .message-body :is(h1, h2, h3, h4, h5, h6) { + color: white !important; +} + +.message-body h1 { + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.message-body h2 { + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.message-body h3 { + font-weight: 600; + font-size: 1.25em; + margin-top: 0; + margin-bottom: 0.6em; + line-height: 1.6; +} + .message-body h4 { - color: var(--body-text-color); - margin: 20px 0 10px; + font-weight: 600; + font-size: 1em; + margin-top: 0; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.message-body h5 { + font-weight: normal; + font-size: 1em; + margin: 0; +} + +.message-body h6 { + font-weight: normal; + font-size: 1em; + margin: 0; } .dark .message q { From 24a4c98d42a60283df1bc7e583604be222de4626 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:23:03 -0800 Subject: [PATCH 099/173] UI: improve the style of links in messages --- css/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/css/main.css b/css/main.css index 7b3910f9..637dbae5 100644 --- a/css/main.css +++ b/css/main.css @@ -501,6 +501,10 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { list-style-position: outside; } +.message-body a { + font-weight: 500; +} + .chat .message-body ul, .chat .message-body ol { padding-inline-start: 2em; } From c8ddb86c22e8c8a2b56d161e4acf311c79fb1c17 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:23:21 -0800 Subject: [PATCH 100/173] UI: improve some light mode colors --- css/html_instruct_style.css | 2 +- css/main.css | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index 5591f7d1..14fd919d 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -51,13 +51,13 @@ } .chat .user-message { + background: #f4f4f4; padding: 1.5rem 1rem; border-radius: 0; border-bottom-right-radius: 0; } .chat .assistant-message { - background: #f4f4f4; padding: 1.5rem 1rem; border-radius: 0; border: 0; diff --git a/css/main.css b/css/main.css index 637dbae5..ec118911 100644 --- a/css/main.css +++ b/css/main.css @@ -437,10 +437,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { font-size: 16px; } -.message-body :is(h1, h2, h3, h4, h5, h6) { - color: black !important; -} - .dark .message-body :is(h1, h2, h3, h4, h5, h6) { color: white !important; } From e2fb86e5df464b671984762e2445108b15c9145c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:42:17 -0800 Subject: [PATCH 101/173] UI: further improve the style of lists and headings --- css/html_instruct_style.css | 5 ---- css/main.css | 30 ++++++++++------------- modules/html_generator.py | 49 +++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index 14fd919d..7f74bf88 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -33,11 +33,6 @@ margin-bottom: 0 !important; } -.chat .message-body li { - margin-top: 1.25em !important; - margin-bottom: 1.25em !important; -} - .user-message, .assistant-message { font-family: Inter, Helvetica, Arial, sans-serif; } diff --git a/css/main.css b/css/main.css index ec118911..2ea7b960 100644 --- a/css/main.css +++ b/css/main.css @@ -460,7 +460,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .message-body h3 { font-weight: 600; font-size: 1.25em; - margin-top: 0; + margin-top: 1.6em; margin-bottom: 0.6em; line-height: 1.6; } @@ -468,7 +468,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .message-body h4 { font-weight: 600; font-size: 1em; - margin-top: 0; + margin-top: 1.5em; margin-bottom: 0.5em; line-height: 1.5; } @@ -495,6 +495,14 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .message-body li { list-style-position: outside; + margin-top: 0.5em !important; + margin-bottom: 0.5em !important; +} + +.message-body ul.long-list li, +.message-body ol.long-list li { + margin-top: 1.25em !important; + margin-bottom: 1.25em !important; } .message-body a { @@ -505,23 +513,10 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { padding-inline-start: 2em; } -.chat .message-body li:not(:last-child) { - margin-top: 0; - margin-bottom: 2px; -} - -.chat .message-body li:last-child { - margin-bottom: 0 !important; -} - .message-body li > p { display: inline !important; } -.message-body ul, .message-body ol { - font-size: 15px !important; -} - .message-body ul { list-style-type: disc !important; } @@ -834,8 +829,9 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { padding-bottom: 80px !important; } -.chat ol, .chat ul { - margin-top: 6px !important; +.message-body ol, .message-body ul { + margin-top: 0 !important; + margin-bottom: 1.25em !important; } /* ---------------------------------------------- diff --git a/modules/html_generator.py b/modules/html_generator.py index 01b20866..57eac1b1 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -69,6 +69,52 @@ def replace_blockquote(m): return m.group().replace('\n', '\n> ').replace('\\begin{blockquote}', '').replace('\\end{blockquote}', '') +def add_long_list_class(html): + ''' + Adds a long-list class to
      or
        containing long
      1. items. + These will receive a smaller margin/padding in the CSS. + ''' + + # Helper function to check if a tag is within
         or 
        +    def is_within_block(start_idx, end_idx, block_matches):
        +        return any(start < start_idx < end or start < end_idx < end for start, end in block_matches)
        +
        +    # Find all 
        ...
        and ... blocks + pre_blocks = [(m.start(), m.end()) for m in re.finditer(r'.*?
        ', html, re.DOTALL)] + code_blocks = [(m.start(), m.end()) for m in re.finditer(r'.*?', html, re.DOTALL)] + all_blocks = pre_blocks + code_blocks + + # Pattern to find
          ...
        and
          ...
        blocks and their contents + list_pattern = re.compile(r'(<[uo]l.*?>)(.*?)()', re.DOTALL) + li_pattern = re.compile(r'(.*?)
      2. ', re.DOTALL) + + def process_list(match): + start_idx, end_idx = match.span() + if is_within_block(start_idx, end_idx, all_blocks): + return match.group(0) # Leave the block unchanged if within
         or 
        +
        +        opening_tag = match.group(1)
        +        list_content = match.group(2)
        +        closing_tag = match.group(3)
        +
        +        # Find all list items within this list
        +        li_matches = li_pattern.finditer(list_content)
        +        has_long_item = any(len(li_match.group(1).strip()) > 128 for li_match in li_matches)
        +
        +        if has_long_item:
        +            # Add class="long-list" to the opening tag if it doesn't already have a class
        +            if 'class=' not in opening_tag:
        +                opening_tag = opening_tag[:-1] + ' class="long-list">'
        +            else:
        +                # If there's already a class, append long-list to it
        +                opening_tag = re.sub(r'class="([^"]*)"', r'class="\1 long-list"', opening_tag)
        +
        +        return opening_tag + list_content + closing_tag
        +
        +    # Process HTML and replace list blocks
        +    return list_pattern.sub(process_list, html)
        +
        +
         @functools.lru_cache(maxsize=None)
         def convert_to_markdown(string):
         
        @@ -168,6 +214,9 @@ def convert_to_markdown(string):
             pattern = re.compile(r']*>(.*?)', re.DOTALL)
             html_output = pattern.sub(lambda x: html.unescape(x.group()), html_output)
         
        +    # Add "long-list" class to 
          or
            containing a long
          1. item + html_output = add_long_list_class(html_output) + return html_output From 2acec386fc6647782e30cbddbc298652a2224b3c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:08:56 -0800 Subject: [PATCH 102/173] UI: improve the streaming cursor --- modules/chat.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/chat.py b/modules/chat.py index 92808fb7..2638c794 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -353,14 +353,14 @@ def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_mess # Extract the reply if state['mode'] in ['chat', 'chat-instruct']: - visible_reply = re.sub("(||{{user}})", state['name1'], reply + '❚') + visible_reply = re.sub("(||{{user}})", state['name1'], reply + '▍') else: - visible_reply = reply + '❚' + visible_reply = reply + '▍' visible_reply = html.escape(visible_reply) if shared.stop_everything: - if output['visible'][-1][1].endswith('❚'): + if output['visible'][-1][1].endswith('▍'): output['visible'][-1][1] = output['visible'][-1][1][:-1] output['visible'][-1][1] = apply_extensions('output', output['visible'][-1][1], state, is_chat=True) @@ -378,7 +378,7 @@ def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_mess if is_stream: yield output - if output['visible'][-1][1].endswith('❚'): + if output['visible'][-1][1].endswith('▍'): output['visible'][-1][1] = output['visible'][-1][1][:-1] output['visible'][-1][1] = apply_extensions('output', output['visible'][-1][1], state, is_chat=True) From 89888bef56018099b95e04317c9393f1952c5aa7 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:38:36 -0800 Subject: [PATCH 103/173] UI: increase the threshold for a
          2. to be considered long --- modules/html_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index 57eac1b1..0d831af2 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -99,7 +99,7 @@ def add_long_list_class(html): # Find all list items within this list li_matches = li_pattern.finditer(list_content) - has_long_item = any(len(li_match.group(1).strip()) > 128 for li_match in li_matches) + has_long_item = any(len(li_match.group(1).strip()) > 160 for li_match in li_matches) if has_long_item: # Add class="long-list" to the opening tag if it doesn't already have a class From ee3a533e5cc43612d887bdf275a786edd581eec0 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:11:29 -0800 Subject: [PATCH 104/173] UI: improve the message width in instruct mode --- css/html_instruct_style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index 7f74bf88..dcc19c29 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -68,7 +68,7 @@ .chat .user-message .text, .chat .assistant-message .text { - max-width: 40.25rem; + max-width: 645px; margin-left: auto; margin-right: auto; } From 0490ee620a1d479d304cd24b3d6d6c0d44032f7b Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:51:34 -0800 Subject: [PATCH 105/173] UI: increase the threshold for a
          3. to be considered long (some more) --- modules/html_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index 0d831af2..f07b6e75 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -99,7 +99,7 @@ def add_long_list_class(html): # Find all list items within this list li_matches = li_pattern.finditer(list_content) - has_long_item = any(len(li_match.group(1).strip()) > 160 for li_match in li_matches) + has_long_item = any(len(li_match.group(1).strip()) > 224 for li_match in li_matches) if has_long_item: # Add class="long-list" to the opening tag if it doesn't already have a class From 39a5c9a49c35875d14f35cca54411c6864fe66ae Mon Sep 17 00:00:00 2001 From: oobabooga Date: Sun, 29 Dec 2024 11:16:17 -0300 Subject: [PATCH 106/173] UI organization (#6618) --- css/main.css | 2 +- modules/loaders.py | 1 - modules/ui_model_menu.py | 71 ++++++++++------------ modules/ui_parameters.py | 124 +++++++++++++++++++-------------------- 4 files changed, 94 insertions(+), 104 deletions(-) diff --git a/css/main.css b/css/main.css index 2ea7b960..314b36e0 100644 --- a/css/main.css +++ b/css/main.css @@ -38,7 +38,7 @@ div.svelte-iyf88w { /* "info" messages without a title above */ .block > .svelte-e8n7p6:not(:only-of-type, #chat-mode *) { - margin-bottom: 2px; + margin-bottom: 0; } .py-6 { diff --git a/modules/loaders.py b/modules/loaders.py index 4cb7e349..1cfdb31b 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -26,7 +26,6 @@ loaders_and_params = OrderedDict({ 'compress_pos_emb', 'disable_exllama', 'disable_exllamav2', - 'transformers_info', ], 'llama.cpp': [ 'n_ctx', diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 189bedfd..c4bb8f01 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -80,59 +80,52 @@ def create_ui(): with gr.Blocks(): with gr.Row(): with gr.Column(): - with gr.Blocks(): - for i in range(len(total_mem)): - shared.gradio[f'gpu_memory_{i}'] = gr.Slider(label=f"gpu-memory in MiB for device :{i}", maximum=total_mem[i], value=default_gpu_mem[i]) + for i in range(len(total_mem)): + shared.gradio[f'gpu_memory_{i}'] = gr.Slider(label=f"gpu-memory in MiB for device :{i}", maximum=total_mem[i], value=default_gpu_mem[i]) - shared.gradio['cpu_memory'] = gr.Slider(label="cpu-memory in MiB", maximum=total_cpu_mem, value=default_cpu_mem) - - with gr.Blocks(): - shared.gradio['transformers_info'] = gr.Markdown('load-in-4bit params:') - shared.gradio['compute_dtype'] = gr.Dropdown(label="compute_dtype", choices=["bfloat16", "float16", "float32"], value=shared.args.compute_dtype) - shared.gradio['quant_type'] = gr.Dropdown(label="quant_type", choices=["nf4", "fp4"], value=shared.args.quant_type) - - shared.gradio['hqq_backend'] = gr.Dropdown(label="hqq_backend", choices=["PYTORCH", "PYTORCH_COMPILE", "ATEN"], value=shared.args.hqq_backend) - shared.gradio['n_gpu_layers'] = gr.Slider(label="n-gpu-layers", minimum=0, maximum=256, value=shared.args.n_gpu_layers, info='Must be set to more than 0 for your GPU to be used.') - shared.gradio['n_ctx'] = gr.Number(label="n_ctx", precision=0, step=256, value=shared.args.n_ctx, info='Context length. Try lowering this if you run out of memory while loading the model.') - shared.gradio['tensor_split'] = gr.Textbox(label='tensor_split', info='List of proportions to split the model across multiple GPUs. Example: 60,40') - shared.gradio['n_batch'] = gr.Slider(label="n_batch", minimum=1, maximum=2048, step=1, value=shared.args.n_batch) + shared.gradio['cpu_memory'] = gr.Slider(label="cpu-memory in MiB", maximum=total_cpu_mem, value=default_cpu_mem) + shared.gradio['n_gpu_layers'] = gr.Slider(label="n-gpu-layers", minimum=0, maximum=256, value=shared.args.n_gpu_layers, info='Must be greater than 0 for the GPU to be used. ⚠️ Lower this value if you can\'t load the model.') shared.gradio['threads'] = gr.Slider(label="threads", minimum=0, step=1, maximum=256, value=shared.args.threads) shared.gradio['threads_batch'] = gr.Slider(label="threads_batch", minimum=0, step=1, maximum=256, value=shared.args.threads_batch) + shared.gradio['n_batch'] = gr.Slider(label="n_batch", minimum=1, maximum=2048, step=1, value=shared.args.n_batch) + shared.gradio['hqq_backend'] = gr.Dropdown(label="hqq_backend", choices=["PYTORCH", "PYTORCH_COMPILE", "ATEN"], value=shared.args.hqq_backend) shared.gradio['wbits'] = gr.Dropdown(label="wbits", choices=["None", 1, 2, 3, 4, 8], value=shared.args.wbits if shared.args.wbits > 0 else "None") shared.gradio['groupsize'] = gr.Dropdown(label="groupsize", choices=["None", 32, 64, 128, 1024], value=shared.args.groupsize if shared.args.groupsize > 0 else "None") + shared.gradio['n_ctx'] = gr.Number(label="n_ctx", precision=0, step=256, value=shared.args.n_ctx, info='Context length. ⚠️ Lower this value if you can\'t load the model.') + shared.gradio['max_seq_len'] = gr.Number(label='max_seq_len', precision=0, step=256, value=shared.args.max_seq_len, info='Context length. ⚠️ Lower this value if you can\'t load the model.') + shared.gradio['cache_type'] = gr.Dropdown(label="cache_type", choices=['fp16', 'q8_0', 'q4_0', 'fp8', 'q8', 'q6', 'q4'], value=shared.args.cache_type, info='Valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') + shared.gradio['tensor_split'] = gr.Textbox(label='tensor_split', info='List of proportions to split the model across multiple GPUs. Example: 60,40') shared.gradio['gpu_split'] = gr.Textbox(label='gpu-split', info='Comma-separated list of VRAM (in GB) to use per GPU. Example: 20,7,7') - shared.gradio['max_seq_len'] = gr.Number(label='max_seq_len', precision=0, step=256, value=shared.args.max_seq_len, info='Context length. Try lowering this if you run out of memory while loading the model.') - with gr.Blocks(): - shared.gradio['alpha_value'] = gr.Number(label='alpha_value', value=shared.args.alpha_value, precision=2, info='Positional embeddings alpha factor for NTK RoPE scaling. Recommended values (NTKv1): 1.75 for 1.5x context, 2.5 for 2x context. Use either this or compress_pos_emb, not both.') - shared.gradio['rope_freq_base'] = gr.Number(label='rope_freq_base', value=shared.args.rope_freq_base, precision=0, info='Positional embeddings frequency base for NTK RoPE scaling. Related to alpha_value by rope_freq_base = 10000 * alpha_value ^ (64 / 63). 0 = from model.') - shared.gradio['compress_pos_emb'] = gr.Number(label='compress_pos_emb', value=shared.args.compress_pos_emb, precision=2, info='Positional embeddings compression factor. Should be set to (context length) / (model\'s original context length). Equal to 1/rope_freq_scale.') - - shared.gradio['autogptq_info'] = gr.Markdown('ExLlamav2_HF is recommended over AutoGPTQ for models derived from Llama.') + shared.gradio['alpha_value'] = gr.Number(label='alpha_value', value=shared.args.alpha_value, precision=2, info='Positional embeddings alpha factor for NTK RoPE scaling. Recommended values (NTKv1): 1.75 for 1.5x context, 2.5 for 2x context. Use either this or compress_pos_emb, not both.') + shared.gradio['rope_freq_base'] = gr.Number(label='rope_freq_base', value=shared.args.rope_freq_base, precision=0, info='Positional embeddings frequency base for NTK RoPE scaling. Related to alpha_value by rope_freq_base = 10000 * alpha_value ^ (64 / 63). 0 = from model.') + shared.gradio['compress_pos_emb'] = gr.Number(label='compress_pos_emb', value=shared.args.compress_pos_emb, precision=2, info='Positional embeddings compression factor. Should be set to (context length) / (model\'s original context length). Equal to 1/rope_freq_scale.') + shared.gradio['compute_dtype'] = gr.Dropdown(label="compute_dtype", choices=["bfloat16", "float16", "float32"], value=shared.args.compute_dtype, info='Used by load-in-4bit.') + shared.gradio['quant_type'] = gr.Dropdown(label="quant_type", choices=["nf4", "fp4"], value=shared.args.quant_type, info='Used by load-in-4bit.') + shared.gradio['attention_sink_size'] = gr.Number(label="attention_sink_size", value=shared.args.attention_sink_size, precision=0, info='StreamingLLM: number of sink tokens. Only used if the trimmed prompt doesn\'t share a prefix with the old prompt.') + shared.gradio['num_experts_per_token'] = gr.Number(label="Number of experts per token", value=shared.args.num_experts_per_token, info='Only applies to MoE models like Mixtral.') with gr.Column(): + shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') shared.gradio['load_in_8bit'] = gr.Checkbox(label="load-in-8bit", value=shared.args.load_in_8bit) shared.gradio['load_in_4bit'] = gr.Checkbox(label="load-in-4bit", value=shared.args.load_in_4bit) - shared.gradio['use_double_quant'] = gr.Checkbox(label="use_double_quant", value=shared.args.use_double_quant) - shared.gradio['use_flash_attention_2'] = gr.Checkbox(label="use_flash_attention_2", value=shared.args.use_flash_attention_2, info='Set use_flash_attention_2=True while loading the model.') - shared.gradio['use_eager_attention'] = gr.Checkbox(label="use_eager_attention", value=shared.args.use_eager_attention, info='Set attn_implementation= eager while loading the model.') shared.gradio['flash_attn'] = gr.Checkbox(label="flash_attn", value=shared.args.flash_attn, info='Use flash-attention.') - shared.gradio['auto_devices'] = gr.Checkbox(label="auto-devices", value=shared.args.auto_devices) - shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') - shared.gradio['cache_type'] = gr.Dropdown(label="cache_type", choices=['fp16', 'q8_0', 'q4_0', 'fp8', 'q8', 'q6', 'q4'], value=shared.args.cache_type, info='Valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') + shared.gradio['use_flash_attention_2'] = gr.Checkbox(label="use_flash_attention_2", value=shared.args.use_flash_attention_2, info='Set use_flash_attention_2=True while loading the model.') shared.gradio['streaming_llm'] = gr.Checkbox(label="streaming_llm", value=shared.args.streaming_llm, info='(experimental) Activate StreamingLLM to avoid re-evaluating the entire prompt when old messages are removed.') - shared.gradio['attention_sink_size'] = gr.Number(label="attention_sink_size", value=shared.args.attention_sink_size, precision=0, info='StreamingLLM: number of sink tokens. Only used if the trimmed prompt doesn\'t share a prefix with the old prompt.') + shared.gradio['auto_devices'] = gr.Checkbox(label="auto-devices", value=shared.args.auto_devices) shared.gradio['cpu'] = gr.Checkbox(label="cpu", value=shared.args.cpu, info='llama.cpp: Use llama-cpp-python compiled without GPU acceleration. Transformers: use PyTorch in CPU mode.') + shared.gradio['disk'] = gr.Checkbox(label="disk", value=shared.args.disk) shared.gradio['row_split'] = gr.Checkbox(label="row_split", value=shared.args.row_split, info='Split the model by rows across GPUs. This may improve multi-gpu performance.') shared.gradio['no_offload_kqv'] = gr.Checkbox(label="no_offload_kqv", value=shared.args.no_offload_kqv, info='Do not offload the K, Q, V to the GPU. This saves VRAM but reduces the performance.') shared.gradio['no_mul_mat_q'] = gr.Checkbox(label="no_mul_mat_q", value=shared.args.no_mul_mat_q, info='Disable the mulmat kernels.') + shared.gradio['no_mmap'] = gr.Checkbox(label="no-mmap", value=shared.args.no_mmap) + shared.gradio['mlock'] = gr.Checkbox(label="mlock", value=shared.args.mlock) + shared.gradio['numa'] = gr.Checkbox(label="numa", value=shared.args.numa, info='NUMA support can help on some systems with non-uniform memory access.') shared.gradio['triton'] = gr.Checkbox(label="triton", value=shared.args.triton) shared.gradio['no_inject_fused_mlp'] = gr.Checkbox(label="no_inject_fused_mlp", value=shared.args.no_inject_fused_mlp, info='Affects Triton only. Disable fused MLP. Fused MLP improves performance but uses more VRAM. Disable if running low on VRAM.') shared.gradio['no_use_cuda_fp16'] = gr.Checkbox(label="no_use_cuda_fp16", value=shared.args.no_use_cuda_fp16, info='This can make models faster on some systems.') shared.gradio['desc_act'] = gr.Checkbox(label="desc_act", value=shared.args.desc_act, info='\'desc_act\', \'wbits\', and \'groupsize\' are used for old models without a quantize_config.json.') - shared.gradio['no_mmap'] = gr.Checkbox(label="no-mmap", value=shared.args.no_mmap) - shared.gradio['mlock'] = gr.Checkbox(label="mlock", value=shared.args.mlock) - shared.gradio['numa'] = gr.Checkbox(label="numa", value=shared.args.numa, info='NUMA support can help on some systems with non-uniform memory access.') - shared.gradio['disk'] = gr.Checkbox(label="disk", value=shared.args.disk) + shared.gradio['use_double_quant'] = gr.Checkbox(label="use_double_quant", value=shared.args.use_double_quant, info='Used by load-in-4bit.') + shared.gradio['use_eager_attention'] = gr.Checkbox(label="use_eager_attention", value=shared.args.use_eager_attention, info='Set attn_implementation= eager while loading the model.') shared.gradio['bf16'] = gr.Checkbox(label="bf16", value=shared.args.bf16) shared.gradio['autosplit'] = gr.Checkbox(label="autosplit", value=shared.args.autosplit, info='Automatically split the model tensors across the available GPUs.') shared.gradio['enable_tp'] = gr.Checkbox(label="enable_tp", value=shared.args.enable_tp, info='Enable Tensor Parallelism (TP).') @@ -141,16 +134,14 @@ def create_ui(): shared.gradio['no_sdpa'] = gr.Checkbox(label="no_sdpa", value=shared.args.no_sdpa) shared.gradio['cfg_cache'] = gr.Checkbox(label="cfg-cache", value=shared.args.cfg_cache, info='Necessary to use CFG with this loader.') shared.gradio['cpp_runner'] = gr.Checkbox(label="cpp-runner", value=shared.args.cpp_runner, info='Enable inference with ModelRunnerCpp, which is faster than the default ModelRunner.') - shared.gradio['num_experts_per_token'] = gr.Number(label="Number of experts per token", value=shared.args.num_experts_per_token, info='Only applies to MoE models like Mixtral.') - with gr.Blocks(): - shared.gradio['trust_remote_code'] = gr.Checkbox(label="trust-remote-code", value=shared.args.trust_remote_code, info='Set trust_remote_code=True while loading the tokenizer/model. To enable this option, start the web UI with the --trust-remote-code flag.', interactive=shared.args.trust_remote_code) - shared.gradio['no_use_fast'] = gr.Checkbox(label="no_use_fast", value=shared.args.no_use_fast, info='Set use_fast=False while loading the tokenizer.') - shared.gradio['logits_all'] = gr.Checkbox(label="logits_all", value=shared.args.logits_all, info='Needs to be set for perplexity evaluation to work with this loader. Otherwise, ignore it, as it makes prompt processing slower.') - + shared.gradio['logits_all'] = gr.Checkbox(label="logits_all", value=shared.args.logits_all, info='Needs to be set for perplexity evaluation to work with this loader. Otherwise, ignore it, as it makes prompt processing slower.') shared.gradio['disable_exllama'] = gr.Checkbox(label="disable_exllama", value=shared.args.disable_exllama, info='Disable ExLlama kernel for GPTQ models.') shared.gradio['disable_exllamav2'] = gr.Checkbox(label="disable_exllamav2", value=shared.args.disable_exllamav2, info='Disable ExLlamav2 kernel for GPTQ models.') - shared.gradio['exllamav2_info'] = gr.Markdown("ExLlamav2_HF is recommended over ExLlamav2 for better integration with extensions and more consistent sampling behavior across loaders.") + shared.gradio['trust_remote_code'] = gr.Checkbox(label="trust-remote-code", value=shared.args.trust_remote_code, info='Set trust_remote_code=True while loading the tokenizer/model. To enable this option, start the web UI with the --trust-remote-code flag.', interactive=shared.args.trust_remote_code) + shared.gradio['no_use_fast'] = gr.Checkbox(label="no_use_fast", value=shared.args.no_use_fast, info='Set use_fast=False while loading the tokenizer.') shared.gradio['llamacpp_HF_info'] = gr.Markdown("llamacpp_HF loads llama.cpp as a Transformers model. To use it, you need to place your GGUF in a subfolder of models/ with the necessary tokenizer files.\n\nYou can use the \"llamacpp_HF creator\" menu to do that automatically.") + shared.gradio['exllamav2_info'] = gr.Markdown("ExLlamav2_HF is recommended over ExLlamav2 for better integration with extensions and more consistent sampling behavior across loaders.") + shared.gradio['autogptq_info'] = gr.Markdown('ExLlamav2_HF is recommended over AutoGPTQ for models derived from Llama.') shared.gradio['tensorrt_llm_info'] = gr.Markdown('* TensorRT-LLM has to be installed manually in a separate Python 3.10 environment at the moment. For a guide, consult the description of [this PR](https://github.com/oobabooga/text-generation-webui/pull/5715). \n\n* `max_seq_len` is only used when `cpp-runner` is checked.\n\n* `cpp_runner` does not support streaming at the moment.') with gr.Column(): diff --git a/modules/ui_parameters.py b/modules/ui_parameters.py index a2665e0d..727a1528 100644 --- a/modules/ui_parameters.py +++ b/modules/ui_parameters.py @@ -27,80 +27,80 @@ def create_ui(default_preset): with gr.Column(): with gr.Row(): with gr.Column(): - shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=shared.settings['max_new_tokens']) + gr.Markdown('## Curve shape') shared.gradio['temperature'] = gr.Slider(0.01, 5, value=generate_params['temperature'], step=0.01, label='temperature') - shared.gradio['top_p'] = gr.Slider(0.0, 1.0, value=generate_params['top_p'], step=0.01, label='top_p') - shared.gradio['top_k'] = gr.Slider(0, 200, value=generate_params['top_k'], step=1, label='top_k') - shared.gradio['typical_p'] = gr.Slider(0.0, 1.0, value=generate_params['typical_p'], step=0.01, label='typical_p') - shared.gradio['min_p'] = gr.Slider(0.0, 1.0, value=generate_params['min_p'], step=0.01, label='min_p') - shared.gradio['repetition_penalty'] = gr.Slider(1.0, 1.5, value=generate_params['repetition_penalty'], step=0.01, label='repetition_penalty') - shared.gradio['frequency_penalty'] = gr.Slider(0, 2, value=generate_params['frequency_penalty'], step=0.05, label='frequency_penalty') - shared.gradio['presence_penalty'] = gr.Slider(0, 2, value=generate_params['presence_penalty'], step=0.05, label='presence_penalty') - shared.gradio['repetition_penalty_range'] = gr.Slider(0, 4096, step=64, value=generate_params['repetition_penalty_range'], label='repetition_penalty_range') - shared.gradio['do_sample'] = gr.Checkbox(value=generate_params['do_sample'], label='do_sample') - - with gr.Blocks(): - shared.gradio['dry_multiplier'] = gr.Slider(0, 5, value=generate_params['dry_multiplier'], step=0.01, label='dry_multiplier', info='Set to greater than 0 to enable DRY. Recommended value: 0.8.') - shared.gradio['dry_allowed_length'] = gr.Slider(1, 20, value=generate_params['dry_allowed_length'], step=1, label='dry_allowed_length', info='Longest sequence that can be repeated without being penalized.') - shared.gradio['dry_base'] = gr.Slider(1, 4, value=generate_params['dry_base'], step=0.01, label='dry_base', info='Controls how fast the penalty grows with increasing sequence length.') - shared.gradio['dry_sequence_breakers'] = gr.Textbox(value=generate_params['dry_sequence_breakers'], label='dry_sequence_breakers', info='Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.') - - with gr.Blocks(): - shared.gradio['xtc_threshold'] = gr.Slider(0, 0.5, value=generate_params['xtc_threshold'], step=0.01, label='xtc_threshold', info='If 2 or more tokens have probability above this threshold, consider removing all but the last one.') - shared.gradio['xtc_probability'] = gr.Slider(0, 1, value=generate_params['xtc_probability'], step=0.01, label='xtc_probability', info='Probability that the removal will actually happen. 0 disables the sampler. 1 makes it always happen.') - - gr.Markdown("[Learn more](https://github.com/oobabooga/text-generation-webui/wiki/03-%E2%80%90-Parameters-Tab)") - - with gr.Column(): - with gr.Group(): - shared.gradio['auto_max_new_tokens'] = gr.Checkbox(value=shared.settings['auto_max_new_tokens'], label='auto_max_new_tokens', info='Expand max_new_tokens to the available context length.') - shared.gradio['ban_eos_token'] = gr.Checkbox(value=shared.settings['ban_eos_token'], label='Ban the eos_token', info='Forces the model to never end the generation prematurely.') - shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.') - shared.gradio['custom_stopping_strings'] = gr.Textbox(lines=2, value=shared.settings["custom_stopping_strings"] or None, label='Custom stopping strings', info='Written between "" and separated by commas.', placeholder='"\\n", "\\nYou:"') - shared.gradio['custom_token_bans'] = gr.Textbox(value=shared.settings['custom_token_bans'] or None, label='Token bans', info='Token IDs to ban, separated by commas. The IDs can be found in the Default or Notebook tab.') - - shared.gradio['penalty_alpha'] = gr.Slider(0, 5, value=generate_params['penalty_alpha'], label='penalty_alpha', info='For Contrastive Search. do_sample must be unchecked.') - shared.gradio['guidance_scale'] = gr.Slider(-0.5, 2.5, step=0.05, value=generate_params['guidance_scale'], label='guidance_scale', info='For CFG. 1.5 is a good value.') - shared.gradio['negative_prompt'] = gr.Textbox(value=shared.settings['negative_prompt'], label='Negative prompt', lines=3, elem_classes=['add_scrollbar']) - shared.gradio['mirostat_mode'] = gr.Slider(0, 2, step=1, value=generate_params['mirostat_mode'], label='mirostat_mode', info='mode=1 is for llama.cpp only.') - shared.gradio['mirostat_tau'] = gr.Slider(0, 10, step=0.01, value=generate_params['mirostat_tau'], label='mirostat_tau') - shared.gradio['mirostat_eta'] = gr.Slider(0, 1, step=0.01, value=generate_params['mirostat_eta'], label='mirostat_eta') - shared.gradio['epsilon_cutoff'] = gr.Slider(0, 9, value=generate_params['epsilon_cutoff'], step=0.01, label='epsilon_cutoff') - shared.gradio['eta_cutoff'] = gr.Slider(0, 20, value=generate_params['eta_cutoff'], step=0.01, label='eta_cutoff') - shared.gradio['encoder_repetition_penalty'] = gr.Slider(0.8, 1.5, value=generate_params['encoder_repetition_penalty'], step=0.01, label='encoder_repetition_penalty') - shared.gradio['no_repeat_ngram_size'] = gr.Slider(0, 20, step=1, value=generate_params['no_repeat_ngram_size'], label='no_repeat_ngram_size') - - with gr.Column(): - with gr.Row() as shared.gradio['grammar_file_row']: - shared.gradio['grammar_file'] = gr.Dropdown(value='None', choices=utils.get_available_grammars(), label='Load grammar from file (.gbnf)', elem_classes='slim-dropdown') - ui.create_refresh_button(shared.gradio['grammar_file'], lambda: None, lambda: {'choices': utils.get_available_grammars()}, 'refresh-button', interactive=not mu) - shared.gradio['save_grammar'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu) - shared.gradio['delete_grammar'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu) - - shared.gradio['grammar_string'] = gr.Textbox(value='', label='Grammar', lines=16, elem_classes=['add_scrollbar', 'monospace']) - - with gr.Row(): - with gr.Column(): - shared.gradio['tfs'] = gr.Slider(0.0, 1.0, value=generate_params['tfs'], step=0.01, label='tfs') - shared.gradio['top_a'] = gr.Slider(0.0, 1.0, value=generate_params['top_a'], step=0.01, label='top_a') - shared.gradio['smoothing_factor'] = gr.Slider(0.0, 10.0, value=generate_params['smoothing_factor'], step=0.01, label='smoothing_factor', info='Activates Quadratic Sampling.') - shared.gradio['smoothing_curve'] = gr.Slider(1.0, 10.0, value=generate_params['smoothing_curve'], step=0.01, label='smoothing_curve', info='Adjusts the dropoff curve of Quadratic Sampling.') - shared.gradio['dynamic_temperature'] = gr.Checkbox(value=generate_params['dynamic_temperature'], label='dynamic_temperature') shared.gradio['dynatemp_low'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_low'], step=0.01, label='dynatemp_low', visible=generate_params['dynamic_temperature']) shared.gradio['dynatemp_high'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_high'], step=0.01, label='dynatemp_high', visible=generate_params['dynamic_temperature']) shared.gradio['dynatemp_exponent'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_exponent'], step=0.01, label='dynatemp_exponent', visible=generate_params['dynamic_temperature']) - shared.gradio['temperature_last'] = gr.Checkbox(value=generate_params['temperature_last'], label='temperature_last', info='Moves temperature/dynamic temperature/quadratic sampling to the end of the sampler stack, ignoring their positions in "Sampler priority".') - shared.gradio['sampler_priority'] = gr.Textbox(value=generate_params['sampler_priority'], lines=12, label='Sampler priority', info='Parameter names separated by new lines or commas.') + shared.gradio['smoothing_factor'] = gr.Slider(0.0, 10.0, value=generate_params['smoothing_factor'], step=0.01, label='smoothing_factor', info='Activates Quadratic Sampling.') + shared.gradio['smoothing_curve'] = gr.Slider(1.0, 10.0, value=generate_params['smoothing_curve'], step=0.01, label='smoothing_curve', info='Adjusts the dropoff curve of Quadratic Sampling.') + + gr.Markdown('## Curve cutoff') + shared.gradio['min_p'] = gr.Slider(0.0, 1.0, value=generate_params['min_p'], step=0.01, label='min_p') + shared.gradio['top_p'] = gr.Slider(0.0, 1.0, value=generate_params['top_p'], step=0.01, label='top_p') + shared.gradio['top_k'] = gr.Slider(0, 200, value=generate_params['top_k'], step=1, label='top_k') + shared.gradio['typical_p'] = gr.Slider(0.0, 1.0, value=generate_params['typical_p'], step=0.01, label='typical_p') + shared.gradio['xtc_threshold'] = gr.Slider(0, 0.5, value=generate_params['xtc_threshold'], step=0.01, label='xtc_threshold', info='If 2 or more tokens have probability above this threshold, consider removing all but the last one.') + shared.gradio['xtc_probability'] = gr.Slider(0, 1, value=generate_params['xtc_probability'], step=0.01, label='xtc_probability', info='Probability that the removal will actually happen. 0 disables the sampler. 1 makes it always happen.') + shared.gradio['epsilon_cutoff'] = gr.Slider(0, 9, value=generate_params['epsilon_cutoff'], step=0.01, label='epsilon_cutoff') + shared.gradio['eta_cutoff'] = gr.Slider(0, 20, value=generate_params['eta_cutoff'], step=0.01, label='eta_cutoff') + shared.gradio['tfs'] = gr.Slider(0.0, 1.0, value=generate_params['tfs'], step=0.01, label='tfs') + shared.gradio['top_a'] = gr.Slider(0.0, 1.0, value=generate_params['top_a'], step=0.01, label='top_a') + + gr.Markdown('## Repetition suppression') + shared.gradio['dry_multiplier'] = gr.Slider(0, 5, value=generate_params['dry_multiplier'], step=0.01, label='dry_multiplier', info='Set to greater than 0 to enable DRY. Recommended value: 0.8.') + shared.gradio['dry_allowed_length'] = gr.Slider(1, 20, value=generate_params['dry_allowed_length'], step=1, label='dry_allowed_length', info='Longest sequence that can be repeated without being penalized.') + shared.gradio['dry_base'] = gr.Slider(1, 4, value=generate_params['dry_base'], step=0.01, label='dry_base', info='Controls how fast the penalty grows with increasing sequence length.') + shared.gradio['repetition_penalty'] = gr.Slider(1.0, 1.5, value=generate_params['repetition_penalty'], step=0.01, label='repetition_penalty') + shared.gradio['frequency_penalty'] = gr.Slider(0, 2, value=generate_params['frequency_penalty'], step=0.05, label='frequency_penalty') + shared.gradio['presence_penalty'] = gr.Slider(0, 2, value=generate_params['presence_penalty'], step=0.05, label='presence_penalty') + shared.gradio['encoder_repetition_penalty'] = gr.Slider(0.8, 1.5, value=generate_params['encoder_repetition_penalty'], step=0.01, label='encoder_repetition_penalty') + shared.gradio['no_repeat_ngram_size'] = gr.Slider(0, 20, step=1, value=generate_params['no_repeat_ngram_size'], label='no_repeat_ngram_size') + shared.gradio['repetition_penalty_range'] = gr.Slider(0, 4096, step=64, value=generate_params['repetition_penalty_range'], label='repetition_penalty_range') with gr.Column(): - shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length. Most models require this to be at most 2048.') + gr.Markdown('## Alternative sampling methods') + shared.gradio['penalty_alpha'] = gr.Slider(0, 5, value=generate_params['penalty_alpha'], label='penalty_alpha', info='For Contrastive Search. do_sample must be unchecked.') + shared.gradio['guidance_scale'] = gr.Slider(-0.5, 2.5, step=0.05, value=generate_params['guidance_scale'], label='guidance_scale', info='For CFG. 1.5 is a good value.') + shared.gradio['mirostat_mode'] = gr.Slider(0, 2, step=1, value=generate_params['mirostat_mode'], label='mirostat_mode', info='mode=1 is for llama.cpp only.') + shared.gradio['mirostat_tau'] = gr.Slider(0, 10, step=0.01, value=generate_params['mirostat_tau'], label='mirostat_tau') + shared.gradio['mirostat_eta'] = gr.Slider(0, 1, step=0.01, value=generate_params['mirostat_eta'], label='mirostat_eta') + + gr.Markdown('## Other options') + shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], value=shared.settings['max_new_tokens'], step=1, label='max_new_tokens', info='⚠️ Setting this too high can cause prompt truncation.') shared.gradio['prompt_lookup_num_tokens'] = gr.Slider(value=shared.settings['prompt_lookup_num_tokens'], minimum=0, maximum=10, step=1, label='prompt_lookup_num_tokens', info='Activates Prompt Lookup Decoding.') shared.gradio['max_tokens_second'] = gr.Slider(value=shared.settings['max_tokens_second'], minimum=0, maximum=20, step=1, label='Maximum tokens/second', info='To make text readable in real time.') shared.gradio['max_updates_second'] = gr.Slider(value=shared.settings['max_updates_second'], minimum=0, maximum=24, step=1, label='Maximum UI updates/second', info='Set this if you experience lag in the UI during streaming.') - shared.gradio['seed'] = gr.Number(value=shared.settings['seed'], label='Seed (-1 for random)') + + with gr.Column(): + with gr.Row(): + with gr.Column(): + shared.gradio['do_sample'] = gr.Checkbox(value=generate_params['do_sample'], label='do_sample') + shared.gradio['dynamic_temperature'] = gr.Checkbox(value=generate_params['dynamic_temperature'], label='dynamic_temperature') + shared.gradio['temperature_last'] = gr.Checkbox(value=generate_params['temperature_last'], label='temperature_last', info='Moves temperature/dynamic temperature/quadratic sampling to the end of the sampler stack, ignoring their positions in "Sampler priority".') + shared.gradio['auto_max_new_tokens'] = gr.Checkbox(value=shared.settings['auto_max_new_tokens'], label='auto_max_new_tokens', info='Expand max_new_tokens to the available context length.') + shared.gradio['ban_eos_token'] = gr.Checkbox(value=shared.settings['ban_eos_token'], label='Ban the eos_token', info='Forces the model to never end the generation prematurely.') + shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.') shared.gradio['skip_special_tokens'] = gr.Checkbox(value=shared.settings['skip_special_tokens'], label='Skip special tokens', info='Some specific models need this unset.') shared.gradio['stream'] = gr.Checkbox(value=shared.settings['stream'], label='Activate text streaming') + with gr.Column(): + shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length. Most models require this to be at most 2048.') + shared.gradio['seed'] = gr.Number(value=shared.settings['seed'], label='Seed (-1 for random)') + + shared.gradio['sampler_priority'] = gr.Textbox(value=generate_params['sampler_priority'], lines=12, label='Sampler priority', info='Parameter names separated by new lines or commas.', elem_classes=['add_scrollbar']) + shared.gradio['custom_stopping_strings'] = gr.Textbox(lines=2, value=shared.settings["custom_stopping_strings"] or None, label='Custom stopping strings', info='Written between "" and separated by commas.', placeholder='"\\n", "\\nYou:"') + shared.gradio['custom_token_bans'] = gr.Textbox(value=shared.settings['custom_token_bans'] or None, label='Token bans', info='Token IDs to ban, separated by commas. The IDs can be found in the Default or Notebook tab.') + shared.gradio['negative_prompt'] = gr.Textbox(value=shared.settings['negative_prompt'], label='Negative prompt', info='For CFG. Only used when guidance_scale is different than 1.', lines=3, elem_classes=['add_scrollbar']) + shared.gradio['dry_sequence_breakers'] = gr.Textbox(value=generate_params['dry_sequence_breakers'], label='dry_sequence_breakers', info='Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.') + with gr.Row() as shared.gradio['grammar_file_row']: + shared.gradio['grammar_file'] = gr.Dropdown(value='None', choices=utils.get_available_grammars(), label='Load grammar from file (.gbnf)', elem_classes='slim-dropdown') + ui.create_refresh_button(shared.gradio['grammar_file'], lambda: None, lambda: {'choices': utils.get_available_grammars()}, 'refresh-button', interactive=not mu) + shared.gradio['save_grammar'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu) + shared.gradio['delete_grammar'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu) + + shared.gradio['grammar_string'] = gr.Textbox(value='', label='Grammar', lines=16, elem_classes=['add_scrollbar', 'monospace']) + ui_chat.create_chat_settings_ui() From 4ce9d13dbec04230b4a56b905e8e96ae9f4f4d8e Mon Sep 17 00:00:00 2001 From: oobabooga Date: Sun, 29 Dec 2024 12:25:26 -0300 Subject: [PATCH 107/173] Preset cleanup (#6619) --- presets/Big O.yaml | 6 ------ presets/Creative.yaml | 2 ++ presets/{Debug-deterministic.yaml => Deterministic.yaml} | 0 presets/Divine Intellect.yaml | 4 ---- presets/Instruct.yaml | 1 + presets/LLaMA-Precise.yaml | 4 ---- presets/Midnight Enigma.yaml | 4 ---- presets/Shortwave.yaml | 4 ---- presets/Yara.yaml | 4 ---- presets/simple-1.yaml | 4 ---- 10 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 presets/Big O.yaml create mode 100644 presets/Creative.yaml rename presets/{Debug-deterministic.yaml => Deterministic.yaml} (100%) delete mode 100644 presets/Divine Intellect.yaml create mode 100644 presets/Instruct.yaml delete mode 100644 presets/LLaMA-Precise.yaml delete mode 100644 presets/Midnight Enigma.yaml delete mode 100644 presets/Shortwave.yaml delete mode 100644 presets/Yara.yaml delete mode 100644 presets/simple-1.yaml diff --git a/presets/Big O.yaml b/presets/Big O.yaml deleted file mode 100644 index 2ab18268..00000000 --- a/presets/Big O.yaml +++ /dev/null @@ -1,6 +0,0 @@ -temperature: 0.87 -top_p: 0.99 -typical_p: 0.68 -tfs: 0.68 -repetition_penalty: 1.01 -top_k: 85 diff --git a/presets/Creative.yaml b/presets/Creative.yaml new file mode 100644 index 00000000..3ed04190 --- /dev/null +++ b/presets/Creative.yaml @@ -0,0 +1,2 @@ +min_p: 0.02 +xtc_probability: 0.5 diff --git a/presets/Debug-deterministic.yaml b/presets/Deterministic.yaml similarity index 100% rename from presets/Debug-deterministic.yaml rename to presets/Deterministic.yaml diff --git a/presets/Divine Intellect.yaml b/presets/Divine Intellect.yaml deleted file mode 100644 index ac750e40..00000000 --- a/presets/Divine Intellect.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 1.31 -top_p: 0.14 -repetition_penalty: 1.17 -top_k: 49 diff --git a/presets/Instruct.yaml b/presets/Instruct.yaml new file mode 100644 index 00000000..142fcd82 --- /dev/null +++ b/presets/Instruct.yaml @@ -0,0 +1 @@ +min_p: 0.2 diff --git a/presets/LLaMA-Precise.yaml b/presets/LLaMA-Precise.yaml deleted file mode 100644 index c5f9cae2..00000000 --- a/presets/LLaMA-Precise.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 0.7 -top_p: 0.1 -repetition_penalty: 1.18 -top_k: 40 diff --git a/presets/Midnight Enigma.yaml b/presets/Midnight Enigma.yaml deleted file mode 100644 index 0bd1763c..00000000 --- a/presets/Midnight Enigma.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 0.98 -top_p: 0.37 -repetition_penalty: 1.18 -top_k: 100 diff --git a/presets/Shortwave.yaml b/presets/Shortwave.yaml deleted file mode 100644 index a2528abd..00000000 --- a/presets/Shortwave.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 1.53 -top_p: 0.64 -repetition_penalty: 1.07 -top_k: 33 diff --git a/presets/Yara.yaml b/presets/Yara.yaml deleted file mode 100644 index 87bb019e..00000000 --- a/presets/Yara.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 0.82 -top_p: 0.21 -repetition_penalty: 1.19 -top_k: 72 diff --git a/presets/simple-1.yaml b/presets/simple-1.yaml deleted file mode 100644 index 30a10659..00000000 --- a/presets/simple-1.yaml +++ /dev/null @@ -1,4 +0,0 @@ -temperature: 0.7 -top_p: 0.9 -repetition_penalty: 1.15 -top_k: 20 From 292cd489e9916104b3f965c8da3ccb9f36253b90 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 30 Dec 2024 04:31:10 -0800 Subject: [PATCH 108/173] Bump ExLlamaV2 to 0.2.7 --- requirements.txt | 10 +++++----- requirements_amd.txt | 6 +++--- requirements_amd_noavx2.txt | 6 +++--- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_noavx2.txt | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 24c92391..a04cb04f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index b7093d50..e5bec4bf 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -39,6 +39,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp # AMD wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 88682aea..d408b4cf 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -37,6 +37,6 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 6588278d..da0423a2 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -33,4 +33,4 @@ tiktoken # Mac wheels https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 1fc9795b..dd1933bd 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -35,4 +35,4 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/me https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 9ad138d8..db21c0fc 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -50,11 +50,11 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/te https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/exllamav2/releases/download/v0.2.6/exllamav2-0.2.6-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From cca4ac56fa2e093af99552a4a9ce6aece21bde41 Mon Sep 17 00:00:00 2001 From: mamei16 Date: Mon, 30 Dec 2024 13:34:19 +0100 Subject: [PATCH 109/173] Fix interface loading with dark theme even when 'dark_theme' is set to false (#6614) --- server.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server.py b/server.py index d6069d5e..31e1c4c6 100644 --- a/server.py +++ b/server.py @@ -154,6 +154,9 @@ def create_interface(): if ({str(shared.settings['dark_theme']).lower()}) {{ document.getElementsByTagName('body')[0].classList.add('dark'); }} + else {{ + document.getElementsByTagName('body')[0].classList.remove('dark'); + }} {js} {ui.show_controls_js} toggle_controls(x); From d24b83132b207b5b95f7ba3754e6b3f9b99e1f84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 09:35:20 -0300 Subject: [PATCH 110/173] Bump jinja2 from 3.1.4 to 3.1.5 (#6601) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index a04cb04f..8b36f54f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_amd.txt b/requirements_amd.txt index e5bec4bf..1b85b20f 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index d408b4cf..1bafc141 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index da0423a2..345368b7 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index dd1933bd..a3c3055b 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 53fedd7e..a4b7882c 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 9f52b172..878aea06 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index db21c0fc..1a345611 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -5,7 +5,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index e2daebd9..95fe3add 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -4,7 +4,7 @@ datasets einops fastapi==0.112.4 gradio==4.37.* -jinja2==3.1.4 +jinja2==3.1.5 markdown numba==0.59.* numpy==1.26.* From e953af85cd45b3c24d4fe953a9ed68181d175ed8 Mon Sep 17 00:00:00 2001 From: mamei16 Date: Tue, 31 Dec 2024 05:04:02 +0100 Subject: [PATCH 111/173] Fix newlines in the markdown renderer (#6599) --------- Co-authored-by: oobabooga --- modules/html_generator.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index f07b6e75..08147bb7 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -150,7 +150,6 @@ def convert_to_markdown(string): result = '' is_code = False is_latex = False - previous_line_empty = True for line in string.split('\n'): stripped_line = line.strip() @@ -168,20 +167,16 @@ def convert_to_markdown(string): elif stripped_line.endswith('\\\\]'): is_latex = False - # Preserve indentation for lists and code blocks - if stripped_line.startswith('-') or stripped_line.startswith('*') or stripped_line.startswith('+') or stripped_line.startswith('>') or re.match(r'\d+\.', stripped_line): - result += line + '\n' - previous_line_empty = False - elif is_code or is_latex or line.startswith('|'): - result += line + '\n' - previous_line_empty = False - else: - if previous_line_empty: - result += line.strip() + '\n' - else: - result += line.strip() + '\n\n' + result += line - previous_line_empty = stripped_line == '' + # Don't add an extra \n for code, LaTeX, or tables + if is_code or is_latex or line.startswith('|'): + result += '\n' + # Also don't add an extra \n for lists + elif stripped_line.startswith('-') or stripped_line.startswith('*') or stripped_line.startswith('+') or stripped_line.startswith('>') or re.match(r'\d+\.', stripped_line): + result += '\n' + else: + result += '\n\n' result = result.strip() if is_code: @@ -200,7 +195,7 @@ def convert_to_markdown(string): result = re.sub(list_item_pattern, r'\g<1> ' + delete_str, result) # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) # Remove the delete string from the HTML output pos = html_output.rfind(delete_str) @@ -208,7 +203,7 @@ def convert_to_markdown(string): html_output = html_output[:pos] + html_output[pos + len(delete_str):] else: # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) # Unescape code blocks pattern = re.compile(r']*>(.*?)', re.DOTALL) From 64853f85095f8671a28298b9563896e619d531da Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 31 Dec 2024 14:43:22 -0800 Subject: [PATCH 112/173] Reapply a necessary change that I removed from #6599 (thanks @mamei16!) --- modules/html_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index 08147bb7..40a56731 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -176,7 +176,7 @@ def convert_to_markdown(string): elif stripped_line.startswith('-') or stripped_line.startswith('*') or stripped_line.startswith('+') or stripped_line.startswith('>') or re.match(r'\d+\.', stripped_line): result += '\n' else: - result += '\n\n' + result += ' \n' result = result.strip() if is_code: From 7b887247115b40825854c31f094703af399bd6d2 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Wed, 1 Jan 2025 18:33:38 -0300 Subject: [PATCH 113/173] Make responses start faster by removing unnecessary cleanup calls (#6625) --- modules/callbacks.py | 15 +-------------- modules/models.py | 1 + modules/text_generation.py | 5 +++-- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/modules/callbacks.py b/modules/callbacks.py index 2b039ef1..2c04cc53 100644 --- a/modules/callbacks.py +++ b/modules/callbacks.py @@ -65,7 +65,6 @@ class Iteratorize: traceback.print_exc() pass - clear_torch_cache() self.q.put(self.sentinel) if self.c_callback: self.c_callback(ret) @@ -84,22 +83,10 @@ class Iteratorize: return obj def __del__(self): - clear_torch_cache() + pass def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.stop_now = True - clear_torch_cache() - - -def clear_torch_cache(): - gc.collect() - if not shared.args.cpu: - if is_torch_xpu_available(): - torch.xpu.empty_cache() - elif is_torch_npu_available(): - torch.npu.empty_cache() - else: - torch.cuda.empty_cache() diff --git a/modules/models.py b/modules/models.py index 3e8ae3f2..7a52c07c 100644 --- a/modules/models.py +++ b/modules/models.py @@ -90,6 +90,7 @@ def load_model(model_name, loader=None): raise ValueError shared.args.loader = loader + clear_torch_cache() output = load_func_map[loader](model_name) if type(output) is tuple: model, tokenizer = output diff --git a/modules/text_generation.py b/modules/text_generation.py index 86245098..c999fa81 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -79,7 +79,6 @@ def _generate_reply(question, state, stopping_strings=None, is_chat=False, escap all_stop_strings += st shared.stop_everything = False - clear_torch_cache() seed = set_manual_seed(state['seed']) last_update = -1 reply = '' @@ -288,6 +287,9 @@ def get_reply_from_output_ids(output_ids, state=None, starting_from=0): def generate_reply_HF(question, original_question, seed, state, stopping_strings=None, is_chat=False): + if shared.args.loader == 'Transformers': + clear_torch_cache() + generate_params = {} for k in ['max_new_tokens', 'temperature', 'temperature_last', 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', 'top_p', 'min_p', 'top_k', 'repetition_penalty', 'presence_penalty', 'frequency_penalty', 'repetition_penalty_range', 'typical_p', 'tfs', 'top_a', 'guidance_scale', 'penalty_alpha', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', 'do_sample', 'encoder_repetition_penalty', 'no_repeat_ngram_size', 'dry_multiplier', 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', 'xtc_threshold', 'xtc_probability']: if k in state: @@ -393,7 +395,6 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings def generate_with_callback(callback=None, *args, **kwargs): kwargs['stopping_criteria'].append(Stream(callback_func=callback)) - clear_torch_cache() with torch.no_grad(): shared.model.generate(**kwargs) From 725639118a84fc78a1bdb9c49538a941899eee58 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 1 Jan 2025 13:53:50 -0800 Subject: [PATCH 114/173] UI: Use a tab length of 2 for lists (rather than 4) --- modules/html_generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index 40a56731..8160f8b6 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -195,7 +195,7 @@ def convert_to_markdown(string): result = re.sub(list_item_pattern, r'\g<1> ' + delete_str, result) # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) # Remove the delete string from the HTML output pos = html_output.rfind(delete_str) @@ -203,7 +203,7 @@ def convert_to_markdown(string): html_output = html_output[:pos] + html_output[pos + len(delete_str):] else: # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables']) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) # Unescape code blocks pattern = re.compile(r']*>(.*?)', re.DOTALL) From 9163951f3aa65956ffcc7518d4a9c6ccca353b0b Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:49:57 -0800 Subject: [PATCH 115/173] UI: reduce the CPU usage during text streaming --- js/main.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/js/main.js b/js/main.js index a8018175..76a0184b 100644 --- a/js/main.js +++ b/js/main.js @@ -446,25 +446,33 @@ function toggleBigPicture() { //------------------------------------------------ // Handle the chat input box growth //------------------------------------------------ -let currentChatInputHeight = 0; + +// Variables to store current dimensions +let currentChatInputHeight = chatInput.clientHeight; + +// Cache DOM elements +const chatContainer = document.getElementById("chat").parentNode.parentNode.parentNode; +const chatInput = document.querySelector("#chat-input textarea"); // Update chat layout based on chat and input dimensions function updateCssProperties() { - const chatContainer = document.getElementById("chat").parentNode.parentNode.parentNode; - const chatInputHeight = document.querySelector("#chat-input textarea").clientHeight; + const chatInputHeight = chatInput.clientHeight; // Check if the chat container is visible if (chatContainer.clientHeight > 0) { - const newChatHeight = `${chatContainer.parentNode.clientHeight - chatInputHeight + 40 - 100 - 20}px`; + const chatContainerParentHeight = chatContainer.parentNode.clientHeight; + const newChatHeight = `${chatContainerParentHeight - chatInputHeight - 80}px`; + document.documentElement.style.setProperty("--chat-height", newChatHeight); document.documentElement.style.setProperty("--input-delta", `${chatInputHeight - 40}px`); // Adjust scrollTop based on input height change if (chatInputHeight !== currentChatInputHeight) { - if (!isScrolled && chatInputHeight < currentChatInputHeight) { + const deltaHeight = chatInputHeight - currentChatInputHeight; + if (!isScrolled && deltaHeight < 0) { chatContainer.scrollTop = chatContainer.scrollHeight; } else { - chatContainer.scrollTop += chatInputHeight - currentChatInputHeight; + chatContainer.scrollTop += deltaHeight; } currentChatInputHeight = chatInputHeight; From f011787a835b8eb2d3cf354cec4b76a8109defbc Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:55:18 -0800 Subject: [PATCH 116/173] UI: make codeblocks scroll horizontally on overflow --- css/main.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/main.css b/css/main.css index 314b36e0..a08350ad 100644 --- a/css/main.css +++ b/css/main.css @@ -538,8 +538,8 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } .message-body pre > code { - white-space: pre-wrap !important; - word-wrap: break-word !important; + white-space: pre !important; + overflow-x: auto !important; border: 1px solid #666; border-radius: 5px; font-size: 82%; From 979e1f1bd68ed9e44b9af0633017f9ecc456bbcd Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:57:09 -0800 Subject: [PATCH 117/173] Fix a bug after 9163951f3aa65956ffcc7518d4a9c6ccca353b0b --- js/main.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/main.js b/js/main.js index 76a0184b..efb84238 100644 --- a/js/main.js +++ b/js/main.js @@ -447,13 +447,13 @@ function toggleBigPicture() { // Handle the chat input box growth //------------------------------------------------ -// Variables to store current dimensions -let currentChatInputHeight = chatInput.clientHeight; - // Cache DOM elements const chatContainer = document.getElementById("chat").parentNode.parentNode.parentNode; const chatInput = document.querySelector("#chat-input textarea"); +// Variables to store current dimensions +let currentChatInputHeight = chatInput.clientHeight; + // Update chat layout based on chat and input dimensions function updateCssProperties() { const chatInputHeight = chatInput.clientHeight; From 13c033c745b54ce3b35c805ca0ff12f8f93bfb5d Mon Sep 17 00:00:00 2001 From: Petr Korolev Date: Thu, 2 Jan 2025 06:06:11 +0300 Subject: [PATCH 118/173] Fix CUDA error on MPS backend during API request (#6572) --------- Co-authored-by: oobabooga --- modules/LoRA.py | 14 +++--------- modules/logits.py | 25 +++++++++------------ modules/models.py | 46 ++++++++++++++++++++++++-------------- modules/sampler_hijack.py | 15 +++++++------ modules/text_generation.py | 28 ++++++++++------------- 5 files changed, 63 insertions(+), 65 deletions(-) diff --git a/modules/LoRA.py b/modules/LoRA.py index 4fd144ba..e1ad01d7 100644 --- a/modules/LoRA.py +++ b/modules/LoRA.py @@ -1,11 +1,8 @@ from pathlib import Path -import torch -from transformers import is_torch_xpu_available - import modules.shared as shared from modules.logging_colors import logger -from modules.models import reload_model +from modules.models import get_device, reload_model def add_lora_to_model(lora_names): @@ -132,14 +129,9 @@ def add_lora_transformers(lora_names): if not shared.args.load_in_8bit and not shared.args.cpu: shared.model.half() if not hasattr(shared.model, "hf_device_map"): - if torch.backends.mps.is_available(): - device = torch.device('mps') + device = get_device() + if device: shared.model = shared.model.to(device) - elif is_torch_xpu_available(): - device = torch.device("xpu:0") - shared.model = shared.model.to(device) - else: - shared.model = shared.model.cuda() shared.lora_names = lora_names diff --git a/modules/logits.py b/modules/logits.py index 73cabb41..f8a1e80c 100644 --- a/modules/logits.py +++ b/modules/logits.py @@ -2,11 +2,10 @@ import time import traceback import torch -from transformers import is_torch_npu_available, is_torch_xpu_available from modules import models, sampler_hijack, shared from modules.logging_colors import logger -from modules.models import load_model +from modules.models import get_device, load_model from modules.text_generation import generate_reply global_scores = None @@ -57,23 +56,21 @@ def _get_next_logits(prompt, state, use_samplers, previous, top_logits=25, retur scores = sampler_hijack.global_scores[-1] else: if is_non_hf_exllamav2: - if is_torch_xpu_available(): - tokens = shared.tokenizer.encode(prompt).to("xpu:0") - elif is_torch_npu_available(): - tokens = shared.tokenizer.encode(prompt).to("npu:0") - else: - tokens = shared.tokenizer.encode(prompt).cuda() + device = get_device() + tokens = shared.tokenizer.encode(prompt) + if device: + tokens = tokens.to(device) + scores = shared.model.get_logits(tokens)[-1][-1] elif is_non_hf_llamacpp: tokens = shared.tokenizer.encode(prompt) scores = shared.model.get_logits(tokens)[-1][-1] else: - if is_torch_xpu_available(): - tokens = shared.tokenizer.encode(prompt, return_tensors='pt').to("xpu:0") - elif is_torch_npu_available(): - tokens = shared.tokenizer.encode(prompt, return_tensors='pt').to("npu:0") - else: - tokens = shared.tokenizer.encode(prompt, return_tensors='pt').cuda() + device = get_device() + tokens = shared.tokenizer.encode(prompt, return_tensors='pt') + if device: + tokens = tokens.to(device) + output = shared.model(input_ids=tokens) scores = output['logits'][-1][-1] diff --git a/modules/models.py b/modules/models.py index 7a52c07c..d906535b 100644 --- a/modules/models.py +++ b/modules/models.py @@ -21,11 +21,12 @@ from transformers import ( AutoModelForSeq2SeqLM, AutoTokenizer, BitsAndBytesConfig, - GPTQConfig + GPTQConfig, + is_torch_npu_available, + is_torch_xpu_available ) import modules.shared as shared -from modules import sampler_hijack from modules.logging_colors import logger from modules.models_settings import get_model_metadata @@ -56,8 +57,6 @@ if shared.args.deepspeed: ds_config = generate_ds_config(shared.args.bf16, 1 * world_size, shared.args.nvme_offload_dir) dschf = HfDeepSpeedConfig(ds_config) # Keep this object alive for the Transformers integration -sampler_hijack.hijack_samplers() - last_generation_time = time.time() @@ -172,17 +171,9 @@ def huggingface_loader(model_name): model = LoaderClass.from_pretrained(path_to_model, **params) if not (hasattr(model, 'is_loaded_in_4bit') and model.is_loaded_in_4bit): - if torch.backends.mps.is_available(): - device = torch.device('mps') + device = get_device() + if device: model = model.to(device) - elif is_xpu_available(): - device = torch.device("xpu") - model = model.to(device) - elif is_npu_available(): - device = torch.device("npu") - model = model.to(device) - else: - model = model.cuda() # DeepSpeed ZeRO-3 elif shared.args.deepspeed: @@ -380,13 +371,34 @@ def get_max_memory_dict(): return max_memory if len(max_memory) > 0 else None +def get_device(): + if torch.cuda.is_available(): + return torch.device('cuda') + elif shared.args.deepspeed: + import deepspeed + return deepspeed.get_accelerator().current_device_name() + elif torch.backends.mps.is_available(): + return torch.device('mps') + elif is_torch_xpu_available(): + return torch.device('xpu:0') + elif is_torch_npu_available(): + return torch.device('npu:0') + else: + return None + + def clear_torch_cache(): gc.collect() if not shared.args.cpu: - if is_xpu_available(): - torch.xpu.empty_cache() - else: + if torch.cuda.is_available(): torch.cuda.empty_cache() + elif is_xpu_available(): + torch.xpu.empty_cache() + elif is_npu_available(): + torch.npu.empty_cache() + elif torch.backends.mps.is_available(): + if hasattr(torch.backends.mps, 'empty_cache'): + torch.backends.mps.empty_cache() def unload_model(keep_model_name=False): diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 24dbcf2e..62ceca8d 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -5,7 +5,7 @@ import random import torch import transformers -from transformers import LogitsWarper, is_torch_xpu_available +from transformers import LogitsWarper from transformers.generation.logits_process import ( LogitNormalization, LogitsProcessor, @@ -14,6 +14,7 @@ from transformers.generation.logits_process import ( from modules import shared from modules.logging_colors import logger +from modules.models import get_device global_scores = None @@ -339,12 +340,12 @@ class MirostatLogitsWarper(LogitsWarper): break # Normalize the probabilities of the remaining words - if is_torch_xpu_available(): - prob_topk = torch.softmax(sorted_logits, dim=0).to("xpu") - prev_i = torch.multinomial(prob_topk, num_samples=1, replacement=True).to("xpu") - else: - prob_topk = torch.softmax(sorted_logits, dim=0).to('cuda') - prev_i = torch.multinomial(prob_topk, num_samples=1, replacement=True).to('cuda') + prob_topk = torch.softmax(sorted_logits, dim=0) + prev_i = torch.multinomial(prob_topk, num_samples=1, replacement=True) + device = get_device() + if device: + prob_topk = prob_topk.to(device) + prev_i = prev_i.to(device) observed_surprise = -math.log2(prob_topk[prev_i]) self.e = observed_surprise - self.mirostat_tau diff --git a/modules/text_generation.py b/modules/text_generation.py index c999fa81..db415dce 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -16,7 +16,7 @@ from transformers import ( ) import modules.shared as shared -from modules import models +from modules import models, sampler_hijack from modules.cache_utils import process_llamacpp_cache from modules.callbacks import ( Iteratorize, @@ -28,7 +28,9 @@ from modules.grammar.grammar_utils import initialize_grammar from modules.grammar.logits_process import GrammarConstrainedLogitsProcessor from modules.html_generator import generate_basic_html from modules.logging_colors import logger -from modules.models import clear_torch_cache, load_model +from modules.models import clear_torch_cache, get_device, load_model + +sampler_hijack.hijack_samplers() def generate_reply(*args, **kwargs): @@ -159,18 +161,12 @@ def encode(prompt, add_special_tokens=True, add_bos_token=True, truncation_lengt if shared.model.__class__.__name__ in ['LlamaCppModel', 'Exllamav2Model', 'TensorRTLLMModel'] or shared.args.cpu: return input_ids - elif shared.args.deepspeed: - import deepspeed - return input_ids.to(deepspeed.get_accelerator().current_device_name()) - elif torch.backends.mps.is_available(): - device = torch.device('mps') - return input_ids.to(device) - elif is_torch_xpu_available(): - return input_ids.to("xpu:0") - elif is_torch_npu_available(): - return input_ids.to("npu:0") else: - return input_ids.cuda() + device = get_device() + if device: + return input_ids.to(device) + + return input_ids def decode(output_ids, skip_special_tokens=True): @@ -328,7 +324,6 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings # Encode the input input_ids = encode(question, add_bos_token=state['add_bos_token'], truncation_length=get_max_prompt_length(state)) output = input_ids[0] - cuda = not any((shared.args.cpu, shared.args.deepspeed)) if state['auto_max_new_tokens']: generate_params['max_new_tokens'] = state['truncation_length'] - input_ids.shape[-1] @@ -383,8 +378,9 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings if not state['stream']: with torch.no_grad(): output = shared.model.generate(**generate_params)[0] - if cuda: - output = output.cuda() + device = get_device() + if device: + output = output.to(device) starting_from = 0 if shared.is_seq2seq else len(input_ids[0]) yield get_reply_from_output_ids(output, state, starting_from=starting_from) From 75f1b5ccde221783b4fedef92da6afc3a44824f0 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:24:18 -0800 Subject: [PATCH 119/173] UI: add a "Branch chat" button --- css/main.css | 1 + modules/chat.py | 15 +++++++++++++++ modules/ui_chat.py | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/css/main.css b/css/main.css index a08350ad..870f4192 100644 --- a/css/main.css +++ b/css/main.css @@ -980,6 +980,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { #rename-row { width: 100%; justify-content: center; + gap: 10px; } diff --git a/modules/chat.py b/modules/chat.py index 2638c794..81328385 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -1092,6 +1092,21 @@ def handle_delete_chat_confirm_click(state): ] +def handle_branch_chat_click(state): + history = state['history'] + new_unique_id = datetime.now().strftime('%Y%m%d-%H-%M-%S') + save_history(history, new_unique_id, state['character_menu'], state['mode']) + + histories = find_all_histories_with_first_prompts(state) + html = redraw_html(history, state['name1'], state['name2'], state['mode'], state['chat_style'], state['character_menu']) + + convert_to_markdown.cache_clear() + + past_chats_update = gr.update(choices=histories, value=new_unique_id) + + return [history, html, past_chats_update] + + def handle_rename_chat_click(): return [ gr.update(value="My New Chat"), diff --git a/modules/ui_chat.py b/modules/ui_chat.py index e372f5c2..b09d0081 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -24,6 +24,7 @@ def create_ui(): with gr.Row(elem_id='past-chats-row', elem_classes=['pretty_scrollbar']): with gr.Column(): with gr.Row(elem_id='past-chats-buttons'): + shared.gradio['branch_chat'] = gr.Button('Branch', elem_classes='refresh-button', interactive=not mu) shared.gradio['rename_chat'] = gr.Button('Rename', elem_classes='refresh-button', interactive=not mu) shared.gradio['delete_chat'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu) shared.gradio['Start new chat'] = gr.Button('New chat', elem_classes=['refresh-button', 'focus-on-chat-input']) @@ -250,6 +251,10 @@ def create_event_handlers(): ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( chat.handle_delete_chat_confirm_click, gradio('interface_state'), gradio('history', 'display', 'unique_id', 'delete-chat-row'), show_progress=False) + shared.gradio['branch_chat'].click( + ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + chat.handle_branch_chat_click, gradio('interface_state'), gradio('history', 'display', 'unique_id'), show_progress=False) + shared.gradio['rename_chat'].click(chat.handle_rename_chat_click, None, gradio('rename_to', 'rename-row'), show_progress=False) shared.gradio['rename_to-cancel'].click(lambda: gr.update(visible=False), None, gradio('rename-row'), show_progress=False) shared.gradio['rename_to-confirm'].click( From 973255cb0bc61c0cf50e6f562bfc632a3d6fab1c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:48:24 -0800 Subject: [PATCH 120/173] UI: fix codeblocks overflowing on mobile --- css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/main.css b/css/main.css index 870f4192..564a39a1 100644 --- a/css/main.css +++ b/css/main.css @@ -540,6 +540,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { .message-body pre > code { white-space: pre !important; overflow-x: auto !important; + max-width: calc(100dvw - 39px); border: 1px solid #666; border-radius: 5px; font-size: 82%; From b8fc9010fa4667c78a01adb6f1449e515e94709f Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:57:04 -0800 Subject: [PATCH 121/173] UI: fix `orjson.JSONDecodeError` error on page reload --- modules/ui_chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_chat.py b/modules/ui_chat.py index b09d0081..ecebc28e 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -18,7 +18,7 @@ def create_ui(): mu = shared.args.multi_user shared.gradio['Chat input'] = gr.State() - shared.gradio['history'] = gr.JSON({'internal': [], 'visible': []}, visible=False) + shared.gradio['history'] = gr.JSON(visible=False) with gr.Tab('Chat', elem_id='chat-tab'): with gr.Row(elem_id='past-chats-row', elem_classes=['pretty_scrollbar']): From 4b3e1b37573057fe878ff48037569253b9df5576 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:46:40 -0800 Subject: [PATCH 122/173] UI: add a "Search chats" input field --- css/main.css | 6 +++++- modules/chat.py | 40 +++++++++++++++++++++++++--------------- modules/ui.py | 1 + modules/ui_chat.py | 6 ++++++ 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/css/main.css b/css/main.css index 564a39a1..64da1602 100644 --- a/css/main.css +++ b/css/main.css @@ -876,6 +876,10 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { flex-shrink: 1; } +#search_chat > :nth-child(2) > :first-child { + display: none; +} + /* ---------------------------------------------- Keep dropdown menus above errored components ---------------------------------------------- */ @@ -911,7 +915,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } #past-chats { - max-height: calc(100dvh - 90px); + max-height: calc(100dvh - 135px); overflow-y: scroll !important; border-radius: 0; scrollbar-width: auto; diff --git a/modules/chat.py b/modules/chat.py index 81328385..694c137b 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -593,21 +593,26 @@ def find_all_histories_with_first_prompts(state): result = [] for i, path in enumerate(histories): filename = path.stem - if re.match(r'^[0-9]{8}-[0-9]{2}-[0-9]{2}-[0-9]{2}$', filename): - with open(path, 'r', encoding='utf-8') as f: - data = json.load(f) + file_content = "" + with open(path, 'r', encoding='utf-8') as f: + file_content = f.read() - first_prompt = "" - if data and 'visible' in data and len(data['visible']) > 0: - if data['internal'][0][0] == '<|BEGIN-VISIBLE-CHAT|>': - if len(data['visible']) > 1: - first_prompt = html.unescape(data['visible'][1][0]) - elif i == 0: - first_prompt = "New chat" - else: - first_prompt = html.unescape(data['visible'][0][0]) - elif i == 0: - first_prompt = "New chat" + if state['search_chat'] and state['search_chat'] not in file_content: + continue + + data = json.loads(file_content) + if re.match(r'^[0-9]{8}-[0-9]{2}-[0-9]{2}-[0-9]{2}$', filename): + first_prompt = "" + if data and 'visible' in data and len(data['visible']) > 0: + if data['internal'][0][0] == '<|BEGIN-VISIBLE-CHAT|>': + if len(data['visible']) > 1: + first_prompt = html.unescape(data['visible'][1][0]) + elif i == 0: + first_prompt = "New chat" + else: + first_prompt = html.unescape(data['visible'][0][0]) + elif i == 0: + first_prompt = "New chat" else: first_prompt = filename @@ -615,7 +620,7 @@ def find_all_histories_with_first_prompts(state): # Truncate the first prompt if it's longer than 30 characters if len(first_prompt) > 30: - first_prompt = first_prompt[:30-3] + '...' + first_prompt = first_prompt[:30 - 3] + '...' result.append((first_prompt, filename)) @@ -1124,6 +1129,11 @@ def handle_rename_chat_confirm(rename_to, state): ] +def handle_search_chat_change(state): + histories = find_all_histories_with_first_prompts(state) + return gr.update(choices=histories) + + def handle_upload_chat_history(load_chat_history, state): history = start_new_chat(state) history = load_history_json(load_chat_history, history) diff --git a/modules/ui.py b/modules/ui.py index 4bfea9fa..a3bf520f 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -230,6 +230,7 @@ def list_interface_input_elements(): 'start_with', 'character_menu', 'history', + 'search_chat', 'unique_id', 'name1', 'user_bio', diff --git a/modules/ui_chat.py b/modules/ui_chat.py index ecebc28e..b92dd9ae 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -29,6 +29,8 @@ def create_ui(): shared.gradio['delete_chat'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu) shared.gradio['Start new chat'] = gr.Button('New chat', elem_classes=['refresh-button', 'focus-on-chat-input']) + shared.gradio['search_chat'] = gr.Textbox(placeholder='Search chats...', max_lines=1, elem_id='search_chat') + with gr.Row(elem_id='delete-chat-row', visible=False) as shared.gradio['delete-chat-row']: shared.gradio['delete_chat-cancel'] = gr.Button('Cancel', elem_classes=['refresh-button', 'focus-on-chat-input']) shared.gradio['delete_chat-confirm'] = gr.Button('Confirm', variant='stop', elem_classes=['refresh-button', 'focus-on-chat-input']) @@ -265,6 +267,10 @@ def create_event_handlers(): ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( chat.handle_rename_chat_confirm, gradio('rename_to', 'interface_state'), gradio('unique_id', 'rename-row'), show_progress=False) + shared.gradio['search_chat'].change( + ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( + chat.handle_search_chat_change, gradio('interface_state'), gradio('unique_id'), show_progress=False) + shared.gradio['load_chat_history'].upload( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( chat.handle_upload_chat_history, gradio('load_chat_history', 'interface_state'), gradio('history', 'display', 'unique_id'), show_progress=False).then( From e2702200e131944e58e19a9894b8ebadb24c6f75 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 2 Jan 2025 19:26:50 -0800 Subject: [PATCH 123/173] UI: fix the font size of lists in chat mode --- css/chat_style-cai-chat.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/chat_style-cai-chat.css b/css/chat_style-cai-chat.css index d7b1ba88..93276bd3 100644 --- a/css/chat_style-cai-chat.css +++ b/css/chat_style-cai-chat.css @@ -9,6 +9,7 @@ .message-body { margin-top: 3px; + font-size: 15px !important; } .circle-you { From 3815f46838e4bb2542d32fbdc5151bc4f2a5abb7 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 3 Jan 2025 04:35:29 -0800 Subject: [PATCH 124/173] UI: minor style improvements to chat tab --- css/main.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index 64da1602..0ccaf106 100644 --- a/css/main.css +++ b/css/main.css @@ -839,7 +839,11 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { Past chats menus ---------------------------------------------- */ #rename-row label { - margin-top: var(--layout-gap); + margin-top: 0; +} + +#rename-row > :nth-child(2) { + justify-content: center; } /* ---------------------------------------------- From 9f24885bd2f70f7d07742f766107983b301434af Mon Sep 17 00:00:00 2001 From: mamei16 Date: Sat, 4 Jan 2025 19:41:31 +0100 Subject: [PATCH 125/173] Sane handling of markdown lists (#6626) --- modules/html_generator.py | 7 +- modules/sane_markdown_lists.py | 336 +++++++++++++++++++++++++++++++++ 2 files changed, 340 insertions(+), 3 deletions(-) create mode 100644 modules/sane_markdown_lists.py diff --git a/modules/html_generator.py b/modules/html_generator.py index 8160f8b6..e61fc558 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -9,6 +9,7 @@ import markdown from PIL import Image, ImageOps from modules import shared +from modules.sane_markdown_lists import SaneListExtension from modules.utils import get_available_chat_styles # This is to store the paths to the thumbnails of the profile pictures @@ -174,7 +175,7 @@ def convert_to_markdown(string): result += '\n' # Also don't add an extra \n for lists elif stripped_line.startswith('-') or stripped_line.startswith('*') or stripped_line.startswith('+') or stripped_line.startswith('>') or re.match(r'\d+\.', stripped_line): - result += '\n' + result += ' \n' else: result += ' \n' @@ -195,7 +196,7 @@ def convert_to_markdown(string): result = re.sub(list_item_pattern, r'\g<1> ' + delete_str, result) # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables', SaneListExtension()]) # Remove the delete string from the HTML output pos = html_output.rfind(delete_str) @@ -203,7 +204,7 @@ def convert_to_markdown(string): html_output = html_output[:pos] + html_output[pos + len(delete_str):] else: # Convert to HTML using markdown - html_output = markdown.markdown(result, extensions=['fenced_code', 'tables'], tab_length=2) + html_output = markdown.markdown(result, extensions=['fenced_code', 'tables', SaneListExtension()]) # Unescape code blocks pattern = re.compile(r']*>(.*?)', re.DOTALL) diff --git a/modules/sane_markdown_lists.py b/modules/sane_markdown_lists.py new file mode 100644 index 00000000..1e1d76fd --- /dev/null +++ b/modules/sane_markdown_lists.py @@ -0,0 +1,336 @@ +# Code based on the Sane List Extension for Python-Markdown +# ======================================= + +# Modify the behavior of Lists in Python-Markdown to act in a sane manner. + +# See https://Python-Markdown.github.io/extensions/sane_lists +# for documentation. + +# Original code Copyright 2011 [Waylan Limberg](http://achinghead.com) + +# All changes Copyright 2011-2014 The Python Markdown Project + +# License: [BSD](https://opensource.org/licenses/bsd-license.php) + +""" +Modify the behavior of Lists in Python-Markdown to act in a sane manner. +""" + +from __future__ import annotations + +import re +import xml.etree.ElementTree as etree +from typing import TYPE_CHECKING + +from markdown import Extension +from markdown.blockparser import BlockParser +from markdown.blockprocessors import ( + ListIndentProcessor, + OListProcessor, + ParagraphProcessor +) + +if TYPE_CHECKING: # pragma: no cover + from markdown import blockparser + + +# The min. number of added leading spaces needed to start a nested list +MIN_NESTED_LIST_INDENT = 2 +assert MIN_NESTED_LIST_INDENT > 1, "'MIN_NESTED_LIST_INDENT' must be > 1" + + +class SaneListIndentProcessor(ListIndentProcessor): + """ Process children of list items. + + Example + + * a list item + process this part + + or this part + + """ + + def __init__(self, *args): + super().__init__(*args) + self.INDENT_RE = re.compile(r'^(([ ])+)') + + def test(self, parent: etree.Element, block: str) -> bool: + return block.startswith(' ' * MIN_NESTED_LIST_INDENT) and \ + not self.parser.state.isstate('detabbed') and \ + (parent.tag in self.ITEM_TYPES or + (len(parent) and parent[-1] is not None and + (parent[-1].tag in self.LIST_TYPES))) + + def get_level(self, parent: etree.Element, block: str) -> tuple[int, etree.Element]: + """ Get level of indentation based on list level. """ + # Get indent level + m = self.INDENT_RE.match(block) + if m: + indent_level = len(m.group(1)) / MIN_NESTED_LIST_INDENT + else: + indent_level = 0 + if self.parser.state.isstate('list'): + # We're in a tight-list - so we already are at correct parent. + level = 1 + else: + # We're in a loose-list - so we need to find parent. + level = 0 + # Step through children of tree to find matching indent level. + while indent_level > level: + child = self.lastChild(parent) + if (child is not None and + (child.tag in self.LIST_TYPES or child.tag in self.ITEM_TYPES)): + if child.tag in self.LIST_TYPES: + level += 1 + parent = child + else: + # No more child levels. If we're short of `indent_level`, + # we have a code block. So we stop here. + break + return level, parent + + def detab(self, text: str, length: int | None = None) -> tuple[str, str]: + """ Remove a tab from the front of each line of the given text. """ + if length is None: + length = MIN_NESTED_LIST_INDENT + newtext = [] + lines = text.split('\n') + for line in lines: + if line.startswith(' ' * length): + newtext.append(line[length:]) + elif not line.strip(): + newtext.append('') + else: + break + return '\n'.join(newtext), '\n'.join(lines[len(newtext):]) + + def looseDetab(self, text: str, level: int = 1) -> str: + """ Remove indentation from front of lines but allowing dedented lines. """ + lines = text.split('\n') + for i in range(len(lines)): + if lines[i].startswith(' ' * MIN_NESTED_LIST_INDENT * level): + lines[i] = lines[i][MIN_NESTED_LIST_INDENT * level:] + return '\n'.join(lines) + + +class SaneOListProcessor(OListProcessor): + """ Override `SIBLING_TAGS` to not include `ul` and set `LAZY_OL` to `False`. """ + + SIBLING_TAGS = ['ol'] + """ Exclude `ul` from list of siblings. """ + LAZY_OL = False + """ Disable lazy list behavior. """ + + def __init__(self, parser: blockparser.BlockParser): + super().__init__(parser) + # This restriction stems from the 'CodeBlockProcessor' class, + # which automatically matches blocks with an indent = self.tab_length + max_list_start_indent = self.tab_length - 1 + # Detect an item (e.g., `1. item`) + self.RE = re.compile(r'^[ ]{0,%d}[\*_]{0,2}\d+\.[ ]+(.*)' % max_list_start_indent) + # Detect items on secondary lines. they can be of either list type. + self.CHILD_RE = re.compile(r'^[ ]{0,%d}([\*_]{0,2})((\d+\.))[ ]+(.*)' % (MIN_NESTED_LIST_INDENT - 1)) + # Detect indented (nested) items of either type + self.INDENT_RE = re.compile(r'^[ ]{%d,%d}[\*_]{0,2}((\d+\.)|[*+-])[ ]+.*' % + (MIN_NESTED_LIST_INDENT, self.tab_length * 2 - 1)) + + def run(self, parent: etree.Element, blocks: list[str]) -> None: + # Check for multiple items in one block. + items = self.get_items(blocks.pop(0)) + sibling = self.lastChild(parent) + + if sibling is not None and sibling.tag in self.SIBLING_TAGS: + # Previous block was a list item, so set that as parent + lst = sibling + # make sure previous item is in a `p` - if the item has text, + # then it isn't in a `p` + if lst[-1].text: + # since it's possible there are other children for this + # sibling, we can't just `SubElement` the `p`, we need to + # insert it as the first item. + p = etree.Element('p') + p.text = lst[-1].text + lst[-1].text = '' + lst[-1].insert(0, p) + # if the last item has a tail, then the tail needs to be put in a `p` + # likely only when a header is not followed by a blank line + lch = self.lastChild(lst[-1]) + if lch is not None and lch.tail: + p = etree.SubElement(lst[-1], 'p') + p.text = lch.tail.lstrip() + lch.tail = '' + + # parse first block differently as it gets wrapped in a `p`. + li = etree.SubElement(lst, 'li') + self.parser.state.set('looselist') + firstitem = items.pop(0) + self.parser.parseBlocks(li, [firstitem]) + self.parser.state.reset() + elif parent.tag in ['ol', 'ul']: + # this catches the edge case of a multi-item indented list whose + # first item is in a blank parent-list item: + # * * subitem1 + # * subitem2 + # see also `ListIndentProcessor` + lst = parent + else: + # This is a new list so create parent with appropriate tag. + lst = etree.SubElement(parent, self.TAG) + # Check if a custom start integer is set + if not self.LAZY_OL and self.STARTSWITH != '1': + lst.attrib['start'] = self.STARTSWITH + + self.parser.state.set('list') + # Loop through items in block, recursively parsing each with the + # appropriate parent. + for item in items: + if item.startswith(" " * MIN_NESTED_LIST_INDENT): + # Item is indented. Parse with last item as parent + self.parser.parseBlocks(lst[-1], [item]) + else: + # New item. Create `li` and parse with it as parent + li = etree.SubElement(lst, 'li') + self.parser.parseBlocks(li, [item]) + self.parser.state.reset() + + def looseDetab(self, text: str, indent_length: int, level: int = 1) -> str: + """ Remove indentation from front of lines but allowing dedented lines. """ + lines = text.split('\n') + for i in range(len(lines)): + if lines[i].startswith(' ' * indent_length * level): + lines[i] = lines[i][indent_length * level:] + return '\n'.join(lines) + + def get_items(self, block: str) -> list[str]: + """ Break a block into list items. """ + # If first level of list is indented, remove that indentation + if (indent_len := len(block) - len(block.lstrip())) > 0: + block = self.looseDetab(block, indent_len) + items = [] + for line in block.split('\n'): + m = self.CHILD_RE.match(line) + if m: + # This is a new list item + # Check first item for the start index + if not items: + # Detect the integer value of first list item + INTEGER_RE = re.compile(r'(\d+)') + self.STARTSWITH = INTEGER_RE.match(m.group(2)).group() + # Append to the list + items.append(m.group(1) + m.group(4)) + elif self.INDENT_RE.match(line): + # This is an indented (possibly nested) item. + if items[-1].startswith(' ' * MIN_NESTED_LIST_INDENT): + # Previous item was indented. Append to that item. + items[-1] = '{}\n{}'.format(items[-1], line) + else: + items.append(line) + else: + # This is another line of previous item. Append to that item. + items[-1] = '{}\n{}'.format(items[-1], line) + return items + + +class SaneUListProcessor(SaneOListProcessor): + """ Override `SIBLING_TAGS` to not include `ol`. """ + + TAG: str = 'ul' + SIBLING_TAGS = ['ul'] + """ Exclude `ol` from list of siblings. """ + + def __init__(self, parser: blockparser.BlockParser): + super().__init__(parser) + # Detect an item (e.g., `- item` or `+ item` or `* item`). + max_list_start_indent = self.tab_length - 1 + self.RE = re.compile(r'^[ ]{0,%d}[*+-][ ]+(.*)' % max_list_start_indent) + self.CHILD_RE = re.compile(r'^[ ]{0,%d}(([*+-]))[ ]+(.*)' % (MIN_NESTED_LIST_INDENT - 1)) + + def get_items(self, block: str) -> list[str]: + """ Break a block into list items. """ + # If first level of list is indented, remove that indentation + if (indent_len := len(block) - len(block.lstrip())) > 0: + block = self.looseDetab(block, indent_len) + items = [] + for line in block.split('\n'): + m = self.CHILD_RE.match(line) + if m: + # Append to the list + items.append(m.group(3)) + elif self.INDENT_RE.match(line): + # This is an indented (possibly nested) item. + if items[-1].startswith(' ' * MIN_NESTED_LIST_INDENT): + # Previous item was indented. Append to that item. + items[-1] = '{}\n{}'.format(items[-1], line) + else: + items.append(line) + else: + # This is another line of previous item. Append to that item. + items[-1] = '{}\n{}'.format(items[-1], line) + return items + + +class SaneParagraphProcessor(ParagraphProcessor): + """ Process Paragraph blocks. """ + + def __init__(self, parser: BlockParser): + super().__init__(parser) + max_list_start_indent = self.tab_length - 1 + self.LIST_RE = re.compile(r"\s{2}\n(\s{0,%d}[\d+*-])" % max_list_start_indent) + + def run(self, parent: etree.Element, blocks: list[str]) -> None: + block = blocks.pop(0) + if block.strip(): + # Not a blank block. Add to parent, otherwise throw it away. + if self.parser.state.isstate('list'): + # The parent is a tight-list. + # + # Check for any children. This will likely only happen in a + # tight-list when a header isn't followed by a blank line. + # For example: + # + # * # Header + # Line 2 of list item - not part of header. + sibling = self.lastChild(parent) + if sibling is not None: + # Insert after sibling. + if sibling.tail: + sibling.tail = '{}\n{}'.format(sibling.tail, block) + else: + sibling.tail = '\n%s' % block + else: + # Append to parent.text + if parent.text: + parent.text = '{}\n{}'.format(parent.text, block) + else: + parent.text = block.lstrip() + else: + # Check if paragraph contains a list + next_list_block = None + if list_match := self.LIST_RE.search(block): + list_start = list_match.end() - len(list_match.group(1)) + next_list_block = block[list_start:] + block = block[:list_start] + + # Create a regular paragraph + p = etree.SubElement(parent, 'p') + p.text = block.lstrip() + + # If a list was found, parse its block separately with the paragraph as the parent + if next_list_block: + self.parser.parseBlocks(p, [next_list_block]) + + +class SaneListExtension(Extension): + """ Add sane lists to Markdown. """ + + def extendMarkdown(self, md): + """ Override existing Processors. """ + md.parser.blockprocessors.register(SaneListIndentProcessor(md.parser), 'indent', 90) + md.parser.blockprocessors.register(SaneOListProcessor(md.parser), 'olist', 40) + md.parser.blockprocessors.register(SaneUListProcessor(md.parser), 'ulist', 30) + md.parser.blockprocessors.register(SaneParagraphProcessor(md.parser), 'paragraph', 10) + + +def makeExtension(**kwargs): # pragma: no cover + return SaneListExtension(**kwargs) From 0e673a7a4278deaedb3513b4e406cdcc45b19b4e Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Jan 2025 11:40:24 -0800 Subject: [PATCH 126/173] UI: reduce the size of HTML sent to the UI during streaming --- modules/html_generator.py | 130 +++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 72 deletions(-) diff --git a/modules/html_generator.py b/modules/html_generator.py index e61fc558..1f12d77a 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -268,29 +268,24 @@ def generate_instruct_html(history): for i, _row in enumerate(history): row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] - if row[0]: # don't display empty user messages - output += f""" -
            -
            -
            - {row[0]} -
            -
            -
            - """ + if row[0]: # Don't display empty user messages + output += ( + f'
            ' + f'
            ' + f'
            {row[0]}
            ' + f'
            ' + f'
            ' + ) - output += f""" -
            -
            -
            - {row[1]} -
            -
            -
            - """ + output += ( + f'
            ' + f'
            ' + f'
            {row[1]}
            ' + f'
            ' + f'
            ' + ) output += "" - return output @@ -298,44 +293,39 @@ def generate_cai_chat_html(history, name1, name2, style, character, reset_cache= output = f'
            ' # We use ?character and ?time.time() to force the browser to reset caches - img_bot = f'' if Path("cache/pfp_character_thumb.png").exists() else '' - img_me = f'' if Path("cache/pfp_me.png").exists() else '' + img_bot = ( + f'' + if Path("cache/pfp_character_thumb.png").exists() else '' + ) + + img_me = ( + f'' + if Path("cache/pfp_me.png").exists() else '' + ) for i, _row in enumerate(history): row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] - if row[0]: # don't display empty user messages - output += f""" -
            -
            - {img_me} -
            -
            -
            - {name1} -
            -
            - {row[0]} -
            -
            -
            - """ + if row[0]: # Don't display empty user messages + output += ( + f'
            ' + f'
            {img_me}
            ' + f'
            ' + f'
            {name1}
            ' + f'
            {row[0]}
            ' + f'
            ' + f'
            ' + ) - output += f""" -
            -
            - {img_bot} -
            -
            -
            - {name2} -
            -
            - {row[1]} -
            -
            -
            - """ + output += ( + f'
            ' + f'
            {img_bot}
            ' + f'
            ' + f'
            {name2}
            ' + f'
            {row[1]}
            ' + f'
            ' + f'
            ' + ) output += "
            " return output @@ -347,26 +337,22 @@ def generate_chat_html(history, name1, name2, reset_cache=False): for i, _row in enumerate(history): row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] - if row[0]: # don't display empty user messages - output += f""" -
            -
            -
            - {row[0]} -
            -
            -
            - """ + if row[0]: # Don't display empty user messages + output += ( + f'
            ' + f'
            ' + f'
            {row[0]}
            ' + f'
            ' + f'
            ' + ) - output += f""" -
            -
            -
            - {row[1]} -
            -
            -
            - """ + output += ( + f'
            ' + f'
            ' + f'
            {row[1]}
            ' + f'
            ' + f'
            ' + ) output += "" return output From 049297fa660125467d8d2aed00f91901871dbf52 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Jan 2025 14:09:36 -0800 Subject: [PATCH 127/173] UI: reduce the size of CSS sent to the UI during streaming --- modules/html_generator.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/modules/html_generator.py b/modules/html_generator.py index 1f12d77a..e3550ed5 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -15,6 +15,29 @@ from modules.utils import get_available_chat_styles # This is to store the paths to the thumbnails of the profile pictures image_cache = {} + +def minify_css(css: str) -> str: + # Step 1: Remove comments + css = re.sub(r'/\*.*?\*/', '', css, flags=re.DOTALL) + + # Step 2: Remove leading and trailing whitespace + css = re.sub(r'^[ \t]*|[ \t]*$', '', css, flags=re.MULTILINE) + + # Step 3: Remove spaces after specific characters ({ : ; ,}) + css = re.sub(r'([:{;,])\s+', r'\1', css) + + # Step 4: Remove spaces before `{` + css = re.sub(r'\s+{', '{', css) + + # Step 5: Remove empty lines + css = re.sub(r'^\s*$', '', css, flags=re.MULTILINE) + + # Step 6: Collapse all lines into one + css = re.sub(r'\n', '', css) + + return css + + with open(Path(__file__).resolve().parent / '../css/html_readable_style.css', 'r') as f: readable_css = f.read() with open(Path(__file__).resolve().parent / '../css/html_instruct_style.css', 'r') as f: @@ -35,6 +58,12 @@ for k in chat_styles: style = match.group(1) chat_styles[k] = chat_styles.get(style, '') + '\n\n' + '\n'.join(lines[1:]) +# Reduce the size of the CSS sources above +readable_css = minify_css(readable_css) +instruct_css = minify_css(instruct_css) +for k in chat_styles: + chat_styles[k] = minify_css(chat_styles[k]) + def fix_newlines(string): string = string.replace('\n', '\n\n') From d56b5005689d17472626872c6fd40fc4208dff30 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:22:40 -0800 Subject: [PATCH 128/173] UI: add padding to file saving dialog --- css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/main.css b/css/main.css index 0ccaf106..dc89fbef 100644 --- a/css/main.css +++ b/css/main.css @@ -226,6 +226,7 @@ button { max-width: 500px; background-color: var(--input-background-fill); border: var(--input-border-width) solid var(--input-border-color) !important; + padding: 10px; } .file-saver > :first-child > :last-child { From 3967520e71ba0ab386893d7c7e946fd621e25b06 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:22:59 -0800 Subject: [PATCH 129/173] Connect XTC, DRY, smoothing_factor, and dynatemp to ExLlamaV2 loader (non-HF) --- modules/exllamav2.py | 30 +++++++++++++++++++++++++++++- modules/loaders.py | 12 +++++++++++- modules/sampler_hijack.py | 4 +++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/modules/exllamav2.py b/modules/exllamav2.py index 9b6da83c..0289bb21 100644 --- a/modules/exllamav2.py +++ b/modules/exllamav2.py @@ -1,8 +1,8 @@ +import json import traceback from pathlib import Path import torch - from exllamav2 import ( ExLlamaV2, ExLlamaV2Cache, @@ -15,6 +15,7 @@ from exllamav2 import ( ExLlamaV2Tokenizer ) from exllamav2.generator import ExLlamaV2Sampler, ExLlamaV2StreamingGenerator + from modules import shared from modules.logging_colors import logger from modules.text_generation import get_max_prompt_length @@ -122,6 +123,10 @@ class Exllamav2Model: settings.token_presence_penalty = state['presence_penalty'] settings.temperature = state['temperature'] + settings.smoothing_factor = state['smoothing_factor'] + settings.min_temp = state['dynatemp_low'] if state['dynamic_temperature'] else 0 + settings.max_temp = state['dynatemp_high'] if state['dynamic_temperature'] else 0 + settings.temp_exponent = state['dynatemp_exponent'] settings.top_k = state['top_k'] settings.top_p = state['top_p'] settings.top_a = state['top_a'] @@ -143,6 +148,29 @@ class Exllamav2Model: if len(to_ban) > 0: settings.disallow_tokens(self.tokenizer, to_ban) + settings.dry_allowed_length = state['dry_allowed_length'] + settings.dry_base = state['dry_base'] + settings.dry_multiplier = state['dry_multiplier'] + + # Dry sequence breakers processing + if state['dry_multiplier'] > 0 and state['dry_sequence_breakers']: + dry_sequence_breakers = state['dry_sequence_breakers'] + + # Support both JSON array notation and comma-separated strings. + if not dry_sequence_breakers.startswith("["): + dry_sequence_breakers = "[" + dry_sequence_breakers + "]" + + sequence_breaker_strings = json.loads(dry_sequence_breakers) + # Prefix with 'a' to get the correct encoding of the token at the end of a text. + sequence_breakers = { + self.encode(f"a{s}")[0, -1].item() for s in sequence_breaker_strings + } + + settings.dry_sequence_breakers = sequence_breakers + + settings.xtc_probability = state['xtc_probability'] + settings.xtc_threshold = state['xtc_threshold'] + ids = self.tokenizer.encode(prompt, add_bos=state['add_bos_token'], encode_special_tokens=True) ids = ids[:, -get_max_prompt_length(state):] diff --git a/modules/loaders.py b/modules/loaders.py index 1cfdb31b..a4edf822 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -194,6 +194,10 @@ loaders_samplers = { 'ExLlamav2': { 'temperature', 'temperature_last', + 'smoothing_factor', + 'dynatemp_low', + 'dynatemp_high', + 'dynatemp_exponent', 'top_p', 'min_p', 'top_k', @@ -204,10 +208,16 @@ loaders_samplers = { 'presence_penalty', 'frequency_penalty', 'repetition_penalty_range', - 'seed', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', + 'dry_multiplier', + 'dry_base', + 'dry_allowed_length', + 'dry_sequence_breakers', + 'xtc_threshold', + 'xtc_probability', + 'seed', 'ban_eos_token', 'add_bos_token', 'custom_token_bans', diff --git a/modules/sampler_hijack.py b/modules/sampler_hijack.py index 62ceca8d..d202af1f 100644 --- a/modules/sampler_hijack.py +++ b/modules/sampler_hijack.py @@ -495,7 +495,9 @@ def get_logits_processor_patch(self, **kwargs): sequence_breaker_strings = json.loads(dry_sequence_breakers) # Prefix with 'a' to get the correct encoding of the token at the end of a text. - sequence_breakers = {shared.tokenizer.encode(f'a{s}')[-1] for s in sequence_breaker_strings} + sequence_breakers = { + shared.tokenizer.encode(f'a{s}')[-1] for s in sequence_breaker_strings + } warpers.append( DRYLogitsProcessor( From 11af199aff41d0863a06d3407a22c0a13fb2709b Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 4 Jan 2025 17:52:57 -0800 Subject: [PATCH 130/173] Add a "Static KV cache" option for transformers --- extensions/openai/typing.py | 1 + modules/loaders.py | 3 ++- modules/shared.py | 1 + modules/text_generation.py | 3 +++ modules/ui.py | 1 + modules/ui_parameters.py | 1 + settings-template.yaml | 1 + 7 files changed, 10 insertions(+), 1 deletion(-) diff --git a/extensions/openai/typing.py b/extensions/openai/typing.py index f63c1f39..dfac8e03 100644 --- a/extensions/openai/typing.py +++ b/extensions/openai/typing.py @@ -42,6 +42,7 @@ class GenerationOptions(BaseModel): truncation_length: int = 0 max_tokens_second: int = 0 prompt_lookup_num_tokens: int = 0 + static_cache: bool = False custom_token_bans: str = "" sampler_priority: List[str] | str | None = Field(default=None, description="List of samplers where the first items will appear first in the stack. Example: [\"top_k\", \"temperature\", \"top_p\"].") auto_max_new_tokens: bool = False diff --git a/modules/loaders.py b/modules/loaders.py index a4edf822..e1a41bb1 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -183,7 +183,8 @@ def transformers_samplers(): 'add_bos_token', 'skip_special_tokens', 'auto_max_new_tokens', - 'prompt_lookup_num_tokens' + 'prompt_lookup_num_tokens', + 'static_cache', } diff --git a/modules/shared.py b/modules/shared.py index cab61226..f2ae05a6 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -46,6 +46,7 @@ settings = { 'max_tokens_second': 0, 'max_updates_second': 0, 'prompt_lookup_num_tokens': 0, + 'static_cache': False, 'custom_stopping_strings': '', 'custom_token_bans': '', 'auto_max_new_tokens': False, diff --git a/modules/text_generation.py b/modules/text_generation.py index db415dce..3e9788b8 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -302,6 +302,9 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings if state['prompt_lookup_num_tokens'] > 0: generate_params['prompt_lookup_num_tokens'] = state['prompt_lookup_num_tokens'] + if state['static_cache']: + generate_params['cache_implementation'] = 'static' + for k in ['epsilon_cutoff', 'eta_cutoff']: if state[k] > 0: generate_params[k] = state[k] * 1e-4 diff --git a/modules/ui.py b/modules/ui.py index a3bf520f..3c75f6ca 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -220,6 +220,7 @@ def list_interface_input_elements(): 'custom_stopping_strings', 'skip_special_tokens', 'stream', + 'static_cache', 'tfs', 'top_a', ] diff --git a/modules/ui_parameters.py b/modules/ui_parameters.py index 727a1528..f22f6233 100644 --- a/modules/ui_parameters.py +++ b/modules/ui_parameters.py @@ -83,6 +83,7 @@ def create_ui(default_preset): shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.') shared.gradio['skip_special_tokens'] = gr.Checkbox(value=shared.settings['skip_special_tokens'], label='Skip special tokens', info='Some specific models need this unset.') shared.gradio['stream'] = gr.Checkbox(value=shared.settings['stream'], label='Activate text streaming') + shared.gradio['static_cache'] = gr.Checkbox(value=shared.settings['static_cache'], label='Static KV cache') with gr.Column(): shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length. Most models require this to be at most 2048.') diff --git a/settings-template.yaml b/settings-template.yaml index 59c76c35..d5ed47c3 100644 --- a/settings-template.yaml +++ b/settings-template.yaml @@ -22,6 +22,7 @@ ban_eos_token: false add_bos_token: true skip_special_tokens: true stream: true +static_cache: false character: Assistant name1: You custom_system_message: '' From c0f600c8879fb28c5b84dd74bc6384619bfcf4fa Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sun, 5 Jan 2025 05:45:12 -0800 Subject: [PATCH 131/173] Add a --torch-compile flag for transformers --- modules/loaders.py | 3 ++- modules/models.py | 3 +++ modules/shared.py | 1 + modules/ui.py | 3 ++- modules/ui_model_menu.py | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/loaders.py b/modules/loaders.py index e1a41bb1..191126b3 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -9,12 +9,13 @@ loaders_and_params = OrderedDict({ 'Transformers': [ 'cpu_memory', 'gpu_memory', + 'load_in_4bit', 'load_in_8bit', + 'torch_compile', 'bf16', 'cpu', 'disk', 'auto_devices', - 'load_in_4bit', 'use_double_quant', 'quant_type', 'compute_dtype', diff --git a/modules/models.py b/modules/models.py index d906535b..cb1ba218 100644 --- a/modules/models.py +++ b/modules/models.py @@ -254,6 +254,9 @@ def huggingface_loader(model_name): print() model = LoaderClass.from_pretrained(path_to_model, **params) + if shared.args.torch_compile: + model = torch.compile(model) + return model diff --git a/modules/shared.py b/modules/shared.py index f2ae05a6..891c0556 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -104,6 +104,7 @@ group.add_argument('--force-safetensors', action='store_true', help='Set use_saf group.add_argument('--no_use_fast', action='store_true', help='Set use_fast=False while loading the tokenizer (it\'s True by default). Use this if you have any problems related to use_fast.') group.add_argument('--use_flash_attention_2', action='store_true', help='Set use_flash_attention_2=True while loading the model.') group.add_argument('--use_eager_attention', action='store_true', help='Set attn_implementation= eager while loading the model.') +group.add_argument('--torch-compile', action='store_true', help='Compile the model with torch.compile for improved performance.') # bitsandbytes 4-bit group = parser.add_argument_group('bitsandbytes 4-bit') diff --git a/modules/ui.py b/modules/ui.py index 3c75f6ca..30d4163c 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -109,12 +109,13 @@ def list_model_elements(): 'disk', 'cpu', 'bf16', + 'load_in_4bit', 'load_in_8bit', + 'torch_compile', 'trust_remote_code', 'no_use_fast', 'use_flash_attention_2', 'use_eager_attention', - 'load_in_4bit', 'compute_dtype', 'quant_type', 'use_double_quant', diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index c4bb8f01..f2814401 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -108,6 +108,7 @@ def create_ui(): shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') shared.gradio['load_in_8bit'] = gr.Checkbox(label="load-in-8bit", value=shared.args.load_in_8bit) shared.gradio['load_in_4bit'] = gr.Checkbox(label="load-in-4bit", value=shared.args.load_in_4bit) + shared.gradio['torch_compile'] = gr.Checkbox(label="torch-compile", value=shared.args.torch_compile, info='Compile the model with torch.compile for improved performance.') shared.gradio['flash_attn'] = gr.Checkbox(label="flash_attn", value=shared.args.flash_attn, info='Use flash-attention.') shared.gradio['use_flash_attention_2'] = gr.Checkbox(label="use_flash_attention_2", value=shared.args.use_flash_attention_2, info='Set use_flash_attention_2=True while loading the model.') shared.gradio['streaming_llm'] = gr.Checkbox(label="streaming_llm", value=shared.args.streaming_llm, info='(experimental) Activate StreamingLLM to avoid re-evaluating the entire prompt when old messages are removed.') From 03a0f236a483d2b05094cc6e5546cfa28bd1668b Mon Sep 17 00:00:00 2001 From: FP HAM Date: Wed, 8 Jan 2025 14:54:09 -0500 Subject: [PATCH 132/173] Training_PRO fix: add `if 'quantization_config' in shared.model.config.to_dict()` --- extensions/Training_PRO/script.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/Training_PRO/script.py b/extensions/Training_PRO/script.py index 5365154c..01bcf67d 100644 --- a/extensions/Training_PRO/script.py +++ b/extensions/Training_PRO/script.py @@ -789,7 +789,11 @@ def do_train(lora_name: str, always_override: bool, save_steps: int, micro_batch if not hasattr(shared.model, 'lm_head') or hasattr(shared.model.lm_head, 'weight'): logger.info("Getting model ready...") # here we can disable gradient checkpoint, by default = true, use_gradient_checkpointing=True - prepare_model_for_kbit_training(shared.model) + if 'quantization_config' in shared.model.config.to_dict(): + print(f"Method: {RED}QLORA{RESET}") + prepare_model_for_kbit_training(shared.model) + else: + print(f"Method: {RED}LoRA{RESET}") # base model is now frozen and should not be reused for any other LoRA training than this one shared.model_dirty_from_training = True From 1f867229770b902939cd319a9950802b42c4a104 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:56:55 -0300 Subject: [PATCH 133/173] Update safetensors requirement from ==0.4.* to ==0.5.* (#6634) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8b36f54f..fb8ca6b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_amd.txt b/requirements_amd.txt index 1b85b20f..88b4b887 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 1bafc141..ef43da99 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 345368b7..369d34d8 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index a3c3055b..9eefd8b8 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index a4b7882c..f5313ecf 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 878aea06..aefe31d0 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 1a345611..9e1633ca 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -17,7 +17,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 95fe3add..45003f0d 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -16,7 +16,7 @@ pydantic==2.8.2 pyyaml requests rich -safetensors==0.4.* +safetensors==0.5.* scipy sentencepiece tensorboard From d3adcbf64b782ee04262af1fca8eb1a837a1ea67 Mon Sep 17 00:00:00 2001 From: Jack Cloudman Date: Wed, 8 Jan 2025 14:30:21 -0600 Subject: [PATCH 134/173] Add `--exclude-pattern` flag to download-model.py script (#6542) --- download-model.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/download-model.py b/download-model.py index 306784a3..8fe94371 100644 --- a/download-model.py +++ b/download-model.py @@ -72,7 +72,7 @@ class ModelDownloader: return model, branch - def get_download_links_from_huggingface(self, model, branch, text_only=False, specific_file=None): + def get_download_links_from_huggingface(self, model, branch, text_only=False, specific_file=None, exclude_pattern=None): session = self.session page = f"/api/models/{model}/tree/{branch}" cursor = b"" @@ -100,13 +100,17 @@ class ModelDownloader: if specific_file not in [None, ''] and fname != specific_file: continue + # Exclude files matching the exclude pattern + if exclude_pattern is not None and re.match(exclude_pattern, fname): + continue + if not is_lora and fname.endswith(('adapter_config.json', 'adapter_model.bin')): is_lora = True is_pytorch = re.match(r"(pytorch|adapter|gptq)_model.*\.bin", fname) is_safetensors = re.match(r".*\.safetensors", fname) is_pt = re.match(r".*\.pt", fname) - is_gguf = re.match(r'.*\.gguf', fname) + is_gguf = re.match(r".*\.gguf", fname) is_tiktoken = re.match(r".*\.tiktoken", fname) is_tokenizer = re.match(r"(tokenizer|ice|spiece).*\.model", fname) or is_tiktoken is_text = re.match(r".*\.(txt|json|py|md)", fname) or is_tokenizer @@ -140,7 +144,6 @@ class ModelDownloader: # If both pytorch and safetensors are available, download safetensors only # Also if GGUF and safetensors are available, download only safetensors - # (why do people do this?) if (has_pytorch or has_pt or has_gguf) and has_safetensors: has_gguf = False for i in range(len(classifications) - 1, -1, -1): @@ -148,8 +151,6 @@ class ModelDownloader: links.pop(i) # For GGUF, try to download only the Q4_K_M if no specific file is specified. - # If not present, exclude all GGUFs, as that's likely a repository with both - # GGUF and fp16 files. if has_gguf and specific_file is None: has_q4km = False for i in range(len(classifications) - 1, -1, -1): @@ -312,6 +313,7 @@ if __name__ == '__main__': parser.add_argument('--threads', type=int, default=4, help='Number of files to download simultaneously.') parser.add_argument('--text-only', action='store_true', help='Only download text files (txt/json).') parser.add_argument('--specific-file', type=str, default=None, help='Name of the specific file to download (if not provided, downloads all).') + parser.add_argument('--exclude-pattern', type=str, default=None, help='Regex pattern to exclude files from download.') parser.add_argument('--output', type=str, default=None, help='Save the model files to this folder.') parser.add_argument('--model-dir', type=str, default=None, help='Save the model files to a subfolder of this folder instead of the default one (text-generation-webui/models).') parser.add_argument('--clean', action='store_true', help='Does not resume the previous download.') @@ -322,6 +324,7 @@ if __name__ == '__main__': branch = args.branch model = args.MODEL specific_file = args.specific_file + exclude_pattern = args.exclude_pattern if model is None: print("Error: Please specify the model you'd like to download (e.g. 'python download-model.py facebook/opt-1.3b').") @@ -336,7 +339,9 @@ if __name__ == '__main__': sys.exit() # Get the download links from Hugging Face - links, sha256, is_lora, is_llamacpp = downloader.get_download_links_from_huggingface(model, branch, text_only=args.text_only, specific_file=specific_file) + links, sha256, is_lora, is_llamacpp = downloader.get_download_links_from_huggingface( + model, branch, text_only=args.text_only, specific_file=specific_file, exclude_pattern=exclude_pattern + ) # Get the output folder if args.output: @@ -349,4 +354,7 @@ if __name__ == '__main__': downloader.check_model_files(model, branch, links, sha256, output_folder) else: # Download files - downloader.download_model_files(model, branch, links, sha256, output_folder, specific_file=specific_file, threads=args.threads, is_llamacpp=is_llamacpp) + downloader.download_model_files( + model, branch, links, sha256, output_folder, + specific_file=specific_file, threads=args.threads, is_llamacpp=is_llamacpp + ) From 7157257c3f4691b9e4b56ceddb8c428802ac4c54 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Wed, 8 Jan 2025 19:28:56 -0300 Subject: [PATCH 135/173] Remove the AutoGPTQ loader (#6641) --- README.md | 2 +- modules/AutoGPTQ_loader.py | 74 -------------------------------------- modules/LoRA.py | 38 ++------------------ modules/loaders.py | 21 ----------- modules/models.py | 29 +-------------- modules/models_settings.py | 41 +++------------------ modules/shared.py | 23 +++++------- modules/ui.py | 8 ----- modules/ui_model_menu.py | 9 ----- one_click.py | 2 +- 10 files changed, 19 insertions(+), 228 deletions(-) delete mode 100644 modules/AutoGPTQ_loader.py diff --git a/README.md b/README.md index 0e16aa30..bec686ad 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features -- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp/exllamav2). [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM) are also supported but you need to install them manually. +- Supports multiple text generation backends in a single UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp-org/exllamav2). [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) is supported via its own [Dockerfile](https://github.com/oobabooga/text-generation-webui/blob/main/docker/TensorRT-LLM/Dockerfile), and the Transformers loader is compatible with libraries like [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM), but they must be installed manually. - OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). - Automatic prompt formatting using Jinja2 templates. - Three chat modes: `instruct`, `chat-instruct`, and `chat`, with automatic prompt templates in `chat-instruct`. diff --git a/modules/AutoGPTQ_loader.py b/modules/AutoGPTQ_loader.py deleted file mode 100644 index 69e8f299..00000000 --- a/modules/AutoGPTQ_loader.py +++ /dev/null @@ -1,74 +0,0 @@ -from pathlib import Path - -from accelerate.utils import is_xpu_available -from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig - -import modules.shared as shared -from modules.logging_colors import logger -from modules.models import get_max_memory_dict - - -def load_quantized(model_name): - path_to_model = Path(f'{shared.args.model_dir}/{model_name}') - pt_path = None - - # Find the model checkpoint - if shared.args.checkpoint: - pt_path = Path(shared.args.checkpoint) - else: - for ext in ['.safetensors', '.pt', '.bin']: - found = list(path_to_model.glob(f"*{ext}")) - if len(found) > 0: - if len(found) > 1: - logger.warning(f'More than one {ext} model has been found. The last one will be selected. It could be wrong.') - - pt_path = found[-1] - break - - if pt_path is None: - logger.error("The model could not be loaded because its checkpoint file in .bin/.pt/.safetensors format could not be located.") - return - - use_safetensors = pt_path.suffix == '.safetensors' - if not (path_to_model / "quantize_config.json").exists(): - quantize_config = BaseQuantizeConfig( - bits=bits if (bits := shared.args.wbits) > 0 else 4, - group_size=gs if (gs := shared.args.groupsize) > 0 else -1, - desc_act=shared.args.desc_act - ) - else: - quantize_config = None - - # Define the params for AutoGPTQForCausalLM.from_quantized - params = { - 'model_basename': pt_path.stem, - 'device': "xpu:0" if is_xpu_available() else "cuda:0" if not shared.args.cpu else "cpu", - 'use_triton': shared.args.triton, - 'inject_fused_attention': False, - 'inject_fused_mlp': not shared.args.no_inject_fused_mlp, - 'use_safetensors': use_safetensors, - 'trust_remote_code': shared.args.trust_remote_code, - 'max_memory': get_max_memory_dict(), - 'quantize_config': quantize_config, - 'use_cuda_fp16': not shared.args.no_use_cuda_fp16, - 'disable_exllama': shared.args.disable_exllama, - 'disable_exllamav2': shared.args.disable_exllamav2, - } - - logger.info(f"The AutoGPTQ params are: {params}") - model = AutoGPTQForCausalLM.from_quantized(path_to_model, **params) - - # These lines fix the multimodal extension when used with AutoGPTQ - if hasattr(model, 'model'): - if not hasattr(model, 'dtype'): - if hasattr(model.model, 'dtype'): - model.dtype = model.model.dtype - - if hasattr(model.model, 'model') and hasattr(model.model.model, 'embed_tokens'): - if not hasattr(model, 'embed_tokens'): - model.embed_tokens = model.model.model.embed_tokens - - if not hasattr(model.model, 'embed_tokens'): - model.model.embed_tokens = model.model.model.embed_tokens - - return model diff --git a/modules/LoRA.py b/modules/LoRA.py index e1ad01d7..1f4883e2 100644 --- a/modules/LoRA.py +++ b/modules/LoRA.py @@ -2,13 +2,11 @@ from pathlib import Path import modules.shared as shared from modules.logging_colors import logger -from modules.models import get_device, reload_model +from modules.models import get_device def add_lora_to_model(lora_names): - if 'GPTQForCausalLM' in shared.model.__class__.__name__ or shared.args.loader == 'AutoGPTQ': - add_lora_autogptq(lora_names) - elif shared.model.__class__.__name__ in ['Exllamav2Model', 'Exllamav2HF'] or shared.args.loader in ['ExLlamav2', 'ExLlamav2_HF']: + if shared.model.__class__.__name__ in ['Exllamav2Model', 'Exllamav2HF'] or shared.args.loader in ['ExLlamav2', 'ExLlamav2_HF']: add_lora_exllamav2(lora_names) else: add_lora_transformers(lora_names) @@ -48,38 +46,6 @@ def add_lora_exllamav2(lora_names): shared.model.loras = None -def add_lora_autogptq(lora_names): - ''' - Adapted from https://github.com/Ph0rk0z/text-generation-webui-testing - ''' - - try: - from auto_gptq import get_gptq_peft_model - from auto_gptq.utils.peft_utils import GPTQLoraConfig - except: - logger.error("This version of AutoGPTQ does not support LoRA. You need to install from source or wait for a new release.") - return - - if len(lora_names) == 0: - reload_model() - - shared.lora_names = [] - return - else: - if len(lora_names) > 1: - logger.warning('AutoGPTQ can only work with 1 LoRA at the moment. Only the first one in the list will be loaded.') - - peft_config = GPTQLoraConfig( - inference_mode=True, - ) - - lora_path = get_lora_path(lora_names[0]) - logger.info("Applying the following LoRAs to {}: {}".format(shared.model_name, ', '.join([lora_names[0]]))) - shared.model = get_gptq_peft_model(shared.model, peft_config, lora_path) - shared.lora_names = [lora_names[0]] - return - - def add_lora_transformers(lora_names): from peft import PeftModel diff --git a/modules/loaders.py b/modules/loaders.py index 191126b3..4e331dbb 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -25,8 +25,6 @@ loaders_and_params = OrderedDict({ 'use_eager_attention', 'alpha_value', 'compress_pos_emb', - 'disable_exllama', - 'disable_exllamav2', ], 'llama.cpp': [ 'n_ctx', @@ -107,24 +105,6 @@ loaders_and_params = OrderedDict({ 'compress_pos_emb', 'exllamav2_info', ], - 'AutoGPTQ': [ - 'triton', - 'no_inject_fused_mlp', - 'no_use_cuda_fp16', - 'wbits', - 'groupsize', - 'desc_act', - 'disable_exllama', - 'disable_exllamav2', - 'gpu_memory', - 'cpu_memory', - 'cpu', - 'disk', - 'auto_devices', - 'trust_remote_code', - 'no_use_fast', - 'autogptq_info', - ], 'HQQ': [ 'hqq_backend', 'trust_remote_code', @@ -191,7 +171,6 @@ def transformers_samplers(): loaders_samplers = { 'Transformers': transformers_samplers(), - 'AutoGPTQ': transformers_samplers(), 'HQQ': transformers_samplers(), 'ExLlamav2': { 'temperature', diff --git a/modules/models.py b/modules/models.py index cb1ba218..9c58b279 100644 --- a/modules/models.py +++ b/modules/models.py @@ -3,7 +3,6 @@ import os import pprint import re import time -import traceback from pathlib import Path import torch @@ -21,7 +20,6 @@ from transformers import ( AutoModelForSeq2SeqLM, AutoTokenizer, BitsAndBytesConfig, - GPTQConfig, is_torch_npu_available, is_torch_xpu_available ) @@ -73,7 +71,6 @@ def load_model(model_name, loader=None): 'llamacpp_HF': llamacpp_HF_loader, 'ExLlamav2': ExLlamav2_loader, 'ExLlamav2_HF': ExLlamav2_HF_loader, - 'AutoGPTQ': AutoGPTQ_loader, 'HQQ': HQQ_loader, 'TensorRT-LLM': TensorRT_LLM_loader, } @@ -164,7 +161,7 @@ def huggingface_loader(model_name): LoaderClass = AutoModelForCausalLM # Load the model without any special settings - if not any([shared.args.cpu, shared.args.load_in_8bit, shared.args.load_in_4bit, shared.args.auto_devices, shared.args.disk, shared.args.deepspeed, shared.args.gpu_memory is not None, shared.args.cpu_memory is not None, shared.args.compress_pos_emb > 1, shared.args.alpha_value > 1, shared.args.disable_exllama, shared.args.disable_exllamav2]): + if not any([shared.args.cpu, shared.args.load_in_8bit, shared.args.load_in_4bit, shared.args.auto_devices, shared.args.disk, shared.args.deepspeed, shared.args.gpu_memory is not None, shared.args.cpu_memory is not None, shared.args.compress_pos_emb > 1, shared.args.alpha_value > 1]): logger.info("TRANSFORMERS_PARAMS=") pprint.PrettyPrinter(indent=4, sort_dicts=False).pprint(params) print() @@ -229,21 +226,6 @@ def huggingface_loader(model_name): if shared.args.disk: params['offload_folder'] = shared.args.disk_cache_dir - if shared.args.disable_exllama or shared.args.disable_exllamav2: - try: - gptq_config = GPTQConfig( - bits=config.quantization_config.get('bits', 4), - disable_exllama=shared.args.disable_exllama, - disable_exllamav2=shared.args.disable_exllamav2, - ) - - params['quantization_config'] = gptq_config - logger.info(f'Loading with disable_exllama={shared.args.disable_exllama} and disable_exllamav2={shared.args.disable_exllamav2}.') - except: - exc = traceback.format_exc() - logger.error('Failed to disable exllama. Does the config.json for this model contain the necessary quantization info?') - print(exc) - if shared.args.compress_pos_emb > 1: params['rope_scaling'] = {'type': 'linear', 'factor': shared.args.compress_pos_emb} elif shared.args.alpha_value > 1: @@ -310,15 +292,6 @@ def ExLlamav2_HF_loader(model_name): return Exllamav2HF.from_pretrained(model_name) -def AutoGPTQ_loader(model_name): - try: - import modules.AutoGPTQ_loader - except ModuleNotFoundError: - raise ModuleNotFoundError("Failed to import 'autogptq'. Please install it manually following the instructions in the AutoGPTQ GitHub repository.") - - return modules.AutoGPTQ_loader.load_quantized(model_name) - - def HQQ_loader(model_name): try: from hqq.core.quantize import HQQBackend, HQQLinear diff --git a/modules/models_settings.py b/modules/models_settings.py index 1bb00ceb..8d658523 100644 --- a/modules/models_settings.py +++ b/modules/models_settings.py @@ -11,9 +11,6 @@ def get_fallback_settings(): return { 'bf16': False, 'use_eager_attention': False, - 'wbits': 'None', - 'groupsize': 'None', - 'desc_act': False, 'max_seq_len': 2048, 'n_ctx': 2048, 'rope_freq_base': 0, @@ -111,26 +108,6 @@ def get_model_metadata(model): if 'architectures' in metadata and isinstance(metadata['architectures'], list) and 'Gemma2ForCausalLM' in metadata['architectures']: model_settings['use_eager_attention'] = True - # Read GPTQ metadata for old GPTQ loaders - if 'quantization_config' in metadata and metadata['quantization_config'].get('quant_method', '') != 'exl2': - if 'bits' in metadata['quantization_config']: - model_settings['wbits'] = metadata['quantization_config']['bits'] - if 'group_size' in metadata['quantization_config']: - model_settings['groupsize'] = metadata['quantization_config']['group_size'] - if 'desc_act' in metadata['quantization_config']: - model_settings['desc_act'] = metadata['quantization_config']['desc_act'] - - # Read AutoGPTQ metadata - path = Path(f'{shared.args.model_dir}/{model}/quantize_config.json') - if path.exists(): - metadata = json.loads(open(path, 'r', encoding='utf-8').read()) - if 'bits' in metadata: - model_settings['wbits'] = metadata['bits'] - if 'group_size' in metadata: - model_settings['groupsize'] = metadata['group_size'] - if 'desc_act' in metadata: - model_settings['desc_act'] = metadata['desc_act'] - # Try to find the Jinja instruct template path = Path(f'{shared.args.model_dir}/{model}') / 'tokenizer_config.json' if path.exists(): @@ -178,7 +155,7 @@ def infer_loader(model_name, model_settings): path_to_model = Path(f'{shared.args.model_dir}/{model_name}') if not path_to_model.exists(): loader = None - elif (path_to_model / 'quantize_config.json').exists() or ('wbits' in model_settings and isinstance(model_settings['wbits'], int) and model_settings['wbits'] > 0): + elif (path_to_model / 'quantize_config.json').exists(): # Old GPTQ metadata file loader = 'ExLlamav2_HF' elif len(list(path_to_model.glob('*.gguf'))) > 0 and path_to_model.is_dir() and (path_to_model / 'tokenizer_config.json').exists(): loader = 'llamacpp_HF' @@ -215,16 +192,11 @@ def update_model_parameters(state, initial=False): if initial and element in shared.provided_arguments: continue - # Setting null defaults - if element in ['wbits', 'groupsize'] and value == 'None': - value = vars(shared.args_defaults)[element] - elif element in ['cpu_memory'] and value == 0: + if element in ['cpu_memory'] and value == 0: value = vars(shared.args_defaults)[element] # Making some simple conversions - if element in ['wbits', 'groupsize']: - value = int(value) - elif element == 'cpu_memory' and value is not None: + if element == 'cpu_memory' and value is not None: value = f"{value}MiB" setattr(shared.args, element, value) @@ -251,15 +223,12 @@ def apply_model_settings_to_state(model, state): loader = model_settings.pop('loader') # If the user is using an alternative loader for the same model type, let them keep using it - if not (loader == 'ExLlamav2_HF' and state['loader'] in ['ExLlamav2', 'AutoGPTQ']): + if not (loader == 'ExLlamav2_HF' and state['loader'] in ['ExLlamav2']): state['loader'] = loader for k in model_settings: if k in state: - if k in ['wbits', 'groupsize']: - state[k] = str(model_settings[k]) - else: - state[k] = model_settings[k] + state[k] = model_settings[k] return state diff --git a/modules/shared.py b/modules/shared.py index 891c0556..6a83baae 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -86,7 +86,7 @@ group.add_argument('--idle-timeout', type=int, default=0, help='Unload model aft # Model loader group = parser.add_argument_group('Model loader') -group.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlamav2_HF, ExLlamav2, AutoGPTQ.') +group.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlamav2_HF, ExLlamav2.') # Transformers/Accelerate group = parser.add_argument_group('Transformers/Accelerate') @@ -147,17 +147,6 @@ group.add_argument('--no_sdpa', action='store_true', help='Force Torch SDPA to n group.add_argument('--num_experts_per_token', type=int, default=2, help='Number of experts to use for generation. Applies to MoE models like Mixtral.') group.add_argument('--enable_tp', action='store_true', help='Enable Tensor Parallelism (TP) in ExLlamaV2.') -# AutoGPTQ -group = parser.add_argument_group('AutoGPTQ') -group.add_argument('--triton', action='store_true', help='Use triton.') -group.add_argument('--no_inject_fused_mlp', action='store_true', help='Triton mode only: disable the use of fused MLP, which will use less VRAM at the cost of slower inference.') -group.add_argument('--no_use_cuda_fp16', action='store_true', help='This can make models faster on some systems.') -group.add_argument('--desc_act', action='store_true', help='For models that do not have a quantize_config.json, this parameter is used to define whether to set desc_act or not in BaseQuantizeConfig.') -group.add_argument('--disable_exllama', action='store_true', help='Disable ExLlama kernel, which can improve inference speed on some systems.') -group.add_argument('--disable_exllamav2', action='store_true', help='Disable ExLlamav2 kernel.') -group.add_argument('--wbits', type=int, default=0, help='Load a pre-quantized model with specified precision in bits. 2, 3, 4 and 8 are supported.') -group.add_argument('--groupsize', type=int, default=-1, help='Group size.') - # HQQ group = parser.add_argument_group('HQQ') group.add_argument('--hqq-backend', type=str, default='PYTORCH_COMPILE', help='Backend for the HQQ loader. Valid options: PYTORCH, PYTORCH_COMPILE, ATEN.') @@ -220,6 +209,14 @@ group.add_argument('--no_inject_fused_attention', action='store_true', help='DEP group.add_argument('--cache_4bit', action='store_true', help='DEPRECATED') group.add_argument('--cache_8bit', action='store_true', help='DEPRECATED') group.add_argument('--chat-buttons', action='store_true', help='DEPRECATED') +group.add_argument('--triton', action='store_true', help='DEPRECATED') +group.add_argument('--no_inject_fused_mlp', action='store_true', help='DEPRECATED') +group.add_argument('--no_use_cuda_fp16', action='store_true', help='DEPRECATED') +group.add_argument('--desc_act', action='store_true', help='DEPRECATED') +group.add_argument('--disable_exllama', action='store_true', help='DEPRECATED') +group.add_argument('--disable_exllamav2', action='store_true', help='DEPRECATED') +group.add_argument('--wbits', type=int, default=0, help='DEPRECATED') +group.add_argument('--groupsize', type=int, default=-1, help='DEPRECATED') args = parser.parse_args() args_defaults = parser.parse_args([]) @@ -262,8 +259,6 @@ def fix_loader_name(name): return 'llamacpp_HF' elif name in ['transformers', 'huggingface', 'hf', 'hugging_face', 'hugging face']: return 'Transformers' - elif name in ['autogptq', 'auto-gptq', 'auto_gptq', 'auto gptq']: - return 'AutoGPTQ' elif name in ['exllama', 'ex-llama', 'ex_llama', 'exlama']: return 'ExLlama' elif name in ['exllamav2', 'exllama-v2', 'ex_llama-v2', 'exlamav2', 'exlama-v2', 'exllama2', 'exllama-2']: diff --git a/modules/ui.py b/modules/ui.py index 30d4163c..e66de434 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -119,14 +119,6 @@ def list_model_elements(): 'compute_dtype', 'quant_type', 'use_double_quant', - 'wbits', - 'groupsize', - 'triton', - 'desc_act', - 'no_inject_fused_mlp', - 'no_use_cuda_fp16', - 'disable_exllama', - 'disable_exllamav2', 'cfg_cache', 'no_flash_attn', 'no_xformers', diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index f2814401..eac0cba6 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -89,8 +89,6 @@ def create_ui(): shared.gradio['threads_batch'] = gr.Slider(label="threads_batch", minimum=0, step=1, maximum=256, value=shared.args.threads_batch) shared.gradio['n_batch'] = gr.Slider(label="n_batch", minimum=1, maximum=2048, step=1, value=shared.args.n_batch) shared.gradio['hqq_backend'] = gr.Dropdown(label="hqq_backend", choices=["PYTORCH", "PYTORCH_COMPILE", "ATEN"], value=shared.args.hqq_backend) - shared.gradio['wbits'] = gr.Dropdown(label="wbits", choices=["None", 1, 2, 3, 4, 8], value=shared.args.wbits if shared.args.wbits > 0 else "None") - shared.gradio['groupsize'] = gr.Dropdown(label="groupsize", choices=["None", 32, 64, 128, 1024], value=shared.args.groupsize if shared.args.groupsize > 0 else "None") shared.gradio['n_ctx'] = gr.Number(label="n_ctx", precision=0, step=256, value=shared.args.n_ctx, info='Context length. ⚠️ Lower this value if you can\'t load the model.') shared.gradio['max_seq_len'] = gr.Number(label='max_seq_len', precision=0, step=256, value=shared.args.max_seq_len, info='Context length. ⚠️ Lower this value if you can\'t load the model.') shared.gradio['cache_type'] = gr.Dropdown(label="cache_type", choices=['fp16', 'q8_0', 'q4_0', 'fp8', 'q8', 'q6', 'q4'], value=shared.args.cache_type, info='Valid options: llama.cpp - fp16, q8_0, q4_0; ExLlamaV2 - fp16, fp8, q8, q6, q4.') @@ -121,10 +119,6 @@ def create_ui(): shared.gradio['no_mmap'] = gr.Checkbox(label="no-mmap", value=shared.args.no_mmap) shared.gradio['mlock'] = gr.Checkbox(label="mlock", value=shared.args.mlock) shared.gradio['numa'] = gr.Checkbox(label="numa", value=shared.args.numa, info='NUMA support can help on some systems with non-uniform memory access.') - shared.gradio['triton'] = gr.Checkbox(label="triton", value=shared.args.triton) - shared.gradio['no_inject_fused_mlp'] = gr.Checkbox(label="no_inject_fused_mlp", value=shared.args.no_inject_fused_mlp, info='Affects Triton only. Disable fused MLP. Fused MLP improves performance but uses more VRAM. Disable if running low on VRAM.') - shared.gradio['no_use_cuda_fp16'] = gr.Checkbox(label="no_use_cuda_fp16", value=shared.args.no_use_cuda_fp16, info='This can make models faster on some systems.') - shared.gradio['desc_act'] = gr.Checkbox(label="desc_act", value=shared.args.desc_act, info='\'desc_act\', \'wbits\', and \'groupsize\' are used for old models without a quantize_config.json.') shared.gradio['use_double_quant'] = gr.Checkbox(label="use_double_quant", value=shared.args.use_double_quant, info='Used by load-in-4bit.') shared.gradio['use_eager_attention'] = gr.Checkbox(label="use_eager_attention", value=shared.args.use_eager_attention, info='Set attn_implementation= eager while loading the model.') shared.gradio['bf16'] = gr.Checkbox(label="bf16", value=shared.args.bf16) @@ -136,13 +130,10 @@ def create_ui(): shared.gradio['cfg_cache'] = gr.Checkbox(label="cfg-cache", value=shared.args.cfg_cache, info='Necessary to use CFG with this loader.') shared.gradio['cpp_runner'] = gr.Checkbox(label="cpp-runner", value=shared.args.cpp_runner, info='Enable inference with ModelRunnerCpp, which is faster than the default ModelRunner.') shared.gradio['logits_all'] = gr.Checkbox(label="logits_all", value=shared.args.logits_all, info='Needs to be set for perplexity evaluation to work with this loader. Otherwise, ignore it, as it makes prompt processing slower.') - shared.gradio['disable_exllama'] = gr.Checkbox(label="disable_exllama", value=shared.args.disable_exllama, info='Disable ExLlama kernel for GPTQ models.') - shared.gradio['disable_exllamav2'] = gr.Checkbox(label="disable_exllamav2", value=shared.args.disable_exllamav2, info='Disable ExLlamav2 kernel for GPTQ models.') shared.gradio['trust_remote_code'] = gr.Checkbox(label="trust-remote-code", value=shared.args.trust_remote_code, info='Set trust_remote_code=True while loading the tokenizer/model. To enable this option, start the web UI with the --trust-remote-code flag.', interactive=shared.args.trust_remote_code) shared.gradio['no_use_fast'] = gr.Checkbox(label="no_use_fast", value=shared.args.no_use_fast, info='Set use_fast=False while loading the tokenizer.') shared.gradio['llamacpp_HF_info'] = gr.Markdown("llamacpp_HF loads llama.cpp as a Transformers model. To use it, you need to place your GGUF in a subfolder of models/ with the necessary tokenizer files.\n\nYou can use the \"llamacpp_HF creator\" menu to do that automatically.") shared.gradio['exllamav2_info'] = gr.Markdown("ExLlamav2_HF is recommended over ExLlamav2 for better integration with extensions and more consistent sampling behavior across loaders.") - shared.gradio['autogptq_info'] = gr.Markdown('ExLlamav2_HF is recommended over AutoGPTQ for models derived from Llama.') shared.gradio['tensorrt_llm_info'] = gr.Markdown('* TensorRT-LLM has to be installed manually in a separate Python 3.10 environment at the moment. For a guide, consult the description of [this PR](https://github.com/oobabooga/text-generation-webui/pull/5715). \n\n* `max_seq_len` is only used when `cpp-runner` is checked.\n\n* `cpp_runner` does not support streaming at the moment.') with gr.Column(): diff --git a/one_click.py b/one_click.py index 8fc1edf0..ca11efac 100644 --- a/one_click.py +++ b/one_click.py @@ -394,7 +394,7 @@ def update_requirements(initial_installation=False, pull=True): textgen_requirements = [ req.replace('+cu121', '+cu118').replace('+cu122', '+cu118') for req in textgen_requirements - if "auto-gptq" not in req.lower() and "autoawq" not in req.lower() + if "autoawq" not in req.lower() ] if is_windows() and is_cuda118: # No flash-attention on Windows for CUDA 11 From ad118056b87ff03f4892baed34c605851db3a923 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:29:46 -0800 Subject: [PATCH 136/173] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bec686ad..07138772 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features -- Supports multiple text generation backends in a single UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp-org/exllamav2). [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) is supported via its own [Dockerfile](https://github.com/oobabooga/text-generation-webui/blob/main/docker/TensorRT-LLM/Dockerfile), and the Transformers loader is compatible with libraries like [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM), but they must be installed manually. +- Supports multiple text generation backends in one UI/API, including [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp), and [ExLlamaV2](https://github.com/turboderp-org/exllamav2). [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) is supported via its own [Dockerfile](https://github.com/oobabooga/text-generation-webui/blob/main/docker/TensorRT-LLM/Dockerfile), and the Transformers loader is compatible with libraries like [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [HQQ](https://github.com/mobiusml/hqq), and [AQLM](https://github.com/Vahe1994/AQLM), but they must be installed manually. - OpenAI-compatible API with Chat and Completions endpoints – see [examples](https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#examples). - Automatic prompt formatting using Jinja2 templates. - Three chat modes: `instruct`, `chat-instruct`, and `chat`, with automatic prompt templates in `chat-instruct`. From 91a8a878878e57f221ca3992ec8c425cf3805d88 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:07:21 -0800 Subject: [PATCH 137/173] Remove obsolete code --- modules/shared.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index 6a83baae..7829e462 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -259,8 +259,6 @@ def fix_loader_name(name): return 'llamacpp_HF' elif name in ['transformers', 'huggingface', 'hf', 'hugging_face', 'hugging face']: return 'Transformers' - elif name in ['exllama', 'ex-llama', 'ex_llama', 'exlama']: - return 'ExLlama' elif name in ['exllamav2', 'exllama-v2', 'ex_llama-v2', 'exlamav2', 'exlama-v2', 'exllama2', 'exllama-2']: return 'ExLlamav2' elif name in ['exllamav2-hf', 'exllamav2_hf', 'exllama-v2-hf', 'exllama_v2_hf', 'exllama-v2_hf', 'exllama2-hf', 'exllama2_hf', 'exllama-2-hf', 'exllama_2_hf', 'exllama-2_hf']: From b9e2ded6d4ea32ceccea87d1f0a37ed003f0316e Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:17:31 +0900 Subject: [PATCH 138/173] Added UnicodeDecodeError workaround for modules/llamacpp_model.py (#6040) --------- Co-authored-by: oobabooga <112222186+oobabooga@users.noreply.github.com> --- modules/llamacpp_model.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/llamacpp_model.py b/modules/llamacpp_model.py index 6a76ee4e..c79755e4 100644 --- a/modules/llamacpp_model.py +++ b/modules/llamacpp_model.py @@ -122,7 +122,14 @@ class LlamaCppModel: return self.model.tokenize(string) def decode(self, ids, **kwargs): - return self.model.detokenize(ids).decode('utf-8') + detokenized = self.model.detokenize(ids) + try: + # Attempt strict UTF-8 decoding first + return detokenized.decode('utf-8', 'strict') + except UnicodeDecodeError as e: + # Log the error and fall back to UTF-8 with replacement + logger.warning(f"Invalid UTF-8 in detokenized output. Using replacement characters.\n{e}") + return detokenized.decode('utf-8', 'replace') def get_logits(self, tokens): self.model.reset() From e6796c3859350a082174436922709818d2aa74ef Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:24:21 -0800 Subject: [PATCH 139/173] Bump llama-cpp-python to 0.3.6, add macOS 14 and 15 wheels --- requirements.txt | 24 ++++++++++++------------ requirements_amd.txt | 12 ++++++------ requirements_amd_noavx2.txt | 8 ++++---- requirements_apple_intel.txt | 6 ++++-- requirements_apple_silicon.txt | 10 ++++++---- requirements_cpu_only.txt | 8 ++++---- requirements_cpu_only_noavx2.txt | 8 ++++---- requirements_noavx2.txt | 24 ++++++++++++------------ 8 files changed, 52 insertions(+), 48 deletions(-) diff --git a/requirements.txt b/requirements.txt index fb8ca6b3..6539161c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" diff --git a/requirements_amd.txt b/requirements_amd.txt index 88b4b887..2e5f2da7 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -31,14 +31,14 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.5+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.6+rocm6.1.2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/rocm/llama_cpp_python_cuda-0.3.6+rocm6.1.2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system != "Darwin" and platform_machine != "x86_64" diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index ef43da99..b1eb7d31 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -31,10 +31,10 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # AMD wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+rocm6.1.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 369d34d8..6a9bf7f7 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -31,6 +31,8 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp311-cp311-macosx_15_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and platform_release < "25.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp310-cp310-macosx_15_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and platform_release < "25.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp311-cp311-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp310-cp310-macosx_14_0_x86_64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 9eefd8b8..d8928d58 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -31,8 +31,10 @@ sse-starlette==1.6.5 tiktoken # Mac wheels -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.5-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp311-cp311-macosx_15_0_arm64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and platform_release < "25.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp310-cp310-macosx_15_0_arm64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and platform_release < "25.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "23.0.0" and platform_release < "24.0.0" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp311-cp311-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.6-cp310-cp310-macosx_13_0_arm64.whl; platform_system == "Darwin" and platform_release >= "22.0.0" and platform_release < "23.0.0" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index f5313ecf..84658a11 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index aefe31d0..5944d5a7 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -31,7 +31,7 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 9e1633ca..fda4292d 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -32,22 +32,22 @@ sse-starlette==1.6.5 tiktoken # llama-cpp-python (CPU only, no AVX2) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.5+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" # llama-cpp-python (CUDA, no tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.5+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # llama-cpp-python (CUDA, tensor cores) -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.5+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" # CUDA wheels https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" From 4ffc9ffc7a84c39f2442d060eff531cf8f70a084 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:24:38 -0800 Subject: [PATCH 140/173] UI: fix a list style --- css/main.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/main.css b/css/main.css index dc89fbef..6febb471 100644 --- a/css/main.css +++ b/css/main.css @@ -500,8 +500,8 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { margin-bottom: 0.5em !important; } -.message-body ul.long-list li, -.message-body ol.long-list li { +.message-body ul.long-list > li, +.message-body ol.long-list > li { margin-top: 1.25em !important; margin-bottom: 1.25em !important; } From 5c89068168e6a5e65d55832e7a725f4688bc9434 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:36:30 -0800 Subject: [PATCH 141/173] UI: add an info message for the new Static KV cache option --- modules/ui_parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_parameters.py b/modules/ui_parameters.py index f22f6233..c8fd6bc7 100644 --- a/modules/ui_parameters.py +++ b/modules/ui_parameters.py @@ -83,7 +83,7 @@ def create_ui(default_preset): shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.') shared.gradio['skip_special_tokens'] = gr.Checkbox(value=shared.settings['skip_special_tokens'], label='Skip special tokens', info='Some specific models need this unset.') shared.gradio['stream'] = gr.Checkbox(value=shared.settings['stream'], label='Activate text streaming') - shared.gradio['static_cache'] = gr.Checkbox(value=shared.settings['static_cache'], label='Static KV cache') + shared.gradio['static_cache'] = gr.Checkbox(value=shared.settings['static_cache'], label='Static KV cache', info='Use a static cache for improved performance.') with gr.Column(): shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length. Most models require this to be at most 2048.') From 619265b32c9c436cd2687849ba2c56fa65a18033 Mon Sep 17 00:00:00 2001 From: BPplays <58504799+BPplays@users.noreply.github.com> Date: Thu, 9 Jan 2025 05:23:44 -0800 Subject: [PATCH 142/173] add ipv6 support to the API (#6559) --- extensions/openai/script.py | 36 ++++++++++++++++++++++++++---------- modules/shared.py | 2 ++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/extensions/openai/script.py b/extensions/openai/script.py index 03d99e8d..f23caf9b 100644 --- a/extensions/openai/script.py +++ b/extensions/openai/script.py @@ -353,23 +353,38 @@ async def handle_unload_loras(): def run_server(): - server_addr = '0.0.0.0' if shared.args.listen else '127.0.0.1' + # Parse configuration port = int(os.environ.get('OPENEDAI_PORT', shared.args.api_port)) - ssl_certfile = os.environ.get('OPENEDAI_CERT_PATH', shared.args.ssl_certfile) ssl_keyfile = os.environ.get('OPENEDAI_KEY_PATH', shared.args.ssl_keyfile) + # In the server configuration: + server_addrs = [] + if os.environ.get('OPENEDAI_ENABLE_IPV6', shared.args.api_enable_ipv6): + server_addrs.append('[::]' if shared.args.listen else '[::1]') + if not os.environ.get('OPENEDAI_DISABLE_IPV4', shared.args.api_disable_ipv4): + server_addrs.append('0.0.0.0' if shared.args.listen else '127.0.0.1') + + if not server_addrs: + raise Exception('you MUST enable IPv6 or IPv4 for the API to work') + + # Log server information if shared.args.public_api: - def on_start(public_url: str): - logger.info(f'OpenAI-compatible API URL:\n\n{public_url}\n') - - _start_cloudflared(port, shared.args.public_api_id, max_attempts=3, on_start=on_start) + _start_cloudflared( + port, + shared.args.public_api_id, + max_attempts=3, + on_start=lambda url: logger.info(f'OpenAI-compatible API URL:\n\n{url}\n') + ) else: - if ssl_keyfile and ssl_certfile: - logger.info(f'OpenAI-compatible API URL:\n\nhttps://{server_addr}:{port}\n') + url_proto = 'https://' if (ssl_certfile and ssl_keyfile) else 'http://' + urls = [f'{url_proto}{addr}:{port}' for addr in server_addrs] + if len(urls) > 1: + logger.info('OpenAI-compatible API URLs:\n\n' + '\n'.join(urls) + '\n') else: - logger.info(f'OpenAI-compatible API URL:\n\nhttp://{server_addr}:{port}\n') + logger.info('OpenAI-compatible API URL:\n\n' + '\n'.join(urls) + '\n') + # Log API keys if shared.args.api_key: if not shared.args.admin_key: shared.args.admin_key = shared.args.api_key @@ -379,8 +394,9 @@ def run_server(): if shared.args.admin_key and shared.args.admin_key != shared.args.api_key: logger.info(f'OpenAI API admin key (for loading/unloading models):\n\n{shared.args.admin_key}\n') + # Start server logging.getLogger("uvicorn.error").propagate = False - uvicorn.run(app, host=server_addr, port=port, ssl_certfile=ssl_certfile, ssl_keyfile=ssl_keyfile) + uvicorn.run(app, host=server_addrs, port=port, ssl_certfile=ssl_certfile, ssl_keyfile=ssl_keyfile) def setup(): diff --git a/modules/shared.py b/modules/shared.py index 7829e462..a0070b1f 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -193,6 +193,8 @@ group.add_argument('--public-api-id', type=str, help='Tunnel ID for named Cloudf group.add_argument('--api-port', type=int, default=5000, help='The listening port for the API.') group.add_argument('--api-key', type=str, default='', help='API authentication key.') group.add_argument('--admin-key', type=str, default='', help='API authentication key for admin tasks like loading and unloading models. If not set, will be the same as --api-key.') +group.add_argument('--api-enable-ipv6', action='store_true', help='Enable IPv6 for the API') +group.add_argument('--api-disable-ipv4', action='store_true', help='Disable IPv4 for the API') group.add_argument('--nowebui', action='store_true', help='Do not launch the Gradio UI. Useful for launching the API in standalone mode.') # Multimodal From 03b4067f3197de0ef753d2fe415785e0a5dffebb Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:58:33 -0800 Subject: [PATCH 143/173] Installer: ask 1 question for NVIDIA users instead of 2 --- docker/amd/Dockerfile | 2 +- docker/cpu/Dockerfile | 2 +- docker/intel/Dockerfile | 2 +- docker/nvidia/Dockerfile | 2 +- one_click.py | 45 +++++++++++++++++++++------------------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/docker/amd/Dockerfile b/docker/amd/Dockerfile index 365e88e3..cfbcf7e4 100644 --- a/docker/amd/Dockerfile +++ b/docker/amd/Dockerfile @@ -13,7 +13,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,rw \ WORKDIR /home/app/ RUN git clone https://github.com/oobabooga/text-generation-webui.git WORKDIR /home/app/text-generation-webui -RUN GPU_CHOICE=B USE_CUDA118=FALSE LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose +RUN GPU_CHOICE=C LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose COPY CMD_FLAGS.txt /home/app/text-generation-webui/ EXPOSE ${CONTAINER_PORT:-7860} ${CONTAINER_API_PORT:-5000} ${CONTAINER_API_STREAM_PORT:-5005} WORKDIR /home/app/text-generation-webui diff --git a/docker/cpu/Dockerfile b/docker/cpu/Dockerfile index 04ccf94a..8f643d2f 100644 --- a/docker/cpu/Dockerfile +++ b/docker/cpu/Dockerfile @@ -17,7 +17,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,rw \ WORKDIR /home/app/ RUN git clone https://github.com/oobabooga/text-generation-webui.git WORKDIR /home/app/text-generation-webui -RUN GPU_CHOICE=N USE_CUDA118=FALSE LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose +RUN GPU_CHOICE=N LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose COPY CMD_FLAGS.txt /home/app/text-generation-webui/ EXPOSE ${CONTAINER_PORT:-7860} ${CONTAINER_API_PORT:-5000} ${CONTAINER_API_STREAM_PORT:-5005} # set umask to ensure group read / write at runtime diff --git a/docker/intel/Dockerfile b/docker/intel/Dockerfile index bc67a185..d2ed671e 100644 --- a/docker/intel/Dockerfile +++ b/docker/intel/Dockerfile @@ -13,7 +13,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,rw \ WORKDIR /home/app/ RUN git clone https://github.com/oobabooga/text-generation-webui.git WORKDIR /home/app/text-generation-webui -RUN GPU_CHOICE=D USE_CUDA118=FALSE LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose +RUN GPU_CHOICE=E LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose COPY CMD_FLAGS.txt /home/app/text-generation-webui/ EXPOSE ${CONTAINER_PORT:-7860} ${CONTAINER_API_PORT:-5000} ${CONTAINER_API_STREAM_PORT:-5005} # set umask to ensure group read / write at runtime diff --git a/docker/nvidia/Dockerfile b/docker/nvidia/Dockerfile index 66a717a7..900a4329 100644 --- a/docker/nvidia/Dockerfile +++ b/docker/nvidia/Dockerfile @@ -13,7 +13,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,rw \ WORKDIR /home/app/ RUN git clone https://github.com/oobabooga/text-generation-webui.git WORKDIR /home/app/text-generation-webui -RUN GPU_CHOICE=A USE_CUDA118=FALSE LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose +RUN GPU_CHOICE=A LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose COPY CMD_FLAGS.txt /home/app/text-generation-webui/ EXPOSE ${CONTAINER_PORT:-7860} ${CONTAINER_API_PORT:-5000} ${CONTAINER_API_STREAM_PORT:-5005} WORKDIR /home/app/text-generation-webui diff --git a/one_click.py b/one_click.py index ca11efac..e78a2450 100644 --- a/one_click.py +++ b/one_click.py @@ -232,33 +232,45 @@ def get_user_choice(question, options_dict): def install_webui(): - # Ask the user for the GPU vendor if "GPU_CHOICE" in os.environ: choice = os.environ["GPU_CHOICE"].upper() print_big_message(f"Selected GPU choice \"{choice}\" based on the GPU_CHOICE environment variable.") + + # Warn about changed meanings and handle old NVIDIA choice + if choice == "B": + print_big_message("Warning: GPU_CHOICE='B' now means 'NVIDIA (CUDA 11.8)' in the new version.") + elif choice == "C": + print_big_message("Warning: GPU_CHOICE='C' now means 'AMD' in the new version.") + elif choice == "D": + print_big_message("Warning: GPU_CHOICE='D' now means 'Apple M Series' in the new version.") + elif choice == "A" and "USE_CUDA118" in os.environ: + choice = "B" if os.environ.get("USE_CUDA118", "").lower() in ("yes", "y", "true", "1", "t", "on") else "A" else: choice = get_user_choice( "What is your GPU?", { - 'A': 'NVIDIA', - 'B': 'AMD (Linux/MacOS only. Requires ROCm SDK 6.1 on Linux)', - 'C': 'Apple M Series', - 'D': 'Intel Arc (IPEX)', - 'N': 'None (I want to run models in CPU mode)' + 'A': 'NVIDIA - CUDA 12.1 (recommended)', + 'B': 'NVIDIA - CUDA 11.8 (legacy GPUs)', + 'C': 'AMD - Linux/macOS only, requires ROCm 6.1', + 'D': 'Apple M Series', + 'E': 'Intel Arc (beta)', + 'N': 'CPU mode' }, ) + # Convert choices to GPU names for compatibility gpu_choice_to_name = { "A": "NVIDIA", - "B": "AMD", - "C": "APPLE", - "D": "INTEL", + "B": "NVIDIA", + "C": "AMD", + "D": "APPLE", + "E": "INTEL", "N": "NONE" } selected_gpu = gpu_choice_to_name[choice] - use_cuda118 = "N" + use_cuda118 = (choice == "B") # CUDA version is now determined by menu choice # Write a flag to CMD_FLAGS.txt for CPU mode if selected_gpu == "NONE": @@ -267,18 +279,9 @@ def install_webui(): print_big_message("Adding the --cpu flag to CMD_FLAGS.txt.") cmd_flags_file.write("\n--cpu\n") - # Check if the user wants CUDA 11.8 + # Handle CUDA version display elif any((is_windows(), is_linux())) and selected_gpu == "NVIDIA": - if "USE_CUDA118" in os.environ: - use_cuda118 = "Y" if os.environ.get("USE_CUDA118", "").lower() in ("yes", "y", "true", "1", "t", "on") else "N" - else: - print("\nDo you want to use CUDA 11.8 instead of 12.1?\nOnly choose this option if your GPU is very old (Kepler or older).\n\nFor RTX and GTX series GPUs, say \"N\".\nIf unsure, say \"N\".\n") - use_cuda118 = input("Input (Y/N)> ").upper().strip('"\'').strip() - while use_cuda118 not in 'YN': - print("Invalid choice. Please try again.") - use_cuda118 = input("Input> ").upper().strip('"\'').strip() - - if use_cuda118 == 'Y': + if use_cuda118: print("CUDA: 11.8") else: print("CUDA: 12.1") From c08d87b78db0acf13cb3d7ced94f8c9b5b78ac91 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:23:38 -0800 Subject: [PATCH 144/173] Make the huggingface loader more readable --- modules/models.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/modules/models.py b/modules/models.py index 9c58b279..f551b828 100644 --- a/modules/models.py +++ b/modules/models.py @@ -160,8 +160,22 @@ def huggingface_loader(model_name): else: LoaderClass = AutoModelForCausalLM + # Determine if we should use default loading + should_use_default_loading = not any([ + shared.args.cpu, + shared.args.load_in_8bit, + shared.args.load_in_4bit, + shared.args.auto_devices, + shared.args.disk, + shared.args.deepspeed, + shared.args.gpu_memory is not None, + shared.args.cpu_memory is not None, + shared.args.compress_pos_emb > 1, + shared.args.alpha_value > 1, + ]) + # Load the model without any special settings - if not any([shared.args.cpu, shared.args.load_in_8bit, shared.args.load_in_4bit, shared.args.auto_devices, shared.args.disk, shared.args.deepspeed, shared.args.gpu_memory is not None, shared.args.cpu_memory is not None, shared.args.compress_pos_emb > 1, shared.args.alpha_value > 1]): + if should_use_default_loading: logger.info("TRANSFORMERS_PARAMS=") pprint.PrettyPrinter(indent=4, sort_dicts=False).pprint(params) print() @@ -174,8 +188,20 @@ def huggingface_loader(model_name): # DeepSpeed ZeRO-3 elif shared.args.deepspeed: - model = LoaderClass.from_pretrained(path_to_model, torch_dtype=params['torch_dtype'], trust_remote_code=params.get('trust_remote_code')) - model = deepspeed.initialize(model=model, config_params=ds_config, model_parameters=None, optimizer=None, lr_scheduler=None)[0] + model = LoaderClass.from_pretrained( + path_to_model, + torch_dtype=params['torch_dtype'], + trust_remote_code=params.get('trust_remote_code') + ) + + model = deepspeed.initialize( + model=model, + config_params=ds_config, + model_parameters=None, + optimizer=None, + lr_scheduler=None + )[0] + model.module.eval() # Inference logger.info(f'DeepSpeed ZeRO-3 is enabled: {is_deepspeed_zero3_enabled()}') @@ -197,16 +223,15 @@ def huggingface_loader(model_name): # and https://huggingface.co/blog/4bit-transformers-bitsandbytes quantization_config_params = { 'load_in_4bit': True, - 'bnb_4bit_compute_dtype': eval("torch.{}".format(shared.args.compute_dtype)) if shared.args.compute_dtype in ["bfloat16", "float16", "float32"] else None, + 'bnb_4bit_compute_dtype': eval(f"torch.{shared.args.compute_dtype}") if shared.args.compute_dtype in ["bfloat16", "float16", "float32"] else None, 'bnb_4bit_quant_type': shared.args.quant_type, 'bnb_4bit_use_double_quant': shared.args.use_double_quant, 'llm_int8_enable_fp32_cpu_offload': True } - params['quantization_config'] = BitsAndBytesConfig(**quantization_config_params) elif shared.args.load_in_8bit: - if any((shared.args.auto_devices, shared.args.gpu_memory)): + if shared.args.auto_devices or shared.args.gpu_memory: params['quantization_config'] = BitsAndBytesConfig(load_in_8bit=True, llm_int8_enable_fp32_cpu_offload=True) else: params['quantization_config'] = BitsAndBytesConfig(load_in_8bit=True) From 3020f2e5ec823eef91475bcbcc929b1b2d9ca614 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:44:03 -0800 Subject: [PATCH 145/173] UI: improve the info message about --tensorcores --- modules/ui_model_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index eac0cba6..d5116938 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -103,7 +103,7 @@ def create_ui(): shared.gradio['num_experts_per_token'] = gr.Number(label="Number of experts per token", value=shared.args.num_experts_per_token, info='Only applies to MoE models like Mixtral.') with gr.Column(): - shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') + shared.gradio['tensorcores'] = gr.Checkbox(label="tensorcores", value=shared.args.tensorcores, info='NVIDIA only: use llama-cpp-python compiled without GGML_CUDA_FORCE_MMQ. This may improve performance on newer cards.') shared.gradio['load_in_8bit'] = gr.Checkbox(label="load-in-8bit", value=shared.args.load_in_8bit) shared.gradio['load_in_4bit'] = gr.Checkbox(label="load-in-4bit", value=shared.args.load_in_4bit) shared.gradio['torch_compile'] = gr.Checkbox(label="torch-compile", value=shared.args.torch_compile, info='Compile the model with torch.compile for improved performance.') From 0e94d7075e5404537320b1a17c0a37bf2164a187 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:12:30 -0800 Subject: [PATCH 146/173] UI: minor style fix on Windows --- css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index 6febb471..9d99a876 100644 --- a/css/main.css +++ b/css/main.css @@ -990,7 +990,7 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { #rename-row { width: 100%; justify-content: center; - gap: 10px; + gap: 9px; } From f3c0f964a2ef51c0828495b88c654a0c0ab32b42 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:18:23 -0800 Subject: [PATCH 147/173] Lint --- modules/callbacks.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/callbacks.py b/modules/callbacks.py index 2c04cc53..0f918f3d 100644 --- a/modules/callbacks.py +++ b/modules/callbacks.py @@ -1,11 +1,9 @@ -import gc import traceback from queue import Queue from threading import Thread import torch import transformers -from transformers import is_torch_npu_available, is_torch_xpu_available import modules.shared as shared From 15bfe36619d5c8b9b2be32e14f71bd47802a2223 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:58:14 -0800 Subject: [PATCH 148/173] Installer: update miniconda to 24.11.1 (experimental) --- start_linux.sh | 2 +- start_macos.sh | 2 +- start_windows.bat | 4 ++-- wsl.sh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/start_linux.sh b/start_linux.sh index 792daca8..256604cb 100755 --- a/start_linux.sh +++ b/start_linux.sh @@ -19,7 +19,7 @@ esac INSTALL_DIR="$(pwd)/installer_files" CONDA_ROOT_PREFIX="$(pwd)/installer_files/conda" INSTALL_ENV_DIR="$(pwd)/installer_files/env" -MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-${OS_ARCH}.sh" +MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-${OS_ARCH}.sh" conda_exists="F" # figure out whether git and conda needs to be installed diff --git a/start_macos.sh b/start_macos.sh index 6761f531..02f1011a 100755 --- a/start_macos.sh +++ b/start_macos.sh @@ -19,7 +19,7 @@ esac INSTALL_DIR="$(pwd)/installer_files" CONDA_ROOT_PREFIX="$(pwd)/installer_files/conda" INSTALL_ENV_DIR="$(pwd)/installer_files/env" -MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-MacOSX-${OS_ARCH}.sh" +MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-${OS_ARCH}.sh" conda_exists="F" # figure out whether git and conda needs to be installed diff --git a/start_windows.bat b/start_windows.bat index ebcc1997..c167cdc5 100755 --- a/start_windows.bat +++ b/start_windows.bat @@ -25,8 +25,8 @@ set TEMP=%cd%\installer_files set INSTALL_DIR=%cd%\installer_files set CONDA_ROOT_PREFIX=%cd%\installer_files\conda set INSTALL_ENV_DIR=%cd%\installer_files\env -set MINICONDA_DOWNLOAD_URL=https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Windows-x86_64.exe -set MINICONDA_CHECKSUM=307194e1f12bbeb52b083634e89cc67db4f7980bd542254b43d3309eaf7cb358 +set MINICONDA_DOWNLOAD_URL=https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Windows-x86_64.exe +set MINICONDA_CHECKSUM=43dcbcc315ff91edf959e002cd2f1ede38c64b999fefcc951bccf2ed69c9e8bb set conda_exists=F @rem figure out whether git and conda needs to be installed diff --git a/wsl.sh b/wsl.sh index 7b17132f..c5d28b16 100755 --- a/wsl.sh +++ b/wsl.sh @@ -26,7 +26,7 @@ fi INSTALL_DIR="$INSTALL_DIR_PREFIX/text-generation-webui" CONDA_ROOT_PREFIX="$INSTALL_DIR/installer_files/conda" INSTALL_ENV_DIR="$INSTALL_DIR/installer_files/env" -MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh" +MINICONDA_DOWNLOAD_URL="https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-x86_64.sh" conda_exists="F" # environment isolation From da6d868f58e519ec90796eef137cef26e67d4fd8 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:11:46 -0800 Subject: [PATCH 149/173] Remove old deprecated flags (~6 months or more) --- modules/shared.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index a0070b1f..f478df05 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -203,11 +203,6 @@ group.add_argument('--multimodal-pipeline', type=str, default=None, help='The mu # Deprecated parameters group = parser.add_argument_group('Deprecated') -group.add_argument('--model_type', type=str, help='DEPRECATED') -group.add_argument('--pre_layer', type=int, nargs='+', help='DEPRECATED') -group.add_argument('--checkpoint', type=str, help='DEPRECATED') -group.add_argument('--monkey-patch', action='store_true', help='DEPRECATED') -group.add_argument('--no_inject_fused_attention', action='store_true', help='DEPRECATED') group.add_argument('--cache_4bit', action='store_true', help='DEPRECATED') group.add_argument('--cache_8bit', action='store_true', help='DEPRECATED') group.add_argument('--chat-buttons', action='store_true', help='DEPRECATED') @@ -228,14 +223,26 @@ for arg in sys.argv[1:]: if hasattr(args, arg): provided_arguments.append(arg) -deprecated_args = [] +deprecated_args = [ + 'cache_4bit', + 'cache_8bit', + 'chat_buttons', + 'triton', + 'no_inject_fused_mlp', + 'no_use_cuda_fp16', + 'desc_act', + 'disable_exllama', + 'disable_exllamav2', + 'wbits', + 'groupsize' +] def do_cmd_flags_warnings(): # Deprecation warnings for k in deprecated_args: - if getattr(args, k): + if k in provided_arguments: logger.warning(f'The --{k} flag has been deprecated and will be removed soon. Please remove that flag.') # Security warnings From 7fe46764fb2d675c4e281592a1328293c0c56b07 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 10 Jan 2025 07:07:41 -0800 Subject: [PATCH 150/173] Improve the --help message about --tensorcores as well --- modules/shared.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/shared.py b/modules/shared.py index f478df05..89263205 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -116,7 +116,7 @@ group.add_argument('--quant_type', type=str, default='nf4', help='quant_type for # llama.cpp group = parser.add_argument_group('llama.cpp') group.add_argument('--flash-attn', action='store_true', help='Use flash-attention.') -group.add_argument('--tensorcores', action='store_true', help='NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards.') +group.add_argument('--tensorcores', action='store_true', help='NVIDIA only: use llama-cpp-python compiled without GGML_CUDA_FORCE_MMQ. This may improve performance on newer cards.') group.add_argument('--n_ctx', type=int, default=2048, help='Size of the prompt context.') group.add_argument('--threads', type=int, default=0, help='Number of threads to use.') group.add_argument('--threads-batch', type=int, default=0, help='Number of threads to use for batches/prompt processing.') From 17aa97248fa3aa60d46a1a355ec8d2f5705bad38 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 10 Jan 2025 07:22:25 -0800 Subject: [PATCH 151/173] Installer: make the hashsum verification more robust on Windows --- start_windows.bat | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/start_windows.bat b/start_windows.bat index c167cdc5..960cfdb7 100755 --- a/start_windows.bat +++ b/start_windows.bat @@ -41,10 +41,18 @@ if "%conda_exists%" == "F" ( mkdir "%INSTALL_DIR%" call curl -Lk "%MINICONDA_DOWNLOAD_URL%" > "%INSTALL_DIR%\miniconda_installer.exe" || ( echo. && echo Miniconda failed to download. && goto end ) + :: Try CertUtil first for /f %%a in ('CertUtil -hashfile "%INSTALL_DIR%\miniconda_installer.exe" SHA256 ^| find /i /v " " ^| find /i "%MINICONDA_CHECKSUM%"') do ( set "output=%%a" ) + :: If CertUtil fails, try PowerShell + if not defined output ( + for /f %%a in ('powershell -Command "if((Get-FileHash \"%INSTALL_DIR%\miniconda_installer.exe\" -Algorithm SHA256).Hash -eq ''%MINICONDA_CHECKSUM%''){echo true}"') do ( + set "output=%%a" + ) + ) + if not defined output ( echo The checksum verification for miniconda_installer.exe has failed. del "%INSTALL_DIR%\miniconda_installer.exe" From 83c426e96b6c2cd4349d38c4cd212cbb0afd2044 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Fri, 10 Jan 2025 18:04:32 -0300 Subject: [PATCH 152/173] Organize internals (#6646) --- extensions/openai/typing.py | 48 +++--- modules/loaders.py | 306 ++++++++++++++++++------------------ modules/presets.py | 36 ++--- modules/shared.py | 40 ++--- modules/text_generation.py | 64 ++++++-- modules/ui.py | 162 +++++++++---------- 6 files changed, 346 insertions(+), 310 deletions(-) diff --git a/extensions/openai/typing.py b/extensions/openai/typing.py index dfac8e03..5f0e0128 100644 --- a/extensions/openai/typing.py +++ b/extensions/openai/typing.py @@ -7,48 +7,48 @@ from pydantic import BaseModel, Field class GenerationOptions(BaseModel): preset: str | None = Field(default=None, description="The name of a file under text-generation-webui/presets (without the .yaml extension). The sampling parameters that get overwritten by this option are the keys in the default_preset() function in modules/presets.py.") - min_p: float = 0 - dynamic_temperature: bool = False dynatemp_low: float = 1 dynatemp_high: float = 1 dynatemp_exponent: float = 1 smoothing_factor: float = 0 smoothing_curve: float = 1 + min_p: float = 0 top_k: int = 0 - repetition_penalty: float = 1 - repetition_penalty_range: int = 1024 typical_p: float = 1 - tfs: float = 1 - top_a: float = 0 + xtc_threshold: float = 0.1 + xtc_probability: float = 0 epsilon_cutoff: float = 0 eta_cutoff: float = 0 - guidance_scale: float = 1 - negative_prompt: str = '' + tfs: float = 1 + top_a: float = 0 + dry_multiplier: float = 0 + dry_allowed_length: int = 2 + dry_base: float = 1.75 + repetition_penalty: float = 1 + encoder_repetition_penalty: float = 1 + no_repeat_ngram_size: int = 0 + repetition_penalty_range: int = 1024 penalty_alpha: float = 0 + guidance_scale: float = 1 mirostat_mode: int = 0 mirostat_tau: float = 5 mirostat_eta: float = 0.1 - temperature_last: bool = False - do_sample: bool = True - seed: int = -1 - encoder_repetition_penalty: float = 1 - no_repeat_ngram_size: int = 0 - dry_multiplier: float = 0 - dry_base: float = 1.75 - dry_allowed_length: int = 2 - dry_sequence_breakers: str = '"\\n", ":", "\\"", "*"' - xtc_threshold: float = 0.1 - xtc_probability: float = 0 - truncation_length: int = 0 - max_tokens_second: int = 0 prompt_lookup_num_tokens: int = 0 - static_cache: bool = False - custom_token_bans: str = "" - sampler_priority: List[str] | str | None = Field(default=None, description="List of samplers where the first items will appear first in the stack. Example: [\"top_k\", \"temperature\", \"top_p\"].") + max_tokens_second: int = 0 + do_sample: bool = True + dynamic_temperature: bool = False + temperature_last: bool = False auto_max_new_tokens: bool = False ban_eos_token: bool = False add_bos_token: bool = True skip_special_tokens: bool = True + static_cache: bool = False + truncation_length: int = 0 + seed: int = -1 + sampler_priority: List[str] | str | None = Field(default=None, description="List of samplers where the first items will appear first in the stack. Example: [\"top_k\", \"temperature\", \"top_p\"].") + custom_token_bans: str = "" + negative_prompt: str = '' + dry_sequence_breakers: str = '"\\n", ":", "\\"", "*"' grammar_string: str = "" diff --git a/modules/loaders.py b/modules/loaders.py index 4e331dbb..cd864e40 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -7,102 +7,103 @@ from modules import shared loaders_and_params = OrderedDict({ 'Transformers': [ - 'cpu_memory', 'gpu_memory', - 'load_in_4bit', - 'load_in_8bit', - 'torch_compile', - 'bf16', - 'cpu', - 'disk', - 'auto_devices', - 'use_double_quant', - 'quant_type', - 'compute_dtype', - 'trust_remote_code', - 'no_use_fast', - 'use_flash_attention_2', - 'use_eager_attention', + 'cpu_memory', 'alpha_value', 'compress_pos_emb', - ], - 'llama.cpp': [ - 'n_ctx', - 'n_gpu_layers', - 'cache_type', - 'tensor_split', - 'n_batch', - 'threads', - 'threads_batch', - 'no_mmap', - 'mlock', - 'no_mul_mat_q', - 'rope_freq_base', - 'compress_pos_emb', + 'compute_dtype', + 'quant_type', + 'load_in_8bit', + 'load_in_4bit', + 'torch_compile', + 'use_flash_attention_2', + 'auto_devices', 'cpu', - 'numa', - 'no_offload_kqv', - 'row_split', - 'tensorcores', - 'flash_attn', - 'streaming_llm', - 'attention_sink_size', - ], - 'llamacpp_HF': [ - 'n_ctx', - 'n_gpu_layers', - 'cache_type', - 'tensor_split', - 'n_batch', - 'threads', - 'threads_batch', - 'no_mmap', - 'mlock', - 'no_mul_mat_q', - 'rope_freq_base', - 'compress_pos_emb', - 'cpu', - 'numa', - 'cfg_cache', + 'disk', + 'use_double_quant', + 'use_eager_attention', + 'bf16', + 'trust_remote_code', 'no_use_fast', - 'logits_all', - 'no_offload_kqv', - 'row_split', + ], + 'llama.cpp': [ + 'n_gpu_layers', + 'threads', + 'threads_batch', + 'n_batch', + 'n_ctx', + 'cache_type', + 'tensor_split', + 'rope_freq_base', + 'compress_pos_emb', + 'attention_sink_size', 'tensorcores', 'flash_attn', 'streaming_llm', + 'cpu', + 'row_split', + 'no_offload_kqv', + 'no_mul_mat_q', + 'no_mmap', + 'mlock', + 'numa', + ], + 'llamacpp_HF': [ + 'n_gpu_layers', + 'threads', + 'threads_batch', + 'n_batch', + 'n_ctx', + 'cache_type', + 'tensor_split', + 'rope_freq_base', + 'compress_pos_emb', 'attention_sink_size', + 'tensorcores', + 'flash_attn', + 'streaming_llm', + 'cpu', + 'row_split', + 'no_offload_kqv', + 'no_mul_mat_q', + 'no_mmap', + 'mlock', + 'numa', + 'cfg_cache', + 'logits_all', + 'trust_remote_code', + 'no_use_fast', 'llamacpp_HF_info', ], 'ExLlamav2_HF': [ - 'gpu_split', 'max_seq_len', - 'cfg_cache', + 'cache_type', + 'gpu_split', + 'alpha_value', + 'compress_pos_emb', + 'num_experts_per_token', + 'autosplit', + 'enable_tp', 'no_flash_attn', 'no_xformers', 'no_sdpa', - 'num_experts_per_token', - 'cache_type', - 'autosplit', - 'enable_tp', - 'alpha_value', - 'compress_pos_emb', + 'cfg_cache', 'trust_remote_code', 'no_use_fast', ], 'ExLlamav2': [ - 'gpu_split', 'max_seq_len', + 'cache_type', + 'gpu_split', + 'alpha_value', + 'compress_pos_emb', + 'num_experts_per_token', + 'autosplit', + 'enable_tp', 'no_flash_attn', 'no_xformers', 'no_sdpa', - 'num_experts_per_token', - 'cache_type', - 'autosplit', - 'enable_tp', - 'alpha_value', - 'compress_pos_emb', 'exllamav2_info', ], 'HQQ': [ @@ -121,51 +122,51 @@ loaders_and_params = OrderedDict({ def transformers_samplers(): return { 'temperature', - 'temperature_last', - 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', - 'top_p', 'min_p', + 'top_p', 'top_k', 'typical_p', + 'xtc_threshold', + 'xtc_probability', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', - 'repetition_penalty_range', + 'presence_penalty', 'encoder_repetition_penalty', 'no_repeat_ngram_size', - 'dry_multiplier', - 'dry_base', - 'dry_allowed_length', - 'dry_sequence_breakers', - 'xtc_threshold', - 'xtc_probability', - 'seed', - 'do_sample', + 'repetition_penalty_range', 'penalty_alpha', + 'guidance_scale', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'grammar_file_row', - 'grammar_string', - 'guidance_scale', - 'negative_prompt', + 'prompt_lookup_num_tokens', + 'do_sample', + 'dynamic_temperature', + 'temperature_last', + 'auto_max_new_tokens', 'ban_eos_token', - 'custom_token_bans', - 'sampler_priority', 'add_bos_token', 'skip_special_tokens', - 'auto_max_new_tokens', - 'prompt_lookup_num_tokens', 'static_cache', + 'seed', + 'sampler_priority', + 'custom_token_bans', + 'negative_prompt', + 'dry_sequence_breakers', + 'grammar_string', + 'grammar_file_row', } @@ -174,155 +175,156 @@ loaders_samplers = { 'HQQ': transformers_samplers(), 'ExLlamav2': { 'temperature', - 'temperature_last', - 'smoothing_factor', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', - 'top_p', + 'smoothing_factor', 'min_p', + 'top_p', 'top_k', 'typical_p', + 'xtc_threshold', + 'xtc_probability', 'tfs', 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', + 'presence_penalty', 'repetition_penalty_range', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'dry_multiplier', - 'dry_base', - 'dry_allowed_length', - 'dry_sequence_breakers', - 'xtc_threshold', - 'xtc_probability', - 'seed', + 'dynamic_temperature', + 'temperature_last', + 'auto_max_new_tokens', 'ban_eos_token', 'add_bos_token', - 'custom_token_bans', 'skip_special_tokens', - 'auto_max_new_tokens', + 'seed', + 'custom_token_bans', + 'dry_sequence_breakers', }, 'ExLlamav2_HF': { 'temperature', - 'temperature_last', - 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', - 'top_p', 'min_p', + 'top_p', 'top_k', 'typical_p', + 'xtc_threshold', + 'xtc_probability', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', - 'repetition_penalty_range', + 'presence_penalty', 'encoder_repetition_penalty', 'no_repeat_ngram_size', - 'dry_multiplier', - 'dry_base', - 'dry_allowed_length', - 'dry_sequence_breakers', - 'xtc_threshold', - 'xtc_probability', - 'seed', - 'do_sample', + 'repetition_penalty_range', + 'guidance_scale', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'grammar_file_row', - 'grammar_string', - 'guidance_scale', - 'negative_prompt', + 'do_sample', + 'dynamic_temperature', + 'temperature_last', + 'auto_max_new_tokens', 'ban_eos_token', - 'custom_token_bans', - 'sampler_priority', 'add_bos_token', 'skip_special_tokens', - 'auto_max_new_tokens', + 'seed', + 'sampler_priority', + 'custom_token_bans', + 'negative_prompt', + 'dry_sequence_breakers', + 'grammar_string', + 'grammar_file_row', }, 'llama.cpp': { 'temperature', - 'top_p', 'min_p', + 'top_p', 'top_k', 'typical_p', 'tfs', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', - 'seed', + 'presence_penalty', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'grammar_file_row', - 'grammar_string', 'ban_eos_token', + 'seed', 'custom_token_bans', + 'grammar_string', + 'grammar_file_row', }, 'llamacpp_HF': { 'temperature', - 'temperature_last', - 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', - 'top_p', 'min_p', + 'top_p', 'top_k', 'typical_p', + 'xtc_threshold', + 'xtc_probability', 'epsilon_cutoff', 'eta_cutoff', 'tfs', 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', - 'repetition_penalty_range', + 'presence_penalty', 'encoder_repetition_penalty', 'no_repeat_ngram_size', - 'dry_multiplier', - 'dry_base', - 'dry_allowed_length', - 'dry_sequence_breakers', - 'xtc_threshold', - 'xtc_probability', - 'seed', - 'do_sample', + 'repetition_penalty_range', + 'guidance_scale', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'grammar_file_row', - 'grammar_string', - 'guidance_scale', - 'negative_prompt', + 'do_sample', + 'dynamic_temperature', + 'temperature_last', + 'auto_max_new_tokens', 'ban_eos_token', - 'custom_token_bans', - 'sampler_priority', 'add_bos_token', 'skip_special_tokens', - 'auto_max_new_tokens', + 'seed', + 'sampler_priority', + 'custom_token_bans', + 'negative_prompt', + 'dry_sequence_breakers', + 'grammar_string', + 'grammar_file_row', }, 'TensorRT-LLM': { 'temperature', 'top_p', 'top_k', 'repetition_penalty', - 'presence_penalty', 'frequency_penalty', - 'ban_eos_token', + 'presence_penalty', 'auto_max_new_tokens', + 'ban_eos_token', } } diff --git a/modules/presets.py b/modules/presets.py index c8118fb3..b841af53 100644 --- a/modules/presets.py +++ b/modules/presets.py @@ -13,40 +13,40 @@ from modules.logging_colors import logger def default_preset(): return { 'temperature': 1, - 'temperature_last': False, - 'dynamic_temperature': False, 'dynatemp_low': 1, 'dynatemp_high': 1, 'dynatemp_exponent': 1, 'smoothing_factor': 0, 'smoothing_curve': 1, - 'top_p': 1, 'min_p': 0, + 'top_p': 1, 'top_k': 0, - 'repetition_penalty': 1, - 'presence_penalty': 0, - 'frequency_penalty': 0, - 'repetition_penalty_range': 1024, 'typical_p': 1, - 'tfs': 1, - 'top_a': 0, + 'xtc_threshold': 0.1, + 'xtc_probability': 0, 'epsilon_cutoff': 0, 'eta_cutoff': 0, - 'guidance_scale': 1, + 'tfs': 1, + 'top_a': 0, + 'dry_multiplier': 0, + 'dry_allowed_length': 2, + 'dry_base': 1.75, + 'repetition_penalty': 1, + 'frequency_penalty': 0, + 'presence_penalty': 0, + 'encoder_repetition_penalty': 1, + 'no_repeat_ngram_size': 0, + 'repetition_penalty_range': 1024, 'penalty_alpha': 0, + 'guidance_scale': 1, 'mirostat_mode': 0, 'mirostat_tau': 5, 'mirostat_eta': 0.1, 'do_sample': True, - 'encoder_repetition_penalty': 1, - 'no_repeat_ngram_size': 0, - 'dry_multiplier': 0, - 'dry_base': 1.75, - 'dry_allowed_length': 2, + 'dynamic_temperature': False, + 'temperature_last': False, + 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nxtc\nencoder_repetition_penalty\nno_repeat_ngram', 'dry_sequence_breakers': '"\\n", ":", "\\"", "*"', - 'xtc_threshold': 0.1, - 'xtc_probability': 0, - 'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nxtc\nencoder_repetition_penalty\nno_repeat_ngram' } diff --git a/modules/shared.py b/modules/shared.py index 89263205..928747f7 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -29,39 +29,39 @@ need_restart = False # UI defaults settings = { - 'dark_theme': True, 'show_controls': True, 'start_with': '', 'mode': 'chat-instruct', 'chat_style': 'cai-chat', + 'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>', 'prompt-default': 'QA', 'prompt-notebook': 'QA', - 'preset': 'min_p', - 'max_new_tokens': 512, - 'max_new_tokens_min': 1, - 'max_new_tokens_max': 4096, - 'negative_prompt': '', - 'seed': -1, - 'truncation_length': 2048, - 'max_tokens_second': 0, - 'max_updates_second': 0, - 'prompt_lookup_num_tokens': 0, - 'static_cache': False, - 'custom_stopping_strings': '', - 'custom_token_bans': '', - 'auto_max_new_tokens': False, - 'ban_eos_token': False, - 'add_bos_token': True, - 'skip_special_tokens': True, - 'stream': True, 'character': 'Assistant', 'name1': 'You', 'user_bio': '', 'custom_system_message': '', 'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}", 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}", - 'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>', + 'preset': 'min_p', + 'max_new_tokens': 512, + 'max_new_tokens_min': 1, + 'max_new_tokens_max': 4096, + 'prompt_lookup_num_tokens': 0, + 'max_tokens_second': 0, + 'max_updates_second': 0, + 'auto_max_new_tokens': False, + 'ban_eos_token': False, + 'add_bos_token': True, + 'skip_special_tokens': True, + 'stream': True, + 'static_cache': False, + 'truncation_length': 2048, + 'seed': -1, + 'custom_stopping_strings': '', + 'custom_token_bans': '', + 'negative_prompt': '', 'autoload_model': False, + 'dark_theme': True, 'default_extensions': [], } diff --git a/modules/text_generation.py b/modules/text_generation.py index 3e9788b8..152b2b8d 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -287,31 +287,62 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings clear_torch_cache() generate_params = {} - for k in ['max_new_tokens', 'temperature', 'temperature_last', 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', 'top_p', 'min_p', 'top_k', 'repetition_penalty', 'presence_penalty', 'frequency_penalty', 'repetition_penalty_range', 'typical_p', 'tfs', 'top_a', 'guidance_scale', 'penalty_alpha', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', 'do_sample', 'encoder_repetition_penalty', 'no_repeat_ngram_size', 'dry_multiplier', 'dry_base', 'dry_allowed_length', 'dry_sequence_breakers', 'xtc_threshold', 'xtc_probability']: + for k in [ + 'temperature', + 'dynatemp_low', + 'dynatemp_high', + 'dynatemp_exponent', + 'smoothing_factor', + 'smoothing_curve', + 'min_p', + 'top_p', + 'top_k', + 'typical_p', + 'xtc_threshold', + 'xtc_probability', + 'tfs', + 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', + 'repetition_penalty', + 'frequency_penalty', + 'presence_penalty', + 'encoder_repetition_penalty', + 'no_repeat_ngram_size', + 'repetition_penalty_range', + 'penalty_alpha', + 'guidance_scale', + 'mirostat_mode', + 'mirostat_tau', + 'mirostat_eta', + 'max_new_tokens', + 'do_sample', + 'dynamic_temperature', + 'temperature_last', + 'dry_sequence_breakers', + ]: if k in state: generate_params[k] = state[k] - if isinstance(state['sampler_priority'], list) and len(state['sampler_priority']) > 0: - generate_params['sampler_priority'] = state['sampler_priority'] - elif isinstance(state['sampler_priority'], str) and state['sampler_priority'].strip() != '': - generate_params['sampler_priority'] = [x.strip() for x in state['sampler_priority'].replace('\n', ',').split(',') if x.strip()] - - if state['negative_prompt'] != '': - generate_params['negative_prompt_ids'] = encode(state['negative_prompt']) - - if state['prompt_lookup_num_tokens'] > 0: - generate_params['prompt_lookup_num_tokens'] = state['prompt_lookup_num_tokens'] - - if state['static_cache']: - generate_params['cache_implementation'] = 'static' - for k in ['epsilon_cutoff', 'eta_cutoff']: if state[k] > 0: generate_params[k] = state[k] * 1e-4 + if state['prompt_lookup_num_tokens'] > 0: + generate_params['prompt_lookup_num_tokens'] = state['prompt_lookup_num_tokens'] + if state['ban_eos_token']: generate_params['suppress_tokens'] = [shared.tokenizer.eos_token_id] + if state['static_cache']: + generate_params['cache_implementation'] = 'static' + + if isinstance(state['sampler_priority'], list) and len(state['sampler_priority']) > 0: + generate_params['sampler_priority'] = state['sampler_priority'] + elif isinstance(state['sampler_priority'], str) and state['sampler_priority'].strip() != '': + generate_params['sampler_priority'] = [x.strip() for x in state['sampler_priority'].replace('\n', ',').split(',') if x.strip()] + if state['custom_token_bans']: to_ban = [int(x) for x in state['custom_token_bans'].split(',')] if len(to_ban) > 0: @@ -320,6 +351,9 @@ def generate_reply_HF(question, original_question, seed, state, stopping_strings else: generate_params['suppress_tokens'] = to_ban + if state['negative_prompt'] != '': + generate_params['negative_prompt_ids'] = encode(state['negative_prompt']) + generate_params.update({'use_cache': not shared.args.no_cache}) if shared.args.deepspeed: generate_params.update({'synced_gpus': True}) diff --git a/modules/ui.py b/modules/ui.py index e66de434..4f7ee785 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -102,55 +102,55 @@ else: def list_model_elements(): elements = [ - 'loader', 'filter_by_loader', + 'loader', 'cpu_memory', - 'auto_devices', - 'disk', - 'cpu', - 'bf16', - 'load_in_4bit', - 'load_in_8bit', - 'torch_compile', - 'trust_remote_code', - 'no_use_fast', - 'use_flash_attention_2', - 'use_eager_attention', - 'compute_dtype', - 'quant_type', - 'use_double_quant', - 'cfg_cache', - 'no_flash_attn', - 'no_xformers', - 'no_sdpa', - 'num_experts_per_token', - 'cache_type', - 'autosplit', - 'enable_tp', + 'n_gpu_layers', 'threads', 'threads_batch', 'n_batch', - 'no_mmap', - 'mlock', - 'no_mul_mat_q', - 'n_gpu_layers', - 'tensor_split', + 'hqq_backend', 'n_ctx', - 'gpu_split', 'max_seq_len', - 'compress_pos_emb', + 'cache_type', + 'tensor_split', + 'gpu_split', 'alpha_value', 'rope_freq_base', - 'numa', - 'logits_all', - 'no_offload_kqv', - 'row_split', - 'tensorcores', - 'flash_attn', - 'streaming_llm', + 'compress_pos_emb', + 'compute_dtype', + 'quant_type', 'attention_sink_size', - 'hqq_backend', + 'num_experts_per_token', + 'tensorcores', + 'load_in_8bit', + 'load_in_4bit', + 'torch_compile', + 'flash_attn', + 'use_flash_attention_2', + 'streaming_llm', + 'auto_devices', + 'cpu', + 'disk', + 'row_split', + 'no_offload_kqv', + 'no_mul_mat_q', + 'no_mmap', + 'mlock', + 'numa', + 'use_double_quant', + 'use_eager_attention', + 'bf16', + 'autosplit', + 'enable_tp', + 'no_flash_attn', + 'no_xformers', + 'no_sdpa', + 'cfg_cache', 'cpp_runner', + 'logits_all', + 'trust_remote_code', + 'no_use_fast', ] if is_torch_xpu_available(): @@ -165,87 +165,87 @@ def list_model_elements(): def list_interface_input_elements(): elements = [ - 'max_new_tokens', - 'auto_max_new_tokens', - 'max_tokens_second', - 'max_updates_second', - 'prompt_lookup_num_tokens', - 'seed', 'temperature', - 'temperature_last', - 'dynamic_temperature', 'dynatemp_low', 'dynatemp_high', 'dynatemp_exponent', 'smoothing_factor', 'smoothing_curve', - 'top_p', 'min_p', + 'top_p', 'top_k', 'typical_p', - 'epsilon_cutoff', - 'eta_cutoff', - 'repetition_penalty', - 'presence_penalty', - 'frequency_penalty', - 'repetition_penalty_range', - 'encoder_repetition_penalty', - 'no_repeat_ngram_size', - 'dry_multiplier', - 'dry_base', - 'dry_allowed_length', - 'dry_sequence_breakers', 'xtc_threshold', 'xtc_probability', - 'do_sample', + 'epsilon_cutoff', + 'eta_cutoff', + 'tfs', + 'top_a', + 'dry_multiplier', + 'dry_allowed_length', + 'dry_base', + 'repetition_penalty', + 'frequency_penalty', + 'presence_penalty', + 'encoder_repetition_penalty', + 'no_repeat_ngram_size', + 'repetition_penalty_range', 'penalty_alpha', + 'guidance_scale', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', - 'grammar_string', - 'negative_prompt', - 'guidance_scale', - 'add_bos_token', + 'max_new_tokens', + 'prompt_lookup_num_tokens', + 'max_tokens_second', + 'max_updates_second', + 'do_sample', + 'dynamic_temperature', + 'temperature_last', + 'auto_max_new_tokens', 'ban_eos_token', - 'custom_token_bans', - 'sampler_priority', - 'truncation_length', - 'custom_stopping_strings', + 'add_bos_token', 'skip_special_tokens', 'stream', 'static_cache', - 'tfs', - 'top_a', + 'truncation_length', + 'seed', + 'sampler_priority', + 'custom_stopping_strings', + 'custom_token_bans', + 'negative_prompt', + 'dry_sequence_breakers', + 'grammar_string', ] # Chat elements elements += [ - 'textbox', - 'start_with', - 'character_menu', 'history', 'search_chat', 'unique_id', + 'textbox', + 'start_with', + 'mode', + 'chat_style', + 'chat-instruct_command', + 'character_menu', + 'name2', + 'context', + 'greeting', 'name1', 'user_bio', - 'name2', - 'greeting', - 'context', - 'mode', 'custom_system_message', 'instruction_template_str', 'chat_template_str', - 'chat_style', - 'chat-instruct_command', ] # Notebook/default elements elements += [ - 'textbox-notebook', 'textbox-default', - 'output_textbox', + 'textbox-notebook', 'prompt_menu-default', 'prompt_menu-notebook', + 'output_textbox', ] # Model elements From c393f7650d558d8ee1311adb5f66cc505e73fb78 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 10 Jan 2025 13:22:18 -0800 Subject: [PATCH 153/173] Update settings-template.yaml, organize modules/shared.py --- modules/shared.py | 4 ++-- settings-template.yaml | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index 928747f7..4d873cb9 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -40,8 +40,6 @@ settings = { 'name1': 'You', 'user_bio': '', 'custom_system_message': '', - 'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}", - 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}", 'preset': 'min_p', 'max_new_tokens': 512, 'max_new_tokens_min': 1, @@ -63,6 +61,8 @@ settings = { 'autoload_model': False, 'dark_theme': True, 'default_extensions': [], + 'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}", + 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}", } default_settings = copy.deepcopy(settings) diff --git a/settings-template.yaml b/settings-template.yaml index d5ed47c3..b61dc4e0 100644 --- a/settings-template.yaml +++ b/settings-template.yaml @@ -1,31 +1,38 @@ -dark_theme: true show_controls: true start_with: '' mode: chat-instruct chat_style: cai-chat +chat-instruct_command: |- + Continue the chat dialogue below. Write a single reply for the character "<|character|>". + + <|prompt|> prompt-default: QA prompt-notebook: QA +character: Assistant +name1: You +user_bio: '' +custom_system_message: '' preset: min_p max_new_tokens: 512 max_new_tokens_min: 1 max_new_tokens_max: 4096 -negative_prompt: '' -seed: -1 -truncation_length: 2048 +prompt_lookup_num_tokens: 0 max_tokens_second: 0 max_updates_second: 0 -prompt_lookup_num_tokens: 0 -custom_stopping_strings: '' -custom_token_bans: '' auto_max_new_tokens: false ban_eos_token: false add_bos_token: true skip_special_tokens: true stream: true static_cache: false -character: Assistant -name1: You -custom_system_message: '' +truncation_length: 2048 +seed: -1 +custom_stopping_strings: '' +custom_token_bans: '' +negative_prompt: '' +autoload_model: false +dark_theme: true +default_extensions: [] instruction_template_str: |- {%- set ns = namespace(found=false) -%} {%- for message in messages -%} @@ -67,11 +74,4 @@ chat_template_str: |- {%- endif -%} {%- endif -%} {%- endfor -%} -chat-instruct_command: |- - Continue the chat dialogue below. Write a single reply for the character "<|character|>". - <|prompt|> -autoload_model: false -gallery-items_per_page: 50 -gallery-open: false -default_extensions: [] From d2f6c0f65ff72c96999a51655b096f42d037fe32 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 10 Jan 2025 13:25:40 -0800 Subject: [PATCH 154/173] Update README --- README.md | 30 +++++++++++------------------- modules/shared.py | 2 +- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 07138772..7e2dec95 100644 --- a/README.md +++ b/README.md @@ -204,17 +204,16 @@ List of command-line flags usage: server.py [-h] [--multi-user] [--character CHARACTER] [--model MODEL] [--lora LORA [LORA ...]] [--model-dir MODEL_DIR] [--lora-dir LORA_DIR] [--model-menu] [--settings SETTINGS] [--extensions EXTENSIONS [EXTENSIONS ...]] [--verbose] [--idle-timeout IDLE_TIMEOUT] [--loader LOADER] [--cpu] [--auto-devices] [--gpu-memory GPU_MEMORY [GPU_MEMORY ...]] [--cpu-memory CPU_MEMORY] [--disk] [--disk-cache-dir DISK_CACHE_DIR] [--load-in-8bit] [--bf16] [--no-cache] [--trust-remote-code] [--force-safetensors] [--no_use_fast] - [--use_flash_attention_2] [--use_eager_attention] [--load-in-4bit] [--use_double_quant] [--compute_dtype COMPUTE_DTYPE] [--quant_type QUANT_TYPE] [--flash-attn] [--tensorcores] - [--n_ctx N_CTX] [--threads THREADS] [--threads-batch THREADS_BATCH] [--no_mul_mat_q] [--n_batch N_BATCH] [--no-mmap] [--mlock] [--n-gpu-layers N_GPU_LAYERS] + [--use_flash_attention_2] [--use_eager_attention] [--torch-compile] [--load-in-4bit] [--use_double_quant] [--compute_dtype COMPUTE_DTYPE] [--quant_type QUANT_TYPE] [--flash-attn] + [--tensorcores] [--n_ctx N_CTX] [--threads THREADS] [--threads-batch THREADS_BATCH] [--no_mul_mat_q] [--n_batch N_BATCH] [--no-mmap] [--mlock] [--n-gpu-layers N_GPU_LAYERS] [--tensor_split TENSOR_SPLIT] [--numa] [--logits_all] [--no_offload_kqv] [--cache-capacity CACHE_CAPACITY] [--row_split] [--streaming-llm] [--attention-sink-size ATTENTION_SINK_SIZE] [--tokenizer-dir TOKENIZER_DIR] [--gpu-split GPU_SPLIT] [--autosplit] [--max_seq_len MAX_SEQ_LEN] [--cfg-cache] [--no_flash_attn] [--no_xformers] [--no_sdpa] - [--num_experts_per_token NUM_EXPERTS_PER_TOKEN] [--enable_tp] [--triton] [--no_inject_fused_mlp] [--no_use_cuda_fp16] [--desc_act] [--disable_exllama] [--disable_exllamav2] - [--wbits WBITS] [--groupsize GROUPSIZE] [--hqq-backend HQQ_BACKEND] [--cpp-runner] [--cache_type CACHE_TYPE] [--deepspeed] [--nvme-offload-dir NVME_OFFLOAD_DIR] + [--num_experts_per_token NUM_EXPERTS_PER_TOKEN] [--enable_tp] [--hqq-backend HQQ_BACKEND] [--cpp-runner] [--cache_type CACHE_TYPE] [--deepspeed] [--nvme-offload-dir NVME_OFFLOAD_DIR] [--local_rank LOCAL_RANK] [--alpha_value ALPHA_VALUE] [--rope_freq_base ROPE_FREQ_BASE] [--compress_pos_emb COMPRESS_POS_EMB] [--listen] [--listen-port LISTEN_PORT] [--listen-host LISTEN_HOST] [--share] [--auto-launch] [--gradio-auth GRADIO_AUTH] [--gradio-auth-path GRADIO_AUTH_PATH] [--ssl-keyfile SSL_KEYFILE] [--ssl-certfile SSL_CERTFILE] - [--subpath SUBPATH] [--old-colors] [--api] [--public-api] [--public-api-id PUBLIC_API_ID] [--api-port API_PORT] [--api-key API_KEY] [--admin-key ADMIN_KEY] [--nowebui] - [--multimodal-pipeline MULTIMODAL_PIPELINE] [--model_type MODEL_TYPE] [--pre_layer PRE_LAYER [PRE_LAYER ...]] [--checkpoint CHECKPOINT] [--monkey-patch] [--no_inject_fused_attention] - [--cache_4bit] [--cache_8bit] [--chat-buttons] + [--subpath SUBPATH] [--old-colors] [--api] [--public-api] [--public-api-id PUBLIC_API_ID] [--api-port API_PORT] [--api-key API_KEY] [--admin-key ADMIN_KEY] [--api-enable-ipv6] + [--api-disable-ipv4] [--nowebui] [--multimodal-pipeline MULTIMODAL_PIPELINE] [--cache_4bit] [--cache_8bit] [--chat-buttons] [--triton] [--no_inject_fused_mlp] [--no_use_cuda_fp16] + [--desc_act] [--disable_exllama] [--disable_exllamav2] [--wbits WBITS] [--groupsize GROUPSIZE] Text generation web UI @@ -237,7 +236,7 @@ Basic settings: Model loader: --loader LOADER Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlamav2_HF, ExLlamav2, - AutoGPTQ. + HQQ, TensorRT-LLM. Transformers/Accelerate: --cpu Use the CPU to generate text. Warning: Training on CPU is extremely slow. @@ -255,6 +254,7 @@ Transformers/Accelerate: --no_use_fast Set use_fast=False while loading the tokenizer (it's True by default). Use this if you have any problems related to use_fast. --use_flash_attention_2 Set use_flash_attention_2=True while loading the model. --use_eager_attention Set attn_implementation= eager while loading the model. + --torch-compile Compile the model with torch.compile for improved performance. bitsandbytes 4-bit: --load-in-4bit Load the model with 4-bit precision (using bitsandbytes). @@ -264,7 +264,7 @@ bitsandbytes 4-bit: llama.cpp: --flash-attn Use flash-attention. - --tensorcores NVIDIA only: use llama-cpp-python compiled with tensor cores support. This may increase performance on newer cards. + --tensorcores NVIDIA only: use llama-cpp-python compiled without GGML_CUDA_FORCE_MMQ. This may improve performance on newer cards. --n_ctx N_CTX Size of the prompt context. --threads THREADS Number of threads to use. --threads-batch THREADS_BATCH Number of threads to use for batches/prompt processing. @@ -294,16 +294,6 @@ ExLlamaV2: --num_experts_per_token NUM_EXPERTS_PER_TOKEN Number of experts to use for generation. Applies to MoE models like Mixtral. --enable_tp Enable Tensor Parallelism (TP) in ExLlamaV2. -AutoGPTQ: - --triton Use triton. - --no_inject_fused_mlp Triton mode only: disable the use of fused MLP, which will use less VRAM at the cost of slower inference. - --no_use_cuda_fp16 This can make models faster on some systems. - --desc_act For models that do not have a quantize_config.json, this parameter is used to define whether to set desc_act or not in BaseQuantizeConfig. - --disable_exllama Disable ExLlama kernel, which can improve inference speed on some systems. - --disable_exllamav2 Disable ExLlamav2 kernel. - --wbits WBITS Load a pre-quantized model with specified precision in bits. 2, 3, 4 and 8 are supported. - --groupsize GROUPSIZE Group size. - HQQ: --hqq-backend HQQ_BACKEND Backend for the HQQ loader. Valid options: PYTORCH, PYTORCH_COMPILE, ATEN. @@ -343,6 +333,8 @@ API: --api-port API_PORT The listening port for the API. --api-key API_KEY API authentication key. --admin-key ADMIN_KEY API authentication key for admin tasks like loading and unloading models. If not set, will be the same as --api-key. + --api-enable-ipv6 Enable IPv6 for the API + --api-disable-ipv4 Disable IPv4 for the API --nowebui Do not launch the Gradio UI. Useful for launching the API in standalone mode. Multimodal: diff --git a/modules/shared.py b/modules/shared.py index 4d873cb9..93cd2272 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -86,7 +86,7 @@ group.add_argument('--idle-timeout', type=int, default=0, help='Unload model aft # Model loader group = parser.add_argument_group('Model loader') -group.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlamav2_HF, ExLlamav2.') +group.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlamav2_HF, ExLlamav2, HQQ, TensorRT-LLM.') # Transformers/Accelerate group = parser.add_argument_group('Transformers/Accelerate') From 02db4b0d06e9573de9e399b49006f882b996571b Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:05:08 -0800 Subject: [PATCH 155/173] Bump transformers to 4.48 --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6539161c..c7ced3df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,7 +21,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_amd.txt b/requirements_amd.txt index 2e5f2da7..87ee93d1 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index b1eb7d31..fa2f5ca7 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 6a9bf7f7..e9838295 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index d8928d58..bef02feb 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 84658a11..32f1a50a 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 5944d5a7..938848bf 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index fda4292d..e18cbe64 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -21,7 +21,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 45003f0d..a034ee61 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -20,7 +20,7 @@ safetensors==0.5.* scipy sentencepiece tensorboard -transformers==4.47.* +transformers==4.48.* tqdm wandb From 3a722a36c85f31f7d5d4529b8dfea3faec7b9c37 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Sat, 11 Jan 2025 12:55:19 -0300 Subject: [PATCH 156/173] Use morphdom to make chat streaming 1902381098231% faster (#6653) --- js/main.js | 3 +-- js/morphdom/morphdom-umd.min.js | 1 + modules/block_requests.py | 1 + modules/ui_chat.py | 26 +++++++++++++++++++++++--- 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 js/morphdom/morphdom-umd.min.js diff --git a/js/main.js b/js/main.js index efb84238..ab2499d4 100644 --- a/js/main.js +++ b/js/main.js @@ -147,10 +147,9 @@ const observer = new MutationObserver(function(mutations) { doSyntaxHighlighting(); - if(!isScrolled) { + if (!isScrolled && targetElement.scrollTop !== targetElement.scrollHeight) { targetElement.scrollTop = targetElement.scrollHeight; } - }); // Configure the observer to watch for changes in the subtree and attributes diff --git a/js/morphdom/morphdom-umd.min.js b/js/morphdom/morphdom-umd.min.js new file mode 100644 index 00000000..6746f0e8 --- /dev/null +++ b/js/morphdom/morphdom-umd.min.js @@ -0,0 +1 @@ +(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):(global=global||self,global.morphdom=factory())})(this,function(){"use strict";var DOCUMENT_FRAGMENT_NODE=11;function morphAttrs(fromNode,toNode){var toNodeAttrs=toNode.attributes;var attr;var attrName;var attrNamespaceURI;var attrValue;var fromValue;if(toNode.nodeType===DOCUMENT_FRAGMENT_NODE||fromNode.nodeType===DOCUMENT_FRAGMENT_NODE){return}for(var i=toNodeAttrs.length-1;i>=0;i--){attr=toNodeAttrs[i];attrName=attr.name;attrNamespaceURI=attr.namespaceURI;attrValue=attr.value;if(attrNamespaceURI){attrName=attr.localName||attrName;fromValue=fromNode.getAttributeNS(attrNamespaceURI,attrName);if(fromValue!==attrValue){if(attr.prefix==="xmlns"){attrName=attr.name}fromNode.setAttributeNS(attrNamespaceURI,attrName,attrValue)}}else{fromValue=fromNode.getAttribute(attrName);if(fromValue!==attrValue){fromNode.setAttribute(attrName,attrValue)}}}var fromNodeAttrs=fromNode.attributes;for(var d=fromNodeAttrs.length-1;d>=0;d--){attr=fromNodeAttrs[d];attrName=attr.name;attrNamespaceURI=attr.namespaceURI;if(attrNamespaceURI){attrName=attr.localName||attrName;if(!toNode.hasAttributeNS(attrNamespaceURI,attrName)){fromNode.removeAttributeNS(attrNamespaceURI,attrName)}}else{if(!toNode.hasAttribute(attrName)){fromNode.removeAttribute(attrName)}}}}var range;var NS_XHTML="http://www.w3.org/1999/xhtml";var doc=typeof document==="undefined"?undefined:document;var HAS_TEMPLATE_SUPPORT=!!doc&&"content"in doc.createElement("template");var HAS_RANGE_SUPPORT=!!doc&&doc.createRange&&"createContextualFragment"in doc.createRange();function createFragmentFromTemplate(str){var template=doc.createElement("template");template.innerHTML=str;return template.content.childNodes[0]}function createFragmentFromRange(str){if(!range){range=doc.createRange();range.selectNode(doc.body)}var fragment=range.createContextualFragment(str);return fragment.childNodes[0]}function createFragmentFromWrap(str){var fragment=doc.createElement("body");fragment.innerHTML=str;return fragment.childNodes[0]}function toElement(str){str=str.trim();if(HAS_TEMPLATE_SUPPORT){return createFragmentFromTemplate(str)}else if(HAS_RANGE_SUPPORT){return createFragmentFromRange(str)}return createFragmentFromWrap(str)}function compareNodeNames(fromEl,toEl){var fromNodeName=fromEl.nodeName;var toNodeName=toEl.nodeName;var fromCodeStart,toCodeStart;if(fromNodeName===toNodeName){return true}fromCodeStart=fromNodeName.charCodeAt(0);toCodeStart=toNodeName.charCodeAt(0);if(fromCodeStart<=90&&toCodeStart>=97){return fromNodeName===toNodeName.toUpperCase()}else if(toCodeStart<=90&&fromCodeStart>=97){return toNodeName===fromNodeName.toUpperCase()}else{return false}}function createElementNS(name,namespaceURI){return!namespaceURI||namespaceURI===NS_XHTML?doc.createElement(name):doc.createElementNS(namespaceURI,name)}function moveChildren(fromEl,toEl){var curChild=fromEl.firstChild;while(curChild){var nextChild=curChild.nextSibling;toEl.appendChild(curChild);curChild=nextChild}return toEl}function syncBooleanAttrProp(fromEl,toEl,name){if(fromEl[name]!==toEl[name]){fromEl[name]=toEl[name];if(fromEl[name]){fromEl.setAttribute(name,"")}else{fromEl.removeAttribute(name)}}}var specialElHandlers={OPTION:function(fromEl,toEl){var parentNode=fromEl.parentNode;if(parentNode){var parentName=parentNode.nodeName.toUpperCase();if(parentName==="OPTGROUP"){parentNode=parentNode.parentNode;parentName=parentNode&&parentNode.nodeName.toUpperCase()}if(parentName==="SELECT"&&!parentNode.hasAttribute("multiple")){if(fromEl.hasAttribute("selected")&&!toEl.selected){fromEl.setAttribute("selected","selected");fromEl.removeAttribute("selected")}parentNode.selectedIndex=-1}}syncBooleanAttrProp(fromEl,toEl,"selected")},INPUT:function(fromEl,toEl){syncBooleanAttrProp(fromEl,toEl,"checked");syncBooleanAttrProp(fromEl,toEl,"disabled");if(fromEl.value!==toEl.value){fromEl.value=toEl.value}if(!toEl.hasAttribute("value")){fromEl.removeAttribute("value")}},TEXTAREA:function(fromEl,toEl){var newValue=toEl.value;if(fromEl.value!==newValue){fromEl.value=newValue}var firstChild=fromEl.firstChild;if(firstChild){var oldValue=firstChild.nodeValue;if(oldValue==newValue||!newValue&&oldValue==fromEl.placeholder){return}firstChild.nodeValue=newValue}},SELECT:function(fromEl,toEl){if(!toEl.hasAttribute("multiple")){var selectedIndex=-1;var i=0;var curChild=fromEl.firstChild;var optgroup;var nodeName;while(curChild){nodeName=curChild.nodeName&&curChild.nodeName.toUpperCase();if(nodeName==="OPTGROUP"){optgroup=curChild;curChild=optgroup.firstChild}else{if(nodeName==="OPTION"){if(curChild.hasAttribute("selected")){selectedIndex=i;break}i++}curChild=curChild.nextSibling;if(!curChild&&optgroup){curChild=optgroup.nextSibling;optgroup=null}}}fromEl.selectedIndex=selectedIndex}}};var ELEMENT_NODE=1;var DOCUMENT_FRAGMENT_NODE$1=11;var TEXT_NODE=3;var COMMENT_NODE=8;function noop(){}function defaultGetNodeKey(node){if(node){return node.getAttribute&&node.getAttribute("id")||node.id}}function morphdomFactory(morphAttrs){return function morphdom(fromNode,toNode,options){if(!options){options={}}if(typeof toNode==="string"){if(fromNode.nodeName==="#document"||fromNode.nodeName==="HTML"||fromNode.nodeName==="BODY"){var toNodeHtml=toNode;toNode=doc.createElement("html");toNode.innerHTML=toNodeHtml}else{toNode=toElement(toNode)}}else if(toNode.nodeType===DOCUMENT_FRAGMENT_NODE$1){toNode=toNode.firstElementChild}var getNodeKey=options.getNodeKey||defaultGetNodeKey;var onBeforeNodeAdded=options.onBeforeNodeAdded||noop;var onNodeAdded=options.onNodeAdded||noop;var onBeforeElUpdated=options.onBeforeElUpdated||noop;var onElUpdated=options.onElUpdated||noop;var onBeforeNodeDiscarded=options.onBeforeNodeDiscarded||noop;var onNodeDiscarded=options.onNodeDiscarded||noop;var onBeforeElChildrenUpdated=options.onBeforeElChildrenUpdated||noop;var skipFromChildren=options.skipFromChildren||noop;var addChild=options.addChild||function(parent,child){return parent.appendChild(child)};var childrenOnly=options.childrenOnly===true;var fromNodesLookup=Object.create(null);var keyedRemovalList=[];function addKeyedRemoval(key){keyedRemovalList.push(key)}function walkDiscardedChildNodes(node,skipKeyedNodes){if(node.nodeType===ELEMENT_NODE){var curChild=node.firstChild;while(curChild){var key=undefined;if(skipKeyedNodes&&(key=getNodeKey(curChild))){addKeyedRemoval(key)}else{onNodeDiscarded(curChild);if(curChild.firstChild){walkDiscardedChildNodes(curChild,skipKeyedNodes)}}curChild=curChild.nextSibling}}}function removeNode(node,parentNode,skipKeyedNodes){if(onBeforeNodeDiscarded(node)===false){return}if(parentNode){parentNode.removeChild(node)}onNodeDiscarded(node);walkDiscardedChildNodes(node,skipKeyedNodes)}function indexTree(node){if(node.nodeType===ELEMENT_NODE||node.nodeType===DOCUMENT_FRAGMENT_NODE$1){var curChild=node.firstChild;while(curChild){var key=getNodeKey(curChild);if(key){fromNodesLookup[key]=curChild}indexTree(curChild);curChild=curChild.nextSibling}}}indexTree(fromNode);function handleNodeAdded(el){onNodeAdded(el);var curChild=el.firstChild;while(curChild){var nextSibling=curChild.nextSibling;var key=getNodeKey(curChild);if(key){var unmatchedFromEl=fromNodesLookup[key];if(unmatchedFromEl&&compareNodeNames(curChild,unmatchedFromEl)){curChild.parentNode.replaceChild(unmatchedFromEl,curChild);morphEl(unmatchedFromEl,curChild)}else{handleNodeAdded(curChild)}}else{handleNodeAdded(curChild)}curChild=nextSibling}}function cleanupFromEl(fromEl,curFromNodeChild,curFromNodeKey){while(curFromNodeChild){var fromNextSibling=curFromNodeChild.nextSibling;if(curFromNodeKey=getNodeKey(curFromNodeChild)){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=fromNextSibling}}function morphEl(fromEl,toEl,childrenOnly){var toElKey=getNodeKey(toEl);if(toElKey){delete fromNodesLookup[toElKey]}if(!childrenOnly){var beforeUpdateResult=onBeforeElUpdated(fromEl,toEl);if(beforeUpdateResult===false){return}else if(beforeUpdateResult instanceof HTMLElement){fromEl=beforeUpdateResult;indexTree(fromEl)}morphAttrs(fromEl,toEl);onElUpdated(fromEl);if(onBeforeElChildrenUpdated(fromEl,toEl)===false){return}}if(fromEl.nodeName!=="TEXTAREA"){morphChildren(fromEl,toEl)}else{specialElHandlers.TEXTAREA(fromEl,toEl)}}function morphChildren(fromEl,toEl){var skipFrom=skipFromChildren(fromEl,toEl);var curToNodeChild=toEl.firstChild;var curFromNodeChild=fromEl.firstChild;var curToNodeKey;var curFromNodeKey;var fromNextSibling;var toNextSibling;var matchingFromEl;outer:while(curToNodeChild){toNextSibling=curToNodeChild.nextSibling;curToNodeKey=getNodeKey(curToNodeChild);while(!skipFrom&&curFromNodeChild){fromNextSibling=curFromNodeChild.nextSibling;if(curToNodeChild.isSameNode&&curToNodeChild.isSameNode(curFromNodeChild)){curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling;continue outer}curFromNodeKey=getNodeKey(curFromNodeChild);var curFromNodeType=curFromNodeChild.nodeType;var isCompatible=undefined;if(curFromNodeType===curToNodeChild.nodeType){if(curFromNodeType===ELEMENT_NODE){if(curToNodeKey){if(curToNodeKey!==curFromNodeKey){if(matchingFromEl=fromNodesLookup[curToNodeKey]){if(fromNextSibling===matchingFromEl){isCompatible=false}else{fromEl.insertBefore(matchingFromEl,curFromNodeChild);if(curFromNodeKey){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=matchingFromEl;curFromNodeKey=getNodeKey(curFromNodeChild)}}else{isCompatible=false}}}else if(curFromNodeKey){isCompatible=false}isCompatible=isCompatible!==false&&compareNodeNames(curFromNodeChild,curToNodeChild);if(isCompatible){morphEl(curFromNodeChild,curToNodeChild)}}else if(curFromNodeType===TEXT_NODE||curFromNodeType==COMMENT_NODE){isCompatible=true;if(curFromNodeChild.nodeValue!==curToNodeChild.nodeValue){curFromNodeChild.nodeValue=curToNodeChild.nodeValue}}}if(isCompatible){curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling;continue outer}if(curFromNodeKey){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=fromNextSibling}if(curToNodeKey&&(matchingFromEl=fromNodesLookup[curToNodeKey])&&compareNodeNames(matchingFromEl,curToNodeChild)){if(!skipFrom){addChild(fromEl,matchingFromEl)}morphEl(matchingFromEl,curToNodeChild)}else{var onBeforeNodeAddedResult=onBeforeNodeAdded(curToNodeChild);if(onBeforeNodeAddedResult!==false){if(onBeforeNodeAddedResult){curToNodeChild=onBeforeNodeAddedResult}if(curToNodeChild.actualize){curToNodeChild=curToNodeChild.actualize(fromEl.ownerDocument||doc)}addChild(fromEl,curToNodeChild);handleNodeAdded(curToNodeChild)}}curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling}cleanupFromEl(fromEl,curFromNodeChild,curFromNodeKey);var specialElHandler=specialElHandlers[fromEl.nodeName];if(specialElHandler){specialElHandler(fromEl,toEl)}}var morphedNode=fromNode;var morphedNodeType=morphedNode.nodeType;var toNodeType=toNode.nodeType;if(!childrenOnly){if(morphedNodeType===ELEMENT_NODE){if(toNodeType===ELEMENT_NODE){if(!compareNodeNames(fromNode,toNode)){onNodeDiscarded(fromNode);morphedNode=moveChildren(fromNode,createElementNS(toNode.nodeName,toNode.namespaceURI))}}else{morphedNode=toNode}}else if(morphedNodeType===TEXT_NODE||morphedNodeType===COMMENT_NODE){if(toNodeType===morphedNodeType){if(morphedNode.nodeValue!==toNode.nodeValue){morphedNode.nodeValue=toNode.nodeValue}return morphedNode}else{morphedNode=toNode}}}if(morphedNode===toNode){onNodeDiscarded(fromNode)}else{if(toNode.isSameNode&&toNode.isSameNode(morphedNode)){return}morphEl(morphedNode,toNode,childrenOnly);if(keyedRemovalList){for(var i=0,len=keyedRemovalList.length;i' '\n ' '\n ' + '\n ' f'\n ' '\n ' '\n ' diff --git a/modules/ui_chat.py b/modules/ui_chat.py index b92dd9ae..61be17e3 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -20,7 +20,7 @@ def create_ui(): shared.gradio['Chat input'] = gr.State() shared.gradio['history'] = gr.JSON(visible=False) - with gr.Tab('Chat', elem_id='chat-tab'): + with gr.Tab('Chat', id='Chat', elem_id='chat-tab'): with gr.Row(elem_id='past-chats-row', elem_classes=['pretty_scrollbar']): with gr.Column(): with gr.Row(elem_id='past-chats-buttons'): @@ -46,8 +46,8 @@ def create_ui(): with gr.Row(): with gr.Column(elem_id='chat-col'): - shared.gradio['display'] = gr.HTML(value=chat_html_wrapper({'internal': [], 'visible': []}, '', '', 'chat', 'cai-chat', '')) - + shared.gradio['html_display'] = gr.HTML(value=chat_html_wrapper({'internal': [], 'visible': []}, '', '', 'chat', 'cai-chat', ''), visible=True) + shared.gradio['display'] = gr.Textbox(value="", visible=False) # Hidden buffer with gr.Row(elem_id="chat-input-row"): with gr.Column(scale=1, elem_id='gr-hover-container'): gr.HTML(value='
            ', elem_id='gr-hover') @@ -180,6 +180,26 @@ def create_event_handlers(): shared.input_params = gradio(inputs) shared.reload_inputs = gradio(reload_arr) + # Morph HTML updates instead of updating everything + shared.gradio['display'].change(None, gradio('display'), None, + js=""" + (text) => { + morphdom( + document.getElementById('chat').parentNode, + '
            ' + text + '
            ', + { + onBeforeElUpdated: function(fromEl, toEl) { + if (fromEl.isEqualNode(toEl)) { + return false; // Skip identical nodes + } + return true; // Update only if nodes differ + } + } + ); + } + """ + ) + shared.gradio['Generate'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( lambda x: (x, ''), gradio('textbox'), gradio('Chat input', 'textbox'), show_progress=False).then( From 58342740a5b061c2836f46d93dd70832f894c6e9 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 11 Jan 2025 07:59:49 -0800 Subject: [PATCH 157/173] Bump flash-attn to 2.7.3 --- requirements.txt | 8 ++++---- requirements_noavx2.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index c7ced3df..9bc5956a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index e18cbe64..1755ac24 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -55,7 +55,7 @@ https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+ https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7+cu121.torch2.4.1-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" https://github.com/oobabooga/exllamav2/releases/download/v0.2.7/exllamav2-0.2.7-py3-none-any.whl; platform_system == "Linux" and platform_machine != "x86_64" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" -https://github.com/oobabooga/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" -https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.2.post1/flash_attn-2.7.2.post1+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu122torch2.4.1cxx11abiFALSE-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" +https://github.com/oobabooga/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu122torch2.4.1cxx11abiFALSE-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" +https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" From a5d64b586da0ce39c36d01a59d991fbc76e16362 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Sat, 11 Jan 2025 16:59:21 -0300 Subject: [PATCH 158/173] Add a "copy" button below each message (#6654) --- css/html_instruct_style.css | 2 ++ css/main.css | 53 +++++++++++++++++++++++++++- modules/block_requests.py | 3 +- modules/html_generator.py | 70 ++++++++++++++++++++++++------------- modules/ui.py | 2 ++ 5 files changed, 104 insertions(+), 26 deletions(-) diff --git a/css/html_instruct_style.css b/css/html_instruct_style.css index dcc19c29..fcd0558f 100644 --- a/css/html_instruct_style.css +++ b/css/html_instruct_style.css @@ -48,12 +48,14 @@ .chat .user-message { background: #f4f4f4; padding: 1.5rem 1rem; + padding-bottom: 2rem; border-radius: 0; border-bottom-right-radius: 0; } .chat .assistant-message { padding: 1.5rem 1rem; + padding-bottom: 2rem; border-radius: 0; border: 0; } diff --git a/css/main.css b/css/main.css index 9d99a876..48c6727a 100644 --- a/css/main.css +++ b/css/main.css @@ -1142,7 +1142,6 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { } .dark svg { - fill: white; color: white; } @@ -1221,3 +1220,55 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { background: var(--light-theme-gray); } } + +/* ---------------------------------------------- + Copy button for chat messages +---------------------------------------------- */ +.message .text, +.message .text-you, +.message .text-bot, +.user-message .text, +.assistant-message .text { + position: relative; +} + +.message, .user-message, .assistant-message { + position: relative; +} + +.copy-button { + position: absolute; + bottom: -23px; + left: 0; + padding: 0; + border: none; + border-radius: 3px; + cursor: pointer; + opacity: 0; + display: flex; + align-items: center; + transition: opacity 0.2s; +} + +.message:hover .copy-button, +.user-message:hover .copy-button, +.assistant-message:hover .copy-button { + opacity: 1; +} + +.copy-button svg { + stroke: rgb(156 163 175); + transition: stroke 0.2s; +} + +.copy-button:hover svg { + stroke: rgb(107 114 128); +} + +.dark .copy-button svg { + stroke: rgb(156 163 175); +} + +.dark .copy-button:hover svg { + stroke: rgb(209 213 219); +} diff --git a/modules/block_requests.py b/modules/block_requests.py index 35f983cf..29fc6633 100644 --- a/modules/block_requests.py +++ b/modules/block_requests.py @@ -3,7 +3,7 @@ import io import requests -from modules import shared +from modules import shared, ui from modules.logging_colors import logger original_open = open @@ -58,6 +58,7 @@ def my_open(*args, **kwargs): '\n ' f'\n ' '\n ' + f'\n ' '\n ' ) diff --git a/modules/html_generator.py b/modules/html_generator.py index e3550ed5..b565c63a 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -292,24 +292,34 @@ def get_image_cache(path): return image_cache[path][1] +copy_svg = '''''' +copy_button = f'' + def generate_instruct_html(history): output = f'
            ' - for i, _row in enumerate(history): - row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] - if row[0]: # Don't display empty user messages + for i in range(len(history['visible'])): + row_visible = history['visible'][i] + row_internal = history['internal'][i] + converted_visible = [convert_to_markdown_wrapped(entry, use_cache=i != len(history['visible']) - 1) for entry in row_visible] + + if converted_visible[0]: # Don't display empty user messages output += ( - f'
            ' + f'
            ' f'
            ' - f'
            {row[0]}
            ' + f'
            {converted_visible[0]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) output += ( - f'
            ' + f'
            ' f'
            ' - f'
            {row[1]}
            ' + f'
            {converted_visible[1]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) @@ -332,26 +342,32 @@ def generate_cai_chat_html(history, name1, name2, style, character, reset_cache= if Path("cache/pfp_me.png").exists() else '' ) - for i, _row in enumerate(history): - row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] + for i in range(len(history['visible'])): + row_visible = history['visible'][i] + row_internal = history['internal'][i] + converted_visible = [convert_to_markdown_wrapped(entry, use_cache=i != len(history['visible']) - 1) for entry in row_visible] - if row[0]: # Don't display empty user messages + if converted_visible[0]: # Don't display empty user messages output += ( - f'
            ' + f'
            ' f'
            {img_me}
            ' f'
            ' f'
            {name1}
            ' - f'
            {row[0]}
            ' + f'
            {converted_visible[0]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) output += ( - f'
            ' + f'
            ' f'
            {img_bot}
            ' f'
            ' f'
            {name2}
            ' - f'
            {row[1]}
            ' + f'
            {converted_visible[1]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) @@ -363,22 +379,28 @@ def generate_cai_chat_html(history, name1, name2, style, character, reset_cache= def generate_chat_html(history, name1, name2, reset_cache=False): output = f'
            ' - for i, _row in enumerate(history): - row = [convert_to_markdown_wrapped(entry, use_cache=i != len(history) - 1) for entry in _row] + for i in range(len(history['visible'])): + row_visible = history['visible'][i] + row_internal = history['internal'][i] + converted_visible = [convert_to_markdown_wrapped(entry, use_cache=i != len(history['visible']) - 1) for entry in row_visible] - if row[0]: # Don't display empty user messages + if converted_visible[0]: # Don't display empty user messages output += ( - f'
            ' + f'
            ' f'
            ' - f'
            {row[0]}
            ' + f'
            {converted_visible[0]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) output += ( - f'
            ' + f'
            ' f'
            ' - f'
            {row[1]}
            ' + f'
            {converted_visible[1]}
            ' + f'{copy_button}' f'
            ' f'
            ' ) @@ -389,8 +411,8 @@ def generate_chat_html(history, name1, name2, reset_cache=False): def chat_html_wrapper(history, name1, name2, mode, style, character, reset_cache=False): if mode == 'instruct': - return generate_instruct_html(history['visible']) + return generate_instruct_html(history) elif style == 'wpp': - return generate_chat_html(history['visible'], name1, name2) + return generate_chat_html(history, name1, name2) else: - return generate_cai_chat_html(history['visible'], name1, name2, style, character, reset_cache) + return generate_cai_chat_html(history, name1, name2, style, character, reset_cache) diff --git a/modules/ui.py b/modules/ui.py index 4f7ee785..df948a14 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -19,6 +19,8 @@ with open(Path(__file__).resolve().parent / '../css/highlightjs/highlightjs-copy css += f.read() with open(Path(__file__).resolve().parent / '../js/main.js', 'r') as f: js = f.read() +with open(Path(__file__).resolve().parent / '../js/global_scope_js.js', 'r') as f: + global_scope_js = f.read() with open(Path(__file__).resolve().parent / '../js/save_files.js', 'r') as f: save_files_js = f.read() with open(Path(__file__).resolve().parent / '../js/switch_tabs.js', 'r') as f: From 1b9121e5b87625edbbc13d2dc0e42624173553ca Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Sat, 11 Jan 2025 12:41:41 -0800 Subject: [PATCH 159/173] Add a "refresh" button below the last message, add a missing file --- css/main.css | 29 +++++++++++++++++++---------- js/global_scope_js.js | 23 +++++++++++++++++++++++ modules/html_generator.py | 7 ++++++- 3 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 js/global_scope_js.js diff --git a/css/main.css b/css/main.css index 48c6727a..63681979 100644 --- a/css/main.css +++ b/css/main.css @@ -1236,11 +1236,10 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { position: relative; } -.copy-button { +.footer-button { position: absolute; - bottom: -23px; - left: 0; padding: 0; + margin: 0; border: none; border-radius: 3px; cursor: pointer; @@ -1250,25 +1249,35 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* { transition: opacity 0.2s; } -.message:hover .copy-button, -.user-message:hover .copy-button, -.assistant-message:hover .copy-button { +.footer-button#copy-button { + bottom: -23px; + left: 0; +} + +.footer-button#refresh-button { + bottom: -23px; + left: 25px; +} + +.message:hover .footer-button, +.user-message:hover .footer-button, +.assistant-message:hover .footer-button { opacity: 1; } -.copy-button svg { +.footer-button svg { stroke: rgb(156 163 175); transition: stroke 0.2s; } -.copy-button:hover svg { +.footer-button:hover svg { stroke: rgb(107 114 128); } -.dark .copy-button svg { +.dark .footer-button svg { stroke: rgb(156 163 175); } -.dark .copy-button:hover svg { +.dark .footer-button:hover svg { stroke: rgb(209 213 219); } diff --git a/js/global_scope_js.js b/js/global_scope_js.js new file mode 100644 index 00000000..79b673d7 --- /dev/null +++ b/js/global_scope_js.js @@ -0,0 +1,23 @@ +function copyToClipboard(element) { + if (!element) return; + + const messageElement = element.closest(".message, .user-message, .assistant-message"); + if (!messageElement) return; + + const rawText = messageElement.getAttribute("data-raw"); + if (!rawText) return; + + navigator.clipboard.writeText(rawText).then(function() { + const originalSvg = element.innerHTML; + element.innerHTML = ""; + setTimeout(() => { + element.innerHTML = originalSvg; + }, 1000); + }).catch(function(err) { + console.error("Failed to copy text: ", err); + }); +} + +function regenerateClick() { + document.getElementById("Regenerate").click(); +} diff --git a/modules/html_generator.py b/modules/html_generator.py index b565c63a..79a8dc64 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -293,7 +293,9 @@ def get_image_cache(path): copy_svg = '''''' -copy_button = f'' +refresh_svg = '''''' +copy_button = f'' +refresh_button = f'' def generate_instruct_html(history): output = f'
            ' @@ -320,6 +322,7 @@ def generate_instruct_html(history): f'
            ' f'
            {converted_visible[1]}
            ' f'{copy_button}' + f'{refresh_button if i == len(history["visible"]) - 1 else ""}' f'
            ' f'
            ' ) @@ -368,6 +371,7 @@ def generate_cai_chat_html(history, name1, name2, style, character, reset_cache= f'
            {name2}
            ' f'
            {converted_visible[1]}
            ' f'{copy_button}' + f'{refresh_button if i == len(history["visible"]) - 1 else ""}' f'
            ' f'
            ' ) @@ -401,6 +405,7 @@ def generate_chat_html(history, name1, name2, reset_cache=False): f'
            ' f'
            {converted_visible[1]}
            ' f'{copy_button}' + f'{refresh_button if i == len(history["visible"]) - 1 else ""}' f'
            ' f'
            ' ) From f1797f4323b6eba98521d14c1cc011ce45f4db42 Mon Sep 17 00:00:00 2001 From: mamei16 Date: Sat, 11 Jan 2025 22:39:44 +0100 Subject: [PATCH 160/173] Unescape backslashes in html_output (#6648) --- modules/html_generator.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/html_generator.py b/modules/html_generator.py index 79a8dc64..3ddad51d 100644 --- a/modules/html_generator.py +++ b/modules/html_generator.py @@ -239,6 +239,9 @@ def convert_to_markdown(string): pattern = re.compile(r']*>(.*?)', re.DOTALL) html_output = pattern.sub(lambda x: html.unescape(x.group()), html_output) + # Unescape backslashes + html_output = html_output.replace('\\\\', '\\') + # Add "long-list" class to
              or
                containing a long
              1. item html_output = add_long_list_class(html_output) From a0492ce325b951a9c000fa3cad45806adc8d8926 Mon Sep 17 00:00:00 2001 From: oobabooga Date: Sat, 11 Jan 2025 21:14:10 -0300 Subject: [PATCH 161/173] Optimize syntax highlighting during chat streaming (#6655) --- js/global_scope_js.js | 2 +- js/main.js | 55 +++++++++++++++---------------------------- modules/ui_chat.py | 40 ++++++++++++++++++------------- 3 files changed, 44 insertions(+), 53 deletions(-) diff --git a/js/global_scope_js.js b/js/global_scope_js.js index 79b673d7..983d60f1 100644 --- a/js/global_scope_js.js +++ b/js/global_scope_js.js @@ -19,5 +19,5 @@ function copyToClipboard(element) { } function regenerateClick() { - document.getElementById("Regenerate").click(); + document.getElementById("Regenerate").click(); } diff --git a/js/main.js b/js/main.js index ab2499d4..c5c47d04 100644 --- a/js/main.js +++ b/js/main.js @@ -177,47 +177,30 @@ function isElementVisibleOnScreen(element) { ); } -function getVisibleMessagesIndexes() { - const elements = document.querySelectorAll(".message-body"); - const visibleIndexes = []; - - elements.forEach((element, index) => { - if (isElementVisibleOnScreen(element) && !element.hasAttribute("data-highlighted")) { - visibleIndexes.push(index); - } - }); - - return visibleIndexes; -} - function doSyntaxHighlighting() { - const indexes = getVisibleMessagesIndexes(); - const elements = document.querySelectorAll(".message-body"); + const messageBodies = document.querySelectorAll(".message-body"); - if (indexes.length > 0) { + if (messageBodies.length > 0) { observer.disconnect(); - indexes.forEach((index) => { - const element = elements[index]; + messageBodies.forEach((messageBody) => { + if (isElementVisibleOnScreen(messageBody)) { + // Handle both code and math in a single pass through each message + const codeBlocks = messageBody.querySelectorAll("pre code:not([data-highlighted])"); + codeBlocks.forEach((codeBlock) => { + hljs.highlightElement(codeBlock); + codeBlock.setAttribute("data-highlighted", "true"); + }); - // Tag this element to prevent it from being highlighted twice - element.setAttribute("data-highlighted", "true"); - - // Perform syntax highlighting - const codeBlocks = element.querySelectorAll("pre code"); - - codeBlocks.forEach((codeBlock) => { - hljs.highlightElement(codeBlock); - }); - - renderMathInElement(element, { - delimiters: [ - { left: "$$", right: "$$", display: true }, - { left: "$", right: "$", display: false }, - { left: "\\(", right: "\\)", display: false }, - { left: "\\[", right: "\\]", display: true }, - ], - }); + renderMathInElement(messageBody, { + delimiters: [ + { left: "$$", right: "$$", display: true }, + { left: "$", right: "$", display: false }, + { left: "\\(", right: "\\)", display: false }, + { left: "\\[", right: "\\]", display: true }, + ], + }); + } }); observer.observe(targetElement, config); diff --git a/modules/ui_chat.py b/modules/ui_chat.py index 61be17e3..8497f7df 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -182,23 +182,31 @@ def create_event_handlers(): # Morph HTML updates instead of updating everything shared.gradio['display'].change(None, gradio('display'), None, - js=""" - (text) => { - morphdom( - document.getElementById('chat').parentNode, - '
                ' + text + '
                ', - { - onBeforeElUpdated: function(fromEl, toEl) { - if (fromEl.isEqualNode(toEl)) { - return false; // Skip identical nodes - } - return true; // Update only if nodes differ - } - } - ); + js=""" + (text) => { + morphdom( + document.getElementById('chat').parentNode, + '
                ' + text + '
                ', + { + onBeforeElUpdated: function(fromEl, toEl) { + if (fromEl.tagName === 'PRE' && fromEl.querySelector('code[data-highlighted]')) { + const fromCode = fromEl.querySelector('code'); + const toCode = toEl.querySelector('code'); + + if (fromCode && toCode && fromCode.textContent === toCode.textContent) { + // If the content is the same, preserve the entire
                 element
                +                  toEl.className = fromEl.className;
                +                  toEl.innerHTML = fromEl.innerHTML;
                +                  return false; // Skip updating the 
                 element
                +                }
                +              }
                +              return !fromEl.isEqualNode(toEl); // Update only if nodes differ
                             }
                -        """
                -    )
                +          }
                +        );
                +      }
                +      """
                +    );
                 
                     shared.gradio['Generate'].click(
                         ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
                
                From ed16374ecee6f547c49fe4af0630294add317399 Mon Sep 17 00:00:00 2001
                From: Lounger <4087076+TheLounger@users.noreply.github.com>
                Date: Sun, 12 Jan 2025 03:35:22 +0100
                Subject: [PATCH 162/173] Fix the gallery extension (#6656)
                
                ---
                 extensions/gallery/script.py | 5 +++--
                 1 file changed, 3 insertions(+), 2 deletions(-)
                
                diff --git a/extensions/gallery/script.py b/extensions/gallery/script.py
                index ff0242c8..54f9c745 100644
                --- a/extensions/gallery/script.py
                +++ b/extensions/gallery/script.py
                @@ -93,10 +93,11 @@ def generate_html():
                 
                 def filter_cards(filter_str=''):
                     if filter_str == '':
                -        return cards
                +        return gr.Dataset(samples=cards)
                 
                     filter_upper = filter_str.upper()
                -    return [k for k in cards if filter_upper in k[1].upper()]
                +    filtered = [k for k in cards if filter_upper in k[1].upper()]
                +    return gr.Dataset(samples=filtered)
                 
                 
                 def select_character(evt: gr.SelectData):
                
                From facb4155d4a0d343b6f0cbae93f112456f20875b Mon Sep 17 00:00:00 2001
                From: oobabooga <112222186+oobabooga@users.noreply.github.com>
                Date: Sat, 11 Jan 2025 20:57:28 -0800
                Subject: [PATCH 163/173] Fix morphdom leaving ghost elements behind
                
                ---
                 css/main.css              | 4 ++--
                 modules/html_generator.py | 4 ++--
                 2 files changed, 4 insertions(+), 4 deletions(-)
                
                diff --git a/css/main.css b/css/main.css
                index 63681979..1a7efe70 100644
                --- a/css/main.css
                +++ b/css/main.css
                @@ -1249,12 +1249,12 @@ div.svelte-362y77>*, div.svelte-362y77>.form>* {
                     transition: opacity 0.2s;
                 }
                 
                -.footer-button#copy-button {
                +.footer-button.footer-copy-button {
                     bottom: -23px;
                     left: 0;
                 }
                 
                -.footer-button#refresh-button {
                +.footer-button.footer-refresh-button {
                     bottom: -23px;
                     left: 25px;
                 }
                diff --git a/modules/html_generator.py b/modules/html_generator.py
                index 3ddad51d..245c833c 100644
                --- a/modules/html_generator.py
                +++ b/modules/html_generator.py
                @@ -297,8 +297,8 @@ def get_image_cache(path):
                 
                 copy_svg = ''''''
                 refresh_svg = ''''''
                -copy_button = f''
                -refresh_button = f''
                +copy_button = f''
                +refresh_button = f''
                 
                 def generate_instruct_html(history):
                     output = f'
                ' From c85e5e58d08a18e86e94106740d482250b4c0594 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Mon, 13 Jan 2025 06:20:42 -0800 Subject: [PATCH 164/173] UI: move the new morphdom code to a .js file --- js/global_scope_js.js | 24 ++++++++++++++++++++++++ modules/ui_chat.py | 27 +-------------------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/js/global_scope_js.js b/js/global_scope_js.js index 983d60f1..f4d9c673 100644 --- a/js/global_scope_js.js +++ b/js/global_scope_js.js @@ -21,3 +21,27 @@ function copyToClipboard(element) { function regenerateClick() { document.getElementById("Regenerate").click(); } + +function handleMorphdomUpdate(text) { + console.log("Morphing!"); + morphdom( + document.getElementById("chat").parentNode, + "
                " + text + "
                ", + { + onBeforeElUpdated: function(fromEl, toEl) { + if (fromEl.tagName === "PRE" && fromEl.querySelector("code[data-highlighted]")) { + const fromCode = fromEl.querySelector("code"); + const toCode = toEl.querySelector("code"); + + if (fromCode && toCode && fromCode.textContent === toCode.textContent) { + // If the content is the same, preserve the entire
                 element
                +            toEl.className = fromEl.className;
                +            toEl.innerHTML = fromEl.innerHTML;
                +            return false; // Skip updating the 
                 element
                +          }
                +        }
                +        return !fromEl.isEqualNode(toEl); // Update only if nodes differ
                +      }
                +    }
                +  );
                +}
                diff --git a/modules/ui_chat.py b/modules/ui_chat.py
                index 8497f7df..e80fa33b 100644
                --- a/modules/ui_chat.py
                +++ b/modules/ui_chat.py
                @@ -181,32 +181,7 @@ def create_event_handlers():
                     shared.reload_inputs = gradio(reload_arr)
                 
                     # Morph HTML updates instead of updating everything
                -    shared.gradio['display'].change(None, gradio('display'), None,
                -      js="""
                -      (text) => {
                -        morphdom(
                -          document.getElementById('chat').parentNode,
                -          '
                ' + text + '
                ', - { - onBeforeElUpdated: function(fromEl, toEl) { - if (fromEl.tagName === 'PRE' && fromEl.querySelector('code[data-highlighted]')) { - const fromCode = fromEl.querySelector('code'); - const toCode = toEl.querySelector('code'); - - if (fromCode && toCode && fromCode.textContent === toCode.textContent) { - // If the content is the same, preserve the entire
                 element
                -                  toEl.className = fromEl.className;
                -                  toEl.innerHTML = fromEl.innerHTML;
                -                  return false; // Skip updating the 
                 element
                -                }
                -              }
                -              return !fromEl.isEqualNode(toEl); // Update only if nodes differ
                -            }
                -          }
                -        );
                -      }
                -      """
                -    );
                +    shared.gradio['display'].change(None, gradio('display'), None, js="(text) => handleMorphdomUpdate(text)")
                 
                     shared.gradio['Generate'].click(
                         ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
                
                From 53b838d6c5637406533371cef3b440549f43f4de Mon Sep 17 00:00:00 2001
                From: Underscore <47636331+Th-Underscore@users.noreply.github.com>
                Date: Mon, 13 Jan 2025 16:01:50 -0500
                Subject: [PATCH 165/173] HTML: Fix quote pair RegEx matching for all quote
                 types (#6661)
                
                ---
                 modules/html_generator.py | 11 +++++++++--
                 1 file changed, 9 insertions(+), 2 deletions(-)
                
                diff --git a/modules/html_generator.py b/modules/html_generator.py
                index 245c833c..c14a28b4 100644
                --- a/modules/html_generator.py
                +++ b/modules/html_generator.py
                @@ -73,7 +73,6 @@ def fix_newlines(string):
                 
                 
                 def replace_quotes(text):
                -
                     # Define a list of quote pairs (opening and closing), using HTML entities
                     quote_pairs = [
                         ('"', '"'),  # Double quotes
                @@ -84,14 +83,22 @@ def replace_quotes(text):
                         ('‘', '’'),  # Alternative single quotes
                         ('“', '”'),  # Unicode quotes (numeric entities)
                         ('“', '”'),  # Unicode quotes (hex entities)
                +        ('\u201C', '\u201D'),  # Unicode quotes (literal chars)
                     ]
                 
                     # Create a regex pattern that matches any of the quote pairs, including newlines
                     pattern = '|'.join(f'({re.escape(open_q)})(.*?)({re.escape(close_q)})' for open_q, close_q in quote_pairs)
                 
                     # Replace matched patterns with  tags, keeping original quotes
                -    replaced_text = re.sub(pattern, lambda m: f'{m.group(1)}{m.group(2)}{m.group(3)}', text, flags=re.DOTALL)
                +    def replacer(m):
                +        # Find the first non-None group set
                +        for i in range(1, len(m.groups()), 3):  # Step through each sub-pattern's groups
                +            if m.group(i):  # If this sub-pattern matched
                +                return f'{m.group(i)}{m.group(i + 1)}{m.group(i + 2)}'
                 
                +        return m.group(0)  # Fallback (shouldn't happen)
                +
                +    replaced_text = re.sub(pattern, replacer, text, flags=re.DOTALL)
                     return replaced_text
                 
                 
                
                From c832953ff723aa5dafcb3aac4f19acd0df56bb5b Mon Sep 17 00:00:00 2001
                From: oobabooga <112222186+oobabooga@users.noreply.github.com>
                Date: Tue, 14 Jan 2025 05:59:55 -0800
                Subject: [PATCH 166/173] UI: Activate auto_max_new_tokens by default
                
                ---
                 modules/shared.py      | 2 +-
                 settings-template.yaml | 2 +-
                 2 files changed, 2 insertions(+), 2 deletions(-)
                
                diff --git a/modules/shared.py b/modules/shared.py
                index 93cd2272..f1e12673 100644
                --- a/modules/shared.py
                +++ b/modules/shared.py
                @@ -47,7 +47,7 @@ settings = {
                     'prompt_lookup_num_tokens': 0,
                     'max_tokens_second': 0,
                     'max_updates_second': 0,
                -    'auto_max_new_tokens': False,
                +    'auto_max_new_tokens': True,
                     'ban_eos_token': False,
                     'add_bos_token': True,
                     'skip_special_tokens': True,
                diff --git a/settings-template.yaml b/settings-template.yaml
                index b61dc4e0..93a64abb 100644
                --- a/settings-template.yaml
                +++ b/settings-template.yaml
                @@ -19,7 +19,7 @@ max_new_tokens_max: 4096
                 prompt_lookup_num_tokens: 0
                 max_tokens_second: 0
                 max_updates_second: 0
                -auto_max_new_tokens: false
                +auto_max_new_tokens: true
                 ban_eos_token: false
                 add_bos_token: true
                 skip_special_tokens: true
                
                From f843cb475bd3b880838a6a3a6ff200a2e290b115 Mon Sep 17 00:00:00 2001
                From: oobabooga <112222186+oobabooga@users.noreply.github.com>
                Date: Tue, 14 Jan 2025 08:12:51 -0800
                Subject: [PATCH 167/173] UI: update a help message
                
                ---
                 modules/ui_chat.py | 2 +-
                 1 file changed, 1 insertion(+), 1 deletion(-)
                
                diff --git a/modules/ui_chat.py b/modules/ui_chat.py
                index e80fa33b..395300d0 100644
                --- a/modules/ui_chat.py
                +++ b/modules/ui_chat.py
                @@ -164,7 +164,7 @@ def create_chat_settings_ui():
                         with gr.Row():
                             with gr.Column():
                                 shared.gradio['custom_system_message'] = gr.Textbox(value=shared.settings['custom_system_message'], lines=2, label='Custom system message', info='If not empty, will be used instead of the default one.', elem_classes=['add_scrollbar'])
                -                shared.gradio['instruction_template_str'] = gr.Textbox(value='', label='Instruction template', lines=24, info='Change this according to the model/LoRA that you are using. Used in instruct and chat-instruct modes.', elem_classes=['add_scrollbar', 'monospace'])
                +                shared.gradio['instruction_template_str'] = gr.Textbox(value='', label='Instruction template', lines=24, info='This gets autodetected; you usually don\'t need to change it. Used in instruct and chat-instruct modes.', elem_classes=['add_scrollbar', 'monospace'])
                                 with gr.Row():
                                     shared.gradio['send_instruction_to_default'] = gr.Button('Send to default', elem_classes=['small-button'])
                                     shared.gradio['send_instruction_to_notebook'] = gr.Button('Send to notebook', elem_classes=['small-button'])
                
                From 1ef748fb203730aae92b8f28f44abb68699accb4 Mon Sep 17 00:00:00 2001
                From: oobabooga <112222186+oobabooga@users.noreply.github.com>
                Date: Tue, 14 Jan 2025 16:44:15 -0800
                Subject: [PATCH 168/173] Lint
                
                ---
                 extensions/gallery/script.py | 1 -
                 modules/html_generator.py    | 1 +
                 2 files changed, 1 insertion(+), 1 deletion(-)
                
                diff --git a/extensions/gallery/script.py b/extensions/gallery/script.py
                index 54f9c745..76be4a58 100644
                --- a/extensions/gallery/script.py
                +++ b/extensions/gallery/script.py
                @@ -5,7 +5,6 @@ import gradio as gr
                 from modules.html_generator import get_image_cache
                 from modules.shared import gradio
                 
                -
                 params = {
                     'items_per_page': 50,
                     'open': False,
                diff --git a/modules/html_generator.py b/modules/html_generator.py
                index c14a28b4..29973412 100644
                --- a/modules/html_generator.py
                +++ b/modules/html_generator.py
                @@ -307,6 +307,7 @@ refresh_svg = '''{copy_svg}'
                 refresh_button = f''
                 
                +
                 def generate_instruct_html(history):
                     output = f'
                ' From 5d257397678e03694ded7eca2a9639d04368039b Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 14 Jan 2025 16:59:36 -0800 Subject: [PATCH 169/173] Make the update wizards nice --- update_wizard_linux.sh | 2 +- update_wizard_macos.sh | 2 +- update_wizard_windows.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/update_wizard_linux.sh b/update_wizard_linux.sh index 3ada9a1e..c81d9d9b 100755 --- a/update_wizard_linux.sh +++ b/update_wizard_linux.sh @@ -23,4 +23,4 @@ source "$CONDA_ROOT_PREFIX/etc/profile.d/conda.sh" # otherwise conda complains a conda activate "$INSTALL_ENV_DIR" # update installer env -python one_click.py --update-wizard && echo -e "\nDone!" +python one_click.py --update-wizard && echo -e "\nHave a great day!" diff --git a/update_wizard_macos.sh b/update_wizard_macos.sh index c5add61e..f58bb9e9 100755 --- a/update_wizard_macos.sh +++ b/update_wizard_macos.sh @@ -23,4 +23,4 @@ source "$CONDA_ROOT_PREFIX/etc/profile.d/conda.sh" # otherwise conda complains a conda activate "$INSTALL_ENV_DIR" # update installer env -python one_click.py --update-wizard && echo -e "\nDone!" +python one_click.py --update-wizard && echo -e "\nHave a great day!" diff --git a/update_wizard_windows.bat b/update_wizard_windows.bat index 2b23f322..fac251a7 100755 --- a/update_wizard_windows.bat +++ b/update_wizard_windows.bat @@ -30,7 +30,7 @@ call "%CONDA_ROOT_PREFIX%\condabin\conda.bat" activate "%INSTALL_ENV_DIR%" || ( @rem update installer env call python one_click.py --update-wizard && ( echo. - echo Done! + echo Have a great day! ) :end From 2344366c9b4d3869bfc24d4b2d79efa5c183450d Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:23:44 -0800 Subject: [PATCH 170/173] Remove a debug message --- js/global_scope_js.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/global_scope_js.js b/js/global_scope_js.js index f4d9c673..6bf0f0e3 100644 --- a/js/global_scope_js.js +++ b/js/global_scope_js.js @@ -23,7 +23,6 @@ function regenerateClick() { } function handleMorphdomUpdate(text) { - console.log("Morphing!"); morphdom( document.getElementById("chat").parentNode, "
                " + text + "
                ", From fe96678692a834783e4df523875a1ac6b998a18d Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:28:48 -0800 Subject: [PATCH 171/173] Update some comments in the requirements --- requirements.txt | 4 ++-- requirements_noavx2.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9bc5956a..18872431 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,13 +37,13 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -# llama-cpp-python (CUDA, no tensor cores) +# llama-cpp-python (CUDA, with GGML_CUDA_FORCE_MMQ) https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -# llama-cpp-python (CUDA, tensor cores) +# llama-cpp-python (CUDA, without GGML_CUDA_FORCE_MMQ) https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 1755ac24..69e497e0 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -37,13 +37,13 @@ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cp https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.3.6+cpuavx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" -# llama-cpp-python (CUDA, no tensor cores) +# llama-cpp-python (CUDA, with GGML_CUDA_FORCE_MMQ) https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda-0.3.6+cu121avx-cp310-cp310-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10" -# llama-cpp-python (CUDA, tensor cores) +# llama-cpp-python (CUDA, without GGML_CUDA_FORCE_MMQ) https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10" https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/textgen-webui/llama_cpp_python_cuda_tensorcores-0.3.6+cu121avx-cp311-cp311-linux_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11" From 0258a6f87793da90006045a3ed8e601c5b3c3897 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Thu, 16 Jan 2025 05:21:18 -0800 Subject: [PATCH 172/173] Fix the Google Colab notebook --- modules/block_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/block_requests.py b/modules/block_requests.py index 29fc6633..5a4b533f 100644 --- a/modules/block_requests.py +++ b/modules/block_requests.py @@ -40,7 +40,7 @@ def my_get(url, **kwargs): # Kindly provided by our friend WizardLM-30B def my_open(*args, **kwargs): filename = str(args[0]) - if filename.endswith('index.html'): + if filename.endswith(('index.html', 'share.html')): with original_open(*args, **kwargs) as f: file_contents = f.read() From 096272f49e55357a364ed9016357b97829dae0fd Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 17 Jan 2025 07:03:22 -0800 Subject: [PATCH 173/173] Update README --- .github/FUNDING.yml | 3 +-- README.md | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 7fd11138..e2e16212 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ -github: oobabooga -ko_fi: oobabooga +patreon: oobabooga diff --git a/README.md b/README.md index 7e2dec95..4b22f8d5 100644 --- a/README.md +++ b/README.md @@ -359,7 +359,7 @@ text-generation-webui └── llama-2-13b-chat.Q4_K_M.gguf ``` -* The remaining model types (like 16-bit transformers models and GPTQ models) are made of several files and must be placed in a subfolder. Example: +* The remaining model types (like 16-bit Transformers models and EXL2 models) are made of several files and must be placed in a subfolder. Example: ``` text-generation-webui @@ -400,3 +400,7 @@ https://colab.research.google.com/github/oobabooga/text-generation-webui/blob/ma ## Acknowledgment In August 2023, [Andreessen Horowitz](https://a16z.com/) (a16z) provided a generous grant to encourage and support my independent work on this project. I am **extremely** grateful for their trust and recognition. + +## ⭐ Featured Patreon Supporters + +* [Become the first one!](https://www.patreon.com/oobabooga)