| import os |
| import sys |
| import argparse |
| import subprocess |
| import contextlib |
|
|
| |
| import musubi_tuner_gui.torch_compat |
| import gradio as gr |
|
|
| from musubi_tuner_gui.lora_gui import lora_tab |
| from musubi_tuner_gui.qwen_image_lora_gui import qwen_image_lora_tab |
| from musubi_tuner_gui.wan_lora_gui import wan_lora_tab |
| from musubi_tuner_gui.flux_lora_gui import flux_lora_tab |
| from musubi_tuner_gui.zimage_lora_gui import zimage_lora_tab |
| from musubi_tuner_gui.ideogram4_lora_gui import ideogram4_lora_tab |
| from musubi_tuner_gui.krea2_lora_gui import krea2_lora_tab |
| from musubi_tuner_gui.image_captioning_gui import image_captioning_tab |
| from musubi_tuner_gui.model_quantizer_gui import model_quantizer_tab |
| from musubi_tuner_gui.image_preprocessing_gui import image_preprocessing_tab |
| from musubi_tuner_gui.changelog_gui import version_history_tab |
| from musubi_tuner_gui.lora_extractor_gui import lora_extractor_tab |
| from musubi_tuner_gui.lora_merge_gui import lora_merge_tab |
| from musubi_tuner_gui.lora_convert_gui import lora_convert_tab |
| from musubi_tuner_gui.custom_logging import setup_logging |
| from musubi_tuner_gui.class_gui_config import GUIConfig |
| from musubi_tuner_gui.class_tab_config_manager import TabConfigManager |
| import toml |
|
|
| PYTHON = sys.executable |
| project_dir = os.path.dirname(os.path.abspath(__file__)) |
|
|
| |
| def read_file_content(file_path): |
| with contextlib.suppress(FileNotFoundError): |
| with open(file_path, "r", encoding="utf8") as file: |
| return file.read() |
| return "" |
|
|
| |
| def initialize_ui_interface(config_manager, headless, release_info, readme_content): |
| |
| css = read_file_content("./assets/style.css") |
|
|
| |
| ui_interface = gr.Blocks(css=css, title="SECourses Musubi Trainer V30.2", theme=gr.themes.Soft()) |
| with ui_interface: |
| |
| gr.Markdown("# SECourses Musubi Trainer V30.2 : [https://www.patreon.com/posts/137551634](https://www.patreon.com/posts/137551634)") |
| |
| |
| with gr.Tab("Qwen Image Training"): |
| qwen_config = config_manager.get_config_for_tab("qwen_image") |
| qwen_image_lora_tab(headless=headless, config=qwen_config) |
| |
| with gr.Tab("Wan Models Training"): |
| wan_config = config_manager.get_config_for_tab("wan") |
| wan_lora_tab(headless=headless, config=wan_config) |
|
|
| with gr.Tab("FLUX Training"): |
| flux_config = config_manager.get_config_for_tab("flux") |
| flux_lora_tab(headless=headless, config=flux_config) |
|
|
| with gr.Tab("Z Image Training"): |
| zimage_config = config_manager.get_config_for_tab("zimage") |
| zimage_lora_tab(headless=headless, config=zimage_config) |
|
|
| with gr.Tab("Ideogram 4 Training"): |
| ideogram4_config = config_manager.get_config_for_tab("ideogram4") |
| ideogram4_lora_tab(headless=headless, config=ideogram4_config) |
|
|
| with gr.Tab("Krea 2 Training"): |
| krea2_config = config_manager.get_config_for_tab("krea2") |
| krea2_lora_tab(headless=headless, config=krea2_config) |
| |
| with gr.Tab("Image Captioning"): |
| captioning_config = config_manager.get_config_for_tab("image_captioning") |
| image_captioning_tab(headless=headless, config=captioning_config) |
| |
| with gr.Tab("Model Quantizer"): |
| quant_config = config_manager.get_config_for_tab("model_quantizer") |
| model_quantizer_tab(headless=headless, config=quant_config) |
|
|
| with gr.Tab("LoRA Extractor"): |
| lora_extractor_tab(headless=headless, config=None) |
|
|
| with gr.Tab("LoRA Merger"): |
| lora_merge_tab(headless=headless, config=None) |
|
|
| with gr.Tab("LoRA Converter"): |
| lora_convert_tab(headless=headless, config=None) |
| |
| with gr.Tab("Image Preprocessing"): |
| preprocessing_config = config_manager.get_config_for_tab("image_preprocessing") |
| image_preprocessing_tab(headless=headless, config=preprocessing_config) |
| |
| with gr.Tab("Version History"): |
| version_history_tab(headless=headless, config=None) |
| |
| with gr.Tab("Musubi Tuner (Deprecated)"): |
| musubi_config = config_manager.get_config_for_tab("musubi_tuner") |
| lora_tab(headless=headless, config=musubi_config) |
|
|
| return ui_interface |
|
|
| |
| def UI(**kwargs): |
| |
| log.info(f"headless: {kwargs.get('headless', False)}") |
|
|
| |
| release_info = "v18.0" |
| |
| readme_content = read_file_content("./README.md") |
| |
| |
| config_manager = TabConfigManager(config_file_path=kwargs.get("config", "./qwen_image_defaults.toml")) |
| if config_manager.user_loaded_config: |
| log.info(f"Loaded user configuration from '{kwargs.get('config', './qwen_image_defaults.toml')}'...") |
| else: |
| log.info("No user config loaded - will use tab-specific defaults") |
|
|
| |
| ui_interface = initialize_ui_interface(config_manager, kwargs.get("headless", False), release_info, readme_content) |
|
|
| |
| launch_params = { |
| "server_name": kwargs.get("listen"), |
| "auth": (kwargs["username"], kwargs["password"]) if kwargs.get("username") and kwargs.get("password") else None, |
| "server_port": kwargs.get("server_port", 0) if kwargs.get("server_port", 0) > 0 else None, |
| "inbrowser": kwargs.get("inbrowser", True), |
| "share": kwargs.get("share", False), |
| "root_path": kwargs.get("root_path", None), |
| "debug": kwargs.get("debug", False), |
| } |
| |
| |
| launch_params = {k: v for k, v in launch_params.items() if v is not None} |
|
|
| |
| ui_interface.launch(**launch_params) |
|
|
| |
| def initialize_arg_parser(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--config", type=str, default="./qwen_image_defaults.toml", help="Path to the toml config file for interface defaults") |
| parser.add_argument("--debug", action="store_true", help="Debug on") |
| parser.add_argument("--listen", type=str, default="127.0.0.1", help="IP to listen on for connections to Gradio") |
| parser.add_argument("--username", type=str, default="", help="Username for authentication") |
| parser.add_argument("--password", type=str, default="", help="Password for authentication") |
| parser.add_argument("--server_port", type=int, default=0, help="Port to run the server listener on") |
| parser.add_argument("--inbrowser", action="store_true", default=True, help="Open in browser") |
| parser.add_argument("--share", action="store_true", help="Share the gradio UI") |
| parser.add_argument("--headless", action="store_true", help="Is the server headless") |
| parser.add_argument("--language", type=str, default=None, help="Set custom language") |
| parser.add_argument("--use-ipex", action="store_true", help="Use IPEX environment") |
| parser.add_argument("--use-rocm", action="store_true", help="Use ROCm environment") |
| parser.add_argument("--do_not_use_shell", action="store_true", help="Enforce not to use shell=True when running external commands") |
| parser.add_argument("--do_not_share", action="store_true", help="Do not share the gradio UI") |
| parser.add_argument("--requirements", type=str, default=None, help="requirements file to use for validation") |
| parser.add_argument("--root_path", type=str, default=None, help="`root_path` for Gradio to enable reverse proxy support. e.g. /kohya_ss") |
| parser.add_argument("--noverify", action="store_true", help="Disable requirements verification") |
| return parser |
|
|
| if __name__ == "__main__": |
| |
| parser = initialize_arg_parser() |
| args = parser.parse_args() |
|
|
| |
| log = setup_logging(debug=args.debug) |
|
|
| |
| UI(**vars(args)) |
|
|