feat(config): add configuration options

- add more configuration options for AUTOGGUF_MODEL_DIR_NAME, AUTOGGUF_OUTPUT_DIR_NAME, and AUTOGGUF_RESIZE_FACTOR (these get created on startup)
- move some UI helper funtions out of AutoGGUF.py and into ui_update and Ta
- optimize imports for utility classes
- fix some missing imports
This commit is contained in:
BuildTools 2024-08-25 15:11:36 -07:00
parent 86d7bbba2d
commit fec22adc58
No known key found for this signature in database
GPG Key ID: 3270C066C15D530B
9 changed files with 76 additions and 80 deletions

View File

@ -49,12 +49,20 @@ def __init__(self, args: List[str]) -> None:
load_dotenv() # Loads the .env file load_dotenv() # Loads the .env file
self.resize_factor = 1.1 # 10% increase/decrease # Configuration
self.model_dir_name = os.environ.get("AUTOGGUF_MODEL_DIR_NAME", "models")
self.output_dir_name = os.environ.get(
"AUTOGGUF_OUTPUT_DIR_NAME", "quantized_models"
)
self.resize_factor = float(
os.environ.get("AUTOGGUF_RESIZE_FACTOR", 1.1)
) # 10% increase/decrease
self.default_width, self.default_height = self.parse_resolution() self.default_width, self.default_height = self.parse_resolution()
self.resize(self.default_width, self.default_height) self.resize(self.default_width, self.default_height)
ensure_directory(os.path.abspath("quantized_models")) ensure_directory(os.path.abspath(self.output_dir_name))
ensure_directory(os.path.abspath("models")) ensure_directory(os.path.abspath(self.model_dir_name))
# References # References
self.update_base_model_visibility = partial( self.update_base_model_visibility = partial(
@ -85,6 +93,9 @@ def __init__(self, args: List[str]) -> None:
self.browse_imatrix = utils.browse_imatrix.__get__(self) self.browse_imatrix = utils.browse_imatrix.__get__(self)
self.get_models_data = utils.get_models_data.__get__(self) self.get_models_data = utils.get_models_data.__get__(self)
self.get_tasks_data = utils.get_tasks_data.__get__(self) self.get_tasks_data = utils.get_tasks_data.__get__(self)
self.cancel_task = partial(TaskListItem.cancel_task, self)
self.delete_task = partial(TaskListItem.delete_task, self)
self.toggle_gpu_offload_auto = partial(ui_update.toggle_gpu_offload_auto, self)
self.update_threads_spinbox = partial(ui_update.update_threads_spinbox, self) self.update_threads_spinbox = partial(ui_update.update_threads_spinbox, self)
self.update_threads_slider = partial(ui_update.update_threads_slider, self) self.update_threads_slider = partial(ui_update.update_threads_slider, self)
self.update_gpu_offload_spinbox = partial( self.update_gpu_offload_spinbox = partial(
@ -238,7 +249,7 @@ def __init__(self, args: List[str]) -> None:
# Models path # Models path
models_layout = QHBoxLayout() models_layout = QHBoxLayout()
self.models_input = QLineEdit(os.path.abspath("models")) self.models_input = QLineEdit(os.path.abspath(self.model_dir_name))
models_button = QPushButton(BROWSE) models_button = QPushButton(BROWSE)
models_button.clicked.connect(self.browse_models) models_button.clicked.connect(self.browse_models)
models_layout.addWidget(QLabel(MODELS_PATH)) models_layout.addWidget(QLabel(MODELS_PATH))
@ -248,7 +259,7 @@ def __init__(self, args: List[str]) -> None:
# Output path # Output path
output_layout = QHBoxLayout() output_layout = QHBoxLayout()
self.output_input = QLineEdit(os.path.abspath("quantized_models")) self.output_input = QLineEdit(os.path.abspath(self.output_dir_name))
output_button = QPushButton(BROWSE) output_button = QPushButton(BROWSE)
output_button.clicked.connect(self.browse_output) output_button.clicked.connect(self.browse_output)
output_layout.addWidget(QLabel(OUTPUT_PATH)) output_layout.addWidget(QLabel(OUTPUT_PATH))
@ -1196,11 +1207,6 @@ def show_task_properties(self, item) -> None:
model_info_dialog.exec() model_info_dialog.exec()
break break
def toggle_gpu_offload_auto(self, state) -> None:
is_auto = state == Qt.CheckState.Checked
self.gpu_offload_slider.setEnabled(not is_auto)
self.gpu_offload_spinbox.setEnabled(not is_auto)
def cancel_task_by_item(self, item) -> None: def cancel_task_by_item(self, item) -> None:
task_item = self.task_list.itemWidget(item) task_item = self.task_list.itemWidget(item)
for thread in self.quant_threads: for thread in self.quant_threads:
@ -1210,31 +1216,6 @@ def cancel_task_by_item(self, item) -> None:
self.quant_threads.remove(thread) self.quant_threads.remove(thread)
break break
def cancel_task(self, item) -> None:
self.logger.info(CANCELLING_TASK.format(item.text()))
self.cancel_task_by_item(item)
def delete_task(self, item) -> None:
self.logger.info(DELETING_TASK.format(item.text()))
# Cancel the task first
self.cancel_task_by_item(item)
reply = QMessageBox.question(
self,
CONFIRM_DELETION_TITLE,
CONFIRM_DELETION,
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
QMessageBox.StandardButton.No,
)
if reply == QMessageBox.StandardButton.Yes:
task_item = self.task_list.itemWidget(item)
row = self.task_list.row(item)
self.task_list.takeItem(row)
if task_item:
task_item.deleteLater()
def create_label(self, text, tooltip) -> QLabel: def create_label(self, text, tooltip) -> QLabel:
label = QLabel(text) label = QLabel(text)
label.setToolTip(tooltip) label.setToolTip(tooltip)

View File

@ -2,7 +2,7 @@
import zipfile import zipfile
import requests import requests
from PySide6.QtCore import * from PySide6.QtCore import QThread, Signal
class DownloadThread(QThread): class DownloadThread(QThread):

View File

@ -1,4 +1,4 @@
from PySide6.QtWidgets import * from PySide6.QtWidgets import QVBoxLayout, QTextEdit, QDialog, QPushButton
class ModelInfoDialog(QDialog): class ModelInfoDialog(QDialog):

View File

@ -1,10 +1,11 @@
import os
import signal import signal
import subprocess import subprocess
from PySide6.QtCore import * from PySide6.QtCore import Signal, QThread
from imports_and_globals import open_file_safe from imports_and_globals import open_file_safe
from Localizations import * from Localizations import IN_PROGRESS, COMPLETED
class QuantizationThread(QThread): class QuantizationThread(QThread):

View File

@ -1,6 +1,13 @@
from PySide6.QtCore import * from PySide6.QtCore import *
from PySide6.QtWidgets import * from PySide6.QtWidgets import *
from Localizations import (
DELETING_TASK,
CANCELLING_TASK,
CONFIRM_DELETION_TITLE,
CONFIRM_DELETION,
)
class TaskListItem(QWidget): class TaskListItem(QWidget):
def __init__( def __init__(
@ -30,6 +37,31 @@ def __init__(
self.progress_timer.timeout.connect(self.update_progress) self.progress_timer.timeout.connect(self.update_progress)
self.progress_value = 0 self.progress_value = 0
def cancel_task(self, item) -> None:
self.logger.info(CANCELLING_TASK.format(item.text()))
self.cancel_task_by_item(item)
def delete_task(self, item) -> None:
self.logger.info(DELETING_TASK.format(item.text()))
# Cancel the task first
self.cancel_task_by_item(item)
reply = QMessageBox.question(
self,
CONFIRM_DELETION_TITLE,
CONFIRM_DELETION,
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
QMessageBox.StandardButton.No,
)
if reply == QMessageBox.StandardButton.Yes:
task_item = self.task_list.itemWidget(item)
row = self.task_list.row(item)
self.task_list.takeItem(row)
if task_item:
task_item.deleteLater()
def update_status(self, status) -> None: def update_status(self, status) -> None:
self.status = status self.status = status
self.status_label.setText(status) self.status_label.setText(status)

View File

@ -1,44 +1,9 @@
import os
import sys import sys
from typing import TextIO, Union from typing import TextIO, Union
import psutil
import subprocess
import time
import signal
import json
import platform
import requests
import zipfile
from datetime import datetime
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QApplication,
QMainWindow,
QVBoxLayout,
QHBoxLayout,
QWidget,
QPushButton,
QListWidget,
QLineEdit,
QLabel,
QFileDialog,
QProgressBar,
QComboBox,
QTextEdit,
QCheckBox,
QGroupBox,
QFormLayout,
QScrollArea,
QSlider,
QSpinBox,
QListWidgetItem,
QMessageBox, QMessageBox,
QDialog,
QPlainTextEdit,
QMenu,
) )
from PySide6.QtCore import QTimer, Signal, QThread, Qt, QSize
from PySide6.QtGui import QCloseEvent, QAction
from Localizations import * from Localizations import *

View File

@ -1,7 +1,18 @@
import json import json
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QFileDialog, QMessageBox from PySide6.QtWidgets import QFileDialog, QMessageBox
from Localizations import * from Localizations import (
SAVING_PRESET,
SAVE_PRESET,
JSON_FILES,
PRESET_SAVED,
PRESET_SAVED_TO,
LOADING_PRESET,
LOAD_PRESET,
PRESET_LOADED,
PRESET_LOADED_FROM,
)
def save_preset(self) -> None: def save_preset(self) -> None:

View File

@ -1,10 +1,17 @@
from PySide6.QtCore import QTimer from PySide6.QtCore import QTimer
from PySide6.QtGui import Qt
from Localizations import * from Localizations import *
import psutil import psutil
from error_handling import show_error from error_handling import show_error
def toggle_gpu_offload_auto(self, state) -> None:
is_auto = state == Qt.CheckState.Checked
self.gpu_offload_slider.setEnabled(not is_auto)
self.gpu_offload_spinbox.setEnabled(not is_auto)
def update_model_info(logger, self, model_info) -> None: def update_model_info(logger, self, model_info) -> None:
logger.debug(UPDATING_MODEL_INFO.format(model_info)) logger.debug(UPDATING_MODEL_INFO.format(model_info))
pass pass

View File

@ -1,13 +1,12 @@
from typing import Any, Dict, List, Union from typing import Any, Union
import requests
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
from PySide6.QtWidgets import QFileDialog from PySide6.QtWidgets import QFileDialog
from error_handling import show_error
from Localizations import *
import requests
from DownloadThread import DownloadThread from DownloadThread import DownloadThread
from Localizations import *
from error_handling import show_error
from imports_and_globals import ensure_directory from imports_and_globals import ensure_directory