i2i / app.py
we2app's picture
Update app.py
19149ba verified
Raw
History Blame Contribute Delete
3.02 kB
import torch
import os
import psutil
import time
import math
import gradio as gr
from PIL import Image
from diffusers import AutoPipelineForImage2Image, AutoPipelineForText2Image
# --- System Resource Logic ---
def get_system_usage():
cpu = psutil.cpu_percent(interval=None)
ram = psutil.virtual_memory().percent
# Returns values for the progress bars
return cpu / 100, ram / 100, f"CPU: {cpu}% | RAM: {ram}%"
# --- Model Loading (Optimized for 16GB) ---
device = "cpu"
torch_dtype = torch.float32
pipe_kwargs = {"torch_dtype": torch_dtype, "use_safetensors": True}
i2i_pipe = AutoPipelineForImage2Image.from_pretrained("stabilityai/sdxl-turbo", **pipe_kwargs)
t2i_pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", **pipe_kwargs)
i2i_pipe.enable_attention_slicing()
t2i_pipe.enable_attention_slicing()
i2i_pipe.enable_vae_tiling()
t2i_pipe.enable_vae_tiling()
def predict(init_image, prompt, strength, steps, seed):
generator = torch.manual_seed(seed)
if init_image is not None:
# Simple square crop for better results
w, h = init_image.size
s = min(w, h)
init_image = init_image.crop(((w-s)//2, (h-s)//2, (w+s)//2, (h+s)//2)).resize((512, 512))
return i2i_pipe(prompt=prompt, image=init_image, generator=generator, num_inference_steps=int(steps),
guidance_scale=0.0, strength=strength).images[0]
else:
return t2i_pipe(prompt=prompt, generator=generator, num_inference_steps=int(steps),
guidance_scale=0.0, width=512, height=512).images[0]
# --- UI Construction ---
with gr.Blocks(css="#container{ max-width: 60rem; margin: 0 auto; }") as demo:
with gr.Column(elem_id="container"):
gr.Markdown("## 🚀 SDXL Turbo CPU + System Monitor")
# System Usage Dashboard
with gr.Row():
with gr.Column():
cpu_bar = gr.Label(label="System Status") # Text label for quick reading
with gr.Column():
cpu_plot = gr.Slider(label="CPU Load", interactive=False)
ram_plot = gr.Slider(label="RAM Usage", interactive=False)
with gr.Row():
prompt = gr.Textbox(placeholder="A cinematic cat...", label="Prompt", scale=4)
generate_bt = gr.Button("Generate", variant="primary", scale=1)
with gr.Row():
image_input = gr.Image(type="pil", label="Input (i2i)")
image_output = gr.Image(label="Result")
with gr.Accordion("Settings", open=False):
strength = gr.Slider(0.0, 1.0, 0.7, label="Strength")
steps = gr.Slider(1, 4, 2, step=1, label="Steps")
seed = gr.Number(42, label="Seed")
# Auto-update logic (Runs every 2 seconds)
monitor_timer = gr.Timer(2)
monitor_timer.tick(get_system_usage, outputs=[cpu_plot, ram_plot, cpu_bar])
generate_bt.click(predict, [image_input, prompt, strength, steps, seed], image_output)
demo.launch()