import torch import random import spaces ## For ZeroGPU import gradio as gr from PIL import Image from models_transformer_sd3 import SD3Transformer2DModel from pipeline_stable_diffusion_3_ipa import StableDiffusion3Pipeline import gc import os from huggingface_hub import login TOKEN = os.getenv('TOKEN') login(TOKEN) model_path = 'stabilityai/stable-diffusion-3.5-large' ip_adapter_path = './ip-adapter.bin' image_encoder_path = "google/siglip-so400m-patch14-384" device = "cuda" if torch.cuda.is_available() else "cpu" dtype = torch.float16 if torch.cuda.is_available() else torch.float32 transformer = SD3Transformer2DModel.from_pretrained( model_path, subfolder="transformer", torch_dtype=torch.bfloat16 ) pipe = StableDiffusion3Pipeline.from_pretrained( model_path, transformer=transformer, torch_dtype=torch.bfloat16 ) ## For ZeroGPU no .to("cuda") pipe.init_ipadapter( ip_adapter_path=ip_adapter_path, image_encoder_path=image_encoder_path, nb_token=64, ) pipe.to(device) def randomize_seed_fn(seed: int, randomize_seed: bool) -> int: if randomize_seed: seed = random.randint(0, 2000) return seed @spaces.GPU() ## For ZeroGPU def create_image(image_pil, prompt, n_prompt, scale, control_scale, guidance_scale, num_inference_steps, seed, target="Load only style blocks", ): if target !="Load original IP-Adapter": if target=="Load only style blocks": scale = { "up": {"block_0": [0.0, control_scale, 0.0]}, } elif target=="Load only layout blocks": scale = { "down": {"block_2": [0.0, control_scale]}, } elif target == "Load style+layout block": scale = { "down": {"block_2": [0.0, control_scale]}, "up": {"block_0": [0.0, control_scale, 0.0]}, } #pipe.set_ip_adapter_scale(scale) ## Waiting for SD3 Diffuser integration if hasattr(image_pil, 'read'): # If it's a file style_image = Image.open(image_pil).convert('RGB') else: # If it's already a PIL Image style_image = image_pil.convert('RGB') image = pipe( width=1024, height=1024, prompt=prompt, negative_prompt="lowres, low quality, worst quality", num_inference_steps=24, guidance_scale=guidance_scale, generator=torch.Generator("cuda").manual_seed(randomize_seed_fn(seed, True)), ## For ZeroGPU no device="cpu" clip_image=style_image, ipadapter_scale=scale, ).images[0] if torch.cuda.is_available(): torch.cuda.empty_cache() gc.collect() print(image) return image # Description title = r"""