| import spaces |
| import gradio as gr |
| import torch |
| from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel |
| from tdd_scheduler import TDDScheduler |
| from safetensors.torch import load_file |
| from PIL import Image |
| import transformers |
| transformers.utils.move_cache() |
|
|
| SAFETY_CHECKER = True |
|
|
| loaded_acc = None |
| device = "cuda" |
|
|
| ACC_lora={ |
| "TDD":"sdxl_tdd_wo_adv_lora.safetensors", |
| "TDD_adv":"sdxl_tdd_lora_weights.safetensors", |
| } |
|
|
| if torch.cuda.is_available(): |
| base1 = UNet2DConditionModel.from_pretrained( |
| "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", torch_dtype=torch.float16 |
| ).to(device) |
| base2 = UNet2DConditionModel.from_pretrained( |
| "frankjoshua/realvisxlV40_v40Bakedvae", subfolder="unet", torch_dtype=torch.float16 |
| ).to(device) |
| pipe_sdxl = StableDiffusionXLPipeline.from_pretrained( |
| "stabilityai/stable-diffusion-xl-base-1.0", |
| unet=base1, |
| torch_dtype=torch.float16, |
| variant="fp16", |
| ).to(device) |
|
|
| pipe_sdxl.load_lora_weights("RED-AIGC/TDD", weight_name=ACC_lora["TDD"], adapter_name="TDD") |
| pipe_sdxl.load_lora_weights("RED-AIGC/TDD", weight_name=ACC_lora["TDD_adv"], adapter_name="TDD_adv") |
| pipe_sdxl.scheduler = TDDScheduler.from_config(pipe_sdxl.scheduler.config) |
|
|
| pipe_sdxl_real = StableDiffusionXLPipeline.from_pretrained( |
| "stabilityai/stable-diffusion-xl-base-1.0", |
| unet=base2, |
| torch_dtype=torch.float16, |
| variant="fp16", |
| ).to(device) |
| pipe_sdxl_real.load_lora_weights("RED-AIGC/TDD", weight_name=ACC_lora["TDD"], adapter_name="TDD") |
| pipe_sdxl_real.load_lora_weights("RED-AIGC/TDD", weight_name=ACC_lora["TDD_adv"], adapter_name="TDD_adv") |
| pipe_sdxl_real.scheduler = TDDScheduler.from_config(pipe_sdxl.scheduler.config) |
|
|
| def update_base_model(ckpt): |
| if torch.cuda.is_available(): |
| pipe_sdxl = StableDiffusionXLPipeline.from_pretrained( |
| "stabilityai/stable-diffusion-xl-base-1.0", |
| torch_dtype=torch.float16, |
| variant="fp16", |
| ).to(device) |
| return pipe_sdxl |
|
|
|
|
| if SAFETY_CHECKER: |
| from safety_checker import StableDiffusionSafetyChecker |
| from transformers import CLIPFeatureExtractor |
|
|
| safety_checker = StableDiffusionSafetyChecker.from_pretrained( |
| "CompVis/stable-diffusion-safety-checker" |
| ).to(device) |
| feature_extractor = CLIPFeatureExtractor.from_pretrained( |
| "openai/clip-vit-base-patch32" |
| ) |
|
|
| def check_nsfw_images( |
| images: list[Image.Image], |
| ) -> tuple[list[Image.Image], list[bool]]: |
| safety_checker_input = feature_extractor(images, return_tensors="pt").to(device) |
| has_nsfw_concepts = safety_checker( |
| images=[images], clip_input=safety_checker_input.pixel_values.to(device) |
| ) |
|
|
| return images, has_nsfw_concepts |
|
|
|
|
| |
| @spaces.GPU(enable_queue=True) |
| def generate_image( |
| prompt, |
| negative_prompt, |
| ckpt, |
| acc, |
| num_inference_steps, |
| guidance_scale, |
| eta, |
| seed, |
| progress=gr.Progress(track_tqdm=True), |
| ): |
| global loaded_acc |
| |
|
|
| if ckpt == "Real": |
| pipe = pipe_sdxl_real |
| else: |
| pipe = pipe_sdxl |
|
|
| if loaded_acc != acc: |
| |
| pipe.set_adapters([acc], adapter_weights=[1.0]) |
| print(pipe.get_active_adapters()) |
| loaded_acc = acc |
|
|
| results = pipe( |
| prompt=prompt, |
| negative_prompt=negative_prompt, |
| num_inference_steps=num_inference_steps, |
| guidance_scale=guidance_scale, |
| eta=eta, |
| generator=torch.Generator(device=pipe.device).manual_seed(seed), |
| ) |
|
|
| if SAFETY_CHECKER: |
| images, has_nsfw_concepts = check_nsfw_images(results.images) |
| if any(has_nsfw_concepts): |
| gr.Warning("NSFW content detected.") |
| return Image.new("RGB", (512, 512)) |
| return images[0] |
| return results.images[0] |
|
|
| css = """ |
| h1 { |
| text-align: center; |
| display:block; |
| } |
| .gradio-container { |
| max-width: 70.5rem !important; |
| } |
| """ |
|
|
| with gr.Blocks(css=css) as demo: |
| gr.Markdown( |
| """ |
| # ✨Target-Driven Distillation✨ |
| |
| Target-Driven Distillation (TDD) is a state-of-the-art consistency distillation model that largely accelerates the inference processes of diffusion models. Using its delicate strategies of *target timestep selection* and *decoupled guidance*, models distilled by TDD can generated highly detailed images with only a few steps. |
| |
| [**Project Page**](https://redaigc.github.io/TDD/) **|** [**Paper**](https://arxiv.org/abs/2409.01347) **|** [**Code**](https://github.com/RedAIGC/Target-Driven-Distillation) **|** [**Model**](https://huggingface.co/RED-AIGC/TDD) **|** [🤗 **TDD-SDXL Demo**](https://huggingface.co/spaces/RED-AIGC/TDD) **|** [🤗 **TDD-SVD Demo**](https://huggingface.co/spaces/RED-AIGC/SVD-TDD) |
| """ |
| ) |
| with gr.Row(): |
| with gr.Column(scale=1): |
| with gr.Group(): |
| with gr.Row(): |
| prompt = gr.Textbox(label="Prompt") |
| with gr.Row(): |
| negative_prompt = gr.Textbox(label="Negative Prompt") |
| with gr.Row(): |
| steps = gr.Slider( |
| label="Sampling Steps", |
| minimum=4, |
| maximum=8, |
| step=1, |
| value=4, |
| ) |
| with gr.Row(): |
| guidance_scale = gr.Slider( |
| label="CFG Scale", |
| minimum=1, |
| maximum=4, |
| step=0.1, |
| value=2.0, |
| ) |
| with gr.Row(): |
| eta = gr.Slider( |
| label="eta", |
| minimum=0, |
| maximum=0.3, |
| step=0.01, |
| value=0.2, |
| ) |
| with gr.Row(): |
| seed = gr.Number(label="Seed", value=-1) |
|
|
| with gr.Row(): |
|
|
| ckpt = gr.Dropdown( |
| label="Base Model", |
| choices=["SDXL-1.0", "Real"], |
| value="SDXL-1.0", |
| ) |
|
|
| acc = gr.Dropdown( |
| label="Accelerate Lora", |
| choices=["TDD", "TDD_adv"], |
| value="TDD_adv", |
| ) |
|
|
| with gr.Column(scale=1): |
| with gr.Group(): |
| img = gr.Image(label="TDD Image", value="cat.png") |
| submit_sdxl = gr.Button("Run on SDXL") |
| gr.Examples( |
| examples=[ |
| ["A photo of a cat made of water.", "", "SDXL-1.0", "TDD_adv", 4, 1.7, 0.2, 546237], |
| ["Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", "NSFW, low quality, low resolution, normal quality", "Real", "TDD_adv", 7, 2.0, 0.3, 68436], |
| ["panda mad scientist mixing sparkling chemicals", "", "Real", "TDD_adv", 5, 1.7, 0.2, 3853], |
| ["a dog in snow, 8k", "", "SDXL-1.0", "TDD", 6, 1.3, 0.2, 12138] |
| ], |
| inputs=[prompt, negative_prompt, ckpt, acc, steps, guidance_scale, eta, seed], |
| outputs=[img], |
| fn=generate_image, |
| cache_examples="lazy", |
| ) |
|
|
| gr.on( |
| fn=generate_image, |
| triggers=[ckpt.change, prompt.submit, submit_sdxl.click], |
| inputs=[prompt, negative_prompt, ckpt, acc, steps, guidance_scale, eta, seed], |
| outputs=[img], |
| ) |
|
|
| demo.queue(api_open=False).launch(show_api=False) |