diff --git a/README.md b/README.md index c8fcf20..73b08c7 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ - **Multiple step marge** support ( up to 10 step) - Save and Load your merging combination as `Recipe`, which is simple text. - - ## Recent Update 2022/12/28 @@ -23,8 +21,6 @@ - you can find your logfile on `(extension's dir)/csv/history.tsv` - - ## How to Install - Go to `Extensions` tab on your web UI @@ -33,8 +29,6 @@ - Install - - ## Multi-Marge ![](misc/ss01.png) @@ -59,10 +53,11 @@ - bad example) in second lane, `modelA(A2): __O3__` - | ![](misc/ss01_ABC.png) | Select checkpoint by Dropdown. You can select Output checkpoint of each lane by variables likeĀ `__O1__`. | - | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ![](misc/ss01_M.png) | Multiplier digit is extended to 0.001 step. | - | ![](misc/ss01_S1.png) | Merging method. Weighted Sum, Add difference, Sigmoid. Implementation of "Sigmoid" is from old-days A1111 code, and this value is exchanged by inv-sigmoid in merging process and used as Weighted Sum. | + | ![](misc/ss01_ABC.png) | Select checkpoint by Dropdown. You can select Output checkpoint of each lane by variables likeĀ `__O1__`. | + | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | ![](misc/ss01_M.png) | Multiplier digit is extended to 0.001 step. | + | ![](misc/ss01_S1.png) | Merging method. Weighted Sum, Add difference, Sigmoid. Implementation of "Sigmoid" is from old-days A1111 code, and this value is exchanged by inv-sigmoid in merging process and used as Weighted Sum. | + | ![](misc/ss01_meta.png) | Add information of used models as metadata of 'safetensors'. | - "Checkpoint format" diff --git a/misc/ss01_meta.png b/misc/ss01_meta.png new file mode 100644 index 0000000..02a6849 Binary files /dev/null and b/misc/ss01_meta.png differ diff --git a/scripts/merge_board.py b/scripts/merge_board.py index 570703b..ffdf4a8 100644 --- a/scripts/merge_board.py +++ b/scripts/merge_board.py @@ -37,7 +37,7 @@ def on_ui_tabs(): A8, B8, C8, M8, S8, F8, O8, CF8, \ A9, B9, C9, M9, S9, F9, O9, CF9, \ A10,B10,C10,M10,S10,F10,O10,CF10, \ - _checkpoint_listener, chk_skip_merge_if_exists, radio_config_source \ + _checkpoint_listener, chk_skip_merge_if_exists, radio_config_source, chk_save_metadata \ = ui_merge.on_ui_tabs() # UI:Recipe @@ -119,7 +119,7 @@ def on_ui_tabs(): A8, B8, C8, M8, S8, F8, O8, CF8, A9, B9, C9, M9, S9, F9, O9, CF9, A10,B10,C10,M10,S10,F10,O10,CF10, - chk_skip_merge_if_exists, radio_config_source + chk_skip_merge_if_exists, radio_config_source, chk_save_metadata ): merge_ope = MergeOperation() merge_ope.add_merge(1, A1, B1, C1, M1, S1, F1, O1, CF1) @@ -140,7 +140,7 @@ def on_ui_tabs(): print(f"Start Merge processes. Total process num: {_process_total} .") # run merge - _ret_all = merge_ope.run_merge(skip_merge_if_exists=chk_skip_merge_if_exists, config_source=radio_config_source) + _ret_all = merge_ope.run_merge(skip_merge_if_exists=chk_skip_merge_if_exists, config_source=radio_config_source, save_metadata=chk_save_metadata) print(f"All Multi-Merge process finished. {len(_ret_all)} files.") for _ret in _ret_all: @@ -166,7 +166,7 @@ def on_ui_tabs(): A8, B8, C8, M8, S8, F8, O8, CF8, A9, B9, C9, M9, S9, F9, O9, CF9, A10,B10,C10,M10,S10,F10,O10,CF10, - chk_skip_merge_if_exists, radio_config_source + chk_skip_merge_if_exists, radio_config_source, chk_save_metadata ], outputs=[submit_result] ) diff --git a/scripts/multimerge/operation.py b/scripts/multimerge/operation.py index 816ad62..6fd48ec 100644 --- a/scripts/multimerge/operation.py +++ b/scripts/multimerge/operation.py @@ -21,7 +21,7 @@ class MergeOperation: def get_process_num(self): return len(self.recipes) - def run_merge(self, skip_merge_if_exists=False, config_source=0): + def run_merge(self, skip_merge_if_exists=False, config_source=0, save_metadata=False): _ret_all = [] _vars = {} # {"__A1__": "sd-v1-5-pruned.ckpt"} for _index, _recipe in self.recipes.items(): @@ -29,7 +29,7 @@ class MergeOperation: # apply current variables _recipe.apply_variables(_vars) # run merge - _ret = _recipe.run_merge(_index, skip_merge_if_exists, config_source) + _ret = _recipe.run_merge(_index, skip_merge_if_exists, config_source, save_metadata) _ret_all.append(_ret) # update vars _vars.update(_recipe.get_vars()) diff --git a/scripts/multimerge/recipe.py b/scripts/multimerge/recipe.py index 424e17b..5bd9862 100644 --- a/scripts/multimerge/recipe.py +++ b/scripts/multimerge/recipe.py @@ -71,7 +71,7 @@ class MergeRecipe(): self.B = _apply(self.row_B, _vars) self.C = _apply(self.row_C, _vars) - def run_merge(self, index, skip_merge_if_exists, config_source): + def run_merge(self, index, skip_merge_if_exists, config_source, save_metadata): sd_models.list_models() if skip_merge_if_exists: _filename = self.O + "." + self.CF if self.O != "" else self._estimate_ckpt_name() @@ -111,47 +111,54 @@ class MergeRecipe(): print(f" CF: {self.CF}") id_task = None + discard_weights = "" + bake_in_vae = "None" try: - discard_weights = "" - bake_in_vae = "None" - # backward compatibility for change of run_model_merger - # 2023/01/22 - # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/112416d04171e4bee673f0adc9bd3aeba87ec71a - # def run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae, discard_weights): - results = extras.run_modelmerger(id_task, self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source, bake_in_vae, discard_weights) + # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/d132481058f8a827cd407f2121f128a2bb862f7a + # def run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae, discard_weights, save_metadata): + results = extras.run_modelmerger(id_task, self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source, bake_in_vae, discard_weights, save_metadata) except TypeError as te: print(te) print("Try to use old 'run_modelmerger' params. ") try: # backward compatibility for change of run_model_merger - # 2023/01/19 - # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/0f5dbfffd0b7202a48e404d8e74b5cc9a3e5b135 - # run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae - results = extras.run_modelmerger(id_task, self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source, bake_in_vae) + # 2023/01/22 + # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/112416d04171e4bee673f0adc9bd3aeba87ec71a + # def run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae, discard_weights): + results = extras.run_modelmerger(id_task, self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source, bake_in_vae, discard_weights) except TypeError as te: print(te) - print("Try to use old 'run_modelmerger' params.") + print("Try to use old 'run_modelmerger' params. ") try: - results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source) + # backward compatibility for change of run_model_merger + # 2023/01/19 + # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/0f5dbfffd0b7202a48e404d8e74b5cc9a3e5b135 + # run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae + results = extras.run_modelmerger(id_task, self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source, bake_in_vae) except TypeError as te: - # backward compatibility for change of run_modelmerger - # 2023/01/11 - # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/954091697fce7a1b7997d5f3d73551f793f6bebc print(te) - print("Try to use old 'run_modelmerger' params. 'config_source' is ignored") + print("Try to use old 'run_modelmerger' params.") try: - results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF) + results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF, config_source) except TypeError as te: # backward compatibility for change of run_modelmerger - # 2022/11/27 - # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/dac9b6f15de5e675053d9490a20e0457dcd1a23e/modules/extras.py#L253 - print("Try to use old 'run_modelmerger' params. 'Checkpoint format is forced to 'ckpt'") + # 2023/01/11 + # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/954091697fce7a1b7997d5f3d73551f793f6bebc print(te) + print("Try to use old 'run_modelmerger' params. 'config_source' is ignored") try: - results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O) + results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O, self.CF) except TypeError as te: + # backward compatibility for change of run_modelmerger + # 2022/11/27 + # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/dac9b6f15de5e675053d9490a20e0457dcd1a23e/modules/extras.py#L253 + print("Try to use old 'run_modelmerger' params. 'Checkpoint format is forced to 'ckpt'") print(te) - return ["Error ", "Error "] + try: + results = extras.run_modelmerger(self.A, self.B, self.C, self.S, self.M, self.F, self.O) + except TypeError as te: + print(te) + return ["Error ", "Error "] except Exception as e: print("Error: at recipe.run_merge: ", file=sys.stderr) print(type(e), file=sys.stderr) diff --git a/scripts/multimerge/ui_merge.py b/scripts/multimerge/ui_merge.py index 47e0c5e..2429ce6 100644 --- a/scripts/multimerge/ui_merge.py +++ b/scripts/multimerge/ui_merge.py @@ -31,6 +31,7 @@ def on_ui_tabs(): with gr.Row(): radio_config_source = gr.Radio(choices=["A, B or C", "B", "C", "Don't"], value="A, B or C", label="Copy config from", type="index") chk_skip_merge_if_exists = gr.Checkbox(label="Skip merge if same-name ckpt already exists", value=False, interactive=True) + chk_save_metadata = gr.Checkbox(value=True, label="Save metadata (.safetensors only)") with gr.Row(): with gr.Column(): @@ -211,4 +212,4 @@ def on_ui_tabs(): A8, B8, C8, M8, S8, F8, O8, CF8, \ A9, B9, C9, M9, S9, F9, O9, CF9, \ A10,B10,C10,M10,S10,F10,O10,CF10,\ - _checkpoint_listener, chk_skip_merge_if_exists, radio_config_source + _checkpoint_listener, chk_skip_merge_if_exists, radio_config_source, chk_save_metadata