mirror of https://github.com/leafspark/AutoGGUF
print out quant command and log, dynamic kv
This commit is contained in:
parent
eba074ae89
commit
70f9db166d
|
@ -597,7 +597,7 @@ def save_preset(self):
|
||||||
"token_embedding_type": self.token_embedding_type.currentText(),
|
"token_embedding_type": self.token_embedding_type.currentText(),
|
||||||
"keep_split": self.keep_split.isChecked(),
|
"keep_split": self.keep_split.isChecked(),
|
||||||
"kv_overrides": [
|
"kv_overrides": [
|
||||||
entry.get_override_string() for entry in self.kv_override_entries
|
entry.get_raw_override_string() for entry in self.kv_override_entries
|
||||||
],
|
],
|
||||||
"extra_arguments": self.extra_arguments.text(),
|
"extra_arguments": self.extra_arguments.text(),
|
||||||
}
|
}
|
||||||
|
@ -795,6 +795,9 @@ def export_lora(self):
|
||||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
log_file = os.path.join(logs_path, f"lora_export_{timestamp}.log")
|
log_file = os.path.join(logs_path, f"lora_export_{timestamp}.log")
|
||||||
|
|
||||||
|
command_str = " ".join(command)
|
||||||
|
self.logger.info(f"{LORA_EXPORT_COMMAND}: {command_str}")
|
||||||
|
|
||||||
thread = QuantizationThread(command, backend_path, log_file)
|
thread = QuantizationThread(command, backend_path, log_file)
|
||||||
self.quant_threads.append(thread)
|
self.quant_threads.append(thread)
|
||||||
|
|
||||||
|
@ -884,6 +887,9 @@ def convert_lora(self):
|
||||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
log_file = os.path.join(logs_path, f"lora_conversion_{timestamp}.log")
|
log_file = os.path.join(logs_path, f"lora_conversion_{timestamp}.log")
|
||||||
|
|
||||||
|
command_str = " ".join(command)
|
||||||
|
self.logger.info(f"{LORA_CONVERSION_COMMAND}: {command_str}")
|
||||||
|
|
||||||
thread = QuantizationThread(command, os.getcwd(), log_file)
|
thread = QuantizationThread(command, os.getcwd(), log_file)
|
||||||
self.quant_threads.append(thread)
|
self.quant_threads.append(thread)
|
||||||
|
|
||||||
|
@ -1186,15 +1192,24 @@ def delete_task(self, item):
|
||||||
QMessageBox.StandardButton.No,
|
QMessageBox.StandardButton.No,
|
||||||
)
|
)
|
||||||
if reply == QMessageBox.StandardButton.Yes:
|
if reply == QMessageBox.StandardButton.Yes:
|
||||||
|
# Retrieve the task_item before removing it from the list
|
||||||
|
task_item = self.task_list.itemWidget(item)
|
||||||
|
|
||||||
|
# Remove the item from the list
|
||||||
row = self.task_list.row(item)
|
row = self.task_list.row(item)
|
||||||
self.task_list.takeItem(row)
|
self.task_list.takeItem(row)
|
||||||
|
|
||||||
# If the task is still running, terminate it
|
# If the task is still running, terminate it
|
||||||
task_item = self.task_list.itemWidget(item)
|
if task_item and task_item.log_file:
|
||||||
for thread in self.quant_threads:
|
for thread in self.quant_threads:
|
||||||
if thread.log_file == task_item.log_file:
|
if thread.log_file == task_item.log_file:
|
||||||
thread.terminate()
|
thread.terminate()
|
||||||
self.quant_threads.remove(thread)
|
self.quant_threads.remove(thread)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
# Delete the task_item widget
|
||||||
|
if task_item:
|
||||||
|
task_item.deleteLater()
|
||||||
|
|
||||||
def create_label(self, text, tooltip):
|
def create_label(self, text, tooltip):
|
||||||
label = QLabel(text)
|
label = QLabel(text)
|
||||||
|
@ -1369,9 +1384,13 @@ def quantize_model(self):
|
||||||
)
|
)
|
||||||
if self.keep_split.isChecked():
|
if self.keep_split.isChecked():
|
||||||
command.append("--keep-split")
|
command.append("--keep-split")
|
||||||
if self.override_kv.text():
|
if self.kv_override_entries:
|
||||||
for entry in self.kv_override_entries:
|
for entry in self.kv_override_entries:
|
||||||
override_string = entry.get_override_string()
|
override_string = entry.get_override_string(
|
||||||
|
model_name=model_name,
|
||||||
|
quant_type=quant_type,
|
||||||
|
output_path=output_path
|
||||||
|
)
|
||||||
if override_string:
|
if override_string:
|
||||||
command.extend(["--override-kv", override_string])
|
command.extend(["--override-kv", override_string])
|
||||||
|
|
||||||
|
@ -1389,6 +1408,10 @@ def quantize_model(self):
|
||||||
logs_path, f"{model_name}_{timestamp}_{quant_type}.log"
|
logs_path, f"{model_name}_{timestamp}_{quant_type}.log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Log quant command
|
||||||
|
command_str = " ".join(command)
|
||||||
|
self.logger.info(f"{QUANTIZATION_COMMAND}: {command_str}")
|
||||||
|
|
||||||
thread = QuantizationThread(command, backend_path, log_file)
|
thread = QuantizationThread(command, backend_path, log_file)
|
||||||
self.quant_threads.append(thread)
|
self.quant_threads.append(thread)
|
||||||
|
|
||||||
|
@ -1528,6 +1551,10 @@ def generate_imatrix(self):
|
||||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
log_file = os.path.join(self.logs_input.text(), f"imatrix_{timestamp}.log")
|
log_file = os.path.join(self.logs_input.text(), f"imatrix_{timestamp}.log")
|
||||||
|
|
||||||
|
# Log command
|
||||||
|
command_str = " ".join(command)
|
||||||
|
self.logger.info(f"{IMATRIX_GENERATION_COMMAND}: {command_str}")
|
||||||
|
|
||||||
thread = QuantizationThread(command, backend_path, log_file)
|
thread = QuantizationThread(command, backend_path, log_file)
|
||||||
self.quant_threads.append(thread)
|
self.quant_threads.append(thread)
|
||||||
|
|
||||||
|
@ -1552,10 +1579,11 @@ def show_error(self, message):
|
||||||
self.logger.error(ERROR_MESSAGE.format(message))
|
self.logger.error(ERROR_MESSAGE.format(message))
|
||||||
QMessageBox.critical(self, ERROR, message)
|
QMessageBox.critical(self, ERROR, message)
|
||||||
|
|
||||||
def handle_error(self, error_message, task_item):
|
def handle_error(self, error_message, task_item, task_exists=True):
|
||||||
self.logger.error(TASK_ERROR.format(error_message))
|
self.logger.error(TASK_ERROR.format(error_message))
|
||||||
self.show_error(error_message)
|
self.show_error(error_message)
|
||||||
task_item.set_error()
|
if task_exists:
|
||||||
|
task_item.set_error()
|
||||||
|
|
||||||
def closeEvent(self, event: QCloseEvent):
|
def closeEvent(self, event: QCloseEvent):
|
||||||
self.logger.info(APPLICATION_CLOSING)
|
self.logger.info(APPLICATION_CLOSING)
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
from PyQt6.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QComboBox, QPushButton
|
from PyQt6.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QComboBox, QPushButton
|
||||||
from PyQt6.QtCore import pyqtSignal, QRegularExpression
|
from PyQt6.QtCore import pyqtSignal, QRegularExpression
|
||||||
from PyQt6.QtGui import QDoubleValidator, QIntValidator, QRegularExpressionValidator
|
from PyQt6.QtGui import QDoubleValidator, QIntValidator, QRegularExpressionValidator
|
||||||
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import socket
|
||||||
|
import platform
|
||||||
|
|
||||||
class KVOverrideEntry(QWidget):
|
class KVOverrideEntry(QWidget):
|
||||||
deleted = pyqtSignal(QWidget)
|
deleted = pyqtSignal(QWidget)
|
||||||
|
@ -40,7 +44,34 @@ def __init__(self, parent=None):
|
||||||
def delete_clicked(self):
|
def delete_clicked(self):
|
||||||
self.deleted.emit(self)
|
self.deleted.emit(self)
|
||||||
|
|
||||||
def get_override_string(self):
|
def get_override_string(self, model_name=None, quant_type=None, output_path=None): # Add arguments
|
||||||
|
key = self.key_input.text()
|
||||||
|
type_ = self.type_combo.currentText()
|
||||||
|
value = self.value_input.text()
|
||||||
|
|
||||||
|
dynamic_params = {
|
||||||
|
"{system.time.milliseconds}": lambda: str(int(time.time() * 1000)),
|
||||||
|
"{system.time.seconds}": lambda: str(int(time.time())),
|
||||||
|
"{system.date.iso}": lambda: datetime.now().strftime("%Y-%m-%d"),
|
||||||
|
"{system.datetime.iso}": lambda: datetime.now().isoformat(),
|
||||||
|
"{system.username}": lambda: os.getlogin(),
|
||||||
|
"{system.hostname}": lambda: socket.gethostname(),
|
||||||
|
"{system.platform}": lambda: platform.system(),
|
||||||
|
"{system.python.version}": lambda: platform.python_version(),
|
||||||
|
"{system.time.milliseconds}": lambda: str(int(time.time() * 1000)),
|
||||||
|
"{system.date}": lambda: datetime.now().strftime("%Y-%m-%d"),
|
||||||
|
"{model.name}": lambda: model_name if model_name is not None else "Unknown Model",
|
||||||
|
"{quant.type}": lambda: quant_type if quant_type is not None else "Unknown Quant",
|
||||||
|
"{output.path}": lambda: output_path if output_path is not None else "Unknown Output Path",
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, func in dynamic_params.items():
|
||||||
|
value = value.replace(param, func())
|
||||||
|
|
||||||
|
return f"{key}={type_}:{value}"
|
||||||
|
|
||||||
|
def get_raw_override_string(self):
|
||||||
|
# Return the raw override string with placeholders intact
|
||||||
return f"{self.key_input.text()}={self.type_combo.currentText()}:{self.value_input.text()}"
|
return f"{self.key_input.text()}={self.type_combo.currentText()}:{self.value_input.text()}"
|
||||||
|
|
||||||
def update_validator(self, type_):
|
def update_validator(self, type_):
|
||||||
|
|
|
@ -225,6 +225,10 @@ def __init__(self):
|
||||||
self.GENERATING_IMATRIX_FOR = ""
|
self.GENERATING_IMATRIX_FOR = ""
|
||||||
self.MODEL_PATH_REQUIRED_FOR_IMATRIX = ""
|
self.MODEL_PATH_REQUIRED_FOR_IMATRIX = ""
|
||||||
self.NO_ASSET_SELECTED_FOR_CUDA_CHECK = ""
|
self.NO_ASSET_SELECTED_FOR_CUDA_CHECK = ""
|
||||||
|
self.QUANTIZATION_COMMAND = ""
|
||||||
|
self.IMATRIX_GENERATION_COMMAND = ""
|
||||||
|
self.LORA_CONVERSION_COMMAND = ""
|
||||||
|
self.LORA_EXPORT_COMMAND = ""
|
||||||
|
|
||||||
class _English(_Localization):
|
class _English(_Localization):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -452,6 +456,10 @@ def __init__(self):
|
||||||
self.GENERATING_IMATRIX_FOR = "Generating IMatrix for {}"
|
self.GENERATING_IMATRIX_FOR = "Generating IMatrix for {}"
|
||||||
self.MODEL_PATH_REQUIRED_FOR_IMATRIX = "Model path is required for IMatrix generation."
|
self.MODEL_PATH_REQUIRED_FOR_IMATRIX = "Model path is required for IMatrix generation."
|
||||||
self.NO_ASSET_SELECTED_FOR_CUDA_CHECK = "No asset selected for CUDA check"
|
self.NO_ASSET_SELECTED_FOR_CUDA_CHECK = "No asset selected for CUDA check"
|
||||||
|
self.QUANTIZATION_COMMAND = "Quantization command"
|
||||||
|
self.IMATRIX_GENERATION_COMMAND = "IMatrix generation command"
|
||||||
|
self.LORA_CONVERSION_COMMAND = "LoRA conversion command"
|
||||||
|
self.LORA_EXPORT_COMMAND = "LoRA export command"
|
||||||
|
|
||||||
class _French:
|
class _French:
|
||||||
# French localization
|
# French localization
|
||||||
|
@ -5233,7 +5241,8 @@ def set_language(lang_code):
|
||||||
global ADDING_LORA_ADAPTER, DELETING_LORA_ADAPTER, LORA_FILES, SELECT_LORA_ADAPTER_FILE, STARTING_LORA_EXPORT
|
global ADDING_LORA_ADAPTER, DELETING_LORA_ADAPTER, LORA_FILES, SELECT_LORA_ADAPTER_FILE, STARTING_LORA_EXPORT
|
||||||
global OUTPUT_TYPE, SELECT_OUTPUT_TYPE, GGUF_AND_BIN_FILES, BASE_MODEL, SELECT_BASE_MODEL_FILE
|
global OUTPUT_TYPE, SELECT_OUTPUT_TYPE, GGUF_AND_BIN_FILES, BASE_MODEL, SELECT_BASE_MODEL_FILE
|
||||||
global BASE_MODEL_PATH_REQUIRED, BROWSING_FOR_BASE_MODEL_FILE, SELECT_BASE_MODEL_FOLDER, BROWSING_FOR_BASE_MODEL_FOLDER
|
global BASE_MODEL_PATH_REQUIRED, BROWSING_FOR_BASE_MODEL_FILE, SELECT_BASE_MODEL_FOLDER, BROWSING_FOR_BASE_MODEL_FOLDER
|
||||||
global LORA_CONVERSION_FROM_TO, GENERATING_IMATRIX_FOR, MODEL_PATH_REQUIRED_FOR_IMATRIX, NO_ASSET_SELECTED_FOR_CUDA_CHECK
|
global LORA_CONVERSION_FROM_TO, GENERATING_IMATRIX_FOR, MODEL_PATH_REQUIRED_FOR_IMATRIX, NO_ASSET_SELECTED_FOR_CUDA_CHECK, QUANTIZATION_COMMAND
|
||||||
|
global IMATRIX_GENERATION_COMMAND, LORA_CONVERSION_COMMAND, LORA_EXPORT_COMMAND
|
||||||
|
|
||||||
loc = _languages.get(lang_code, _English)()
|
loc = _languages.get(lang_code, _English)()
|
||||||
english_loc = _English() # Create an instance of English localization for fallback
|
english_loc = _English() # Create an instance of English localization for fallback
|
||||||
|
|
Loading…
Reference in New Issue