import json import random import requests import os from PIL import Image import gradio as gr import numpy as np import spaces import torch from diffusers import DiffusionPipeline, LCMScheduler from peft import PeftModel # Custom LCMScheduler to ignore unexpected attributes class CustomLCMScheduler(LCMScheduler): @property def config(self): return {k: v for k, v in super().config.items() if k != "skip_prk_steps"} def get_image(image_data): # ... (keep the get_image function as is) with open("sdxl_lora.json", "r") as file: data = json.load(file) sdxl_loras_raw = [ { "image": get_image(item["image"]), "title": item["title"], "repo": item["repo"], "trigger_word": item["trigger_word"], "weights": item["weights"], "is_pivotal": item.get("is_pivotal", False), "text_embedding_weights": item.get("text_embedding_weights", None), "likes": item.get("likes", 0), } for item in data ] sdxl_loras_raw = sorted(sdxl_loras_raw, key=lambda x: x["likes"], reverse=True) DEVICE = "cuda" if torch.cuda.is_available() else "cpu" model_id = "stabilityai/stable-diffusion-xl-base-1.0" pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16") pipe.scheduler = CustomLCMScheduler.from_config(pipe.scheduler.config) pipe.to(device=DEVICE, dtype=torch.float16) # Load Flash SDXL LoRA flash_sdxl_id = "jasperai/flash-sdxl" pipe.load_lora_weights(flash_sdxl_id, adapter_name="flash_lora") MAX_SEED = np.iinfo(np.int32).max MAX_IMAGE_SIZE = 1024 def update_selection(selected_state: gr.SelectData, gr_sdxl_loras): lora_id = gr_sdxl_loras[selected_state.index]["repo"] trigger_word = gr_sdxl_loras[selected_state.index]["trigger_word"] return lora_id, trigger_word @spaces.GPU def infer( pre_prompt, prompt, seed, randomize_seed, num_inference_steps, negative_prompt, guidance_scale, user_lora_selector, user_lora_weight, progress=gr.Progress(track_tqdm=True), ): try: # Load the user-selected LoRA new_adapter_id = user_lora_selector.replace("/", "_") pipe.load_lora_weights(user_lora_selector, adapter_name=new_adapter_id) # Set adapter weights pipe.set_adapters(["flash_lora", new_adapter_id], adapter_weights=[1.0, user_lora_weight]) gr.Info("LoRA setup complete") if randomize_seed: seed = random.randint(0, MAX_SEED) generator = torch.Generator().manual_seed(seed) if pre_prompt != "": prompt = f"{pre_prompt} {prompt}" # Use Flash Diffusion settings image = pipe( prompt=prompt, negative_prompt=negative_prompt, guidance_scale=1.0, # Flash Diffusion typically uses guidance_scale=1 num_inference_steps=4, # Flash Diffusion uses fewer steps generator=generator, ).images[0] return image except Exception as e: gr.Error(f"An error occurred: {str(e)}") return None @spaces.GPU def infer( pre_prompt, prompt, seed, randomize_seed, num_inference_steps, negative_prompt, guidance_scale, user_lora_selector, user_lora_weight, progress=gr.Progress(track_tqdm=True), ): load_lora_for_style(user_lora_selector) if randomize_seed: seed = random.randint(0, MAX_SEED) generator = torch.Generator().manual_seed(seed) if pre_prompt != "": prompt = f"{pre_prompt} {prompt}" image = pipe( prompt=prompt, negative_prompt=negative_prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, generator=generator, ).images[0] return image css = """ body { background-color: #1a1a1a; color: #ffffff; } .container { max-width: 900px; margin: auto; padding: 20px; } h1, h2 { color: #4CAF50; text-align: center; } .gallery { display: flex; flex-wrap: wrap; justify-content: center; } .gallery img { margin: 10px; border-radius: 10px; transition: transform 0.3s ease; } .gallery img:hover { transform: scale(1.05); } .gradio-slider input[type="range"] { background-color: #4CAF50; } .gradio-button { background-color: #4CAF50 !important; } """ with gr.Blocks(css=css) as demo: gr.Markdown( """ # ⚡ FlashDiffusion: Araminta K's FlashLoRA Showcase ⚡ This interactive demo showcases [Araminta K's models](https://huggingface.co/alvdansen) using [Flash Diffusion](https://gojasper.github.io/flash-diffusion-project/) technology. ## Acknowledgments - Original Flash Diffusion technology by the Jasper AI team - Based on the paper: [Flash Diffusion: Accelerating Any Conditional Diffusion Model for Few Steps Image Generation](http://arxiv.org/abs/2406.02347) by Clément Chadebec, Onur Tasar, Eyal Benaroche and Benjamin Aubin - Models showcased here are created by Araminta K at Alvdansen Labs Explore the power of FlashLoRA with Araminta K's unique artistic styles! """ ) gr_sdxl_loras = gr.State(value=sdxl_loras_raw) gr_lora_id = gr.State(value="") with gr.Row(): with gr.Column(scale=2): gallery = gr.Gallery( value=[(get_image(item["image"]), item["title"]) for item in sdxl_loras_raw if get_image(item["image"]) is not None], label="SDXL LoRA Gallery", show_label=False, elem_id="gallery", columns=3, height=600, ) user_lora_selector = gr.Textbox( label="Current Selected LoRA", interactive=False, ) with gr.Column(scale=3): prompt = gr.Textbox( label="Prompt", placeholder="Enter your prompt", lines=3, ) with gr.Row(): run_button = gr.Button("Run", variant="primary") clear_button = gr.Button("Clear") result = gr.Image(label="Result", height=512) with gr.Accordion("Advanced Settings", open=False): pre_prompt = gr.Textbox( label="Pre-Prompt", placeholder="Pre Prompt from the LoRA config", lines=2, ) with gr.Row(): seed = gr.Slider( label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=0, ) randomize_seed = gr.Checkbox(label="Randomize seed", value=True) num_inference_steps = gr.Slider( label="Number of inference steps", minimum=4, maximum=8, step=1, value=4, ) guidance_scale = gr.Slider( label="Guidance Scale", minimum=1, maximum=6, step=0.5, value=1, ) negative_prompt = gr.Textbox( label="Negative Prompt", placeholder="Enter a negative Prompt", lines=2, ) gr.on( [run_button.click, prompt.submit], fn=infer, inputs=[ pre_prompt, prompt, seed, randomize_seed, num_inference_steps, negative_prompt, guidance_scale, user_lora_selector, gr.Slider(label="Selected LoRA Weight", minimum=0.5, maximum=3, step=0.1, value=1), ], outputs=[result], ) clear_button.click(lambda: "", outputs=[prompt, result]) gallery.select( fn=update_selection, inputs=[gr_sdxl_loras], outputs=[user_lora_selector, pre_prompt], ) gr.Markdown( """ ## Unleash Your Creativity! This showcase brings together the speed of Flash Diffusion and the artistic flair of Araminta K's models. Craft your prompts, adjust the settings, and watch as AI brings your ideas to life in stunning detail. Remember to use this tool ethically and respect copyright and individual privacy. Enjoy exploring these unique artistic styles! """ ) demo.queue().launch()