@@ -123,6 +123,18 @@ def __init__(self):
123
123
self .show_about = show_about .__get__ (self )
124
124
self .save_preset = presets .save_preset .__get__ (self )
125
125
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 )
126
138
self .update_threads_spinbox = partial (ui_update .update_threads_spinbox , self )
127
139
self .update_threads_slider = partial (ui_update .update_threads_slider , self )
128
140
self .update_gpu_offload_spinbox = partial (
@@ -136,6 +148,9 @@ def __init__(self):
136
148
self .update_download_progress = partial (
137
149
ui_update .update_download_progress , self
138
150
)
151
+ self .delete_lora_adapter_item = partial (
152
+ lora_conversion .delete_lora_adapter_item , self
153
+ )
139
154
140
155
# Set up main widget and layout
141
156
main_widget = QWidget ()
@@ -887,51 +902,6 @@ def save_task_preset(self, task_item):
887
902
)
888
903
break
889
904
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
-
935
905
def browse_base_model (self ):
936
906
self .logger .info (BROWSING_FOR_BASE_MODEL_FOLDER ) # Updated log message
937
907
base_model_folder = QFileDialog .getExistingDirectory (
@@ -940,15 +910,6 @@ def browse_base_model(self):
940
910
if base_model_folder :
941
911
self .base_model_path .setText (os .path .abspath (base_model_folder ))
942
912
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
-
952
913
def browse_hf_model_input (self ):
953
914
self .logger .info (BROWSE_FOR_HF_MODEL_DIRECTORY )
954
915
model_dir = QFileDialog .getExistingDirectory (self , SELECT_HF_MODEL_DIRECTORY )
@@ -1033,87 +994,6 @@ def convert_hf_to_gguf(self):
1033
994
show_error (self .logger , ERROR_STARTING_HF_TO_GGUF_CONVERSION .format (str (e )))
1034
995
self .logger .info (HF_TO_GGUF_CONVERSION_TASK_STARTED )
1035
996
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
-
1117
997
def restart_task (self , task_item ):
1118
998
self .logger .info (RESTARTING_TASK .format (task_item .task_name ))
1119
999
for thread in self .quant_threads :
@@ -1334,36 +1214,6 @@ def load_models(self):
1334
1214
self .model_tree .expandAll ()
1335
1215
self .logger .info (LOADED_MODELS .format (len (single_models ) + len (sharded_models )))
1336
1216
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
-
1367
1217
def validate_quantization_inputs (self ):
1368
1218
self .logger .debug (VALIDATING_QUANTIZATION_INPUTS )
1369
1219
errors = []
0 commit comments