| | import spaces |
| | import gradio as gr |
| | import torch |
| | import os |
| |
|
| | from diffusers import ( |
| | DDPMScheduler, |
| | StableDiffusionXLImg2ImgPipeline, |
| | AutoencoderKL, |
| | ) |
| |
|
| | from diffusers.utils import load_image |
| |
|
| | os.system("pip install torch_tensorrt==2.4.0") |
| |
|
| | BASE_MODEL = "stabilityai/stable-diffusion-xl-base-1.0" |
| | device = "cuda" if torch.cuda.is_available() else "cpu" |
| | print(f"--------->Device: {device}") |
| |
|
| | vae = AutoencoderKL.from_pretrained( |
| | "madebyollin/sdxl-vae-fp16-fix", |
| | torch_dtype=torch.float16, |
| | ) |
| |
|
| | base_pipe = StableDiffusionXLImg2ImgPipeline.from_pretrained( |
| | BASE_MODEL, |
| | vae=vae, |
| | torch_dtype=torch.float16, |
| | variant="fp16", |
| | use_safetensors=True, |
| | ) |
| | base_pipe = base_pipe.to(device, silence_dtype_warnings=True) |
| | base_pipe.scheduler = DDPMScheduler.from_pretrained( |
| | BASE_MODEL, |
| | subfolder="scheduler", |
| | ) |
| |
|
| | backend = "torch_tensorrt" |
| | import torch_tensorrt |
| | print('Compiling model...') |
| | compiledModel = torch.compile( |
| | base_pipe.unet, |
| | backend=backend, |
| | options={ |
| | "truncate_long_and_double": True, |
| | "enabled_precisions": {torch.float32, torch.float16}, |
| | }, |
| | dynamic=False, |
| | ) |
| |
|
| | base_pipe.unet = compiledModel |
| |
|
| | import torch._dynamo |
| | torch._dynamo.config.suppress_errors = True |
| |
|
| | try: |
| | init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img.png") |
| | generated_image = base_pipe( |
| | image=init_image, |
| | prompt="A white cat", |
| | num_inference_steps=5, |
| | ).images[0] |
| |
|
| | generated_image.save("/tmp/gradio/generated_image.png") |
| | except Exception as e: |
| | print(f"Error: {e}") |
| |
|
| |
|
| | def create_demo() -> gr.Blocks: |
| |
|
| | @spaces.GPU(duration=30) |
| | def image_to_image( |
| | image: gr.Image, |
| | prompt:str, |
| | steps:int, |
| | ): |
| | run_task_time = 0 |
| | time_cost_str = '' |
| | run_task_time, time_cost_str = get_time_cost(run_task_time, time_cost_str) |
| | generated_image = base_pipe( |
| | image=image, |
| | prompt=prompt, |
| | num_inference_steps=steps, |
| | ).images[0] |
| | run_task_time, time_cost_str = get_time_cost(run_task_time, time_cost_str) |
| | return generated_image |
| | |
| | def get_time_cost(run_task_time, time_cost_str): |
| | now_time = int(time.time()*1000) |
| | if run_task_time == 0: |
| | time_cost_str = 'start' |
| | else: |
| | if time_cost_str != '': |
| | time_cost_str += f'-->' |
| | time_cost_str += f'{now_time - run_task_time}' |
| | run_task_time = now_time |
| | return run_task_time, time_cost_str |
| |
|
| | with gr.Blocks() as demo: |
| | with gr.Row(): |
| | with gr.Column(): |
| | prompt = gr.Textbox(label="Prompt", placeholder="Write a prompt here", lines=2, value="A beautiful sunset over the city") |
| | with gr.Column(): |
| | steps = gr.Slider(minimum=1, maximum=100, value=5, step=1, label="Num Steps") |
| | g_btn = gr.Button("Generate") |
| | |
| | with gr.Row(): |
| | with gr.Column(): |
| | input_image = gr.Image(label="Input Image", type="pil", interactive=True) |
| | with gr.Column(): |
| | generated_image = gr.Image(label="Generated Image", type="pil", interactive=False) |
| | time_cost = gr.Textbox(label="Time Cost", lines=1, interactive=False) |
| | |
| | g_btn.click( |
| | fn=text_to_image, |
| | inputs=[input_image, prompt, steps], |
| | outputs=[generated_image, time_cost], |
| | ) |
| |
|
| | return demo |
| |
|