الوحدة 1 — الانتشار الكامن: المرمّز التلقائيّ وU-Net والمخطّط
قبل توليد أوّل صورة، فهم واحد لا نتنازل عنه: Stable Diffusion لا يرسم على البكسل، بل في فضاء مضغوط يُسمّى الفضاء الكامن. هذا ليس تفصيلًا نظريًّا؛ إنّه ما يُفسّر لماذا يعمل على GPU متواضعة، ولماذا تنكسر بعض الصور، ولماذا سنستعمل الأدوات بالطريقة التي سنستعملها بها في الوحدات القادمة.
الفكرة العامّة في جملتين
النموذج يتعلّم عمليّة عكس إفساد تدريجيّ: نأخذ صورة نظيفة، نُضيف إليها ضجيجًا خطوة بعد خطوة حتّى تصير ضجيجًا خالصًا، ثمّ نُدرّب شبكة على «التنبّؤ بالضجيج الذي أُضيف في كلّ خطوة». عند التوليد نبدأ من ضجيج عشوائيّ، ونطلب من الشبكة إزالة الضجيج تدريجيًّا مع تعليمة نصّيّة، فينبثق الصور. لكن كلّ هذا لا يحدث على وحدات بكسل بحجم 1024×1024×3، لأنّها مصفوفة عملاقة، بل في تمثيل مضغوط 128×128×4 يُسمّى latent.
المكوّنات الثلاثة
الانتشار الكامن ثلاث شبكات مستقلّة مدرَّبة، تُنفَّذ بالترتيب داخل كلّ استدعاء:
- المرمّز التلقائيّ المتغيّر (VAE). يحوّل الصور من فضاء البكسل إلى الفضاء الكامن ويعود. أثناء التوليد نستعمل فقط الفكّاك (decoder): يأخذ latent 128×128×4 ويُخرِج صورة 1024×1024×3. أثناء التدريب ومسار «صورة إلى صورة» نستعمل أيضًا المرمّز (encoder). حصّة VAE من التوليد صغيرة زمنيًّا، لكنّه مسؤول عن حدّة الحوافّ الأخيرة.
- U-Net. القلب الحسابيّ. يستقبل: latent مُضجّج، ورقم الخطوة الحاليّة، وتضمين النصّ. يُخرِج تنبّؤًا بالضجيج ليُطرَح. يُستدعى مرّة في كلّ خطوة إزالة ضجيج، فإن أعطيته 30 خطوة استدعيته 30 مرّة. هنا يذهب معظم الوقت (60% إلى 80% في التوليد النموذجيّ).
- مرمّز النصّ. يحوّل التعليمة إلى تضمين يفهمه U-Net. SD 1.5 يستعمل CLIP بحجم 77 رمزًا. SDXL يستعمل مرمّزَين نصّيَّين مُدمجَين (OpenCLIP وCLIP-G)، وهذا يُفسّر جزءًا من تحسّن فهم التعليمات في SDXL.
المخطّط: من يدير 30 خطوة إزالة الضجيج
المخطّط (scheduler، ويُسمّى أحيانًا sampler) ليس شبكة عصبيّة، بل خوارزميّة رياضيّة تُحدّد كيف نتنقّل من latent مُضجّج جدًّا إلى latent نظيف عبر عدد محدود من الخطوات. أشهرها: DDIM، Euler، Euler a، DPM++ 2M، UniPC. الفروقات بينها في السرعة وجودة النتيجة لعدد خطوات معطى؛ مثلًا DPM++ 2M يعطي نتيجة قريبة من 50 خطوة DDIM بـ25 خطوة فقط. سنُفصّل هذا في الوحدة 3.
ما يُغيّره SDXL
SDXL ليس مجرّد «SD 1.5 أكبر». اختلافات جوهريّة:
- الفضاء الكامن نفسه: 128×128×4 لصورة 1024×1024، مقابل 64×64×4 في SD 1.5 لصورة 512×512.
- مرمّزَان نصّيَّان بدل واحد، مع نافذة أطول (77 لكلّ واحد).
- U-Net أكبر: 2.6 مليار معلمة مقابل 860 مليون.
- نموذج مُنقّح اختياريّ (refiner) يمرّ على آخر 20% من الخطوات لتحسين الحدّة.
- تكييف بحجم الصورة (size conditioning): SDXL يعرف أنّه يُنتج 1024×1024 ولا يحاول توليد 512×512 مكبّرة.
النتيجة العمليّة: SDXL يفهم تعليمات أطول، وينتج تفاصيل أدقّ، ويستهلك حوالي 10 غيغا من VRAM بدل 4 غيغا لـSD 1.5. للآلات المتواضعة (6 غيغا VRAM أو أقلّ) نبقى على SD 1.5 أو نستعمل نصف الدقّة (fp16).
أوّل توليد بمكتبة diffusers
نحن هنا لبناء صور علامة أثاث. الكرسيّ المرجعيّ ينتظرنا في الوحدات التالية، لكن نبدأ بأبسط توليد ممكن للتأكّد من عمل البيئة:
import torch
from diffusers import StableDiffusionXLPipeline
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
image = pipe(
prompt="a wooden minimalist chair, studio photography, white background",
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("chaise_test.png")
لاحظ torch_dtype=torch.float16 و**variant="fp16"**: هذان الخياران يُنزلان الوزن من 32 بت إلى 16 بت، فيوفّران نصف الذاكرة تقريبًا بلا خسارة بصريّة تُذكر. سنعود لهذه الحيلة وأخواتها في الوحدة 9.
على CPU خالص، نفس السكربت يشتغل لكنّ التوليد قد يستغرق 10 دقائق للصورة الواحدة بدل ثوانٍ. لا يُنصَح إلّا للتجربة الأولى.
لست مجبرًا على تعلّم رياضيّات الانتشار لتستعمله. لكن معرفة المكوّنات الثلاثة تُنجّيك عند التصحيح: صورة ضبابيّة عادةً VAE، صورة لا تحترم التعليمة عادةً U-Net أو المخطّط، صورة تتجاهل كلمة أساسيّة عادةً مرمّز النصّ.
الخيط الأحمر يبدأ
مساعد إنتاج البصريّات لعلامة الأثاث سيولّد أوّل صورة للكرسيّ المرجعيّ. سنعتمد SDXL كلّما أمكن، لأنّ فهم التعليمات ونوعيّة الحوافّ أهمّ من السرعة عند صناعة صور تسويقيّة. الوحدة القادمة تُعمّق فنّ التعليمة الإيجابيّة والسلبيّة، والوحدة الثالثة تُفصّل الخطوات ومقياس التوجيه، والوحدة الرابعة تنتقل إلى تحري ر صورة موجودة.
الخلاصة
- Stable Diffusion يعمل في الفضاء الكامن لا على البكسل، وهذا ما يجعله عمليًّا على GPU متواضعة.
- ثلاث شبكات: VAE (تحويل بكسل ↔ كامن)، U-Net (إزالة الضجيج قلب الحساب)، مرمّز النصّ (فهم التعليمة).
- المخطّط خوارزميّة تحكّم في تسلسل الخطوات، وتُغيّر السرعة والجودة لعدد خطوات معطى.
- SDXL يفهم تعليمات أدقّ ويُنتج 1024×1024، مقابل استهلاك ذاكرة أعلى؛ SD 1.5 يبقى وجيهًا للآلات المتواضعة.