Abrahamm3r's picture
Update app.py
167dae1 verified
import torch
import gradio as gr
import random
from diffusers import DiffusionPipeline
from sdnq import SDNQConfig
from sdnq.loader import apply_sdnq_options_to_model
# --- Model Configuration ---
MODEL_ID = "Abrahamm3r/Z-Image-SDNQ-uint4-svd-r32"
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Loading model: {MODEL_ID} on {device}...")
# 1. Load the pipeline with trust_remote_code=True for Z-Image architecture
# We use bfloat16 as it is standard for these newer flux/z-image models
pipe = DiffusionPipeline.from_pretrained(
MODEL_ID,
torch_dtype=torch.bfloat16,
trust_remote_code=True
)
# 2. Apply SDNQ quantization hooks to the transformer
# This is critical for the model to run with the compressed weights
pipe.transformer = apply_sdnq_options_to_model(pipe.transformer)
# 3. Optimize memory
if device == "cuda":
pipe.to(device)
# Enable if you are on a smaller GPU (e.g., T4 16GB) to save VRAM
# pipe.enable_model_cpu_offload()
print("Model loaded successfully!")
# --- Helper Functions ---
# Preset resolutions for Aspect Ratios
# Z-Image handles various resolutions, but these are safe standard presets
ASPECT_RATIOS = {
"1:1 (Square)": (1024, 1024),
"16:9 (Cinematic)": (1280, 720),
"9:16 (Portrait)": (720, 1280),
"4:3 (Photo)": (1152, 864),
"3:4 (Portrait Photo)": (864, 1152),
"21:9 (Ultrawide)": (1536, 640)
}
def generate_image(prompt, negative_prompt, steps, aspect_ratio_choice, seed, guidance_scale):
# Determine Width/Height from preset
width, height = ASPECT_RATIOS.get(aspect_ratio_choice, (1024, 1024))
# Handle Seed
if seed == -1:
seed = random.randint(0, 2**32 - 1)
generator = torch.Generator(device=device).manual_seed(int(seed))
print(f"Generating: '{prompt}' | Steps: {steps} | Size: {width}x{height} | Seed: {seed}")
try:
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
width=width,
height=height,
num_inference_steps=steps,
guidance_scale=guidance_scale,
generator=generator
).images[0]
return image, seed
except Exception as e:
raise gr.Error(f"Generation failed: {str(e)}")
# --- Gradio UI ---
custom_css = """
#col-container { max-width: 800px; margin: 0 auto; }
#generate-btn { background: linear-gradient(90deg, #4B79A1 0%, #283E51 100%); border: none; color: white; }
"""
with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"# ⚡ Z-Image SDNQ (uint4-svd-r32) Generator")
gr.Markdown(f"Running `{MODEL_ID}`. This uses Structured Decomposable Neural Quantization for high efficiency.")
with gr.Row():
with gr.Column(scale=2):
prompt = gr.Textbox(label="Prompt", placeholder="Describe the image you want...", lines=3)
negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="Low quality, blurry, ugly...", value="low quality, bad anatomy, worst quality, distortion, blurry")
with gr.Row():
aspect_ratio = gr.Dropdown(
label="Aspect Ratio",
choices=list(ASPECT_RATIOS.keys()),
value="1:1 (Square)"
)
steps = gr.Slider(label="Inference Steps", minimum=4, maximum=50, step=1, value=25)
with gr.Row():
guidance = gr.Slider(label="Guidance Scale", minimum=1.0, maximum=10.0, step=0.1, value=3.5)
seed = gr.Number(label="Seed (-1 for Random)", value=-1, precision=0)
run_btn = gr.Button("Generate Image", elem_id="generate-btn", size="lg")
with gr.Column(scale=2):
result_image = gr.Image(label="Generated Image", type="pil")
seed_output = gr.Label(label="Used Seed")
run_btn.click(
fn=generate_image,
inputs=[prompt, negative_prompt, steps, aspect_ratio, seed, guidance],
outputs=[result_image, seed_output]
)
if __name__ == "__main__":
demo.queue().launch()