alvdansen's picture
Update app.py
f1ed22c verified
raw
history blame
No virus
8.67 kB
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()