refactor: move functions out of AutoGGUF

- debloat AutoGGUF
- localize some GGUF split strings
This commit is contained in:
BuildTools 2024-09-15 12:31:34 -07:00
parent 79c74bb54a
commit 1133422456
No known key found for this signature in database
GPG Key ID: 3270C066C15D530B
5 changed files with 106 additions and 86 deletions

View File

@ -5,7 +5,7 @@
import urllib.request import urllib.request
from datetime import datetime from datetime import datetime
from functools import partial, wraps from functools import partial, wraps
from typing import Any, Dict, List, Tuple from typing import Any, Dict, List
from PySide6.QtCore import * from PySide6.QtCore import *
from PySide6.QtGui import * from PySide6.QtGui import *
@ -66,6 +66,8 @@ def __init__(self, args: List[str]) -> None:
init_timer = QElapsedTimer() init_timer = QElapsedTimer()
init_timer.start() init_timer.start()
self.parse_resolution = ui_update.parse_resolution.__get__(self)
width, height = self.parse_resolution() width, height = self.parse_resolution()
self.logger = Logger("AutoGGUF", "logs") self.logger = Logger("AutoGGUF", "logs")
@ -87,7 +89,7 @@ def __init__(self, args: List[str]) -> None:
self.resize_factor = float( self.resize_factor = float(
os.environ.get("AUTOGGUF_RESIZE_FACTOR", 1.1) os.environ.get("AUTOGGUF_RESIZE_FACTOR", 1.1)
) # 10% increase/decrease ) # 10% increase/decrease
self.default_width, self.default_height = self.parse_resolution() self.default_width, self.default_height = width, height
self.resize(self.default_width, self.default_height) self.resize(self.default_width, self.default_height)
ensure_directory(os.path.abspath(self.output_dir_name)) ensure_directory(os.path.abspath(self.output_dir_name))
@ -157,6 +159,13 @@ def __init__(self, args: List[str]) -> None:
self.browse_hf_outfile = ui_update.browse_hf_outfile.__get__(self) self.browse_hf_outfile = ui_update.browse_hf_outfile.__get__(self)
self.browse_hf_model_input = ui_update.browse_hf_model_input.__get__(self) self.browse_hf_model_input = ui_update.browse_hf_model_input.__get__(self)
self.browse_base_model = ui_update.browse_base_model.__get__(self) self.browse_base_model = ui_update.browse_base_model.__get__(self)
self.reset_size = ui_update.reset_size.__get__(self)
self.resize_window = partial(ui_update.resize_window, self)
self.show_detailed_stats_std = partial(GPUMonitor.show_detailed_stats_std, self)
self.show_cpu_graph = partial(GPUMonitor.show_cpu_graph, self)
self.show_ram_graph = partial(GPUMonitor.show_ram_graph, self)
self.rename_model = partial(utils.rename_model, self)
self.show_model_context_menu = partial(utils.show_model_context_menu, self)
# Set up main widget and layout # Set up main widget and layout
main_widget = QWidget() main_widget = QWidget()
@ -276,9 +285,9 @@ def __init__(self, args: List[str]) -> None:
# Split options # Split options
split_options_layout = QHBoxLayout() split_options_layout = QHBoxLayout()
self.split_max_size = QLineEdit() self.split_max_size = QLineEdit()
self.split_max_size.setPlaceholderText("Size in G/M") self.split_max_size.setPlaceholderText(SIZE_IN_UNITS)
self.split_max_tensors = QLineEdit() self.split_max_tensors = QLineEdit()
self.split_max_tensors.setPlaceholderText("Number of tensors") self.split_max_tensors.setPlaceholderText(NUMBER_OF_TENSORS)
split_options_layout.addWidget(QLabel(SPLIT_MAX_SIZE)) split_options_layout.addWidget(QLabel(SPLIT_MAX_SIZE))
split_options_layout.addWidget(self.split_max_size) split_options_layout.addWidget(self.split_max_size)
split_options_layout.addWidget(QLabel(SPLIT_MAX_TENSORS)) split_options_layout.addWidget(QLabel(SPLIT_MAX_TENSORS))
@ -1020,58 +1029,12 @@ def __init__(self, args: List[str]) -> None:
self.logger.info(AUTOGGUF_INITIALIZATION_COMPLETE) self.logger.info(AUTOGGUF_INITIALIZATION_COMPLETE)
self.logger.info(STARTUP_ELASPED_TIME.format(init_timer.elapsed())) self.logger.info(STARTUP_ELASPED_TIME.format(init_timer.elapsed()))
def show_ram_graph(self, event) -> None: def resizeEvent(self, event) -> None:
self.show_detailed_stats(RAM_USAGE_OVER_TIME, self.ram_data) super().resizeEvent(event)
path = QPainterPath()
def show_cpu_graph(self, event) -> None: path.addRoundedRect(self.rect(), 10, 10)
self.show_detailed_stats(CPU_USAGE_OVER_TIME, self.cpu_data) mask = QRegion(path.toFillPolygon().toPolygon())
self.setMask(mask)
def show_detailed_stats(self, title, data) -> None:
dialog = QDialog(self)
dialog.setWindowTitle(title)
dialog.setMinimumSize(800, 600)
layout = QVBoxLayout(dialog)
graph = SimpleGraph(title)
layout.addWidget(graph)
def update_graph_data() -> None:
graph.update_data(data)
timer = QTimer(dialog)
timer.timeout.connect(update_graph_data)
timer.start(200) # Update every 0.2 seconds
dialog.exec()
def show_model_context_menu(self, position):
item = self.model_tree.itemAt(position)
if item:
# Child of a sharded model or top-level item without children
if item.parent() is not None or item.childCount() == 0:
menu = QMenu()
rename_action = menu.addAction(RENAME)
delete_action = menu.addAction(DELETE)
action = menu.exec(self.model_tree.viewport().mapToGlobal(position))
if action == rename_action:
self.rename_model(item)
elif action == delete_action:
self.delete_model(item)
def rename_model(self, item):
old_name = item.text(0)
new_name, ok = QInputDialog.getText(self, RENAME, f"New name for {old_name}:")
if ok and new_name:
old_path = os.path.join(self.models_input.text(), old_name)
new_path = os.path.join(self.models_input.text(), new_name)
try:
os.rename(old_path, new_path)
item.setText(0, new_name)
self.logger.info(MODEL_RENAMED_SUCCESSFULLY.format(old_name, new_name))
except Exception as e:
show_error(self.logger, f"Error renaming model: {e}")
def delete_model(self, item): def delete_model(self, item):
model_name = item.text(0) model_name = item.text(0)
@ -1230,34 +1193,6 @@ def keyPressEvent(self, event) -> None:
self.reset_size() self.reset_size()
super().keyPressEvent(event) super().keyPressEvent(event)
def resize_window(self, larger) -> None:
factor = 1.1 if larger else 1 / 1.1
current_width = self.width()
current_height = self.height()
new_width = int(current_width * factor)
new_height = int(current_height * factor)
self.resize(new_width, new_height)
def reset_size(self) -> None:
self.resize(self.default_width, self.default_height)
def parse_resolution(self) -> Tuple[int, int]:
res = os.environ.get("AUTOGGUF_RESOLUTION", "1650x1100")
try:
width, height = map(int, res.split("x"))
if width <= 0 or height <= 0:
raise ValueError
return width, height
except (ValueError, AttributeError):
return 1650, 1100
def resizeEvent(self, event) -> None:
super().resizeEvent(event)
path = QPainterPath()
path.addRoundedRect(self.rect(), 10, 10)
mask = QRegion(path.toFillPolygon().toPolygon())
self.setMask(mask)
def refresh_backends(self) -> None: def refresh_backends(self) -> None:
self.logger.info(REFRESHING_BACKENDS) self.logger.info(REFRESHING_BACKENDS)
llama_bin = os.path.abspath("llama_bin") llama_bin = os.path.abspath("llama_bin")

View File

@ -22,6 +22,8 @@
VRAM_USAGE_OVER_TIME, VRAM_USAGE_OVER_TIME,
NO_GPU_DETECTED, NO_GPU_DETECTED,
AMD_GPU_NOT_SUPPORTED, AMD_GPU_NOT_SUPPORTED,
CPU_USAGE_OVER_TIME,
RAM_USAGE_OVER_TIME,
) )
from ui_update import animate_bar from ui_update import animate_bar
@ -169,6 +171,31 @@ def mouseDoubleClickEvent(self, event) -> None:
if self.handles: if self.handles:
self.show_detailed_stats() self.show_detailed_stats()
def show_ram_graph(self, event) -> None:
self.show_detailed_stats_std(RAM_USAGE_OVER_TIME, self.ram_data)
def show_cpu_graph(self, event) -> None:
self.show_detailed_stats_std(CPU_USAGE_OVER_TIME, self.cpu_data)
def show_detailed_stats_std(self, title, data) -> None:
dialog = QDialog(self)
dialog.setWindowTitle(title)
dialog.setMinimumSize(800, 600)
layout = QVBoxLayout(dialog)
graph = SimpleGraph(title)
layout.addWidget(graph)
def update_graph_data() -> None:
graph.update_data(data)
timer = QTimer(dialog)
timer.timeout.connect(update_graph_data)
timer.start(200) # Update every 0.2 seconds
dialog.exec()
def show_detailed_stats(self) -> None: def show_detailed_stats(self) -> None:
dialog = QDialog(self) dialog = QDialog(self)
dialog.setWindowTitle(GPU_DETAILS) dialog.setWindowTitle(GPU_DETAILS)

View File

@ -409,6 +409,8 @@ def __init__(self):
self.SPLIT_GGUF_TASK_FINISHED = "GGUF Split task finished" self.SPLIT_GGUF_TASK_FINISHED = "GGUF Split task finished"
self.SPLIT_GGUF_COMMAND = "GGUF Split Command" self.SPLIT_GGUF_COMMAND = "GGUF Split Command"
self.SPLIT_GGUF_ERROR = "Error starting GGUF split" self.SPLIT_GGUF_ERROR = "Error starting GGUF split"
self.NUMBER_OF_TENSORS = "Number of tensors"
self.SIZE_IN_UNITS = "Size in G/M"
# Model actions # Model actions
self.CONFIRM_DELETE = "Confirm Delete" self.CONFIRM_DELETE = "Confirm Delete"

View File

@ -1,12 +1,38 @@
from typing import Tuple
import psutil
from PySide6.QtCore import QTimer from PySide6.QtCore import QTimer
from PySide6.QtGui import Qt from PySide6.QtGui import Qt
from PySide6.QtWidgets import QFileDialog, QLabel from PySide6.QtWidgets import QFileDialog, QLabel
from Localizations import * from Localizations import *
import psutil
from error_handling import show_error from error_handling import show_error
def resize_window(self, larger) -> None:
factor = 1.1 if larger else 1 / 1.1
current_width = self.width()
current_height = self.height()
new_width = int(current_width * factor)
new_height = int(current_height * factor)
self.resize(new_width, new_height)
def reset_size(self) -> None:
self.resize(self.default_width, self.default_height)
def parse_resolution(self) -> Tuple[int, int]:
res = os.environ.get("AUTOGGUF_RESOLUTION", "1650x1100")
try:
width, height = map(int, res.split("x"))
if width <= 0 or height <= 0:
raise ValueError
return width, height
except (ValueError, AttributeError):
return 1650, 1100
def browse_base_model(self) -> None: def browse_base_model(self) -> None:
self.logger.info(BROWSING_FOR_BASE_MODEL_FOLDER) # Updated log message self.logger.info(BROWSING_FOR_BASE_MODEL_FOLDER) # Updated log message
base_model_folder = QFileDialog.getExistingDirectory(self, SELECT_BASE_MODEL_FOLDER) base_model_folder = QFileDialog.getExistingDirectory(self, SELECT_BASE_MODEL_FOLDER)

View File

@ -2,7 +2,7 @@
import requests import requests
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
from PySide6.QtWidgets import QFileDialog from PySide6.QtWidgets import QFileDialog, QInputDialog, QMenu
from DownloadThread import DownloadThread from DownloadThread import DownloadThread
from Localizations import * from Localizations import *
@ -11,6 +11,36 @@
from KVOverrideEntry import KVOverrideEntry from KVOverrideEntry import KVOverrideEntry
def show_model_context_menu(self, position):
item = self.model_tree.itemAt(position)
if item:
# Child of a sharded model or top-level item without children
if item.parent() is not None or item.childCount() == 0:
menu = QMenu()
rename_action = menu.addAction(RENAME)
delete_action = menu.addAction(DELETE)
action = menu.exec(self.model_tree.viewport().mapToGlobal(position))
if action == rename_action:
self.rename_model(item)
elif action == delete_action:
self.delete_model(item)
def rename_model(self, item):
old_name = item.text(0)
new_name, ok = QInputDialog.getText(self, RENAME, f"New name for {old_name}:")
if ok and new_name:
old_path = os.path.join(self.models_input.text(), old_name)
new_path = os.path.join(self.models_input.text(), new_name)
try:
os.rename(old_path, new_path)
item.setText(0, new_name)
self.logger.info(MODEL_RENAMED_SUCCESSFULLY.format(old_name, new_name))
except Exception as e:
show_error(self.logger, f"Error renaming model: {e}")
def add_kv_override(self, override_string=None) -> None: def add_kv_override(self, override_string=None) -> None:
entry = KVOverrideEntry() entry = KVOverrideEntry()
entry.deleted.connect(self.remove_kv_override) entry.deleted.connect(self.remove_kv_override)