Olvia / app.py
MathObsession's picture
Update app.py
7b53522 verified
Raw History Blame Contribute Delete
2.07 kB
# 1. ALWAYS IMPORT SPACES ABSOLUTELY FIRST
import spaces
import os
import torch
from diffusers import DiffusionPipeline
import gradio as gr
# 2. Retrieve token from space secrets
HF_TOKEN = os.getenv("HF_TOKEN")
# 3. Optimize the pipeline instantiation for RAM limits
model_id = "black-forest-labs/FLUX.1-dev"
pipe = DiffusionPipeline.from_pretrained(
model_id,
torch_dtype=torch.bfloat16, # Use half-precision for memory savings
low_cpu_mem_usage=True, # Prevent loading full weights into CPU system RAM at once
token=HF_TOKEN
)
# 4. Mount and fuse the LoRA weights cleanly (Requires 'peft' in requirements.txt)
pipe.load_lora_weights("strangerzonehf/Flux-Icon-Kit-LoRA")
pipe.fuse_lora()
# 5. Zero GPU dynamic invocation container wrapper
@spaces.GPU(duration=60)
def generate_icon(prompt, num_inference_steps=28, guidance_scale=3.5):
# Dynamically move tensors onto the dynamically provisioned Zero GPU
pipe.to("cuda")
full_prompt = f"Icon Kit, {prompt}, minimalist UI UX design element, flat line icon, uniform stroke, solid background"
# Run prediction
output = pipe(
prompt=full_prompt,
num_inference_steps=int(num_inference_steps),
guidance_scale=float(guidance_scale)
)
# Extract the exact first PIL Image item from the output list safely
image = output.images[0]
# CRUCIAL: Immediately dump weights back to CPU to cleanly yield the Zero GPU slot
pipe.to("cpu")
return image
# 6. Expose API Endpoints using Gradio Interface
demo = gr.Interface(
fn=generate_icon,
inputs=[
gr.Textbox(label="Icon Subject (e.g., 'a settings gear wheel')", placeholder="Enter icon concept..."),
gr.Slider(minimum=15, maximum=40, value=28, step=1, label="Inference Steps"),
gr.Slider(minimum=1.0, maximum=10.0, value=3.5, step=0.5, label="Guidance Scale")
],
outputs=gr.Image(type="pil", label="Generated UI Icon Component"),
title="Flux UI/UX Icon Kit Generator"
)
if __name__ == "__main__":
demo.launch()