Qwen-CPU / app.py
rahul7star's picture
Create app.py
829d9d1 verified
import torch
import gradio as gr
from diffusers import QwenImagePipeline, QwenImageTransformer2DModel
from transformers import Qwen2_5_VLForConditionalGeneration
# Set device and dtype
torch_dtype = torch.bfloat16
# Load models
transformer = QwenImageTransformer2DModel.from_pretrained(
"OzzyGT/Qwen-Image-2512-bnb-4bit-transformer",
torch_dtype=torch_dtype,
device_map="cpu" # offloading to CPU
)
text_encoder = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"OzzyGT/Qwen-Image-2512-bnb-4bit-text-encoder",
torch_dtype=torch_dtype,
device_map="cpu"
)
pipe = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image-2512",
transformer=transformer,
text_encoder=text_encoder,
torch_dtype=torch_dtype
)
pipe.enable_model_cpu_offload()
# Define the Gradio function
def generate_image(prompt, negative_prompt, width=1664, height=928, seed=42):
generator = torch.Generator(device="cuda" if torch.cuda.is_available() else "cpu").manual_seed(seed)
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
width=width,
height=height,
num_inference_steps=28,
true_cfg_scale=4.0,
generator=generator,
).images[0]
return image
# Gradio interface
with gr.Blocks() as demo:
gr.Markdown("## Qwen Image Generation")
with gr.Row():
with gr.Column():
prompt_input = gr.Textbox(label="Prompt", lines=8, placeholder="Enter your prompt here...")
negative_prompt_input = gr.Textbox(label="Negative Prompt", lines=4, placeholder="Enter negative prompt...")
width_input = gr.Slider(256, 2048, value=1664, step=64, label="Width")
height_input = gr.Slider(256, 2048, value=928, step=64, label="Height")
seed_input = gr.Number(value=42, label="Random Seed")
generate_btn = gr.Button("Generate Image")
with gr.Column():
output_image = gr.Image(label="Generated Image")
generate_btn.click(
fn=generate_image,
inputs=[prompt_input, negative_prompt_input, width_input, height_input, seed_input],
outputs=output_image
)
demo.launch()