import spaces import gradio as gr import torch from diffusers import ZImagePipeline import os from pathlib import Path # Global variable to store the pipeline pipe = None def load_model(): """ Load the Z-Image Turbo model before inference. This ensures the model is downloaded and ready before any generation requests. """ global pipe if pipe is not None: return pipe print("Loading Z-Image Turbo model...") print("This may take a few minutes on first run while the model downloads...") try: # Load the pipeline with optimal settings pipe = ZImagePipeline.from_pretrained( "Tongyi-MAI/Z-Image-Turbo", torch_dtype=torch.bfloat16, low_cpu_mem_usage=False, ) # Move to GPU if available device = "cuda" if torch.cuda.is_available() else "cpu" pipe.to(device) print(f"Model loaded on {device}") # Optional: Enable Flash Attention for better efficiency try: pipe.transformer.set_attention_backend("flash") print("Flash Attention enabled") except Exception as e: print(f"Flash Attention not available: {e}") print("Using default attention backend") print("Model loaded successfully!") return pipe except Exception as e: print(f"Error loading model: {e}") raise # Pre-load the model when the app starts print("Initializing model on startup...") try: load_model() print("Model initialization complete!") except Exception as e: print(f"Warning: Could not pre-load model: {e}") print("Model will be loaded on first generation request") @spaces.GPU() def generate_image( prompt, progress=gr.Progress(track_tqdm=True) ): """ Generate an image using Z-Image Turbo model. Args: prompt: Text description of the desired image Returns: Generated PIL Image """ global pipe # Ensure model is loaded if pipe is None: progress(0, desc="Loading model...") load_model() if not prompt.strip(): raise gr.Error("Please enter a prompt to generate an image.") # Determine device device = "cuda" if torch.cuda.is_available() else "cpu" # Set random seed for reproducibility generator = torch.Generator(device).manual_seed(42) # Generate the image with optimal settings progress(0.1, desc="Generating image...") try: result = pipe( prompt=prompt, negative_prompt=None, height=1024, width=1024, num_inference_steps=9, guidance_scale=0.0, generator=generator, ) image = result.images[0] progress(1.0, desc="Complete!") return image except Exception as e: raise gr.Error(f"Generation failed: {str(e)}") # Create a custom theme based on Soft theme with Apple-inspired colors custom_theme = gr.themes.Soft( primary_hue=gr.themes.colors.blue, secondary_hue=gr.themes.colors.slate, neutral_hue=gr.themes.colors.gray, spacing_size=gr.themes.sizes.spacing_lg, radius_size=gr.themes.sizes.radius_md, text_size=gr.themes.sizes.text_lg, font=[gr.themes.GoogleFont("Inter"), "ui-sans-serif", "system-ui", "sans-serif"], font_mono=[gr.themes.GoogleFont("IBM Plex Mono"), "ui-monospace", "Consolas", "monospace"], ) # Custom CSS for additional styling custom_css = """ .gradio-container { max-width: 900px !important; margin: 0 auto !important; } .main-header { text-align: center; margin-bottom: 2rem; padding-bottom: 2rem; border-bottom: 1px solid #e5e5e7; } .main-header h1 { font-size: 3rem !important; font-weight: 600 !important; color: #1d1d1f !important; margin: 0 0 0.5rem 0 !important; letter-spacing: -1px; } .main-header .subtitle { font-size: 1.25rem !important; color: #86868b !important; margin: 0.5rem 0 !important; } .attribution { margin-top: 1rem; font-size: 0.875rem; color: #86868b; } .attribution a { color: #0071e3 !important; text-decoration: none; font-weight: 500; } .footer-info { text-align: center; padding: 2rem 1rem; color: #86868b; font-size: 0.875rem; margin-top: 2rem; border-top: 1px solid #e5e5e7; } .footer-info p { margin: 0.25rem 0; } button.primary { background-color: #0071e3 !important; transition: all 0.2s ease !important; } button.primary:hover { background-color: #0077ed !important; box-shadow: 0 4px 12px rgba(0, 113, 227, 0.3) !important; } @media (max-width: 768px) { .main-header h1 { font-size: 2rem !important; } .main-header .subtitle { font-size: 1rem !important; } } """ # Create the Gradio interface with gr.Blocks( title="Z-Image Turbo", fill_height=False ) as demo: # Header with gr.Column(elem_classes="main-header"): gr.Markdown( """ # Z-Image Turbo ### Create stunning images from text """, elem_classes="main-header" ) gr.HTML("""