From 1923ee76ed65103035958d6d3ab2d4fad0b58886 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 19:12:00 +0530 Subject: [PATCH 01/13] Add sdxl support --- configs/stable_diffusion_models.txt | 3 +- environment.yml | 5 +- src/backend/generate.py | 46 +++++++ .../stablediffusion/stable_diffusion_types.py | 3 + .../stablediffusion/stablediffusionxl.py | 129 ++++++++++++++++++ src/frontend/web/text_to_image_xl_ui.py | 114 ++++++++++++++++ src/frontend/web/ui.py | 4 + 7 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 src/backend/stablediffusion/stablediffusionxl.py create mode 100644 src/frontend/web/text_to_image_xl_ui.py diff --git a/configs/stable_diffusion_models.txt b/configs/stable_diffusion_models.txt index 07c4106..b032483 100644 --- a/configs/stable_diffusion_models.txt +++ b/configs/stable_diffusion_models.txt @@ -16,4 +16,5 @@ lllyasviel/sd-controlnet-hed lllyasviel/sd-controlnet-openpose lllyasviel/sd-controlnet-depth lllyasviel/sd-controlnet-scribble -lllyasviel/sd-controlnet-seg \ No newline at end of file +lllyasviel/sd-controlnet-seg +stabilityai/stable-diffusion-xl-base-0.9 \ No newline at end of file diff --git a/environment.yml b/environment.yml index 895a56e..fb5c570 100644 --- a/environment.yml +++ b/environment.yml @@ -13,7 +13,7 @@ dependencies: - numpy=1.19.2 - pip: - accelerate==0.17.1 - - diffusers==0.14.0 + - diffusers==0.18.2 - gradio==3.17.1 - safetensors==0.2.8 - scipy==1.10.0 @@ -24,4 +24,5 @@ dependencies: - flake8==6.0.0 - markupsafe==2.0.1 - opencv-contrib-python==4.7.0.72 - - controlnet-aux==0.0.1 \ No newline at end of file + - controlnet-aux==0.0.1 + - invisible-watermark==0.2.0 \ No newline at end of file diff --git a/src/backend/generate.py b/src/backend/generate.py index bbae16e..4834722 100644 --- a/src/backend/generate.py +++ b/src/backend/generate.py @@ -15,6 +15,7 @@ ) from backend.controlnet.ControlContext import ControlnetContext from backend.stablediffusion.stablediffusion import StableDiffusion +from backend.stablediffusion.stablediffusionxl import StableDiffusionXl from settings import AppSettings @@ -30,6 +31,7 @@ def __init__(self, compute: Computing): self.stable_diffusion_depth = StableDiffusionDepthToImage(compute) self.stable_diffusion_pix_to_pix = StableDiffusionInstructPixToPix(compute) self.controlnet = ControlnetContext(compute) + self.stable_diffusion_xl = StableDiffusionXl(compute) self.app_settings = AppSettings().get_settings() self.model_id = self.app_settings.model_settings.model_id self.low_vram_mode = self.app_settings.low_memory_mode @@ -78,6 +80,15 @@ def _init_stable_diffusion(self): ) self.pipe_initialized = True + def _init_stable_diffusion_xl(self): + if not self.pipe_initialized: + print("Initializing stable diffusion xl pipeline") + self.stable_diffusion_xl.get_text_to_image_xl_pipleline( + self.model_id, + self.low_vram_mode, + ) + self.pipe_initialized = True + def diffusion_image_to_image( self, image, @@ -355,3 +366,38 @@ def diffusion_control_to_image( "CannyToImage", ) return images + + def diffusion_text_to_image_xl( + self, + prompt, + neg_prompt, + image_height, + image_width, + inference_steps, + scheduler, + guidance_scale, + num_images, + attention_slicing, + vae_slicing, + seed, + ) -> Any: + stable_diffusion_settings = StableDiffusionSetting( + prompt=prompt, + negative_prompt=neg_prompt, + image_height=image_height, + image_width=image_width, + inference_steps=inference_steps, + guidance_scale=guidance_scale, + number_of_images=num_images, + scheduler=scheduler, + seed=seed, + attention_slicing=attention_slicing, + vae_slicing=vae_slicing, + ) + self._init_stable_diffusion_xl() + images = self.stable_diffusion_xl.text_to_image_xl(stable_diffusion_settings) + self._save_images( + images, + "TextToImage", + ) + return images diff --git a/src/backend/stablediffusion/stable_diffusion_types.py b/src/backend/stablediffusion/stable_diffusion_types.py index e87b132..3a485a6 100644 --- a/src/backend/stablediffusion/stable_diffusion_types.py +++ b/src/backend/stablediffusion/stable_diffusion_types.py @@ -16,6 +16,7 @@ class StableDiffusionType(str, Enum): controlnet_depth = "controlnet_depth" controlnet_scribble = "controlnet_scribble" controlnet_seg = "controlnet_seg" + stable_diffusion_xl = "StableDiffusionXl" def get_diffusion_type( @@ -44,4 +45,6 @@ def get_diffusion_type( stable_diffusion_type = StableDiffusionType.controlnet_scribble elif "controlnet-seg" in model_id: stable_diffusion_type = StableDiffusionType.controlnet_seg + elif "stable-diffusion-xl" in model_id: + stable_diffusion_type = StableDiffusionType.stable_diffusion_xl return stable_diffusion_type diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py new file mode 100644 index 0000000..90202a4 --- /dev/null +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -0,0 +1,129 @@ +from diffusers import StableDiffusionXLPipeline + +import torch +from diffusers import StableDiffusionImg2ImgPipeline, StableDiffusionPipeline +from PIL import Image + +from backend.computing import Computing +from backend.stablediffusion.scheduler_mixin import SamplerMixin +from backend.stablediffusion.models.scheduler_types import SchedulerType +from backend.stablediffusion.models.setting import ( + StableDiffusionImageToImageSetting, + StableDiffusionSetting, +) +from time import time +from backend.stablediffusion.modelmeta import ModelMeta + + +class StableDiffusionXl(SamplerMixin): + def __init__(self, compute: Computing): + self.compute = compute + self.pipeline = None + self.device = self.compute.name + + super().__init__() + + def get_text_to_image_xl_pipleline( + self, + model_id: str = "stabilityai/stable-diffusion-xl-base-0.9", + low_vram_mode: bool = False, + sampler: str = SchedulerType.DPMSolverMultistepScheduler.value, + ): + repo_id = model_id + model_meta = ModelMeta(repo_id) + is_lora_model = model_meta.is_loramodel() + if is_lora_model: + print("LoRA model detected") + self.model_id = model_meta.get_lora_base_model() + print(f"LoRA base model - {self.model_id}") + else: + self.model_id = model_id + + self.low_vram_mode = low_vram_mode + print(f"StableDiffusion - {self.compute.name},{self.compute.datatype}") + print(f"using model {model_id}") + self.default_sampler = self.find_sampler( + sampler, + self.model_id, + ) + tic = time() + self._load_model() + delta = time() - tic + print(f"Model loaded in {delta:.2f}s ") + + if self.pipeline is None: + raise Exception("Text to image pipeline not initialized") + if is_lora_model: + self.pipeline.unet.load_attn_procs(repo_id) + self._pipeline_to_device() + components = self.pipeline.components + self.img_to_img_pipeline = StableDiffusionImg2ImgPipeline(**components) + + def text_to_image_xl(self, setting: StableDiffusionSetting): + if self.pipeline is None: + raise Exception("Text to image pipeline not initialized") + + self.pipeline.scheduler = self.find_sampler( + setting.scheduler, + self.model_id, + ) + generator = None + if setting.seed != -1: + print(f"Using seed {setting.seed}") + generator = torch.Generator(self.device).manual_seed(setting.seed) + + if setting.attention_slicing: + self.pipeline.enable_attention_slicing() + else: + self.pipeline.disable_attention_slicing() + + if setting.vae_slicing: + self.pipeline.enable_vae_slicing() + else: + self.pipeline.disable_vae_slicing() + + images = self.pipeline( + setting.prompt, + guidance_scale=setting.guidance_scale, + num_inference_steps=setting.inference_steps, + height=setting.image_height, + width=setting.image_width, + negative_prompt=setting.negative_prompt, + num_images_per_prompt=setting.number_of_images, + generator=generator, + ).images + return images + + def _pipeline_to_device(self): + if self.low_vram_mode: + print("Running in low VRAM mode,slower to generate images") + self.pipeline.enable_sequential_cpu_offload() + else: + if self.compute.name == "cuda": + self.pipeline = self.pipeline.to("cuda") + elif self.compute.name == "mps": + self.pipeline = self.pipeline.to("mps") + + def _load_full_precision_model(self): + self.pipeline = StableDiffusionPipeline.from_pretrained( + self.model_id, + torch_dtype=self.compute.datatype, + scheduler=self.default_sampler, + ) + + def _load_model(self): + if self.compute.name == "cuda": + try: + self.pipeline = StableDiffusionXLPipeline.from_pretrained( + self.model_id, + torch_dtype=self.compute.datatype, + scheduler=self.default_sampler, + revision="fp16", + ) + except Exception as ex: + print( + f" The fp16 of the model not found using full precision model, {ex}" + ) + self._load_full_precision_model() + else: + self._load_full_precision_model() diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py new file mode 100644 index 0000000..5344f77 --- /dev/null +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -0,0 +1,114 @@ +from typing import Any + +import gradio as gr + +from backend.stablediffusion.models.scheduler_types import ( + SchedulerType, + get_sampler_names, +) + +random_enabled = True + + +def get_text_to_image_xl_ui(generate_callback_fn: Any) -> None: + with gr.Blocks(): + with gr.Row(): + with gr.Column(): + + def random_seed(): + global random_enabled + random_enabled = not random_enabled + seed_val = -1 + if not random_enabled: + seed_val = 42 + return gr.Number.update( + interactive=not random_enabled, value=seed_val + ) + + # with gr.Row(): + prompt = gr.Textbox( + label="Describe the image you'd like to see", + lines=3, + placeholder="A fantasy landscape", + ) + neg_prompt = gr.Textbox( + label="Don't want to see", + lines=1, + placeholder="", + value="bad, deformed, ugly, bad anatomy", + ) + with gr.Accordion("Advanced options", open=False): + image_height = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Height" + ) + image_width = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Width" + ) + num_inference_steps = gr.Slider( + 1, 100, value=20, step=1, label="Inference Steps" + ) + scheduler = gr.Dropdown( + get_sampler_names(), + value=SchedulerType.DPMSolverMultistepScheduler.value, + label="Sampler", + ) + guidance_scale = gr.Slider( + 1.0, 30.0, value=7.5, step=0.5, label="Guidance Scale" + ) + num_images = gr.Slider( + 1, + 50, + value=1, + step=1, + label="Number of images to generate", + ) + attn_slicing = gr.Checkbox( + label="Attention slicing (Enable if low VRAM)", + value=True, + ) + + vae_slicing = gr.Checkbox( + label="VAE slicing (Enable if low VRAM)", + value=True, + ) + seed = gr.Number( + label="Seed", + value=-1, + precision=0, + interactive=False, + ) + seed_checkbox = gr.Checkbox( + label="Use random seed", + value=True, + interactive=True, + ) + + input_params = [ + prompt, + neg_prompt, + image_height, + image_width, + num_inference_steps, + scheduler, + guidance_scale, + num_images, + attn_slicing, + vae_slicing, + seed, + ] + + with gr.Column(): + generate_btn = gr.Button("Generate", elem_id="generate_button") + output = gr.Gallery( + label="Generated images", + show_label=True, + elem_id="gallery", + ).style( + grid=2, + ) + seed_checkbox.change(fn=random_seed, outputs=seed) + generate_btn.click( + fn=generate_callback_fn, + inputs=input_params, + outputs=output, + ) diff --git a/src/frontend/web/ui.py b/src/frontend/web/ui.py index 9b4f88d..db0eaaa 100644 --- a/src/frontend/web/ui.py +++ b/src/frontend/web/ui.py @@ -12,6 +12,7 @@ from frontend.web.instruct_pix_to_pix_ui import get_instruct_pix_to_pix_ui from frontend.web.settings_ui import get_settings_ui from frontend.web.text_to_image_ui import get_text_to_image_ui +from frontend.web.text_to_image_xl_ui import get_text_to_image_xl_ui from frontend.web.controlnet.controlnet_image_ui import get_controlnet_to_image_ui from settings import AppSettings from utils import DiffusionMagicPaths @@ -76,6 +77,9 @@ def diffusionmagic_web_ui(generate: Generate) -> gr.Blocks: elif stable_diffusion_type == StableDiffusionType.controlnet_seg: with gr.TabItem("Controlnet Segmentation"): get_controlnet_to_image_ui(generate.diffusion_control_to_image) + elif stable_diffusion_type == StableDiffusionType.stable_diffusion_xl: + with gr.TabItem("Text to Image SDXL"): + get_text_to_image_xl_ui(generate.diffusion_text_to_image_xl) with gr.TabItem("Settings"): get_settings_ui() From 9743e64770005e711e1a1039d5e28bf4ead1e954 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 19:31:30 +0530 Subject: [PATCH 02/13] removed fp16 --- src/backend/stablediffusion/stablediffusionxl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index 90202a4..35e7571 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -118,7 +118,6 @@ def _load_model(self): self.model_id, torch_dtype=self.compute.datatype, scheduler=self.default_sampler, - revision="fp16", ) except Exception as ex: print( From c09f5be43c7daa5c731672b7ee1911d346696e14 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 20:10:58 +0530 Subject: [PATCH 03/13] updated xl pipeline --- src/backend/stablediffusion/stablediffusionxl.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index 35e7571..3dd0a55 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -72,10 +72,10 @@ def text_to_image_xl(self, setting: StableDiffusionSetting): print(f"Using seed {setting.seed}") generator = torch.Generator(self.device).manual_seed(setting.seed) - if setting.attention_slicing: - self.pipeline.enable_attention_slicing() - else: - self.pipeline.disable_attention_slicing() + # if setting.attention_slicing: + # self.pipeline.enable_attention_slicing() + # else: + # self.pipeline.disable_attention_slicing() if setting.vae_slicing: self.pipeline.enable_vae_slicing() @@ -105,7 +105,7 @@ def _pipeline_to_device(self): self.pipeline = self.pipeline.to("mps") def _load_full_precision_model(self): - self.pipeline = StableDiffusionPipeline.from_pretrained( + self.pipeline = StableDiffusionXLPipeline.from_pretrained( self.model_id, torch_dtype=self.compute.datatype, scheduler=self.default_sampler, From 065da0682c79c25dad1290d1a6f8620facbe436e Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 20:23:45 +0530 Subject: [PATCH 04/13] disabling img to img --- src/backend/stablediffusion/stablediffusionxl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index 3dd0a55..b4e33de 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -57,7 +57,7 @@ def get_text_to_image_xl_pipleline( self.pipeline.unet.load_attn_procs(repo_id) self._pipeline_to_device() components = self.pipeline.components - self.img_to_img_pipeline = StableDiffusionImg2ImgPipeline(**components) + # self.img_to_img_pipeline = StableDiffusionImg2ImgPipeline(**components) def text_to_image_xl(self, setting: StableDiffusionSetting): if self.pipeline is None: From 0cdfc86c4f9b2a5adffe43c7487a851dc9e13c1d Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 21:23:24 +0530 Subject: [PATCH 05/13] default model changed to xl --- src/models/configs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/configs.py b/src/models/configs.py index 41134e8..6bb5117 100644 --- a/src/models/configs.py +++ b/src/models/configs.py @@ -3,7 +3,7 @@ class StableDiffusionModel(BaseModel): - model_id: str = "stabilityai/stable-diffusion-2-1-base" + model_id: str = "stabilityai/stable-diffusion-xl-base-0.9" use_local: bool = False From ee2212ce420cff8575b33a7ec4420af38ecb5562 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 21:29:41 +0530 Subject: [PATCH 06/13] removed attention slicing --- src/frontend/web/text_to_image_xl_ui.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py index 5344f77..ad6ac48 100644 --- a/src/frontend/web/text_to_image_xl_ui.py +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -62,10 +62,10 @@ def random_seed(): step=1, label="Number of images to generate", ) - attn_slicing = gr.Checkbox( - label="Attention slicing (Enable if low VRAM)", - value=True, - ) + # attn_slicing = gr.Checkbox( + # label="Attention slicing (Enable if low VRAM)", + # value=True, + # ) vae_slicing = gr.Checkbox( label="VAE slicing (Enable if low VRAM)", @@ -92,7 +92,7 @@ def random_seed(): scheduler, guidance_scale, num_images, - attn_slicing, + False, vae_slicing, seed, ] From 26cc35c9452f034ab59c74059623116f69a7da6e Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 21:44:47 +0530 Subject: [PATCH 07/13] Updated readme --- Readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Readme.md b/Readme.md index b179563..198e54e 100644 --- a/Readme.md +++ b/Readme.md @@ -5,6 +5,10 @@ DiffusionMagic focused on the following areas: - Cross-platform (Windows/Linux/Mac) - Modular design, latest best optimizations for speed and memory +## StableDiffusion XL Colab +We can run StableDiffusion XL 0.9 on Google Colab +[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1KrmcU2gONIQ2WihI1s6uITgDDzkbKaJK?usp=sharing) + ![ DiffusionMagic](https://raw.githubusercontent.com/rupeshs/diffusionmagic/main/docs/images/diffusion_magic.PNG) ## Features - Supports various Stable Diffusion workflows From 88110b0a7d1a99a825890f5fc3e539e7472879d8 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 21:52:05 +0530 Subject: [PATCH 08/13] Updated readme format --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 198e54e..cb3c292 100644 --- a/Readme.md +++ b/Readme.md @@ -5,7 +5,7 @@ DiffusionMagic focused on the following areas: - Cross-platform (Windows/Linux/Mac) - Modular design, latest best optimizations for speed and memory -## StableDiffusion XL Colab +## Stable diffusion XL Colab We can run StableDiffusion XL 0.9 on Google Colab [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1KrmcU2gONIQ2WihI1s6uITgDDzkbKaJK?usp=sharing) From 19285d08d67f80586eb5975edd275c1a3351b722 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 23 Jul 2023 22:15:41 +0530 Subject: [PATCH 09/13] attention slicing ui updated --- src/frontend/web/text_to_image_xl_ui.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py index ad6ac48..946ee2f 100644 --- a/src/frontend/web/text_to_image_xl_ui.py +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -62,10 +62,10 @@ def random_seed(): step=1, label="Number of images to generate", ) - # attn_slicing = gr.Checkbox( - # label="Attention slicing (Enable if low VRAM)", - # value=True, - # ) + attn_slicing = gr.Checkbox( + label="Attention slicing (Not used)", + value=True, + ) vae_slicing = gr.Checkbox( label="VAE slicing (Enable if low VRAM)", @@ -92,7 +92,7 @@ def random_seed(): scheduler, guidance_scale, num_images, - False, + attn_slicing, vae_slicing, seed, ] From a8a3d359458a79bfc5a041080ca9e048d18fdcc1 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sat, 5 Aug 2023 15:58:27 +0530 Subject: [PATCH 10/13] SDXL baseline support --- configs/stable_diffusion_models.txt | 3 +- environment.yml | 8 +- src/backend/generate.py | 80 +++++++++++ .../stablediffusion/stablediffusionxl.py | 111 +++++++++++++++- src/frontend/web/image_inpainting_ui.py | 2 +- src/frontend/web/image_inpainting_xl_ui.py | 115 ++++++++++++++++ src/frontend/web/image_to_image_xl_ui.py | 124 ++++++++++++++++++ src/frontend/web/text_to_image_xl_ui.py | 4 +- src/frontend/web/ui.py | 6 + src/models/configs.py | 2 +- 10 files changed, 441 insertions(+), 14 deletions(-) create mode 100644 src/frontend/web/image_inpainting_xl_ui.py create mode 100644 src/frontend/web/image_to_image_xl_ui.py diff --git a/configs/stable_diffusion_models.txt b/configs/stable_diffusion_models.txt index b032483..5ee79e4 100644 --- a/configs/stable_diffusion_models.txt +++ b/configs/stable_diffusion_models.txt @@ -17,4 +17,5 @@ lllyasviel/sd-controlnet-openpose lllyasviel/sd-controlnet-depth lllyasviel/sd-controlnet-scribble lllyasviel/sd-controlnet-seg -stabilityai/stable-diffusion-xl-base-0.9 \ No newline at end of file +stabilityai/stable-diffusion-xl-base-0.9 +stabilityai/stable-diffusion-xl-base-1.0 \ No newline at end of file diff --git a/environment.yml b/environment.yml index fb5c570..1d3912b 100644 --- a/environment.yml +++ b/environment.yml @@ -12,12 +12,12 @@ dependencies: - torchvision=0.15.0 - numpy=1.19.2 - pip: - - accelerate==0.17.1 - - diffusers==0.18.2 + - accelerate==0.21.0 + - diffusers==0.19.3 - gradio==3.17.1 - - safetensors==0.2.8 + - safetensors==0.3.1 - scipy==1.10.0 - - transformers==4.26.0 + - transformers==4.31.0 - pydantic==1.10.4 - mypy==1.0.0 - black==23.1.0 diff --git a/src/backend/generate.py b/src/backend/generate.py index 4834722..4fbd8bd 100644 --- a/src/backend/generate.py +++ b/src/backend/generate.py @@ -401,3 +401,83 @@ def diffusion_text_to_image_xl( "TextToImage", ) return images + + def diffusion_image_to_image_xl( + self, + image, + strength, + prompt, + neg_prompt, + image_height, + image_width, + inference_steps, + scheduler, + guidance_scale, + num_images, + attention_slicing, + seed, + ) -> Any: + stable_diffusion_image_settings = StableDiffusionImageToImageSetting( + image=image, + strength=strength, + prompt=prompt, + negative_prompt=neg_prompt, + image_height=image_height, + image_width=image_width, + inference_steps=inference_steps, + guidance_scale=guidance_scale, + number_of_images=num_images, + scheduler=scheduler, + seed=seed, + attention_slicing=attention_slicing, + ) + self._init_stable_diffusion_xl() + images = self.stable_diffusion_xl.image_to_image( + stable_diffusion_image_settings + ) + + self._save_images( + images, + "ImageToImage", + ) + return images + + def diffusion_image_inpainting_xl( + self, + image, + prompt, + neg_prompt, + image_height, + image_width, + inference_steps, + scheduler, + guidance_scale, + num_images, + attention_slicing, + seed, + ) -> Any: + stable_diffusion_image_settings = StableDiffusionImageInpaintingSetting( + image=image["image"], + mask_image=image["mask"], + prompt=prompt, + negative_prompt=neg_prompt, + image_height=image_height, + image_width=image_width, + inference_steps=inference_steps, + guidance_scale=guidance_scale, + number_of_images=num_images, + scheduler=scheduler, + seed=seed, + attention_slicing=attention_slicing, + ) + + self._init_stable_diffusion_xl() + + images = self.stable_diffusion_xl.image_inpainting( + stable_diffusion_image_settings + ) + self._save_images( + images, + "Inpainting", + ) + return images diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index b4e33de..4cda7b8 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -1,7 +1,8 @@ from diffusers import StableDiffusionXLPipeline import torch -from diffusers import StableDiffusionImg2ImgPipeline, StableDiffusionPipeline +from diffusers import StableDiffusionXLImg2ImgPipeline, StableDiffusionXLInpaintPipeline +from diffusers import DiffusionPipeline from PIL import Image from backend.computing import Computing @@ -13,6 +14,7 @@ ) from time import time from backend.stablediffusion.modelmeta import ModelMeta +from backend.stablediffusion.models.setting import StableDiffusionImageInpaintingSetting class StableDiffusionXl(SamplerMixin): @@ -25,7 +27,7 @@ def __init__(self, compute: Computing): def get_text_to_image_xl_pipleline( self, - model_id: str = "stabilityai/stable-diffusion-xl-base-0.9", + model_id: str = "stabilityai/stable-diffusion-xl-base-1.0", low_vram_mode: bool = False, sampler: str = SchedulerType.DPMSolverMultistepScheduler.value, ): @@ -57,7 +59,8 @@ def get_text_to_image_xl_pipleline( self.pipeline.unet.load_attn_procs(repo_id) self._pipeline_to_device() components = self.pipeline.components - # self.img_to_img_pipeline = StableDiffusionImg2ImgPipeline(**components) + self.img_to_img_pipeline = StableDiffusionXLImg2ImgPipeline(**components) + self.inpainting_pipeline = StableDiffusionXLInpaintPipeline(**components) def text_to_image_xl(self, setting: StableDiffusionSetting): if self.pipeline is None: @@ -92,6 +95,12 @@ def text_to_image_xl(self, setting: StableDiffusionSetting): num_images_per_prompt=setting.number_of_images, generator=generator, ).images + + # self.pipeline.unet = torch.compile( + # self.pipeline.unet, + # mode="reduce-overhead", + # fullgraph=True, + # ) return images def _pipeline_to_device(self): @@ -105,7 +114,7 @@ def _pipeline_to_device(self): self.pipeline = self.pipeline.to("mps") def _load_full_precision_model(self): - self.pipeline = StableDiffusionXLPipeline.from_pretrained( + self.pipeline = DiffusionPipeline( self.model_id, torch_dtype=self.compute.datatype, scheduler=self.default_sampler, @@ -114,10 +123,12 @@ def _load_full_precision_model(self): def _load_model(self): if self.compute.name == "cuda": try: - self.pipeline = StableDiffusionXLPipeline.from_pretrained( + self.pipeline = DiffusionPipeline.from_pretrained( self.model_id, torch_dtype=self.compute.datatype, scheduler=self.default_sampler, + use_safetensors=True, + variant="fp16", ) except Exception as ex: print( @@ -126,3 +137,93 @@ def _load_model(self): self._load_full_precision_model() else: self._load_full_precision_model() + + def image_to_image(self, setting: StableDiffusionImageToImageSetting): + if setting.scheduler is None: + raise Exception("Scheduler cannot be empty") + + print("Running image to image pipeline") + self.img_to_img_pipeline.scheduler = self.find_sampler( # type: ignore + setting.scheduler, + self.model_id, + ) + generator = None + if setting.seed != -1 and setting.seed: + print(f"Using seed {setting.seed}") + generator = torch.Generator(self.device).manual_seed(setting.seed) + + if setting.attention_slicing: + self.img_to_img_pipeline.enable_attention_slicing() # type: ignore + else: + self.img_to_img_pipeline.disable_attention_slicing() # type: ignore + + if setting.vae_slicing: + self.pipeline.enable_vae_slicing() # type: ignore + else: + self.pipeline.disable_vae_slicing() # type: ignore + + init_image = setting.image.resize( + ( + setting.image_width, + setting.image_height, + ), + Image.Resampling.LANCZOS, + ) + images = self.img_to_img_pipeline( # type: ignore + image=init_image, + strength=setting.strength, + prompt=setting.prompt, + guidance_scale=setting.guidance_scale, + num_inference_steps=setting.inference_steps, + negative_prompt=setting.negative_prompt, + num_images_per_prompt=setting.number_of_images, + generator=generator, + ).images + return images + + def image_inpainting(self, setting: StableDiffusionImageInpaintingSetting): + if setting.scheduler is None: + raise Exception("Scheduler cannot be empty") + print("Running image inpainting pipeline") + self.inpainting_pipeline.scheduler = self.find_sampler( + setting.scheduler, + self.model_id, + ) + generator = None + if setting.seed != -1 and setting.seed: + print(f"Using seed {setting.seed}") + generator = torch.Generator(self.device).manual_seed(setting.seed) + + if setting.attention_slicing: + self.inpainting_pipeline.enable_attention_slicing() + else: + self.inpainting_pipeline.disable_attention_slicing() + + base_image = setting.image.convert("RGB").resize( + ( + setting.image_width, + setting.image_height, + ), + Image.Resampling.LANCZOS, + ) + mask_image = setting.mask_image.convert("RGB").resize( + ( + setting.image_width, + setting.image_height, + ), + Image.Resampling.LANCZOS, + ) + + images = self.inpainting_pipeline( + image=base_image, + mask_image=mask_image, + height=setting.image_height, + width=setting.image_width, + prompt=setting.prompt, + guidance_scale=setting.guidance_scale, + num_inference_steps=setting.inference_steps, + negative_prompt=setting.negative_prompt, + num_images_per_prompt=setting.number_of_images, + generator=generator, + ).images + return images diff --git a/src/frontend/web/image_inpainting_ui.py b/src/frontend/web/image_inpainting_ui.py index edd9b48..68a0ec8 100644 --- a/src/frontend/web/image_inpainting_ui.py +++ b/src/frontend/web/image_inpainting_ui.py @@ -69,7 +69,7 @@ def random_seed(): label="Number of images to generate", ) attn_slicing = gr.Checkbox( - label="Attention slicing (Enable if low VRAM)", + label="Attention slicing (Not used)", value=True, ) seed = gr.Number( diff --git a/src/frontend/web/image_inpainting_xl_ui.py b/src/frontend/web/image_inpainting_xl_ui.py new file mode 100644 index 0000000..9f6b515 --- /dev/null +++ b/src/frontend/web/image_inpainting_xl_ui.py @@ -0,0 +1,115 @@ +from typing import Any + +import gradio as gr + +from backend.stablediffusion.models.scheduler_types import ( + SchedulerType, + get_sampler_names, +) + +random_enabled = True + + +def get_image_inpainting_xl_ui(generate_callback_fn: Any) -> None: + with gr.Blocks(): + with gr.Row(): + with gr.Column(): + + def random_seed(): + global random_enabled + random_enabled = not random_enabled + seed_val = -1 + if not random_enabled: + seed_val = 42 + + return gr.Number.update( + interactive=not random_enabled, value=seed_val + ) + + input_image = gr.Image(label="Input image", type="pil", tool="sketch") + prompt = gr.Textbox( + label="Describe the image you'd like to see", + lines=3, + placeholder="A fantasy landscape", + ) + + neg_prompt = gr.Textbox( + label="Don't want to see", + lines=1, + placeholder="", + value="bad, deformed, ugly, bad anatomy", + ) + with gr.Accordion("Advanced options", open=False): + image_height = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Height" + ) + image_width = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Width" + ) + num_inference_steps = gr.Slider( + 1, 100, value=20, step=1, label="Inference Steps" + ) + scheduler = gr.Dropdown( + get_sampler_names(), + value=SchedulerType.DPMSolverMultistepScheduler.value, + label="Sampler", + ) + guidance_scale = gr.Slider( + 1.0, + 30.0, + value=7.5, + step=0.5, + label="Guidance Scale", + ) + num_images = gr.Slider( + 1, + 50, + value=1, + step=1, + label="Number of images to generate", + ) + attn_slicing = gr.Checkbox( + label="Attention slicing (Enable if low VRAM)", + value=True, + ) + seed = gr.Number( + label="Seed", + value=-1, + precision=0, + interactive=False, + ) + seed_checkbox = gr.Checkbox( + label="Use random seed", + value=True, + interactive=True, + ) + + input_params = [ + input_image, + prompt, + neg_prompt, + image_height, + image_width, + num_inference_steps, + scheduler, + guidance_scale, + num_images, + attn_slicing, + seed, + ] + + with gr.Column(): + generate_btn = gr.Button("Inpaint!", elem_id="generate_button") + output = gr.Gallery( + label="Generated images", + show_label=True, + elem_id="gallery", + ).style( + grid=2, + ) + generate_btn.click( + fn=generate_callback_fn, + inputs=input_params, + outputs=output, + ) + seed_checkbox.change(fn=random_seed, outputs=seed) diff --git a/src/frontend/web/image_to_image_xl_ui.py b/src/frontend/web/image_to_image_xl_ui.py new file mode 100644 index 0000000..02efb5e --- /dev/null +++ b/src/frontend/web/image_to_image_xl_ui.py @@ -0,0 +1,124 @@ +from typing import Any + +import gradio as gr + +from backend.stablediffusion.models.scheduler_types import ( + SchedulerType, + get_sampler_names, +) + +random_enabled = True + + +def get_image_to_image_xl_ui(generate_callback_fn: Any) -> None: + with gr.Blocks(): + with gr.Row(): + with gr.Column(): + + def random_seed(): + global random_enabled + random_enabled = not random_enabled + seed_val = -1 + if not random_enabled: + seed_val = 42 + + return gr.Number.update( + interactive=not random_enabled, value=seed_val + ) + + input_image = gr.Image(label="Input image", type="pil") + strength = gr.Slider( + 0.0, + 1.0, + value=0.75, + step=0.05, + label="Strength", + ) + + prompt = gr.Textbox( + label="Describe the image you'd like to see", + lines=3, + placeholder="A fantasy landscape", + ) + + neg_prompt = gr.Textbox( + label="Don't want to see", + lines=1, + placeholder="", + value="bad, deformed, ugly, bad anatomy", + ) + with gr.Accordion("Advanced options", open=False): + image_height = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Height" + ) + image_width = gr.Slider( + 1024, 2048, value=1024, step=64, label="Image Width" + ) + num_inference_steps = gr.Slider( + 1, 100, value=20, step=1, label="Inference Steps" + ) + scheduler = gr.Dropdown( + get_sampler_names(), + value=SchedulerType.DPMSolverMultistepScheduler.value, + label="Sampler", + ) + guidance_scale = gr.Slider( + 1.0, + 30.0, + value=7.5, + step=0.5, + label="Guidance Scale", + ) + num_images = gr.Slider( + 1, + 50, + value=1, + step=1, + label="Number of images to generate", + ) + attn_slicing = gr.Checkbox( + label="Attention slicing (Not used)", + value=True, + ) + seed = gr.Number( + label="Seed", + value=-1, + precision=0, + interactive=False, + ) + seed_checkbox = gr.Checkbox( + label="Use random seed", + value=True, + interactive=True, + ) + + input_params = [ + input_image, + strength, + prompt, + neg_prompt, + image_height, + image_width, + num_inference_steps, + scheduler, + guidance_scale, + num_images, + attn_slicing, + seed, + ] + + with gr.Column(): + generate_btn = gr.Button("Generate", elem_id="generate_button") + output = gr.Gallery( + label="Generated images", + show_label=True, + elem_id="gallery", + ).style( + grid=2, + ) + generate_btn.click( + fn=generate_callback_fn, + inputs=input_params, + outputs=output, + ) + seed_checkbox.change(fn=random_seed, outputs=seed) diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py index 946ee2f..068b3be 100644 --- a/src/frontend/web/text_to_image_xl_ui.py +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -39,10 +39,10 @@ def random_seed(): ) with gr.Accordion("Advanced options", open=False): image_height = gr.Slider( - 1024, 2048, value=1024, step=64, label="Image Height" + 768, 2048, value=768, step=64, label="Image Height" ) image_width = gr.Slider( - 1024, 2048, value=1024, step=64, label="Image Width" + 768, 2048, value=768, step=64, label="Image Width" ) num_inference_steps = gr.Slider( 1, 100, value=20, step=1, label="Inference Steps" diff --git a/src/frontend/web/ui.py b/src/frontend/web/ui.py index db0eaaa..de43a46 100644 --- a/src/frontend/web/ui.py +++ b/src/frontend/web/ui.py @@ -13,6 +13,8 @@ from frontend.web.settings_ui import get_settings_ui from frontend.web.text_to_image_ui import get_text_to_image_ui from frontend.web.text_to_image_xl_ui import get_text_to_image_xl_ui +from frontend.web.image_to_image_xl_ui import get_image_to_image_xl_ui +from frontend.web.image_inpainting_xl_ui import get_image_inpainting_xl_ui from frontend.web.controlnet.controlnet_image_ui import get_controlnet_to_image_ui from settings import AppSettings from utils import DiffusionMagicPaths @@ -80,6 +82,10 @@ def diffusionmagic_web_ui(generate: Generate) -> gr.Blocks: elif stable_diffusion_type == StableDiffusionType.stable_diffusion_xl: with gr.TabItem("Text to Image SDXL"): get_text_to_image_xl_ui(generate.diffusion_text_to_image_xl) + with gr.TabItem("Image to Image SDXL"): + get_image_to_image_xl_ui(generate.diffusion_image_to_image_xl) + with gr.TabItem("Image Inpainting SDXL"): + get_image_inpainting_xl_ui(generate.diffusion_image_inpainting_xl) with gr.TabItem("Settings"): get_settings_ui() diff --git a/src/models/configs.py b/src/models/configs.py index 6bb5117..cc0f3fd 100644 --- a/src/models/configs.py +++ b/src/models/configs.py @@ -3,7 +3,7 @@ class StableDiffusionModel(BaseModel): - model_id: str = "stabilityai/stable-diffusion-xl-base-0.9" + model_id: str = "stabilityai/stable-diffusion-xl-base-1.0" use_local: bool = False From b5cf79f749634e1d5d26b1e63797b80d99a008cd Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sat, 5 Aug 2023 22:03:39 +0530 Subject: [PATCH 11/13] Updated readme and removed sdxl painting (not stable) --- Readme.md | 1 + configs/stable_diffusion_models.txt | 1 - src/backend/generate.py | 40 ------------ .../stablediffusion/stablediffusionxl.py | 62 +++---------------- src/frontend/web/image_to_image_xl_ui.py | 11 ++-- src/frontend/web/text_to_image_xl_ui.py | 11 ++-- src/frontend/web/ui.py | 3 - 7 files changed, 20 insertions(+), 109 deletions(-) diff --git a/Readme.md b/Readme.md index cb3c292..f02d49a 100644 --- a/Readme.md +++ b/Readme.md @@ -117,6 +117,7 @@ Or we can clone the model use the local folder path as model id. ## Linting (Development) Run the following commands from src folder `mypy --ignore-missing-imports --explicit-package-bases .` + `flake8 --max-line-length=100 .` ## Contribute Contributions are welcomed. diff --git a/configs/stable_diffusion_models.txt b/configs/stable_diffusion_models.txt index 5ee79e4..f5dd3c0 100644 --- a/configs/stable_diffusion_models.txt +++ b/configs/stable_diffusion_models.txt @@ -17,5 +17,4 @@ lllyasviel/sd-controlnet-openpose lllyasviel/sd-controlnet-depth lllyasviel/sd-controlnet-scribble lllyasviel/sd-controlnet-seg -stabilityai/stable-diffusion-xl-base-0.9 stabilityai/stable-diffusion-xl-base-1.0 \ No newline at end of file diff --git a/src/backend/generate.py b/src/backend/generate.py index 4fbd8bd..bad9e6d 100644 --- a/src/backend/generate.py +++ b/src/backend/generate.py @@ -441,43 +441,3 @@ def diffusion_image_to_image_xl( "ImageToImage", ) return images - - def diffusion_image_inpainting_xl( - self, - image, - prompt, - neg_prompt, - image_height, - image_width, - inference_steps, - scheduler, - guidance_scale, - num_images, - attention_slicing, - seed, - ) -> Any: - stable_diffusion_image_settings = StableDiffusionImageInpaintingSetting( - image=image["image"], - mask_image=image["mask"], - prompt=prompt, - negative_prompt=neg_prompt, - image_height=image_height, - image_width=image_width, - inference_steps=inference_steps, - guidance_scale=guidance_scale, - number_of_images=num_images, - scheduler=scheduler, - seed=seed, - attention_slicing=attention_slicing, - ) - - self._init_stable_diffusion_xl() - - images = self.stable_diffusion_xl.image_inpainting( - stable_diffusion_image_settings - ) - self._save_images( - images, - "Inpainting", - ) - return images diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index 4cda7b8..ca3cc11 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -1,20 +1,20 @@ -from diffusers import StableDiffusionXLPipeline +from time import time import torch -from diffusers import StableDiffusionXLImg2ImgPipeline, StableDiffusionXLInpaintPipeline -from diffusers import DiffusionPipeline +from diffusers import ( + DiffusionPipeline, + StableDiffusionXLImg2ImgPipeline, +) from PIL import Image from backend.computing import Computing -from backend.stablediffusion.scheduler_mixin import SamplerMixin +from backend.stablediffusion.modelmeta import ModelMeta from backend.stablediffusion.models.scheduler_types import SchedulerType from backend.stablediffusion.models.setting import ( StableDiffusionImageToImageSetting, StableDiffusionSetting, ) -from time import time -from backend.stablediffusion.modelmeta import ModelMeta -from backend.stablediffusion.models.setting import StableDiffusionImageInpaintingSetting +from backend.stablediffusion.scheduler_mixin import SamplerMixin class StableDiffusionXl(SamplerMixin): @@ -60,7 +60,6 @@ def get_text_to_image_xl_pipleline( self._pipeline_to_device() components = self.pipeline.components self.img_to_img_pipeline = StableDiffusionXLImg2ImgPipeline(**components) - self.inpainting_pipeline = StableDiffusionXLInpaintPipeline(**components) def text_to_image_xl(self, setting: StableDiffusionSetting): if self.pipeline is None: @@ -180,50 +179,3 @@ def image_to_image(self, setting: StableDiffusionImageToImageSetting): generator=generator, ).images return images - - def image_inpainting(self, setting: StableDiffusionImageInpaintingSetting): - if setting.scheduler is None: - raise Exception("Scheduler cannot be empty") - print("Running image inpainting pipeline") - self.inpainting_pipeline.scheduler = self.find_sampler( - setting.scheduler, - self.model_id, - ) - generator = None - if setting.seed != -1 and setting.seed: - print(f"Using seed {setting.seed}") - generator = torch.Generator(self.device).manual_seed(setting.seed) - - if setting.attention_slicing: - self.inpainting_pipeline.enable_attention_slicing() - else: - self.inpainting_pipeline.disable_attention_slicing() - - base_image = setting.image.convert("RGB").resize( - ( - setting.image_width, - setting.image_height, - ), - Image.Resampling.LANCZOS, - ) - mask_image = setting.mask_image.convert("RGB").resize( - ( - setting.image_width, - setting.image_height, - ), - Image.Resampling.LANCZOS, - ) - - images = self.inpainting_pipeline( - image=base_image, - mask_image=mask_image, - height=setting.image_height, - width=setting.image_width, - prompt=setting.prompt, - guidance_scale=setting.guidance_scale, - num_inference_steps=setting.inference_steps, - negative_prompt=setting.negative_prompt, - num_images_per_prompt=setting.number_of_images, - generator=generator, - ).images - return images diff --git a/src/frontend/web/image_to_image_xl_ui.py b/src/frontend/web/image_to_image_xl_ui.py index 02efb5e..d1dc306 100644 --- a/src/frontend/web/image_to_image_xl_ui.py +++ b/src/frontend/web/image_to_image_xl_ui.py @@ -49,17 +49,17 @@ def random_seed(): ) with gr.Accordion("Advanced options", open=False): image_height = gr.Slider( - 1024, 2048, value=1024, step=64, label="Image Height" + 768, 2048, value=1024, step=64, label="Image Height" ) image_width = gr.Slider( - 1024, 2048, value=1024, step=64, label="Image Width" + 768, 2048, value=1024, step=64, label="Image Width" ) num_inference_steps = gr.Slider( 1, 100, value=20, step=1, label="Inference Steps" ) scheduler = gr.Dropdown( get_sampler_names(), - value=SchedulerType.DPMSolverMultistepScheduler.value, + value=SchedulerType.UniPCMultistepScheduler.value, label="Sampler", ) guidance_scale = gr.Slider( @@ -77,8 +77,9 @@ def random_seed(): label="Number of images to generate", ) attn_slicing = gr.Checkbox( - label="Attention slicing (Not used)", - value=True, + label="Attention slicing (Not supported)", + value=False, + interactive=False, ) seed = gr.Number( label="Seed", diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py index 068b3be..7ed6823 100644 --- a/src/frontend/web/text_to_image_xl_ui.py +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -39,17 +39,17 @@ def random_seed(): ) with gr.Accordion("Advanced options", open=False): image_height = gr.Slider( - 768, 2048, value=768, step=64, label="Image Height" + 768, 2048, value=1024, step=64, label="Image Height" ) image_width = gr.Slider( - 768, 2048, value=768, step=64, label="Image Width" + 768, 2048, value=1024, step=64, label="Image Width" ) num_inference_steps = gr.Slider( 1, 100, value=20, step=1, label="Inference Steps" ) scheduler = gr.Dropdown( get_sampler_names(), - value=SchedulerType.DPMSolverMultistepScheduler.value, + value=SchedulerType.LMSDiscreteScheduler.value, label="Sampler", ) guidance_scale = gr.Slider( @@ -63,8 +63,9 @@ def random_seed(): label="Number of images to generate", ) attn_slicing = gr.Checkbox( - label="Attention slicing (Not used)", - value=True, + label="Attention slicing (Not supported)", + value=False, + interactive=False, ) vae_slicing = gr.Checkbox( diff --git a/src/frontend/web/ui.py b/src/frontend/web/ui.py index de43a46..bb7b1b5 100644 --- a/src/frontend/web/ui.py +++ b/src/frontend/web/ui.py @@ -14,7 +14,6 @@ from frontend.web.text_to_image_ui import get_text_to_image_ui from frontend.web.text_to_image_xl_ui import get_text_to_image_xl_ui from frontend.web.image_to_image_xl_ui import get_image_to_image_xl_ui -from frontend.web.image_inpainting_xl_ui import get_image_inpainting_xl_ui from frontend.web.controlnet.controlnet_image_ui import get_controlnet_to_image_ui from settings import AppSettings from utils import DiffusionMagicPaths @@ -84,8 +83,6 @@ def diffusionmagic_web_ui(generate: Generate) -> gr.Blocks: get_text_to_image_xl_ui(generate.diffusion_text_to_image_xl) with gr.TabItem("Image to Image SDXL"): get_image_to_image_xl_ui(generate.diffusion_image_to_image_xl) - with gr.TabItem("Image Inpainting SDXL"): - get_image_inpainting_xl_ui(generate.diffusion_image_inpainting_xl) with gr.TabItem("Settings"): get_settings_ui() From e2d7a30eec225321c1ac5a3a02a0380837ccf106 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sat, 5 Aug 2023 23:00:55 +0530 Subject: [PATCH 12/13] Updated sdxl for CPU --- src/backend/stablediffusion/stablediffusionxl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/stablediffusion/stablediffusionxl.py b/src/backend/stablediffusion/stablediffusionxl.py index ca3cc11..8b1cbbd 100644 --- a/src/backend/stablediffusion/stablediffusionxl.py +++ b/src/backend/stablediffusion/stablediffusionxl.py @@ -113,7 +113,7 @@ def _pipeline_to_device(self): self.pipeline = self.pipeline.to("mps") def _load_full_precision_model(self): - self.pipeline = DiffusionPipeline( + self.pipeline = DiffusionPipeline.from_pretrained( self.model_id, torch_dtype=self.compute.datatype, scheduler=self.default_sampler, From 198e4e4b999879389ef62719f28f655659f95f58 Mon Sep 17 00:00:00 2001 From: Rupesh Sreeraman Date: Sun, 6 Aug 2023 11:47:01 +0530 Subject: [PATCH 13/13] Changed grid to columns --- environment.yml | 2 +- src/constants.py | 2 +- src/frontend/web/depth_to_image_ui.py | 2 +- src/frontend/web/image_inpainting_ui.py | 2 +- src/frontend/web/image_inpainting_xl_ui.py | 2 +- src/frontend/web/image_to_image_ui.py | 2 +- src/frontend/web/image_to_image_xl_ui.py | 2 +- src/frontend/web/image_variations_ui.py | 2 +- src/frontend/web/instruct_pix_to_pix_ui.py | 2 +- src/frontend/web/text_to_image_ui.py | 2 +- src/frontend/web/text_to_image_xl_ui.py | 2 +- src/frontend/web/ui.py | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/environment.yml b/environment.yml index 1d3912b..e85d7e9 100644 --- a/environment.yml +++ b/environment.yml @@ -14,7 +14,7 @@ dependencies: - pip: - accelerate==0.21.0 - diffusers==0.19.3 - - gradio==3.17.1 + - gradio==3.32.0 - safetensors==0.3.1 - scipy==1.10.0 - transformers==4.31.0 diff --git a/src/constants.py b/src/constants.py index 79f2bca..465b7e0 100644 --- a/src/constants.py +++ b/src/constants.py @@ -1,4 +1,4 @@ -VERSION = "2.0.0-beta.0" +VERSION = "3.0.0" STABLE_DIFFUSION_MODELS_FILE = "stable_diffusion_models.txt" APP_SETTINGS_FILE = "settings.yaml" CONFIG_DIRECTORY = "configs" diff --git a/src/frontend/web/depth_to_image_ui.py b/src/frontend/web/depth_to_image_ui.py index a4c7cd4..367e68d 100644 --- a/src/frontend/web/depth_to_image_ui.py +++ b/src/frontend/web/depth_to_image_ui.py @@ -114,7 +114,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/image_inpainting_ui.py b/src/frontend/web/image_inpainting_ui.py index 68a0ec8..3a1f05d 100644 --- a/src/frontend/web/image_inpainting_ui.py +++ b/src/frontend/web/image_inpainting_ui.py @@ -105,7 +105,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/image_inpainting_xl_ui.py b/src/frontend/web/image_inpainting_xl_ui.py index 9f6b515..be77595 100644 --- a/src/frontend/web/image_inpainting_xl_ui.py +++ b/src/frontend/web/image_inpainting_xl_ui.py @@ -105,7 +105,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/image_to_image_ui.py b/src/frontend/web/image_to_image_ui.py index 619e497..f9975fb 100644 --- a/src/frontend/web/image_to_image_ui.py +++ b/src/frontend/web/image_to_image_ui.py @@ -114,7 +114,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/image_to_image_xl_ui.py b/src/frontend/web/image_to_image_xl_ui.py index d1dc306..b1bfd48 100644 --- a/src/frontend/web/image_to_image_xl_ui.py +++ b/src/frontend/web/image_to_image_xl_ui.py @@ -115,7 +115,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/image_variations_ui.py b/src/frontend/web/image_variations_ui.py index dc91fbd..0daa00d 100644 --- a/src/frontend/web/image_variations_ui.py +++ b/src/frontend/web/image_variations_ui.py @@ -99,7 +99,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/instruct_pix_to_pix_ui.py b/src/frontend/web/instruct_pix_to_pix_ui.py index ecec6cb..b99b14b 100644 --- a/src/frontend/web/instruct_pix_to_pix_ui.py +++ b/src/frontend/web/instruct_pix_to_pix_ui.py @@ -116,7 +116,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) generate_btn.click( fn=generate_callback_fn, diff --git a/src/frontend/web/text_to_image_ui.py b/src/frontend/web/text_to_image_ui.py index 79e5f1d..5d82dd6 100644 --- a/src/frontend/web/text_to_image_ui.py +++ b/src/frontend/web/text_to_image_ui.py @@ -104,7 +104,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) seed_checkbox.change(fn=random_seed, outputs=seed) generate_btn.click( diff --git a/src/frontend/web/text_to_image_xl_ui.py b/src/frontend/web/text_to_image_xl_ui.py index 7ed6823..f93cdcc 100644 --- a/src/frontend/web/text_to_image_xl_ui.py +++ b/src/frontend/web/text_to_image_xl_ui.py @@ -105,7 +105,7 @@ def random_seed(): show_label=True, elem_id="gallery", ).style( - grid=2, + columns=2, ) seed_checkbox.change(fn=random_seed, outputs=seed) generate_btn.click( diff --git a/src/frontend/web/ui.py b/src/frontend/web/ui.py index bb7b1b5..10de569 100644 --- a/src/frontend/web/ui.py +++ b/src/frontend/web/ui.py @@ -36,7 +36,7 @@ def diffusionmagic_web_ui(generate: Generate) -> gr.Blocks: css=DiffusionMagicPaths.get_css_path(), title="DiffusionMagic", ) as diffusion_magic_ui: - gr.HTML("

DiffusionMagic 2.0 Beta

") + gr.HTML("

DiffusionMagic 3.0

") with gr.Tabs(): if stable_diffusion_type == StableDiffusionType.base: with gr.TabItem("Text to Image"):