Ana içeriğe geç

Qwen Image 2512 Eğitimi: Gradio ile Bir Poster Stüdyosu Kurun

Qwen-Image-2512 ile güçlü tipografi, temiz yerleşim ve fotogerçekçi ürün sahneleri üreten bir Gradio Poster Stüdyosu Uygulaması nasıl kurulur, öğrenin.
· 7 dk. oku

Yapay Zeka ile Keşfedin

Qwen-Image-2512, özellikle gerçekçi görseller ve metin ağırlıklı kompozisyonlarda başarılı olan güçlü bir açık kaynak metinden-görüntüye modeldir. Bu eğitimde, ürün adı, teklif, fiyat, CTA ve faydalar gibi ürün ayrıntılarını girdiğiniz, bir platform en-boy oranı seçtiğiniz ve tek tıkla bir tanıtım görseli ürettiğiniz bir Poster Stüdyosu, bir Gradio uygulaması kurmak için bunu kullanacağız.

Qwen-Image-2512 büyük bir model olduğundan, onu sorunsuz çalıştırmanın pratik yönlerine de odaklanacağız. A100 üzerinde doğru hassasiyet ayarlarıyla nasıl kararlı şekilde yükleneceğini, yaygın hata biçimlerinden nasıl kaçınılacağını ve daha küçük çözünürlüklerde yineleyerek, adımları azaltarak veya daha sıkı donanımlar için kuantize bir modeli keşfederek herhangi bir iş akışına nasıl uyarlanacağını öğreneceksiniz.

Qwen-Image-2512 nedir?

Qwen-Image-2512, Qwen metinden-görüntüye temel modelinin bir güncellemesidir ve önceki Qwen-Image sürümüne göre kalite sıçraması sunar. Kaputun altında, Qwen-Image bir 20B MMDiT difüzyon modelidir, güçlü komut uyumu ve görüntüde metin oluşturma için tasarlanmıştır.

Ayrıca AI Arena üzerinde 10.000+ kör turla yapılan geniş ölçekli bir tercih tarzı değerlendirme tarafından desteklenmektedir; model, kapalı sistemlerle rekabetçi kalırken en güçlü açık kaynak model olarak öne çıkmıştır.

image2.png

Gerçek iş akışlarında en çok önem taşıyan üç iyileştirme şunlardır:

  • Daha gerçekçi insan portreleri: Yüzler daha az “yapay” görünür; yüz hatları daha keskin, cilt ayrıntıları daha doğal ve genel gerçekçilik daha iyidir.
  • Daha zengin doğal dokular: Manzaralar, su, kürk ve malzemeler gibi doku yoğun sahneler daha ince ayrıntılar ve daha ikna edici mikro doku ile oluşturulur.
  • Daha güçlü tipografi ve yerleşim: Metin oluşturma daha isabetlidir ve kompozisyonlar daha sayfa benzeri bir yapıya sahiptir; bu da özellikle posterler, slaytlar, afişler ve infografikler için faydalıdır.

Qwen Image 2512 Örnek Proje: Bir Poster Stüdyosu Kurun

Bu bölümde aşağıdaki işlemleri yapan basit bir Gradio uygulaması kuracağız:

  • Ürün adı, açıklama, teklif, fiyat, CTA ve faydaları toplar
  • Kullanıcının Instagram gönderisi/hikayesi, afiş, poster veya slaytlar gibi bir platform ön ayarı seçmesine izin verir
  • steps, true_cfg_scale, seed ve isteğe bağlı bir negative prompt için bir panel sunar.
  • Son olarak, QwenImagePipeline kullanarak bir poster görseli üretir.

image4.png

Adım adım oluşturalım.

Adım 1: Önkoşullar

Önce GitHub’dan en güncel Diffusers’ı kurun (Qwen’in model kartı, boru hattı desteği için bunu öneriyor) ve temel bağımlılıklarla birlikte:

!pip -q install --upgrade pip
!pip -q install git+https://github.com/huggingface/diffusers
!pip -q install transformers accelerate safetensors gradio pillow psutil

Ardından, CUDA’nın kullanılabilir olduğunu doğrulamak ve GPU’yu belirlemek için hızlı bir sağlama yapın:

import torch, diffusers
print("diffusers:", diffusers.__version__)
print("CUDA available:", torch.cuda.is_available())
!nvidia-smi

Eğer CUDA available: True görüyorsanız ve nvidia-smi içinde GPU’nuzu görüyorsanız, modeli yüklemeye hazırsınız.

Not: QwenImagePipeline tek bir UNet tarzı blok değildir. Diffusers içinde; bir Qwen2.5-VL-7B-Instruct metin kodlayıcı, MMDiT difüzyon dönüştürücü ve çözümleme için bir Varyasyonel Otomatik Kodlayıcı(VAE) içeren tam bir yığındır. 7B metin kodlayıcı, özellikle daha küçük GPU’larda model yükleme ve üretim sırasında RAM/VRAM kullanımının artmasının başlıca nedenlerinden biridir. 

Bu eğitimi Google Colab üzerinde bir A100 ile çalıştırdım; ~50 adımda 1328×1328 görüntü çözünürlüğünü rahatlıkla karşılıyor. T4/16GB sınıfı GPU’larda genellikle ölçeği küçültmek (yaklaşık 768×768 görüntü çözünürlüğü ve daha az adım) ya da alternatif çalışma zamanları (GGUF/ComfyUI gibi) üzerinden kuantize varyantlar kullanmak gerekir.

Adım 2: İçe aktarımlar ve temel yardımcılar

Modeli yüklemeden önce, Colab’ı öngörülebilir kılan küçük bir çalışma zamanı düzeneği kurmaya değer. Qwen-Image-2512 ağırdır ve görüntü üretim iş yükleri hem sistem RAM’ini hem de GPU belleğini sessizce tüketebilir. 

import os, gc, random, psutil, torch
from diffusers import QwenImagePipeline
import gradio as gr
os.environ["HF_HOME"] = "/content/hf"
os.makedirs("/content/hf", exist_ok=True)
def mem(tag=""):
    ram = psutil.virtual_memory().used / 1e9
    v_alloc = torch.cuda.memory_allocated()/1e9 if torch.cuda.is_available() else 0
    v_res   = torch.cuda.memory_reserved()/1e9 if torch.cuda.is_available() else 0
    print(f"[{tag}] RAM={ram:.1f}GB | VRAM alloc={v_alloc:.1f}GB reserved={v_res:.1f}GB")
def cleanup(tag="cleanup"):
    gc.collect()
    if torch.cuda.is_available():
        torch.cuda.empty_cache()
    mem(tag)
assert torch.cuda.is_available(), "GPU runtime required"
print("GPU:", torch.cuda.get_device_name(0))
torch.backends.cuda.matmul.allow_tf32 = True
torch.set_float32_matmul_precision("high")
cleanup("startup")

Bağımlılıklar kurulduktan sonra içe aktarımlar, önbellekleme, bellek izleme ve birkaç GPU performans bayrağını ayarlıyoruz. Kodda şu şekilde görünür:

  • QwenImagePipeline: Görüntü üretimi için ileride Qwen-Image-2512’yi yüklemek ve çalıştırmak üzere kullanacağımız ana boru hattı sınıfı.
  • gradio: Basit web arayüzünü sağlar; böylece posterleri Colab içinde üretebiliriz.
  • HF_HOME=/content/hf: Hugging Face önbelleğini bilinen bir klasöre sabitlemek için kullanıyoruz; böylece model indirmeleri ve ağırlıklar çalıştırmalar arasında tutarlı şekilde saklanır.
  • mem() işlevi: mem() işlevi, ayrılmış ve rezerve edilmiş GPU VRAM’i ile sistem RAM’ini takip eder. 
  • cleanup() işlevi: Python referanslarını temizlemek ve önbelleğe alınmış GPU belleğini boşaltmak için küçük bir sıfırlama yardımcı aracıdır; çözünürlük/adımlar üzerinde yineleme yaparken işe yarar.
  • GPU kontrolleri: CUDA kullanılabilir değilse hızlıca hataya düşeriz, ardından A100 gibi Ampere GPU’larda matris çarpmalarını hızlandırmak için TF32’yi etkinleştirir ve matmul hassasiyetini "high" olarak ayarlarız.

Bu kurulum henüz görüntü üretmez; ancak sonraki adımların (yükleme ve çıkarım) çok daha kararlı ve ayıklanabilir olmasını sağlar.

Adım 3: Qwen-Image-2512’yi yükleyin 

Çalışma zamanı kurulduğuna göre, modeli Diffusers boru hattına yükleme zamanı. A100 üzerinde, performans için çoğu ağırlığı BF16’da çalıştırmak en iyi noktadır; ancak tamamen siyah görüntüler olarak görünebilen NaN’lerden kaçınmak için VAE çözümlemeyi FP32’de tutun.

DTYPE = torch.bfloat16 
pipe = QwenImagePipeline.from_pretrained(
    "Qwen/Qwen-Image-2512",
    torch_dtype=DTYPE,
    low_cpu_mem_usage=True,
    use_safetensors=True,
).to("cuda")
if hasattr(pipe, "vae") and pipe.vae is not None:
    pipe.vae.to(dtype=torch.float32)
cleanup("after pipe load")

Yukarıdaki kodda hedeflediklerimiz şunlar:

  • Ampere/Hopper GPU’larda (A100/H100) BF16 genellikle en iyi varsayılandır; çünkü FP32’den daha hızlı ve bellek açısından verimlidir, büyük modeller için FP16’ya göre de daha sayısal olarak kararlıdır.
  • Ardından, Hugging Face’ten tam Qwen-Image-2512 boru hattını yüklüyor ve model bileşenlerini tek bir çağrılabilir arayüze bağlıyoruz. Bunun için birkaç önemli argüman kullanıyoruz:
    • torch_dtype=DTYPE: Çoğu ağırlığı BF16’da yükleyerek VRAM’i azaltır ve çıkarımı hızlandırır.
    • low_cpu_mem_usage=True: Yükleme sırasında CPU tarafındaki çoğaltmayı azaltır (büyük denetim noktaları için önemlidir).
    • use_safetensors=True: Mümkün olduğunda daha güvenli/hızlı safetensors biçimini kullanmayı sağlar.
  • Son olarak, pipe.vae.to(torch.float32) latent uzay çıktılarının piksele dönüştürülmesini gerçekleştirir. Bu çözümleme adımı daha düşük hassasiyette NaN/Inf’e çarparsa, nihai görüntü tamamen siyah olabilir. Bu yüzden VAE’yi FP32’ye zorluyor ve ardından cleanup() çağrısıyla yükleme sonrası RAM/VRAM ayak izini doğruluyoruz.

Sırada platform en-boy oranı ön ayarlarını tanımlayıp boru hattını etkileşimli poster üretimi için minimal bir Gradio arayüzüne bağlamak var.

Adım 4: Ön ayarlar ve görüntü üretim işlevi

Şimdi demonun motorunu kuruyoruz; yani, UI girdilerini iyi yapılandırılmış bir komuta dönüştüren, platform ön ayarlarına göre çıkış çözünürlüğü seçen ve görsel üretmek için Qwen Image boru hattını çağıran küçük bir katman. 

ASPECT_PRESETS = {
    "Instagram Post (1:1) — 1328×1328": (1328, 1328),
    "Instagram Story (9:16) — 928×1664": (928, 1664),
    "YouTube / Banner (16:9) — 1664×928": (1664, 928),
    "Poster (3:4) — 1104×1472": (1104, 1472),
    "Slides (4:3) — 1472×1104": (1472, 1104),
    "Fast Draft (1:1) — 768×768": (768, 768),
}
DEFAULT_NEG = " " 
def build_prompt(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords, language):
    return f"""
Create a high-converting e-commerce promotional poster in {language}. Clean grid layout, strong hierarchy.
- Product name: "{product_name}"
- Product description: "{product_desc}"
- Offer headline (exact): "{offer}"
- Price (exact): "{price}"
- CTA button text (exact): "{cta}"
- Benefits (use these exact phrases, no typos):
{benefits}
- Tone: {tone}
- Style keywords: {style_keywords}
- Text must be legible and correctly spelled.
- Do not add extra words, fake prices, or random letters.
- Align typography to a neat grid with consistent margins.
""".strip()
@torch.inference_mode()
def generate_image(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords,
                   language, preset, negative_prompt, steps, true_cfg_scale, seed, show_seed):
    w, h = ASPECT_PRESETS[preset]
    prompt = build_prompt(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords, language)
    if seed is None or int(seed) < 0:
        seed = random.randint(0, 2**31 - 1)
    seed = int(seed)
    gen = torch.Generator(device="cuda").manual_seed(seed)
    img = pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        width=int(w),
        height=int(h),
        num_inference_steps=int(steps),
        true_cfg_scale=float(true_cfg_scale),
        generator=gen,
    ).images[0].convert("RGB")
    return (seed if show_seed else None), img

Yukarıdaki ön ayar haritası ve iki işlev, Poster Stüdyomuzun çekirdek motorunu oluşturur.

  • ASPECT_PRESETS sözlüğü, farklı platform tuval boyutlarını tanımlar (ör. Instagram gönderileri için 1:1, Hikayeler için 9:16, afişler için 16:9). Kullanıcılar sadece bir ön ayar seçer ve biz bunu üretim için doğru genişlik × yükseklik değerlerine çeviririz.
  • build_prompt() işlevi, ad, teklif, fiyat, CTA ve faydalar gibi düz ürün girdilerini bir görüntü brifine dönüştürür. Düzen ve metin kurallarını dikkate alır; böylece model her seferinde tutarlı kısıtlar alır ve rastgele metne sapmaz.
  • generate_image() işlevi yürütme katmanıdır. Seçilen ön ayarı okuyarak genişlik/yükseklik değerlerini alır ve seçilen steps, true_cfg_scale ve negative_prompt ile Qwen-Image boru hattını çağırır. Son olarak üretilen posteri (ve isteğe bağlı olarak çekirdeği/seed’i) döndürür. steps, difüzyon sürecinin ne kadar sürdüğünü kontrol eder (daha fazla adım daha yavaş ama genelde daha temiz sonuçlar), true_cfg_scale ise modelin komuta ne kadar sıkı uyduğunu ayarlar (daha yüksek değer daha iyi uyum demektir; ancak çok yükseltmek artefaktlara neden olabilir).

Sırada generate_image() işlevini bir Gradio arayüzüne gömerek kullanıcıların ham komut mühendisliği ile uğraşmadan poster üretmesini sağlamak var.

Adım 5: Gradio UI

Son olarak, poster üretim motorunu bir Gradio arayüzüne sarıyoruz. Uygulama, kullanıcının ürün ayrıntılarını yazmasına, bir platform en-boy oranı seçmesine ve Oluştur’a basmasına olanak tanır. 

with gr.Blocks(title="Qwen Poster Studio (Simple)") as demo:
    gr.Markdown("## Qwen Poster Studio — Qwen-Image-2512")
    with gr.Row():
        with gr.Column(scale=1):
            product_name = gr.Textbox(value="RÅSKOG Utility Cart", label="Product name")
            product_desc = gr.Textbox(value="Compact rolling cart for small spaces. Durable metal frame.", lines=2, label="Product description")
            offer = gr.Textbox(value="NEW YEAR SALE — 20% OFF", label="Offer headline")
            price = gr.Textbox(value="$29.99", label="Price")
            cta = gr.Textbox(value="Shop now", label="CTA button text")
            benefits = gr.Textbox(value="- Compact\n- Easy to move\n- Fits small spaces", lines=4, label="Benefits")
            tone = gr.Dropdown(["Premium", "Minimal", "Bold", "Playful", "Tech"], value="Premium", label="Tone")
            style_keywords = gr.Textbox(value="modern Scandinavian minimal, clean grid, soft warm lighting, premium product photography", label="Style keywords")
            language = gr.Dropdown(["English", "中文"], value="English", label="Language")
            preset = gr.Dropdown(list(ASPECT_PRESETS.keys()), value="Instagram Post (1:1) — 1328×1328", label="Platform preset")
            with gr.Accordion("Advanced (optional)", open=False):
                negative_prompt = gr.Textbox(value=DEFAULT_NEG, label="Negative prompt", lines=2)
                steps = gr.Slider(10, 80, value=50, step=1, label="Steps")
                true_cfg_scale = gr.Slider(1.0, 10.0, value=4.0, step=0.1, label="true_cfg_scale")
                seed = gr.Number(value=-1, precision=0, label="Seed (-1 = random)")
                show_seed = gr.Checkbox(value=False, label="Show seed in output")
            btn = gr.Button("Generate", variant="primary")
        with gr.Column(scale=1):
            used_seed_out = gr.Number(label="Used seed (optional)", precision=0)
            image_out = gr.Image(label="Generated poster")
    btn.click(
        fn=generate_image,
        inputs=[product_name, product_desc, offer, price, cta, benefits, tone, style_keywords,
                language, preset, negative_prompt, steps, true_cfg_scale, seed, show_seed],
        outputs=[used_seed_out, image_out]
    )
demo.launch(share=True, debug=True)

Gradio uygulamasını şu şekilde kuruyoruz:

  • Sol sütun, poster brifi için tüm etkileşimli denetimleri tanımlar. Kullanıcılar ürün alanlarını doldurur; ardından bir ton seçer, stil anahtar sözcükleri ekler, bir dil belirler ve bir platform ön ayarı seçer. Ön ayar önemlidir; çünkü ASPECT_PRESETS kullanılarak doğrudan nihai genişlik × yükseklik ile eşleşir.
  • “Gelişmiş” düğmeleri, modele kaç denoising yinelemesi yaptırılacağını ve modelin komuta ne kadar sıkı uyacağını sırasıyla kontrol eden steps ve true_cfg_scale gibi temel parametreleri içerir. Çekirdek/seed tekrarlanabilirliği kontrol eder ve show_seed nihai çekirdeği isteğe bağlı olarak gösterir.
  • Sağ sütun, üretilen poster görselini ve isteğe bağlı olarak o üretimde kullanılan çekirdeği barındırır.
  • Son olarak, btn.click() çağrısı her şeyi birbirine bağlar. Gradio, tüm giriş bileşenlerini sırayla alır, bunları generate_image()’e iletir ve döndürülen değerleri çıktı bileşenlerine yönlendirir. Son olarak demo.launch(share=True, debug=True) Gradio sunucusunu başlatır, demolar için paylaşılabilir bir genel bağlantı verir ve sorunları teşhis etmeye yardımcı olması için not defterine hata ayıklama günlükleri yazdırır.

Son uygulamamız olan Qwen Image 2512’nin çalışır hâlini gösteren bir video burada:

Sonuç

Qwen-Image-2512, hem fotogerçekçi görseller hem de güvenilir metin ağırlıklı yerleşimler üretmek için uygundur. Bu eğitimde, Diffusers üzerinde uçtan uca bir Poster Stüdyosu kurduk. Modeli bir A100 üzerinde yükledik, platform en-boy oranı ön ayarları ekledik ve her şeyi basit ürün girdilerini cilalı e-ticaret görsellerine dönüştüren bir Gradio arayüzüne sardık.

Daha küçük GPU’larda çalışıyorsanız, aynı iş akışı geçerlidir; sadece 768×768 çözünürlükte yineleyin, adımları azaltın ve ölçeklemeniz gerektiğinde kuantize çalışma zamanlarını değerlendirin.

Qwen-Image-2512 SSS

Qwen-Image-2512’yi bir tüketici GPU’sunda (ör. RTX 4090) çalıştırabilir miyim?

Evet, ancak muhtemelen tam modeli orijinal hassasiyetinde çalıştıramazsınız. Tam BF16 sürümü yaklaşık 48 GB+ VRAM gerektirir; bu da standart tüketici kartlarının erişiminin dışında kalır (24 GB RTX 4090 bile). Ancak, FP8 kuantizasyonu veya GGUF biçimlerini kullanarak 24 GB kartlarda çalıştırabilirsiniz (tıpkı insanların Llama 3’ü yerel olarak çalıştırmasına benzer). 16 GB kartlar için, modeli çökmeden belleğe sığdırmak amacıyla neredeyse kesinlikle 4-bit (Q4_K_M) GGUF varyantlarına ihtiyaç duyarsınız.

Qwen-Image-2512 ticari kullanım için ücretsiz mi?

Bazı rakiplerin kısıtlayıcı "yalnızca araştırma" veya "ticari olmayan" topluluk lisanslarını kullanmasının aksine, Qwen-Image-2512 Apache 2.0 lisansı altında yayımlandı. Bu genel olarak modeli ticari uygulamalar için kullanmanıza, ürünlere entegre etmenize ve (bu Poster Stüdyosu gibi) hizmetler oluşturmanıza, lisans koşullarına uyduğunuz sürece telif ücreti ödemeden olanak tanır.

Bu, FLUX.2 ile nasıl karşılaştırılır?

Farklı güçlü yönlere sahip rakiplerdir.

  • FLUX.2 (ve FLUX.1 Pro) genel olarak fotogerçekçilik ve estetikte en iyisi kabul edilir. Eğer "atmosfer", sanatsal stil veya fotoğrafçılık için yerel 4MP çözünürlük gerekiyorsa, FLUX.2 genellikle üstündür.
  • Qwen-Image-2512, metin oluşturma ve yönerge takibinde öne çıkar. Büyük (7B parametreli) bir metin kodlayıcı kullandığı için, karmaşık komut yerleşimlerini ("metin X’i buraya yerleştir, düğme Y’yi şuraya koy") FLUX’tan çok daha isabetli şekilde takip eder. Ayrıca iki dilli metinde (Çince/İngilizce) ve belge benzeri görüntüler (posterler, çizelgeler, faturalar) üretmede daha iyidir.
Diffusers’ı kaynaktan kurmam gerekir mi?

Evet, Qwen-Image-2512 için model kartı, en güncel boru hattı desteği için Diffusers’ı GitHub’dan kurmanızı söylüyor.

`guidance_scale` doğru ayar düğmesi mi?

Şu anda Qwen-Image için hayır. Mevcut Diffusers entegrasyonunda, guidance_scale esasen bir yer tutucudur; bu yüzden classifier-free guidance vermez. Bu nedenle, kılavuzu kontrol etmek için (tek bir boşluk “ ” bile olsa) bir negative_prompt ile birlikte true_cfg_scale kullandık. Daha yüksek true_cfg_scale komuta uyumu artırır; ancak çok yükseltmek artefaktlara yol açabilir.

Qwen-Image-2512 SSS model boyutu nedir?

HF deposuna göre, Qwen-Image-2512’nin boyutu ~57,7 GB’tır; bu da yerel çıkarım için oldukça büyüktür.

Bellek kullanımı neden bu kadar yüksek?

Bellek kullanımı yüksektir; çünkü boru hattı, difüzyon dönüştürücüsünün ve Varyasyonel Otomatik Kodlayıcı’nın (VAE) yanı sıra büyük bir metin kodlayıcıyı (Qwen2.5-VL-7B Instruct) içerir.

Aashi Dutt

Yazar

Aashi Dutt

ML (Üretken Yapay Zekâ) alanında Google Developers Uzmanıyım, Kaggle 3x Expert unvanına sahibim ve 3+ yıllık teknoloji deneyimiyle Women Techmakers Elçisiyim. 2020'de bir sağlık teknolojileri girişiminin kurucu ortağı oldum ve Georgia Tech'te makine öğrenmesi alanında uzmanlaşarak bilgisayar bilimleri yüksek lisansı yapıyorum.

Konular

İlgili