From cff5d637bc1be5b9fb5168d6a5af3f6abe13fc24 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 12 Nov 2023 17:35:33 -0500 Subject: [PATCH 1/2] fix inpaint --- CHANGELOG.md | 1 + modules/processing_diffusers.py | 9 ++++++--- modules/sd_models.py | 23 +++++++++++++++++------ scripts/xyz_grid.py | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae9698e9b..96e95314d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Updated logic for calculating **steps** when using base/hires/refiner workflows - Safe model offloading for non-standard models - Fix **DPM SDE** scheduler + - Better support for SD 1.5 **inpainting** models - Update to `diffusers==0.23.0` - **Extra networks** - Use multi-threading for 5x load speedup diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index bde6efdbc..0ea8292ac 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -223,7 +223,6 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro return task_args def set_pipeline_args(model, prompts: list, negative_prompts: list, prompts_2: typing.Optional[list]=None, negative_prompts_2: typing.Optional[list]=None, desc:str='', **kwargs): - if hasattr(model, "set_progress_bar_config"): model.set_progress_bar_config(bar_format='Progress {rate_fmt}{postfix} {bar} {percentage:3.0f}% {n_fmt}/{total_fmt} {elapsed} {remaining} ' + '\x1b[38;5;71m' + desc, ncols=80, colour='#327fba') args = {} @@ -408,8 +407,12 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro return max(2, int(steps)) # pipeline type is set earlier in processing, but check for sanity - if sd_models.get_diffusers_task(shared.sd_model) != sd_models.DiffusersTaskType.TEXT_2_IMAGE and len(getattr(p, 'init_images' ,[])) == 0: # reset pipeline - shared.sd_model = sd_models.set_diffuser_pipe(shared.sd_model, sd_models.DiffusersTaskType.TEXT_2_IMAGE) + if sd_models.get_diffusers_task(shared.sd_model) != sd_models.DiffusersTaskType.TEXT_2_IMAGE and len(getattr(p, 'init_images' ,[])) == 0: + shared.sd_model = sd_models.set_diffuser_pipe(shared.sd_model, sd_models.DiffusersTaskType.TEXT_2_IMAGE) # reset pipeline + if hasattr(shared.sd_model, 'unet') and hasattr(shared.sd_model.unet, 'config') and hasattr(shared.sd_model.unet.config, 'in_channels') and shared.sd_model.unet.config.in_channels == 9: + shared.sd_model = sd_models.set_diffuser_pipe(shared.sd_model, sd_models.DiffusersTaskType.INPAINTING) # force pipeline + if len(getattr(p, 'init_images' ,[])) == 0: + p.init_images = [TF.to_pil_image(torch.rand((3, p.height, p.width)))] base_args = set_pipeline_args( model=shared.sd_model, prompts=prompts, diff --git a/modules/sd_models.py b/modules/sd_models.py index 0c6db835a..c47657d9f 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -899,15 +899,26 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No if model_type.startswith('Stable Diffusion'): diffusers_load_config['force_zeros_for_empty_prompt '] = shared.opts.diffusers_force_zeros diffusers_load_config['requires_aesthetics_score'] = shared.opts.diffusers_aesthetics_score - diffusers_load_config['config_files'] = { - 'v1': 'configs/v1-inference.yaml', - 'v2': 'configs/v2-inference-768-v.yaml', - 'xl': 'configs/sd_xl_base.yaml', - 'xl_refiner': 'configs/sd_xl_refiner.yaml', - } + if 'inpainting' in checkpoint_info.path.lower(): + diffusers_load_config['config_files'] = { + 'v1': 'configs/v1-inpainting-inference.yaml', + 'v2': 'configs/v2-inference-768-v.yaml', + 'xl': 'configs/sd_xl_base.yaml', + 'xl_refiner': 'configs/sd_xl_refiner.yaml', + } + else: + diffusers_load_config['config_files'] = { + 'v1': 'configs/v1-inference.yaml', + 'v2': 'configs/v2-inference-768-v.yaml', + 'xl': 'configs/sd_xl_base.yaml', + 'xl_refiner': 'configs/sd_xl_refiner.yaml', + } if hasattr(pipeline, 'from_single_file'): diffusers_load_config['use_safetensors'] = True sd_model = pipeline.from_single_file(checkpoint_info.path, **diffusers_load_config) + if sd_model is not None and hasattr(sd_model, 'unet') and hasattr(sd_model.unet, 'config') and 'inpainting' in checkpoint_info.path.lower(): + shared.log.debug('Model patch: type=inpaint') + sd_model.unet.config.in_channels = 9 elif hasattr(pipeline, 'from_ckpt'): sd_model = pipeline.from_ckpt(checkpoint_info.path, **diffusers_load_config) else: diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index 912638777..4c632a4ce 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -254,7 +254,7 @@ axis_options = [ AxisOption("[Second pass] hires steps", int, apply_field("hr_second_pass_steps")), AxisOption("[Second pass] CFG scale", float, apply_field("image_cfg_scale")), AxisOption("[Second pass] guidance rescale", float, apply_field("diffusers_guidance_rescale")), - AxisOption("[Refiner] model", str, apply_refiner, fmt=format_value, cost=1.0, choices=lambda: sorted(sd_models.checkpoints_list)), + AxisOption("[Refiner] model", str, apply_refiner, fmt=format_value, cost=1.0, choices=lambda: ['None'] + sorted(sd_models.checkpoints_list)), AxisOption("[Refiner] refiner start", float, apply_field("refiner_start")), AxisOption("[Refiner] refiner steps", float, apply_field("refiner_steps")), AxisOption("[TOME] Token merging ratio (txt2img)", float, apply_override('token_merging_ratio')), From f1862579fdad7f266e6b5fd292c27914cb19e457 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 13 Nov 2023 09:27:57 -0500 Subject: [PATCH 2/2] cleanup compile --- cli/run-benchmark.py | 5 +++-- modules/sd_models.py | 16 ++++++++++------ modules/shared.py | 5 +++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/cli/run-benchmark.py b/cli/run-benchmark.py index 112cbeff7..340ba4cf8 100755 --- a/cli/run-benchmark.py +++ b/cli/run-benchmark.py @@ -16,7 +16,7 @@ options = Map({ 'restore_faces': False, 'prompt': 'photo of two dice on a table', 'negative_prompt': 'foggy, blurry', - 'steps': 20, + 'steps': 50, 'batch_size': 1, 'n_iter': 1, 'seed': -1, @@ -28,7 +28,8 @@ options = Map({ # batch = [1, 1, 2, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128] -batch = [1, 1, 2, 4, 8, 12, 16] +# batch = [1, 1, 2, 4, 8, 12, 16] +batch = [4, 4] oom = 0 diff --git a/modules/sd_models.py b/modules/sd_models.py index c47657d9f..fbdfc1424 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -690,7 +690,7 @@ def compile_diffusers(sd_model): shared.log.warning(f"IPEX Optimize not supported: {err}") try: - if shared.opts.cuda_compile and shared.opts.cuda_compile_backend != 'none': + if (shared.opts.cuda_compile or shared.opts.cuda_compile_vae or shared.opts.cuda_compile_upscaler) and shared.opts.cuda_compile_backend != 'none': shared.log.info(f"Compiling pipeline={sd_model.__class__.__name__} shape={8 * sd_model.unet.config.sample_size} mode={shared.opts.cuda_compile_backend}") import torch._dynamo # pylint: disable=unused-import,redefined-outer-name if shared.opts.cuda_compile_backend == "openvino_fx": @@ -706,11 +706,15 @@ def compile_diffusers(sd_model): torch._logging.set_logs(dynamo=log_level, aot=log_level, inductor=log_level) # pylint: disable=protected-access torch._dynamo.config.verbose = shared.opts.cuda_compile_verbose # pylint: disable=protected-access torch._dynamo.config.suppress_errors = shared.opts.cuda_compile_errors # pylint: disable=protected-access - sd_model.unet = torch.compile(sd_model.unet, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init - if hasattr(sd_model, 'vae'): - sd_model.vae.decode = torch.compile(sd_model.vae.decode, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init - if hasattr(sd_model, 'movq'): - sd_model.movq.decode = torch.compile(sd_model.movq.decode, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init + if shared.opts.cuda_compile: + sd_model.unet = torch.compile(sd_model.unet, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init + if shared.opts.cuda_compile_vae: + if hasattr(sd_model, 'vae'): + sd_model.vae.decode = torch.compile(sd_model.vae.decode, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init + if hasattr(sd_model, 'movq'): + sd_model.movq.decode = torch.compile(sd_model.movq.decode, mode=shared.opts.cuda_compile_mode, backend=shared.opts.cuda_compile_backend, fullgraph=shared.opts.cuda_compile_fullgraph) # pylint: disable=attribute-defined-outside-init + from installer import setup_logging + setup_logging() if shared.opts.cuda_compile_precompile: sd_model("dummy prompt") shared.log.info("Complilation done.") diff --git a/modules/shared.py b/modules/shared.py index 61b1236da..ba8c7c4ff 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -285,8 +285,9 @@ options_templates.update(options_section(('cuda', "Compute Settings"), { "torch_gc_threshold": OptionInfo(90, "VRAM usage threshold before running Torch GC to clear up VRAM", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1}), "cuda_compile_sep": OptionInfo("

Model Compile

", "", gr.HTML), - "cuda_compile": OptionInfo(True if cmd_opts.use_openvino else False, "Enable model compile"), - "cuda_compile_upscaler": OptionInfo(True if cmd_opts.use_openvino else False, "Enable upscaler compile"), + "cuda_compile": OptionInfo(True if cmd_opts.use_openvino else False, "Compile UNet"), + "cuda_compile_vae": OptionInfo(True if cmd_opts.use_openvino else False, "Compile VAE"), + "cuda_compile_upscaler": OptionInfo(True if cmd_opts.use_openvino else False, "Compile upscaler"), "cuda_compile_backend": OptionInfo("openvino_fx" if cmd_opts.use_openvino else "none", "Model compile backend", gr.Radio, {"choices": ['none', 'inductor', 'cudagraphs', 'aot_ts_nvfuser', 'hidet', 'ipex', 'openvino_fx']}), "cuda_compile_mode": OptionInfo("default", "Model compile mode", gr.Radio, {"choices": ['default', 'reduce-overhead', 'max-autotune']}), "cuda_compile_fullgraph": OptionInfo(False, "Model compile fullgraph"),