Skip to content

Commit adc8f4b

Browse files
committed
refactor: move functions out of AutoGGUF.py
- move functions out of AutoGGUF.py - add live update support to GPU monitor graphs
1 parent ac41372 commit adc8f4b

File tree

5 files changed

+206
-168
lines changed

5 files changed

+206
-168
lines changed

src/AutoGGUF.py

+15-165
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ def __init__(self):
123123
self.show_about = show_about.__get__(self)
124124
self.save_preset = presets.save_preset.__get__(self)
125125
self.load_preset = presets.load_preset.__get__(self)
126+
self.browse_export_lora_model = (
127+
lora_conversion.browse_export_lora_model.__get__(self)
128+
)
129+
self.browse_export_lora_output = (
130+
lora_conversion.browse_export_lora_output.__get__(self)
131+
)
132+
self.add_lora_adapter = lora_conversion.add_lora_adapter.__get__(self)
133+
self.export_lora = lora_conversion.export_lora.__get__(self)
134+
self.browse_models = utils.browse_models.__get__(self)
135+
self.browse_output = utils.browse_output.__get__(self)
136+
self.browse_logs = utils.browse_logs.__get__(self)
137+
self.browse_imatrix = utils.browse_imatrix.__get__(self)
126138
self.update_threads_spinbox = partial(ui_update.update_threads_spinbox, self)
127139
self.update_threads_slider = partial(ui_update.update_threads_slider, self)
128140
self.update_gpu_offload_spinbox = partial(
@@ -136,6 +148,9 @@ def __init__(self):
136148
self.update_download_progress = partial(
137149
ui_update.update_download_progress, self
138150
)
151+
self.delete_lora_adapter_item = partial(
152+
lora_conversion.delete_lora_adapter_item, self
153+
)
139154

140155
# Set up main widget and layout
141156
main_widget = QWidget()
@@ -887,51 +902,6 @@ def save_task_preset(self, task_item):
887902
)
888903
break
889904

890-
def browse_export_lora_model(self):
891-
self.logger.info(BROWSING_FOR_EXPORT_LORA_MODEL_FILE)
892-
model_file, _ = QFileDialog.getOpenFileName(
893-
self, SELECT_MODEL_FILE, "", GGUF_FILES
894-
)
895-
if model_file:
896-
self.export_lora_model.setText(os.path.abspath(model_file))
897-
898-
def browse_export_lora_output(self):
899-
self.logger.info(BROWSING_FOR_EXPORT_LORA_OUTPUT_FILE)
900-
output_file, _ = QFileDialog.getSaveFileName(
901-
self, SELECT_OUTPUT_FILE, "", GGUF_FILES
902-
)
903-
if output_file:
904-
self.export_lora_output.setText(os.path.abspath(output_file))
905-
906-
def add_lora_adapter(self):
907-
self.logger.info(ADDING_LORA_ADAPTER)
908-
adapter_path, _ = QFileDialog.getOpenFileName(
909-
self, SELECT_LORA_ADAPTER_FILE, "", LORA_FILES
910-
)
911-
if adapter_path:
912-
# Create a widget to hold the path and scale input
913-
adapter_widget = QWidget()
914-
adapter_layout = QHBoxLayout(adapter_widget)
915-
916-
path_input = QLineEdit(adapter_path)
917-
path_input.setReadOnly(True)
918-
adapter_layout.addWidget(path_input)
919-
920-
scale_input = QLineEdit("1.0") # Default scale value
921-
adapter_layout.addWidget(scale_input)
922-
923-
delete_button = QPushButton(DELETE_ADAPTER)
924-
delete_button.clicked.connect(
925-
lambda: self.delete_lora_adapter_item(adapter_widget)
926-
)
927-
adapter_layout.addWidget(delete_button)
928-
929-
# Add the widget to the list
930-
list_item = QListWidgetItem(self.export_lora_adapters)
931-
list_item.setSizeHint(adapter_widget.sizeHint())
932-
self.export_lora_adapters.addItem(list_item)
933-
self.export_lora_adapters.setItemWidget(list_item, adapter_widget)
934-
935905
def browse_base_model(self):
936906
self.logger.info(BROWSING_FOR_BASE_MODEL_FOLDER) # Updated log message
937907
base_model_folder = QFileDialog.getExistingDirectory(
@@ -940,15 +910,6 @@ def browse_base_model(self):
940910
if base_model_folder:
941911
self.base_model_path.setText(os.path.abspath(base_model_folder))
942912

943-
def delete_lora_adapter_item(self, adapter_widget):
944-
self.logger.info(DELETING_LORA_ADAPTER)
945-
# Find the QListWidgetItem containing the adapter_widget
946-
for i in range(self.export_lora_adapters.count()):
947-
item = self.export_lora_adapters.item(i)
948-
if self.export_lora_adapters.itemWidget(item) == adapter_widget:
949-
self.export_lora_adapters.takeItem(i) # Remove the item
950-
break
951-
952913
def browse_hf_model_input(self):
953914
self.logger.info(BROWSE_FOR_HF_MODEL_DIRECTORY)
954915
model_dir = QFileDialog.getExistingDirectory(self, SELECT_HF_MODEL_DIRECTORY)
@@ -1033,87 +994,6 @@ def convert_hf_to_gguf(self):
1033994
show_error(self.logger, ERROR_STARTING_HF_TO_GGUF_CONVERSION.format(str(e)))
1034995
self.logger.info(HF_TO_GGUF_CONVERSION_TASK_STARTED)
1035996

1036-
def export_lora(self):
1037-
self.logger.info(STARTING_LORA_EXPORT)
1038-
try:
1039-
model_path = self.export_lora_model.text()
1040-
output_path = self.export_lora_output.text()
1041-
lora_adapters = []
1042-
1043-
for i in range(self.export_lora_adapters.count()):
1044-
item = self.export_lora_adapters.item(i)
1045-
adapter_widget = self.export_lora_adapters.itemWidget(item)
1046-
path_input = adapter_widget.layout().itemAt(0).widget()
1047-
scale_input = adapter_widget.layout().itemAt(1).widget()
1048-
adapter_path = path_input.text()
1049-
adapter_scale = scale_input.text()
1050-
lora_adapters.append((adapter_path, adapter_scale))
1051-
1052-
if not model_path:
1053-
raise ValueError(MODEL_PATH_REQUIRED)
1054-
if not output_path:
1055-
raise ValueError(OUTPUT_PATH_REQUIRED)
1056-
if not lora_adapters:
1057-
raise ValueError(AT_LEAST_ONE_LORA_ADAPTER_REQUIRED)
1058-
1059-
backend_path = self.backend_combo.currentData()
1060-
if not backend_path:
1061-
raise ValueError(NO_BACKEND_SELECTED)
1062-
1063-
command = [
1064-
os.path.join(backend_path, "llama-export-lora"),
1065-
"--model",
1066-
model_path,
1067-
"--output",
1068-
output_path,
1069-
]
1070-
1071-
for adapter_path, adapter_scale in lora_adapters:
1072-
if adapter_path:
1073-
if adapter_scale:
1074-
try:
1075-
scale_value = float(adapter_scale)
1076-
command.extend(
1077-
["--lora-scaled", adapter_path, str(scale_value)]
1078-
)
1079-
except ValueError:
1080-
raise ValueError(INVALID_LORA_SCALE_VALUE)
1081-
else:
1082-
command.extend(["--lora", adapter_path])
1083-
1084-
threads = self.export_lora_threads.value()
1085-
command.extend(["--threads", str(threads)])
1086-
1087-
logs_path = self.logs_input.text()
1088-
ensure_directory(logs_path)
1089-
1090-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
1091-
log_file = os.path.join(logs_path, f"lora_export_{timestamp}.log")
1092-
1093-
command_str = " ".join(command)
1094-
self.logger.info(f"{LORA_EXPORT_COMMAND}: {command_str}")
1095-
1096-
thread = QuantizationThread(command, backend_path, log_file)
1097-
self.quant_threads.append(thread)
1098-
1099-
task_item = TaskListItem(EXPORTING_LORA, log_file, show_progress_bar=False)
1100-
list_item = QListWidgetItem(self.task_list)
1101-
list_item.setSizeHint(task_item.sizeHint())
1102-
self.task_list.addItem(list_item)
1103-
self.task_list.setItemWidget(list_item, task_item)
1104-
1105-
thread.status_signal.connect(task_item.update_status)
1106-
thread.finished_signal.connect(lambda: self.task_finished(thread))
1107-
thread.error_signal.connect(
1108-
lambda err: handle_error(self.logger, err, task_item)
1109-
)
1110-
thread.start()
1111-
self.logger.info(LORA_EXPORT_TASK_STARTED)
1112-
except ValueError as e:
1113-
show_error(self.logger, str(e))
1114-
except Exception as e:
1115-
show_error(self.logger, ERROR_STARTING_LORA_EXPORT.format(str(e)))
1116-
1117997
def restart_task(self, task_item):
1118998
self.logger.info(RESTARTING_TASK.format(task_item.task_name))
1119999
for thread in self.quant_threads:
@@ -1334,36 +1214,6 @@ def load_models(self):
13341214
self.model_tree.expandAll()
13351215
self.logger.info(LOADED_MODELS.format(len(single_models) + len(sharded_models)))
13361216

1337-
def browse_models(self):
1338-
self.logger.info(BROWSING_FOR_MODELS_DIRECTORY)
1339-
models_path = QFileDialog.getExistingDirectory(self, SELECT_MODELS_DIRECTORY)
1340-
if models_path:
1341-
self.models_input.setText(os.path.abspath(models_path))
1342-
ensure_directory(models_path)
1343-
self.load_models()
1344-
1345-
def browse_output(self):
1346-
self.logger.info(BROWSING_FOR_OUTPUT_DIRECTORY)
1347-
output_path = QFileDialog.getExistingDirectory(self, SELECT_OUTPUT_DIRECTORY)
1348-
if output_path:
1349-
self.output_input.setText(os.path.abspath(output_path))
1350-
ensure_directory(output_path)
1351-
1352-
def browse_logs(self):
1353-
self.logger.info(BROWSING_FOR_LOGS_DIRECTORY)
1354-
logs_path = QFileDialog.getExistingDirectory(self, SELECT_LOGS_DIRECTORY)
1355-
if logs_path:
1356-
self.logs_input.setText(os.path.abspath(logs_path))
1357-
ensure_directory(logs_path)
1358-
1359-
def browse_imatrix(self):
1360-
self.logger.info(BROWSING_FOR_IMATRIX_FILE)
1361-
imatrix_file, _ = QFileDialog.getOpenFileName(
1362-
self, SELECT_IMATRIX_FILE, "", DAT_FILES
1363-
)
1364-
if imatrix_file:
1365-
self.imatrix.setText(os.path.abspath(imatrix_file))
1366-
13671217
def validate_quantization_inputs(self):
13681218
self.logger.debug(VALIDATING_QUANTIZATION_INPUTS)
13691219
errors = []

src/GPUMonitor.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,13 @@ def show_detailed_stats(self):
192192
gpu_graph = SimpleGraph(GPU_USAGE_OVER_TIME)
193193
vram_graph = SimpleGraph(VRAM_USAGE_OVER_TIME)
194194

195-
gpu_graph.update_data(self.gpu_data)
196-
vram_graph.update_data(self.vram_data)
195+
def update_graph_data():
196+
gpu_graph.update_data(self.gpu_data)
197+
vram_graph.update_data(self.vram_data)
198+
199+
timer = QTimer(dialog)
200+
timer.timeout.connect(update_graph_data)
201+
timer.start(200) # Update every 0.2 seconds
197202

198203
tab_widget.addTab(gpu_graph, GPU_USAGE_OVER_TIME)
199204
tab_widget.addTab(vram_graph, VRAM_USAGE_OVER_TIME)

src/Localizations.py

+4
Original file line numberDiff line numberDiff line change
@@ -6069,6 +6069,8 @@ def __init__(self):
60696069
self.REFRESH_MODELS = "重新整理模型"
60706070

60716071

6072+
# fmt: off
6073+
60726074
# Dictionary to map language codes to classes
60736075
_languages = {
60746076
"en-US": _English, # American English
@@ -6101,6 +6103,8 @@ def __init__(self):
61016103
"zh-TW": _TraditionalChinese, # Traditional Chinese (Taiwan)
61026104
}
61036105

6106+
# fmt: on
6107+
61046108

61056109
def set_language(lang_code):
61066110
# Globals

0 commit comments

Comments
 (0)