5 Commits

Author SHA1 Message Date
d1de11ecf4 removed the webuiGUI.py necessity, disable accelerate for windows (incompatible), remove some useless code (still learning) 2023-05-25 19:55:33 +02:00
b063f23e71 added save and load for accelerate. 2023-05-25 18:44:08 +02:00
58772e86f6 Added Accelerate 4bit options, made DeepSpeed disable for windows systems, added pip install accelerate if 8bit is used. 2023-05-25 18:36:34 +02:00
c8ed510030 raised version to 1.5.1 due to fixes in pre_loading
All checks were successful
Package Release / package (ubuntu-latest) (push) Has been cancelled
Package Release / package (windows-latest) (push) Has been cancelled
2023-05-23 18:33:34 +02:00
39b2f0c54d fixed pre_slayer slider crashing on changes 2023-05-22 07:45:06 +02:00
2 changed files with 251 additions and 107 deletions

View File

@@ -34,5 +34,5 @@ jobs:
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: ${{ matrix.os }}-binary-v1.5 name: ${{ matrix.os }}-binary-v1.5.1
path: dist path: dist

View File

@@ -1,10 +1,10 @@
import sys, os, gpustat, json, subprocess, platform, psutil, re, requests, darkdetect, qdarkstyle import sys, os, gpustat, json, subprocess, platform, psutil, re, requests, darkdetect, qdarkstyle, time
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QToolBar, QMessageBox, QAction, QMainWindow, QSpinBox, QLabel, QVBoxLayout, QComboBox, QSlider, QCheckBox, QLineEdit, QFileDialog, QPushButton, QWidget, QListWidget, QListWidgetItem, QGridLayout, QRadioButton, QFrame from PyQt5.QtWidgets import QApplication, QHBoxLayout, QToolBar, QMessageBox, QAction, QMainWindow, QSpinBox, QLabel, QVBoxLayout, QComboBox, QSlider, QCheckBox, QLineEdit, QFileDialog, QPushButton, QWidget, QListWidget, QListWidgetItem, QGridLayout, QRadioButton, QFrame
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QDoubleValidator, QIntValidator from PyQt5.QtGui import QDoubleValidator, QIntValidator
# For showing the current version and checking for updates # For showing the current version and checking for updates
version = "1.5" version = "1.5.1"
# Profile folder for loading and saving profiles. # Profile folder for loading and saving profiles.
profiles_folder = "./profiles" profiles_folder = "./profiles"
@@ -15,6 +15,12 @@ model_folder = "./text-generation-webui/models"
extensions_folder = "./text-generation-webui/extensions" extensions_folder = "./text-generation-webui/extensions"
loras_folder = "./text-generation-webui/loras" loras_folder = "./text-generation-webui/loras"
characters_folder = "./text-generation-webui/characters" characters_folder = "./text-generation-webui/characters"
if getattr(sys, 'frozen', False):
webui_file = sys._MEIPASS + '/webuiGUI.py'
else:
webui_file = 'webuiGUI.py'
# Get the current Max CPU threads to use, so the user can't exceed his thread count. # Get the current Max CPU threads to use, so the user can't exceed his thread count.
max_threads = psutil.cpu_count(logical=True) max_threads = psutil.cpu_count(logical=True)
@@ -50,6 +56,7 @@ def run_cmd_with_conda(cmd, env=None):
# Open a separate terminal window and execute the command # Open a separate terminal window and execute the command
subprocess.Popen(['start', 'cmd', '/k', full_cmd], shell=True, env=env) subprocess.Popen(['start', 'cmd', '/k', full_cmd], shell=True, env=env)
elif platform.system() == 'Linux': elif platform.system() == 'Linux':
# Define the necessary variables from the bash script # Define the necessary variables from the bash script
install_dir = os.path.dirname(os.path.abspath(__file__)) install_dir = os.path.dirname(os.path.abspath(__file__))
@@ -90,7 +97,14 @@ class MainWindow(QMainWindow):
def init_ui(self): def init_ui(self):
self.setWindowTitle(f'StartUI for oobabooga webui v{version}') self.setWindowTitle(f'StartUI for oobabooga webui v{version}')
# ToolBar ##########################################
# _____ _ ____ #
# |_ _|__ ___ | | | __ ) __ _ _ __ #
# | |/ _ \ / _ \| | | _ \ / _` | '__| #
# | | (_) | (_) | | | |_) | (_| | | #
# |_|\___/ \___/|_| |____/ \__,_|_| #
# #
##########################################
toolbar = QToolBar() toolbar = QToolBar()
toolbar.setMovable(False) toolbar.setMovable(False)
self.addToolBar(toolbar) self.addToolBar(toolbar)
@@ -100,28 +114,31 @@ class MainWindow(QMainWindow):
toolbar.addWidget(toolbar_label) toolbar.addWidget(toolbar_label)
# Deepspeed checkbox # Deepspeed checkbox
self.deepspeed_settings_checkbox = QCheckBox(" DeepSpeed ") self.deepspeed_settings_checkbox = QCheckBox("\tDeepSpeed\t")
self.deepspeed_settings_checkbox.setToolTip("Enables specific DeepSpeed Settings.")
self.deepspeed_settings_checkbox.setChecked(False) self.deepspeed_settings_checkbox.setChecked(False)
self.deepspeed_settings_checkbox.setToolTip("Enables Deepspeed Settings")
self.deepspeed_settings_checkbox.stateChanged.connect(self.on_deepspeed_settings_checkbox_stateChanged) self.deepspeed_settings_checkbox.stateChanged.connect(self.on_deepspeed_settings_checkbox_stateChanged)
toolbar.addWidget(self.deepspeed_settings_checkbox) toolbar.addWidget(self.deepspeed_settings_checkbox)
if platform.system() == 'Windows':
self.deepspeed_settings_checkbox.setEnabled(False)
self.deepspeed_settings_checkbox.setToolTip("DeepSpeed is not Supported in Windows.")
# llama.cpp checkbox # llama.cpp checkbox
self.llama_settings_checkbox = QCheckBox(" llama.cpp ") self.llama_settings_checkbox = QCheckBox("\tllama.cpp\t")
self.llama_settings_checkbox.setChecked(False) self.llama_settings_checkbox.setChecked(False)
self.llama_settings_checkbox.setToolTip("Enables llama.cpp Settings") self.llama_settings_checkbox.setToolTip("Enables llama.cpp Settings")
self.llama_settings_checkbox.stateChanged.connect(self.on_llama_settings_checkbox_stateChanged) self.llama_settings_checkbox.stateChanged.connect(self.on_llama_settings_checkbox_stateChanged)
toolbar.addWidget(self.llama_settings_checkbox) toolbar.addWidget(self.llama_settings_checkbox)
# FlexGen Checkbox # FlexGen Checkbox
self.flexgen_settings_checkbox = QCheckBox(" FlexGen ") self.flexgen_settings_checkbox = QCheckBox("\tFlexGen\t")
self.flexgen_settings_checkbox.setChecked(False) self.flexgen_settings_checkbox.setChecked(False)
self.flexgen_settings_checkbox.setToolTip("Enables FlexGen Settings") self.flexgen_settings_checkbox.setToolTip("Enables FlexGen Settings")
self.flexgen_settings_checkbox.stateChanged.connect(self.on_flexgen_settings_checkbox_stateChanged) self.flexgen_settings_checkbox.stateChanged.connect(self.on_flexgen_settings_checkbox_stateChanged)
toolbar.addWidget(self.flexgen_settings_checkbox) toolbar.addWidget(self.flexgen_settings_checkbox)
# RWKV Checkbox # RWKV Checkbox
self.rwkv_settings_checkbox = QCheckBox(" RWKV ") self.rwkv_settings_checkbox = QCheckBox("\tRWKV\t")
self.rwkv_settings_checkbox.setChecked(False) self.rwkv_settings_checkbox.setChecked(False)
self.rwkv_settings_checkbox.setVisible(False) self.rwkv_settings_checkbox.setVisible(False)
self.rwkv_settings_checkbox.setToolTip("Enables RWKV Settings") self.rwkv_settings_checkbox.setToolTip("Enables RWKV Settings")
@@ -129,13 +146,30 @@ class MainWindow(QMainWindow):
toolbar.addWidget(self.rwkv_settings_checkbox) toolbar.addWidget(self.rwkv_settings_checkbox)
# API Checkbox # API Checkbox
self.api_settings_checkbox = QCheckBox(" API ") self.api_settings_checkbox = QCheckBox("\tAPI\t")
self.api_settings_checkbox.setChecked(False) self.api_settings_checkbox.setChecked(False)
self.api_settings_checkbox.setToolTip("Enables API Settings") self.api_settings_checkbox.setToolTip("Enables API Settings")
self.api_settings_checkbox.stateChanged.connect(self.on_api_settings_checkbox_stateChanged) self.api_settings_checkbox.stateChanged.connect(self.on_api_settings_checkbox_stateChanged)
toolbar.addWidget(self.api_settings_checkbox) toolbar.addWidget(self.api_settings_checkbox)
# Menu Bar # Accelerate Checkbox
self.Accelerate_settings_checkbox = QCheckBox("\tAccelerate\t")
self.Accelerate_settings_checkbox.setChecked(False)
self.Accelerate_settings_checkbox.setToolTip("Enables API Settings")
self.Accelerate_settings_checkbox.stateChanged.connect(self.on_Accelerate_settings_checkbox_stateChanged)
toolbar.addWidget(self.Accelerate_settings_checkbox)
if platform.system() == 'Windows':
self.Accelerate_settings_checkbox.setEnabled(False)
self.Accelerate_settings_checkbox.setToolTip("Accelerate is not Supported in Windows.")
################################################
# __ __ ____ #
# | \/ | ___ _ __ _ _ | __ ) __ _ _ __ #
# | |\/| |/ _ \ '_ \| | | | | _ \ / _` | '__| #
# | | | | __/ | | | |_| | | |_) | (_| | | #
# |_| |_|\___|_| |_|\__,_| |____/ \__,_|_| #
# #
################################################
menu = self.menuBar() menu = self.menuBar()
# Main menu # Main menu
@@ -179,7 +213,14 @@ class MainWindow(QMainWindow):
report_bug_action.triggered.connect(self.on_report_bug_clicked) report_bug_action.triggered.connect(self.on_report_bug_clicked)
help_menu.addAction(report_bug_action) help_menu.addAction(report_bug_action)
# Main Window Layout, column width ###################################################################
# __ __ _ __ ___ _ #
# | \/ | __ _(_)_ __ \ \ / (_)_ __ __| | _____ __ #
# | |\/| |/ _` | | '_ \ \ \ /\ / /| | '_ \ / _` |/ _ \ \ /\ / / #
# | | | | (_| | | | | | \ V V / | | | | | (_| | (_) \ V V / #
# |_| |_|\__,_|_|_| |_| \_/\_/ |_|_| |_|\__,_|\___/ \_/\_/ #
# #
###################################################################
layout = QGridLayout() layout = QGridLayout()
layout.setColumnMinimumWidth(0, 350) layout.setColumnMinimumWidth(0, 350)
layout.setColumnMinimumWidth(3, 30) layout.setColumnMinimumWidth(3, 30)
@@ -216,7 +257,6 @@ class MainWindow(QMainWindow):
model_type_box.addWidget(self.model_type) model_type_box.addWidget(self.model_type)
layout.addLayout(model_type_box, 1, 0) layout.addLayout(model_type_box, 1, 0)
# Character # Character
character_box = QHBoxLayout() character_box = QHBoxLayout()
@@ -373,41 +413,26 @@ class MainWindow(QMainWindow):
self.ram_slider.valueChanged.connect(self.on_ram_slider_changed) self.ram_slider.valueChanged.connect(self.on_ram_slider_changed)
# Pre-layer Slider # Pre-layer Slider
# Check if Nvidia_gpu is enabled, if not, we don't need multiple pre_layer slider. self.pre_layer_labels = []
if nvidia_gpu: self.pre_layer_slider = []
self.pre_layer_labels = [] self.pre_layer_slider_value = []
self.pre_layer_slider = [] self.pre_layer_amount_max = 100
self.pre_layer_slider_value = [] # Don't get confused. With the latest changes, each GPU can have it's own pre_layer value. So we check again gpu_stats for the amount.
self.pre_layer_amount_max = 100 for i, gpu in enumerate(gpu_stats):
# Don't get confused. With the latest changes, each GPU can have it's own pre_layer value. So we check again gpu_stats for the amount. pre_layer_labels = QLabel(f"{gpu.name} Pre_Layer:")
for i, gpu in enumerate(gpu_stats): pre_layer_labels.setToolTip(f"The number of layers to allocate to the GPU.\nSetting this parameter enables CPU offloading for 4-bit models.\nFor multi-gpu, write the numbers separated by spaces, eg --pre_layer 30 60.")
pre_layer_labels = QLabel(f"{gpu.name} Pre_Layer:") layout.addWidget(pre_layer_labels, 11 + (len(gpu_stats) * 2) + i, 0)
pre_layer_labels.setToolTip(f"The number of layers to allocate to the GPU.\nSetting this parameter enables CPU offloading for 4-bit models.\nFor multi-gpu, write the numbers separated by spaces, eg --pre_layer 30 60.") self.pre_layer_labels.append(pre_layer_labels)
layout.addWidget(pre_layer_labels, 11 + (len(gpu_stats) * 2) + i, 0)
self.pre_layer_labels.append(pre_layer_labels)
pre_layer_sliders = QSlider(Qt.Horizontal) pre_layer_sliders = QSlider(Qt.Horizontal)
pre_layer_sliders.setMaximum(100) pre_layer_sliders.setMaximum(100)
pre_layer_sliders.valueChanged.connect(lambda value, idx=i: self.on_pre_layer_slider_changed(value, idx)) pre_layer_sliders.valueChanged.connect(lambda value, idx=i: self.on_pre_layer_slider_changed(value, idx))
layout.addWidget(pre_layer_sliders, 11 + (len(gpu_stats) * 2) + i, 1) layout.addWidget(pre_layer_sliders, 11 + (len(gpu_stats) * 2) + i, 1)
self.pre_layer_slider.append(pre_layer_sliders) self.pre_layer_slider.append(pre_layer_sliders)
pre_layer_sliders_value = QLabel("0") pre_layer_sliders_value = QLabel("0")
layout.addWidget(pre_layer_sliders_value, 11 + (len(gpu_stats) * 2) + i, 2) layout.addWidget(pre_layer_sliders_value, 11 + (len(gpu_stats) * 2) + i, 2)
self.pre_layer_slider_value.append(pre_layer_sliders_value) self.pre_layer_slider_value.append(pre_layer_sliders_value)
else:
self.pre_layer_slider = QSlider(Qt.Horizontal)
self.pre_layer_slider.setMinimum(0)
self.pre_layer_slider.setMaximum(100)
self.pre_layer_slider.setTickInterval(1)
self.pre_layer_slider.setSingleStep(1)
layout.addWidget(QLabel("Pre-layer:"), 11 + len(gpu_stats), 0)
self.pre_layer_slider.setToolTip("The number of layers to allocate to the GPU. Setting this parameter enables CPU offloading for 4-bit models.")
layout.addWidget(self.pre_layer_slider, 11 + len(gpu_stats), 1)
self.pre_layer_slider.valueChanged.connect(self.on_pre_layer_slider_changed)
self.pre_layer_value_label = QLabel("0")
layout.addWidget(self.pre_layer_value_label, 11 + len(gpu_stats), 2)
# Add horizontal line to seperate the Checkboxes # Add horizontal line to seperate the Checkboxes
line = QFrame() line = QFrame()
@@ -522,7 +547,14 @@ class MainWindow(QMainWindow):
# New GUI Options based on Toolbox Checkboxes. # New GUI Options based on Toolbox Checkboxes.
# Deepspeed ######################################################
# ____ ____ _ #
# | _ \ ___ ___ _ __/ ___| _ __ ___ ___ __| | #
# | | | |/ _ \/ _ \ '_ \___ \| '_ \ / _ \/ _ \/ _` | #
# | |_| | __/ __/ |_) |__) | |_) | __/ __/ (_| | #
# |____/ \___|\___| .__/____/| .__/ \___|\___|\__,_| #
# |_| |_| #
######################################################
# Deepspeed Header # Deepspeed Header
self.deepspeed_label_header = QLabel("Deepspeed Options:") self.deepspeed_label_header = QLabel("Deepspeed Options:")
@@ -601,7 +633,14 @@ class MainWindow(QMainWindow):
self.deepspeed_line.setVisible(False) self.deepspeed_line.setVisible(False)
layout.addWidget(self.deepspeed_line, 36 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(self.deepspeed_line, 36 + (len(gpu_stats) * 2), 0, 1, 3)
# llama.cpp #################################################
# _ _ #
# | | | __ _ _ __ ___ __ _ ___ _ __ _ __ #
# | | |/ _` | '_ ` _ \ / _` | / __| '_ \| '_ \ #
# | | | (_| | | | | | | (_| || (__| |_) | |_) | #
# |_|_|\__,_|_| |_| |_|\__,_(_)___| .__/| .__/ #
# |_| |_| #
#################################################
# llama.cpp Header # llama.cpp Header
self.llama_label_header = QLabel("llama.cpp Options:") self.llama_label_header = QLabel("llama.cpp Options:")
@@ -710,7 +749,14 @@ class MainWindow(QMainWindow):
self.llama_line.setVisible(False) self.llama_line.setVisible(False)
layout.addWidget(self.llama_line, 46 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(self.llama_line, 46 + (len(gpu_stats) * 2), 0, 1, 3)
# FlexGen Options ########################################
# _____ _ ____ #
# | ___| | _____ __/ ___| ___ _ __ #
# | |_ | |/ _ \ \/ / | _ / _ \ '_ \ #
# | _| | | __/> <| |_| | __/ | | | #
# |_| |_|\___/_/\_\\____|\___|_| |_| #
# #
########################################
# FlexGen Header Label # FlexGen Header Label
self.flexgen_header_label = QLabel("FlexGen Options") self.flexgen_header_label = QLabel("FlexGen Options")
@@ -810,7 +856,14 @@ class MainWindow(QMainWindow):
self.flexline.setVisible(False) self.flexline.setVisible(False)
layout.addWidget(self.flexline, 54 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(self.flexline, 54 + (len(gpu_stats) * 2), 0, 1, 3)
# RWKV Options ###################################
# ______ ___ ____ __ #
# | _ \ \ / / |/ /\ \ / / #
# | |_) \ \ /\ / /| ' / \ \ / / #
# | _ < \ V V / | . \ \ V / #
# |_| \_\ \_/\_/ |_|\_\ \_/ #
# #
###################################
# RWKV Header # RWKV Header
self.rwkv_header = QLabel("RWKV:") self.rwkv_header = QLabel("RWKV:")
@@ -865,7 +918,14 @@ class MainWindow(QMainWindow):
self.rwkv_line.setVisible(False) self.rwkv_line.setVisible(False)
layout.addWidget(self.rwkv_line, 65 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(self.rwkv_line, 65 + (len(gpu_stats) * 2), 0, 1, 3)
# API Options ######################
# _ ____ ___ #
# / \ | _ \_ _| #
# / _ \ | |_) | | #
# / ___ \| __/| | #
# /_/ \_\_| |___| #
# #
######################
# API Header Label # API Header Label
self.api_header = QLabel("API:") self.api_header = QLabel("API:")
@@ -878,7 +938,6 @@ class MainWindow(QMainWindow):
self.api_checkbox.setToolTip("Enable the API extension.") self.api_checkbox.setToolTip("Enable the API extension.")
self.api_checkbox.setVisible(False) self.api_checkbox.setVisible(False)
layout.addWidget(self.api_checkbox, 71 + (len(gpu_stats) * 2), 0) layout.addWidget(self.api_checkbox, 71 + (len(gpu_stats) * 2), 0)
#self.api_checkbox.stateChanged.connect(self.on_api_checkbox_changed)
# API blocking Port Checkbox # API blocking Port Checkbox
self.api_blocking_port_checkbox = QCheckBox("Change API Blocking Port") self.api_blocking_port_checkbox = QCheckBox("Change API Blocking Port")
@@ -919,12 +978,80 @@ class MainWindow(QMainWindow):
layout.addWidget(self.api_public_checkbox, 74 + (len(gpu_stats) * 2), 0) layout.addWidget(self.api_public_checkbox, 74 + (len(gpu_stats) * 2), 0)
self.api_public_checkbox.stateChanged.connect(self.on_api_public_checkbox_changed) self.api_public_checkbox.stateChanged.connect(self.on_api_public_checkbox_changed)
# Seperator for the Toolbox Options
self.toolboxapiline = QFrame()
self.toolboxapiline.setFrameShape(QFrame.HLine)
self.toolboxapiline.setFrameShadow(QFrame.Sunken)
self.toolboxapiline.setVisible(False)
layout.addWidget(self.toolboxapiline, 75 + (len(gpu_stats) * 2), 0, 1, 3)
#############################################################################
# _ _ _ _ _ _ _ _ #
# / \ ___ ___ ___| | ___ _ __ __ _| |_ ___ | || | | |__ (_) |_ #
# / _ \ / __/ __/ _ \ |/ _ \ '__/ _` | __/ _ \ | || |_ _____| '_ \| | __| #
# / ___ \ (_| (_| __/ | __/ | | (_| | || __/ |__ _|_____| |_) | | |_ #
# /_/ \_\___\___\___|_|\___|_| \__,_|\__\___| |_| |_.__/|_|\__| #
# #
#############################################################################
# Accelerate 4-bit Header
self.accelerate4bit_header = QLabel("Accelerate 4-bit:")
self.accelerate4bit_header.setVisible(False)
self.accelerate4bit_header.setToolTip("Accelerate 4-bit: Choose the settings to use for accelerating 4-bit models.")
layout.addWidget(self.accelerate4bit_header, 80 + (len(gpu_stats) * 2), 0)
# Accelerate 4-bit Checkbox
self.accelerate4bit_checkbox = QCheckBox("Load in 4-bit")
self.accelerate4bit_checkbox.setToolTip("Load the model with 4-bit precision (using bitsandbytes).")
self.accelerate4bit_checkbox.setVisible(False)
layout.addWidget(self.accelerate4bit_checkbox, 81 + (len(gpu_stats) * 2), 0)
# Compute type horizontal layout
compute_type_layout = QHBoxLayout()
# Compute type label
self.accelerate4bit_compute_type_label = QLabel("Compute Type:")
self.accelerate4bit_compute_type_label.setToolTip("The compute type to use for 4-bit acceleration.")
self.accelerate4bit_compute_type_label.setVisible(False)
compute_type_layout.addWidget(self.accelerate4bit_compute_type_label)
# Compute type dropdown
self.accelerate4bit_compute_type_dropdown = QComboBox()
self.accelerate4bit_compute_type_dropdown.setToolTip("The compute type to use for 4-bit acceleration.")
self.accelerate4bit_compute_type_dropdown.setVisible(False)
self.accelerate4bit_compute_type_dropdown.addItems([ "none", "bfloat16", "float16", "float32"])
compute_type_layout.addWidget(self.accelerate4bit_compute_type_dropdown)
layout.addLayout(compute_type_layout, 81 + (len(gpu_stats) * 2), 1)
# Quant Type Horizontal Box
quant_type_layout = QHBoxLayout()
# Quant type label
self.accelerate4bit_quant_type_label = QLabel("Quant Type:")
self.accelerate4bit_quant_type_label.setToolTip("The quantization type to use for 4-bit acceleration.")
self.accelerate4bit_quant_type_label.setVisible(False)
quant_type_layout.addWidget(self.accelerate4bit_quant_type_label)
# Quant type Dropdown
self.accelerate4bit_quant_type_dropdown = QComboBox()
self.accelerate4bit_quant_type_dropdown.setToolTip("The quantization type to use for 4-bit acceleration.")
self.accelerate4bit_quant_type_dropdown.setVisible(False)
self.accelerate4bit_quant_type_dropdown.addItems([ "none", "nf4", "fp4"])
quant_type_layout.addWidget(self.accelerate4bit_quant_type_dropdown)
layout.addLayout(quant_type_layout, 82 + (len(gpu_stats) * 2), 1)
# Use double quant checkbox
self.accelerate4bit_double_quant_checkbox = QCheckBox("Use Double Quant")
self.accelerate4bit_double_quant_checkbox.setToolTip("Use double quantization for 4-bit acceleration.")
self.accelerate4bit_double_quant_checkbox.setVisible(False)
layout.addWidget(self.accelerate4bit_double_quant_checkbox, 82 + (len(gpu_stats) * 2), 0)
# Seperator for the Toolbox Options # Seperator for the Toolbox Options
self.toolboxendline = QFrame() self.toolboxendline = QFrame()
self.toolboxendline.setFrameShape(QFrame.HLine) self.toolboxendline.setFrameShape(QFrame.HLine)
self.toolboxendline.setFrameShadow(QFrame.Sunken) self.toolboxendline.setFrameShadow(QFrame.Sunken)
self.toolboxendline.setVisible(False) self.toolboxendline.setVisible(False)
layout.addWidget(self.toolboxendline, 75 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(self.toolboxendline, 84 + (len(gpu_stats) * 2), 0, 1, 3)
# Authentication Box # Authentication Box
authentication_box = QHBoxLayout() authentication_box = QHBoxLayout()
@@ -946,7 +1073,7 @@ class MainWindow(QMainWindow):
self.choose_file_button.setToolTip("Choose a file to use for the authentication credentials. Credentials should be saved like:\nUSERNAME1:PASSWORD1\nUSERNAME2:PASSWORD2") self.choose_file_button.setToolTip("Choose a file to use for the authentication credentials. Credentials should be saved like:\nUSERNAME1:PASSWORD1\nUSERNAME2:PASSWORD2")
self.choose_file_button.clicked.connect(self.on_choose_file_button_clicked) self.choose_file_button.clicked.connect(self.on_choose_file_button_clicked)
authentication_box.addWidget(self.choose_file_button) authentication_box.addWidget(self.choose_file_button)
layout.addLayout(authentication_box, 80 + (len(gpu_stats) * 2), 0, 1, 3) layout.addLayout(authentication_box, 85 + (len(gpu_stats) * 2), 0, 1, 3)
# Extensions Selection Menu # Extensions Selection Menu
self.use_extensions_checkbox = QCheckBox("Use Extensions") self.use_extensions_checkbox = QCheckBox("Use Extensions")
@@ -1054,6 +1181,16 @@ class MainWindow(QMainWindow):
central_widget.setLayout(layout) central_widget.setLayout(layout)
self.setCentralWidget(central_widget) self.setCentralWidget(central_widget)
def on_Accelerate_settings_checkbox_stateChanged(self, state):
self.accelerate4bit_header.setVisible(state == Qt.Checked)
self.accelerate4bit_checkbox.setVisible(state == Qt.Checked)
self.accelerate4bit_compute_type_label.setVisible(state == Qt.Checked)
self.accelerate4bit_compute_type_dropdown.setVisible(state == Qt.Checked)
self.accelerate4bit_quant_type_label.setVisible(state == Qt.Checked)
self.accelerate4bit_quant_type_dropdown.setVisible(state == Qt.Checked)
self.accelerate4bit_double_quant_checkbox.setVisible(state == Qt.Checked)
self.toolboxendline.setVisible(state == Qt.Checked)
def on_api_public_checkbox_changed(self, state): def on_api_public_checkbox_changed(self, state):
self.api_streaming_port_SpinBox.setEnabled(False) self.api_streaming_port_SpinBox.setEnabled(False)
self.api_blocking_port_SpinBox.setEnabled(False) self.api_blocking_port_SpinBox.setEnabled(False)
@@ -1074,7 +1211,7 @@ class MainWindow(QMainWindow):
self.api_streaming_port_checkbox.setVisible(state == Qt.Checked) self.api_streaming_port_checkbox.setVisible(state == Qt.Checked)
self.api_streaming_port_SpinBox.setVisible(state == Qt.Checked) self.api_streaming_port_SpinBox.setVisible(state == Qt.Checked)
self.api_public_checkbox.setVisible(state == Qt.Checked) self.api_public_checkbox.setVisible(state == Qt.Checked)
self.toolboxendline.setVisible(state == Qt.Checked) self.toolboxapiline.setVisible(state == Qt.Checked)
def on_rwkv_settings_checkbox_stateChanged(self, state): def on_rwkv_settings_checkbox_stateChanged(self, state):
self.rwkv_header.setVisible(state == Qt.Checked) self.rwkv_header.setVisible(state == Qt.Checked)
@@ -1099,8 +1236,6 @@ class MainWindow(QMainWindow):
self.flexgen_pin_weight_label.setVisible(state == Qt.Checked) self.flexgen_pin_weight_label.setVisible(state == Qt.Checked)
self.flexgen_pin_weight_dropdown.setVisible(state == Qt.Checked) self.flexgen_pin_weight_dropdown.setVisible(state == Qt.Checked)
self.flexline.setVisible(state == Qt.Checked) self.flexline.setVisible(state == Qt.Checked)
#self.flexgen_line.setVisible(state == Qt.Checked)
#self.flexgen_line.setVisible(state == Qt.Checked)
def on_llama_settings_checkbox_stateChanged(self, state): def on_llama_settings_checkbox_stateChanged(self, state):
self.llama_label_header.setVisible(state == Qt.Checked) self.llama_label_header.setVisible(state == Qt.Checked)
@@ -1285,26 +1420,20 @@ class MainWindow(QMainWindow):
self.ram_value_label.setText(f"{value} GiB") self.ram_value_label.setText(f"{value} GiB")
def on_pre_layer_slider_changed(self, value, idx): def on_pre_layer_slider_changed(self, value, idx):
if nvidia_gpu: # Calculate the current total value of all sliders
# Calculate the current total value of all sliders total_value = sum(slider.value() for slider in self.pre_layer_slider)
total_value = sum(slider.value() for slider in self.pre_layer_slider)
# Check if the total value exceeds the maximum # Check if the total value exceeds the maximum
if total_value > self.pre_layer_amount_max: if total_value > self.pre_layer_amount_max:
# Calculate the maximum allowed value for the current slider # Calculate the maximum allowed value for the current slider
max_allowed_value = self.pre_layer_amount_max - (total_value - value) max_allowed_value = self.pre_layer_amount_max - (total_value - value)
# Adjust the value of the current slider if necessary # Adjust the value of the current slider if necessary
if value > max_allowed_value: if value > max_allowed_value:
self.pre_layer_slider[idx].setValue(max_allowed_value) self.pre_layer_slider[idx].setValue(max_allowed_value)
value = max_allowed_value value = max_allowed_value
else:
# Update the value label with the current value of the pre-layer slider
self.pre_layer_value_label.setText(str(value))
def on_pre_layer_slider_changed(self, value): self.pre_layer_slider_value[idx].setText(str(value))
# Update the value label with the current value of the pre-layer slider
self.pre_layer_value_label.setText(str(value))
def on_vram_slider_changed(self, value, gpu_idx): def on_vram_slider_changed(self, value, gpu_idx):
self.gpu_vram_labels[gpu_idx].setText(f"{value} GiB") self.gpu_vram_labels[gpu_idx].setText(f"{value} GiB")
@@ -1409,6 +1538,11 @@ class MainWindow(QMainWindow):
"sdp_attention": self.use_sdp_attention_checkbox.isChecked(), # Saves the state of the sdp_attention checkbox "sdp_attention": self.use_sdp_attention_checkbox.isChecked(), # Saves the state of the sdp_attention checkbox
"autogptq": self.use_autogptq_checkbox.isChecked(), # Saves the state of the autogptq checkbox "autogptq": self.use_autogptq_checkbox.isChecked(), # Saves the state of the autogptq checkbox
"triton": self.use_triton_checkbox.isChecked(), # Saves the state of the triton checkbox "triton": self.use_triton_checkbox.isChecked(), # Saves the state of the triton checkbox
"acceleration": self.Accelerate_settings_checkbox.isChecked(), # Saves the state of the Accelerate checkbox
"use_4bit": self.accelerate4bit_checkbox.isChecked(), # Saves the state of the accelerate4bit checkbox
"compute_dtype": self.accelerate4bit_compute_type_dropdown.currentText(), # Saves the state of the accelerate4bit_compute_type_dropdown
"quant_type": self.accelerate4bit_quant_type_dropdown.currentText(), # Saves the state of the accelerate4bit_quant_type_dropdown
"use_x2_quant": self.accelerate4bit_double_quant_checkbox.isChecked(), # Saves the state of the accelerate4bit_double_quant_checkbox
"deepspeed": self.deepspeed_settings_checkbox.isChecked(), # Saves the state of the deepspeed checkbox "deepspeed": self.deepspeed_settings_checkbox.isChecked(), # Saves the state of the deepspeed checkbox
"deepspeed_enabled": self.deepspeed_checkbox.isChecked(), # Saves the state of the deepspeed checkbox "deepspeed_enabled": self.deepspeed_checkbox.isChecked(), # Saves the state of the deepspeed checkbox
"deepspeed_gpu_num": self.deepspeed_gpu_num_spinbox.value(), # Saves the state of the deepspeed_gpu_num_spinbox "deepspeed_gpu_num": self.deepspeed_gpu_num_spinbox.value(), # Saves the state of the deepspeed_gpu_num_spinbox
@@ -1462,12 +1596,11 @@ class MainWindow(QMainWindow):
"loras": [self.lora_list.item(i).text() for i in range(self.lora_list.count()) if self.lora_list.item(i).checkState() == Qt.Checked] # Saves the chosen loras "loras": [self.lora_list.item(i).text() for i in range(self.lora_list.count()) if self.lora_list.item(i).checkState() == Qt.Checked] # Saves the chosen loras
} }
pre_layer_values = [slider.value() for slider in self.pre_layer_slider]
settings["prelayer"] = pre_layer_values
if nvidia_gpu: if nvidia_gpu:
settings["gpu_vram"] = [slider.value() for slider in self.gpu_vram_sliders] settings["gpu_vram"] = [slider.value() for slider in self.gpu_vram_sliders]
pre_layer_values = [slider.value() for slider in self.pre_layer_slider]
settings["prelayer"] = pre_layer_values
else:
settings["prelayer"] = self.pre_layer_value_label.text()
# Get the text entered in the text field # Get the text entered in the text field
profile_name = self.profile_name_textfield.text() profile_name = self.profile_name_textfield.text()
@@ -1479,7 +1612,6 @@ class MainWindow(QMainWindow):
def expression_check(self, command): def expression_check(self, command):
selected_model = self.model_dropdown.currentText() selected_model = self.model_dropdown.currentText()
#print(f"Selected model: {selected_model}")
# Use a regular expression to check if the selected model matches the pattern # Use a regular expression to check if the selected model matches the pattern
if re.search(r".*mpt.*7b", selected_model, re.IGNORECASE): if re.search(r".*mpt.*7b", selected_model, re.IGNORECASE):
@@ -1525,9 +1657,8 @@ class MainWindow(QMainWindow):
command += f" --model {chosen_model}" command += f" --model {chosen_model}"
# Add the chosen model type to the command # Add the chosen model type to the command
chosen_model_type = self.model_type.currentText()
if self.model_type.currentText() != "none" and self.model_dropdown.currentText() != "none": if self.model_type.currentText() != "none" and self.model_dropdown.currentText() != "none":
command += f" --model_type {chosen_model_type}" command += f" --model_type {self.model_type.currentText()}"
# Add loras to the command # Add loras to the command
loras = [self.lora_list.item(i).text() for i in range(self.lora_list.count()) if self.lora_list.item(i).checkState() == Qt.Checked] loras = [self.lora_list.item(i).text() for i in range(self.lora_list.count()) if self.lora_list.item(i).checkState() == Qt.Checked]
@@ -1536,22 +1667,18 @@ class MainWindow(QMainWindow):
command += f" --lora {' '.join(loras)}" command += f" --lora {' '.join(loras)}"
# Add Characters to the command # Add Characters to the command
chosen_characters = self.character_to_load.currentText()
if self.character_to_load.currentText() != "none": if self.character_to_load.currentText() != "none":
command += f" --character {chosen_characters}" command += f" --character {self.character_to_load.currentText()}"
print(chosen_characters)
# Adds wbits to the command, if not "none" # Adds wbits to the command, if not "none"
chosen_wbits = self.wbit_dropdown.currentText()
if self.wbit_dropdown.currentText() != "none": if self.wbit_dropdown.currentText() != "none":
if not self.cpu_radio_button.isChecked() and self.model_dropdown.currentText() != "none": if not self.cpu_radio_button.isChecked() and self.model_dropdown.currentText() != "none":
command += f" --wbits {chosen_wbits}" command += f" --wbits {self.wbit_dropdown.currentText()}"
# Adds Groupsize to the command, if not "none" # Adds Groupsize to the command, if not "none"
chosen_gsize = self.gsize_dropdown.currentText()
if self.gsize_dropdown.currentText() != "none": if self.gsize_dropdown.currentText() != "none":
if not self.cpu_radio_button.isChecked() and self.model_dropdown.currentText() != "none": if not self.cpu_radio_button.isChecked() and self.model_dropdown.currentText() != "none":
command += f" --groupsize {chosen_gsize}" command += f" --groupsize {self.gsize_dropdown.currentText()}"
# Add the chosen mode to the command (Chat, cai-chat, notebook) # Add the chosen mode to the command (Chat, cai-chat, notebook)
chosen_mode = self.mode_dropdown.currentText() chosen_mode = self.mode_dropdown.currentText()
@@ -1620,6 +1747,21 @@ class MainWindow(QMainWindow):
if self.use_quant_checkbox.isChecked(): if self.use_quant_checkbox.isChecked():
command += " --quant_attn" command += " --quant_attn"
# Accelerate 4-bit
# 4-bit usage
if self.accelerate4bit_checkbox.isChecked():
command += " --load-in-4bit"
if self.accelerate4bit_compute_type_dropdown.currentText() != "none":
command += f" --compute_dtype {self.accelerate4bit_compute_type_dropdown.currentText()}"
if self.accelerate4bit_quant_type_dropdown.currentText() != "none":
command += f" --quant_type {self.accelerate4bit_quant_type_dropdown.currentText()}"
if self.accelerate4bit_double_quant_checkbox.isChecked():
command += " --use_double_quant"
# Disable Cache # Disable Cache
if self.use_nocache_checkbox.isChecked(): if self.use_nocache_checkbox.isChecked():
command += " --no-cache" command += " --no-cache"
@@ -1655,13 +1797,9 @@ class MainWindow(QMainWindow):
command += f" --gradio-auth-path {self.choose_file_label.text()}" command += f" --gradio-auth-path {self.choose_file_label.text()}"
## Adds the Prelayer selection ## Adds the Prelayer selection
if nvidia_gpu: slider_values = [slider.value() for slider in self.pre_layer_slider]
slider_values = [slider.value() for slider in self.pre_layer_slider] if any(value > 0 for value in slider_values):
if any(value > 0 for value in slider_values): command += f" --pre_layer {' '.join(str(value) for value in slider_values if value > 0)}"
command += f" --pre_layer {' '.join(str(value) for value in slider_values if value > 0)}"
else:
if int(self.pre_layer_value_label.text()) > 0:
command += f" --pre_layer {self.pre_layer_value_label.text()}"
# IF sdp_attention is checked # IF sdp_attention is checked
if self.use_sdp_attention_checkbox.isChecked(): if self.use_sdp_attention_checkbox.isChecked():
@@ -1692,7 +1830,7 @@ class MainWindow(QMainWindow):
command += f" --api-streaming-port {self.api_streaming_port_SpinBox.text()}" command += f" --api-streaming-port {self.api_streaming_port_SpinBox.text()}"
# Just for debugging. # Just for debugging.
#print(f"Command generated: python webuiGUI.py {command}") print(f"Command generated: python {webui_file} {command}")
# Based on the Model that's chosen, we will take care of some necessary stuff. # Based on the Model that's chosen, we will take care of some necessary stuff.
# Starts the webui in the conda env with the user given Options # Starts the webui in the conda env with the user given Options
@@ -1711,13 +1849,16 @@ class MainWindow(QMainWindow):
QMessageBox.critical(self, "Error", message) QMessageBox.critical(self, "Error", message)
if not self.deepspeed_checkbox.isChecked(): if not self.deepspeed_checkbox.isChecked():
run_cmd_with_conda(f"python webuiGUI.py {command}") if self.use_8bit_checkbox.isChecked():
run_cmd_with_conda(f"pip install accelerate && python {webui_file} {command}")
else:
run_cmd_with_conda(f"python {webui_file} {command}")
if self.use_autoclose_checkbox.isChecked(): if self.use_autoclose_checkbox.isChecked():
sys.exit() sys.exit()
def on_update_button_clicked(self): def on_update_button_clicked(self):
run_cmd_with_conda("python webuiGUI.py --update && exit") run_cmd_with_conda(f"python {webui_file} --update && exit")
def load_profile(self, profile_file): def load_profile(self, profile_file):
with open(profile_file, "r") as file: with open(profile_file, "r") as file:
@@ -1770,6 +1911,11 @@ class MainWindow(QMainWindow):
self.use_sdp_attention_checkbox.setChecked(settings.get("sdp_attention", False)) self.use_sdp_attention_checkbox.setChecked(settings.get("sdp_attention", False))
self.use_autogptq_checkbox.setChecked(settings.get("autogptq", False)) self.use_autogptq_checkbox.setChecked(settings.get("autogptq", False))
self.use_triton_checkbox.setChecked(settings.get("triton", False)) self.use_triton_checkbox.setChecked(settings.get("triton", False))
self.Accelerate_settings_checkbox.setChecked(settings.get("acceleration", False))
self.accelerate4bit_checkbox.setChecked(settings.get("use_4bit", False))
self.accelerate4bit_compute_type_dropdown.setCurrentText(settings.get("compute_dtype", ""))
self.accelerate4bit_quant_type_dropdown.setCurrentText(settings.get("quant_type", ""))
self.accelerate4bit_double_quant_checkbox.setChecked(settings.get("use_x2_quant", False))
self.deepspeed_settings_checkbox.setChecked(settings.get("deepspeed", False)) self.deepspeed_settings_checkbox.setChecked(settings.get("deepspeed", False))
self.deepspeed_checkbox.setChecked(settings.get("deepspeed_enabled", False)) self.deepspeed_checkbox.setChecked(settings.get("deepspeed_enabled", False))
self.deepspeed_gpu_num_spinbox.setValue(int(settings.get("deepspeed_gpu_num", 0))) self.deepspeed_gpu_num_spinbox.setValue(int(settings.get("deepspeed_gpu_num", 0)))
@@ -1815,16 +1961,14 @@ class MainWindow(QMainWindow):
self.authentication_checkbox.setChecked(settings.get("authentication", False)) self.authentication_checkbox.setChecked(settings.get("authentication", False))
self.choose_file_label.setText(settings.get("authentication_file", "")) self.choose_file_label.setText(settings.get("authentication_file", ""))
self.character_to_load.setCurrentText(settings.get("character", "")) self.character_to_load.setCurrentText(settings.get("character", ""))
#self.pre_layer_slider.setValue(int(settings.get("prelayer", 0)))
self.use_autolaunch_checkbox.setChecked(settings.get("autolaunch", False)) self.use_autolaunch_checkbox.setChecked(settings.get("autolaunch", False))
self.use_network_checkbox.setChecked(settings.get("listen", False)) self.use_network_checkbox.setChecked(settings.get("listen", False))
if nvidia_gpu: if "prelayer" in settings:
if "prelayer" in settings: pre_layer_values = settings["prelayer"]
pre_layer_values = settings["prelayer"] for i, value in enumerate(pre_layer_values):
for i, value in enumerate(pre_layer_values): self.pre_layer_slider[i].setValue(value)
self.pre_layer_slider[i].setValue(value)
else:
self.pre_layer_slider.setValue(int(settings.get("prelayer", 0)))
if nvidia_gpu: if nvidia_gpu:
gpu_vram_settings = settings.get("gpu_vram", []) gpu_vram_settings = settings.get("gpu_vram", [])