30 Commits

Author SHA1 Message Date
adbb97ecc2 added desc_act option 2023-06-03 16:27:13 +02:00
b10c023810 next try adding patchelf installation
All checks were successful
Package Release / package_on_ubuntu (push) Has been cancelled
Package Release / package_on_windows (push) Has been cancelled
2023-05-27 15:27:17 +02:00
757debce3a trying nuitka with linux 2023-05-27 15:23:35 +02:00
a8f033ac5b switching to nuitka, fix removing build folders 2023-05-27 15:19:49 +02:00
a32aff730e fixes indentations 2023-05-27 15:10:37 +02:00
0cd44016f5 trying out nuitka on github actions 2023-05-27 15:09:44 +02:00
21930ba8e9 fixed ubuntu & Windows package creation 2023-05-27 13:38:52 +02:00
b96c0914ed Update package.yml 2023-05-27 13:36:45 +02:00
a07146e879 deleted venv
All checks were successful
Package Release / package (ubuntu-latest) (push) Has been cancelled
Package Release / package (windows-latest) (push) Has been cancelled
2023-05-27 13:21:57 +02:00
807dad51dd too tired to get it in one go 2023-05-27 11:12:04 +02:00
395c347020 mistake fixing 2023-05-27 11:11:16 +02:00
a75a8f42bc still trying to use venv for packaging p2 2023-05-27 11:10:35 +02:00
24e5876eff removed venv deletion for now. 2023-05-27 09:26:37 +02:00
c87e12d75a still trying to use venv for packaging p1 2023-05-27 09:08:07 +02:00
1ffd11eb5b copy & paste error
All checks were successful
Package Release / package (ubuntu-latest) (push) Has been cancelled
Package Release / package (windows-latest) (push) Has been cancelled
2023-05-27 08:21:56 +02:00
311cbfed75 fixing the leave venv 2023-05-27 08:20:29 +02:00
646b7419a5 trying venv to hopefully decrease the binary size 2023-05-27 08:12:41 +02:00
0fb9a42cc6 Update package.yml 2023-05-27 09:45:12 +02:00
b2f2a894c9 removed git commit compare, fixed startup if no nvidia_gpu was found. 2023-05-26 23:23:53 +02:00
ce9ef8f419 last try to fix this
All checks were successful
Package Release / package (ubuntu-latest) (push) Has been cancelled
Package Release / package (windows-latest) (push) Has been cancelled
2023-05-26 18:46:42 +02:00
db6ed71594 last try to fix this 2023-05-26 18:44:36 +02:00
86171f84d7 can't get this ***** fixed -.-
All checks were successful
Package Release / package (ubuntu-latest) (push) Has been cancelled
Package Release / package (windows-latest) (push) Has been cancelled
2023-05-26 15:45:34 +02:00
077669ea2e try fix github actions 2023-05-26 15:24:40 +02:00
25087b1e2d try fix github actions 2023-05-26 15:21:02 +02:00
5d755a302c try fix github actions 2023-05-26 15:20:27 +02:00
cc485f5342 try fix github actions 2023-05-26 15:15:05 +02:00
20c847a532 try fix github actions 2023-05-26 15:11:42 +02:00
ab514acc40 fix for the pyinstaller cmd? 2023-05-26 15:10:31 +02:00
f28f1f21f9 Raised Version to 1.6 2023-05-26 15:06:56 +02:00
c3696284fa made the update text-gen-webui update button to disappear if already at the newest commit 2023-05-26 15:04:39 +02:00
2 changed files with 86 additions and 37 deletions

View File

@@ -6,11 +6,8 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
package: package_on_ubuntu:
runs-on: self-hosted runs-on: ubuntu-selfhosted
strategy:
matrix:
os: [windows-latest, ubuntu-latest]
steps: steps:
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v3 uses: actions/setup-python@v3
@@ -20,19 +17,67 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Upgrade Pip
run: python -m pip install --upgrade pip
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install patchelf -y
pip install -r requirements.txt pip install -r requirements.txt
pip install pyinstaller pip install nuitka
sudo apt install patchelf
- name: Build and package - name: Build and package
run: python3 -m nuitka StartUI.py --onefile --enable-plugin=pyqt5 --product-version=1.6.0 --disable-console --include-data-files=webuiGUI.py=webuiGUI.py --output-dir=./dist --noinclude-pytest-mode=nofollow --noinclude-setuptools-mode=nofollow
- name: remove build folders
run: | run: |
pyinstaller --noconfirm --onefile --windowed StartUI.py rm -rf dist/StartUI.build
cp webuiGUI.py dist/ # Copy webuiGUI.py to the dist directory rm -rf dist/StartUI.dist
rm -rf dist/StartUI.onefile-build
- name: Executive permission
run: |
chmod +x dist/StartUI
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: ${{ matrix.os }}-binary-v1.5.1 name: ubuntu-binary-v1.6
path: dist path: dist
package_on_windows:
runs-on: windows-selfhosted
steps:
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: 3.x
- name: Checkout repository
uses: actions/checkout@v3
- name: Upgrade Pip
run: python -m pip install --upgrade pip
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install nuitka
- name: Build and package
run: nuitka StartUI.py --onefile --enable-plugin=pyqt5 --product-version=1.6.0 --disable-console --include-data-files=webuiGUI.py=webuiGUI.py --output-dir=./dist --noinclude-pytest-mode=nofollow --noinclude-setuptools-mode=nofollow
- name: remove build folders
run: |
Remove-Item -Recurse -Force ./dist/StartUI.build
Remove-Item -Recurse -Force ./dist/StartUI.dist
Remove-Item -Recurse -Force ./dist/StartUI.onefile-build
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: windows-binary-v1.6
path: dist

View File

@@ -1,16 +1,18 @@
import sys, os, gpustat, json, subprocess, platform, psutil, re, requests, darkdetect, qdarkstyle, time 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.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QDoubleValidator, QIntValidator from PyQt5.QtGui import QDoubleValidator, QIntValidator
from PyQt5.QtWidgets import QAction, QApplication, QCheckBox, QComboBox, QFileDialog, QFrame, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QListWidget, QListWidgetItem, QMainWindow, QMessageBox, QPushButton, QRadioButton, QSlider, QSpinBox, QToolBar, QVBoxLayout, QWidget
# For showing the current version and checking for updates # For showing the current version and checking for updates
version = "1.5.1" version = "1.6"
# Profile folder for loading and saving profiles. # Profile folder for loading and saving profiles.
profiles_folder = "./profiles" profiles_folder = "./profiles"
# Create the profile folder if it doesn't exist # Create the profile folder if it doesn't exist
os.makedirs(profiles_folder, exist_ok=True) os.makedirs(profiles_folder, exist_ok=True)
repo_path = "./text-generation-webui"
model_folder = "./text-generation-webui/models" 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"
@@ -221,6 +223,7 @@ class MainWindow(QMainWindow):
# |_| |_|\__,_|_|_| |_| \_/\_/ |_|_| |_|\__,_|\___/ \_/\_/ # # |_| |_|\__,_|_|_| |_| \_/\_/ |_|_| |_|\__,_|\___/ \_/\_/ #
# # # #
################################################################### ###################################################################
layout = QGridLayout() layout = QGridLayout()
layout.setColumnMinimumWidth(0, 350) layout.setColumnMinimumWidth(0, 350)
layout.setColumnMinimumWidth(3, 30) layout.setColumnMinimumWidth(3, 30)
@@ -418,21 +421,22 @@ class MainWindow(QMainWindow):
self.pre_layer_slider_value = [] self.pre_layer_slider_value = []
self.pre_layer_amount_max = 100 self.pre_layer_amount_max = 100
# 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. # 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.
for i, gpu in enumerate(gpu_stats): if nvidia_gpu:
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)
# Add horizontal line to seperate the Checkboxes # Add horizontal line to seperate the Checkboxes
line = QFrame() line = QFrame()
@@ -448,7 +452,7 @@ class MainWindow(QMainWindow):
# Deactivate Streaming Output # Deactivate Streaming Output
self.use_nostream_checkbox = QCheckBox("No Stream") self.use_nostream_checkbox = QCheckBox("No Stream")
self.use_nostream_checkbox.setToolTip("Don't stream the text output in real time. Increases Token/s by ~ 50%") self.use_nostream_checkbox.setToolTip("Don't stream the text output in real time. Increases Token/s by ~ 50%")
layout.addWidget(self.use_nostream_checkbox, 15 + (len(gpu_stats) * 2), 1) layout.addWidget(self.use_nostream_checkbox, 14 + (len(gpu_stats) * 2), 1)
# Load in full 16bit precision # Load in full 16bit precision
self.use_16bit_checkbox = QCheckBox("Load in 16bit") self.use_16bit_checkbox = QCheckBox("Load in 16bit")
@@ -539,11 +543,16 @@ class MainWindow(QMainWindow):
self.use_triton_checkbox.setToolTip("Use Triton for inference.") self.use_triton_checkbox.setToolTip("Use Triton for inference.")
layout.addWidget(self.use_triton_checkbox, 22 + (len(gpu_stats) * 2), 1) layout.addWidget(self.use_triton_checkbox, 22 + (len(gpu_stats) * 2), 1)
# Add desc_act option Checkbox
self.use_desc_act_checkbox = QCheckBox("Use desc_act")
self.use_desc_act_checkbox.setToolTip("For models that don\'t have a quantize_config.json, this parameter is used to define whether to set desc_act or not in BaseQuantizeConfig.")
layout.addWidget(self.use_desc_act_checkbox, 23 + (len(gpu_stats) * 2), 0)
# Add horizontal line to seperate the Checkboxes # Add horizontal line to seperate the Checkboxes
line = QFrame() line = QFrame()
line.setFrameShape(QFrame.HLine) line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken) line.setFrameShadow(QFrame.Sunken)
layout.addWidget(line, 23 + (len(gpu_stats) * 2), 0, 1, 3) layout.addWidget(line, 29 + (len(gpu_stats) * 2), 0, 1, 3)
# New GUI Options based on Toolbox Checkboxes. # New GUI Options based on Toolbox Checkboxes.
@@ -1858,6 +1867,10 @@ class MainWindow(QMainWindow):
if self.use_triton_checkbox.isChecked(): if self.use_triton_checkbox.isChecked():
command += " --triton" command += " --triton"
# if desc_act is checked
if self.use_desc_act_checkbox.isChecked():
command += " --desc_act"
# Adds the chosen extensions to the list of the command. # Adds the chosen extensions to the list of the command.
extensions = [self.extensions_list.item(i).text() for i in range(self.extensions_list.count()) if self.extensions_list.item(i).checkState() == Qt.Checked] extensions = [self.extensions_list.item(i).text() for i in range(self.extensions_list.count()) if self.extensions_list.item(i).checkState() == Qt.Checked]
if self.use_extensions_checkbox.isChecked(): if self.use_extensions_checkbox.isChecked():
@@ -1905,15 +1918,6 @@ class MainWindow(QMainWindow):
def on_update_button_clicked(self): def on_update_button_clicked(self):
run_cmd_with_conda(f"python {webui_file} --update && exit") run_cmd_with_conda(f"python {webui_file} --update && exit")
def load_profile(self, profile_file):
with open(profile_file, "r") as file:
try:
settings = json.load(file)
# Set the GUI elements based on the loaded settings...
except json.JSONDecodeError:
# Handle the case when the file is empty or not in valid JSON format
pass
def populate_profiles_dropdown(self): def populate_profiles_dropdown(self):
self.profiles_dropdown.clear() self.profiles_dropdown.clear()
profiles = [name for name in os.listdir(profiles_folder) if name.endswith(".json")] profiles = [name for name in os.listdir(profiles_folder) if name.endswith(".json")]