فاز 4 · درس 23

ترنسفورمرهای دیفیوژن (DiT) و جریان تصحیح‌شده (Rectified Flow)

نوع
مفهومی و ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python
یک بردار خط مستقیم درخشان که یک مکعب بی‌نظم و دانه‌دانه نویز را به یک مکعب تصویر کریستالی و شفاف با شبکه‌های ترنسفورمر وصل می‌کند
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. از U-Net تا ترنسفورمر
  5. جریان تصحیح‌شده در یک پاراگراف
  6. شرطی‌سازی به روش AdaLN
  7. انکودرهای متن در SD3 و FLUX
  8. هدایت بدون طبقه‌بندی‌کننده کماکان پابرجاست
  9. سازگاری، توربو، اشنل و LCM
  10. چشم‌انداز مدل‌ها در سال 2026
  11. چرا این دگرگونی بنیادین اهمیت دارد؟
  12. پیاده‌سازی عملی
  13. گام 1: یک بلوک DiT با AdaLN
  14. گام 2: یک مدل DiT جمع‌وجور
  15. گام 3: آموزش با جریان تصحیح‌شده
  16. گام 4: نمونه‌بردار اویلر (Euler Sampler)
  17. گام 5: تست اولیه‌ی سرتاسری (Smoke Test)
  18. استفاده‌ی عملی
  19. تحویل پروژه
  20. تمرین‌ها
  21. اصطلاحات کلیدی
  22. برای مطالعه‌ی بیشتر

اگر پیگیر جریان تولید تصویر با هوش مصنوعی باشید، حتماً دیده‌اید که معماری قدیمی U-Net که سال‌ها ستون فقرات Stable Diffusion 1.5 و مدل‌های DDPM اولیه بود، تقریباً کنار رفته است. مدل‌های پیشرو مانند FLUX و Stable Diffusion 3 موتور نویززدای قدیمی را با ترنسفورمرهای دیفیوژن (DiT) تعویض کرده‌اند و به جای صدها گام دیفیوژن تصادفی، از جریان تصحیح‌شده (Rectified Flow) استفاده می‌کنند تا تصاویر را در 20 گام یا حتی کمتر به شکلی پایدار تولید کنند.

درک این معماری‌ها و مبانی ریاضی جریان تصحیح‌شده به شما اجازه می‌دهد از سطح کاربری صرف کتابخانه‌ها فراتر بروید و معماری مدرن مدل‌های چندرسانه‌ای را دقیقاً بشناسید. در این درس پیاده‌سازی بلوک‌های DiT با تکنیک نرمال‌سازی لایه‌ای انطباقی (AdaLN)، حلقه‌ی آموزش پیش‌بینی سرعت و نمونه‌برداری سریع اویلر را به شکل کاملاً عملی بررسی می‌کنیم.

کدهای آموزشی و پایه‌ای این درس برای اجرا روی سیستم محلی و حتی CPU یا پردازنده‌های سازگار شخصی طراحی شده‌اند و نیازی به GPUهای سنگین ابری ندارند. با این حال، توجه داشته باشید که دانلود وزن مدل‌های بزرگی مانند FLUX از مخازنی مثل Hugging Face گاهی به دلیل اختلالات شبکه با کندی مواجه می‌شود که در صورت لزوم می‌توانید از میرورهای موجود کمک بگیرید.

راز دیفیوژن در U-Net نیست. کافی است آن را با یک ترنسفورمر جایگزین کنید و برنامه‌ی نویز را به یک جریان خط مستقیم (straight-line flow) تغییر دهید؛ ناگهان SD3، FLUX و همه‌ی مدل‌های تبدیل متن به تصویر سال 2026 پیش روی شما خواهند بود.

اهداف یادگیری

  • ردیابی مسیر تکامل از DDPM مبتنی بر U-Net (درس 10) تا ترنسفورمر دیفیوژن (Diffusion Transformer یا DiT)، معماری MMDiT در SD3 و ساختار تک‌جریانی + دوجریانی در FLUX
  • تشریح جریان تصحیح‌شده (rectified flow): این‌که چرا مسیر خط مستقیم میان نویز و داده به مدل‌ها اجازه می‌دهد به جای 1000 گام، نمونه‌گیری را در 20 گام انجام دهند
  • پیاده‌سازی یک بلوک DiT جمع‌وجور و یک حلقه‌ی آموزش جریان تصحیح‌شده، هر دو در کمتر از 100 خط کد
  • تمایز میان نسخه‌های مختلف مدل‌ها (SD3، FLUX.1-dev، FLUX.1-schnell، Z-Image و Qwen-Image) بر اساس معماری، تعداد پارامترها و نوع مجوز

صورت مسئله

در درس 10 یک مدل DDPM را به همراه نویززدای U-Net پیاده کردیم. این ترکیب در سال‌های 2020 تا 2023 بر دنیای هوش مصنوعی حکمرانی می‌کرد: U-Net + برنامه‌ی بتای نویز (beta schedule) + تابع زیان (loss) پیش‌بینی نویز. خروجی این فرمول مدل‌های موفقی مثل Stable Diffusion 1.5 و 2.1 و DALL-E 2 بود.

اما همه‌ی مدل‌های پیشروی تبدیل متن به تصویر در سال 2026 از این فرمول عبور کرده‌اند. Stable Diffusion 3، FLUX، SD4، Z-Image، Qwen-Image، Hunyuan-Image — هیچ‌کدام از U-Net استفاده نمی‌کنند؛ بلکه بر پایه‌ی ترنسفورمرهای دیفیوژن (DiT) ساخته شده‌اند. علاوه بر این، SD3 و FLUX برنامه‌ی نویز سنتی DDPM را با جریان تصحیح‌شده (rectified flow) جایگزین کرده‌اند؛ رویکردی که مسیر میان نویز و داده را مستقیم می‌کند و استنتاج را در نسخه‌های تقطیرشده یا سازگار (consistency models) به 1 تا 4 گام کاهش می‌دهد.

اهمیت این تحول در این است که تولید تصویر مبتنی بر دیفیوژن دقیقاً به همین دلیل کنترل‌پذیرتر شده، پرامپت‌ها را با دقت بسیار بالاتری اجرا می‌کند (مشکل رندر متن در SD3 و SD4 حل شد) و سرعت آن به حد مناسب برای محیط‌های پروداکشن رسیده است. درک DiT و جریان تصحیح‌شده، کلید شناخت استک تولید تصویر در سال 2026 است.

مفاهیم پایه

از U-Net تا ترنسفورمر

FLUX (2024)MMDiT (SD3, 2024)DiT (2023)DDPM U-Net (2020)انکودر کانولوشنباتل‌نک کانولوشندیکودر کانولوشنتعبیه وصلهبلوک‌های ترنسفورمربازسازی وصلهجریان متناتنشن مشترک(وزن‌های مجزا برای هر مودالیتی)جریان تصویربلوک‌های دو جریانی(متن + تصویر مجزا)بلوک‌های تک جریانی(الحاق + وزن‌های مشترک)
  • DiT (پیبلز و شی، 2023) — جایگزینی U-Net با یک ترنسفورمر شبیه به ViT روی پچ‌های نهفته (latent patches). اعمال شرایط (conditioning) از طریق نرمال‌سازی لایه‌ای انطباقی (adaptive layer norm یا AdaLN) انجام می‌شود.
  • MMDiT (مدل SD3، اسِر و همکاران، 2024) — دارای دو جریان با وزن‌های مجزا برای توکن‌های متن و تصویر که در یک سازوکار اتنشن (attention) مشترک سهیم هستند.
  • FLUX (آزمایشگاه بلک فارست، 2024) — در N بلوک اول مثل SD3 از معماری دوجریانی استفاده می‌کند؛ اما در بلوک‌های بعدی برای کارایی بهتر در عمق‌های بالاتر، توکن‌ها را به هم متصل کرده و وزن‌ها را به اشتراک می‌گذارد (تک‌جریانی).
  • Z-Image (2025) — یک مدل DiT تک‌جریانی کارآمد با 6 میلیارد پارامتر که ایده‌ی «بزرگ‌تر کردن مدل به هر قیمتی» را به چالش می‌کشد.

جریان تصحیح‌شده در یک پاراگراف

مدل DDPM فرایند رفت را به شکل یک معادله‌ی دیفرانسیل تصادفی (SDE) نویزدار تعریف می‌کند که در آن x_t به‌مرور تخریب می‌شود. فرایند برگشتِ یادگرفته‌شده نیز یک SDE دوم است که با 1000 گام ریز حل می‌شود.

در مقابل، جریان تصحیح‌شده یک درون‌یابی خط مستقیم بین داده‌ی تمیز و نویز خالص تعریف می‌کند:

xt=(1−t) x0+t ϵ,t∈[0,1]x_t = (1 - t) \, x_0 + t \, \epsilon, \qquad t \in [0, 1]

در این روش شبکه‌ای آموزش می‌بیند تا سرعت را پیش‌بینی کند: v_theta(x_t, t) = epsilon - x_0 — یعنی جهت رفت در امتداد مسیر خط مستقیم از داده‌ی تمیز به سمت نویز (dx_t/dt). در زمان نمونه‌گیری، این بردار سرعت را در جهت معکوس انتگرال‌گیری می‌کنید تا از نویز به سمت داده حرکت کنید. معادله‌ی دیفرانسیل معمولی (ODE) حاصل از این فرایند به یک خط مستقیم بسیار نزدیک‌تر است؛ بنابراین برای نمونه‌گیری به گام‌های انتگرال‌گیری بسیار کمتری نیاز دارید.

توسعه‌دهندگان SD3 این روش را Rectified Flow Matching می‌نامند. مدل‌های FLUX، Z-Image و اکثر مدل‌های سال 2026 نیز از همین تابع هدف استفاده می‌کنند. استنتاج معمول در این روش با 20 تا 30 گام اویلر (Euler - قطعی) انجام می‌شود، در حالی که در چارچوب قدیمی DDPM به بیش از 50 گام DDIM نیاز بود. نسخه‌های تقطیرشده (distilled)، توربو (turbo)، اشنل (schnell) و LCM حتی این عدد را به 1 تا 4 گام رسانده‌اند.

شرطی‌سازی به روش AdaLN

مدل‌های DiT از طریق نرمال‌سازی لایه‌ای انطباقی بر اساس گام زمانی و کلاس یا متن شرطی می‌شوند: مقادیر scale و shift از روی بردار شرطی‌سازی پیش‌بینی شده و بعد از LayerNorm اعمال می‌شوند. این روش بسیار تمیزتر از مدولاسیون سبک FiLM در شبکه‌های U-Net است و به استاندارد پیش‌فرض تمام DiTهای امروزی تبدیل شده است.

cond -> MLP -> (scale, shift, gate)
norm(x) * (1 + scale) + shift, then residual add * gate

انکودرهای متن در SD3 و FLUX

  • SD3 از سه انکودر متن استفاده می‌کند: دو مدل CLIP به‌علاوه‌ی T5-XXL. امبدینگ‌های این سه مدل به هم متصل شده و به عنوان شرط متنی به جریان تصویر تزریق می‌شوند.
  • FLUX از یک مدل CLIP-L و یک مدل T5-XXL استفاده می‌کند.
  • نسخه‌های Qwen-Image / Z-Image انکودرهای متن اختصاصی خود را به کار می‌گیرند که با مدل‌های زبانی پایه‌ی آن‌ها هماهنگ شده است.

بخش عمده‌ای از برتری چشمگیر SD3 و FLUX در درک و تحلیل پرامپت‌ها نسبت به SD1.5، به همین انکودر متن برمی‌گردد. مدل T5-XXL به‌تنهایی 4.7 میلیارد پارامتر دارد.

هدایت بدون طبقه‌بندی‌کننده کماکان پابرجاست

جریان تصحیح‌شده نمونه‌بردار (sampler) را تغییر می‌دهد، نه سازوکار شرطی‌سازی را. هدایت بدون طبقه‌بندی‌کننده (classifier-free guidance — یعنی حذف متن با احتمال 10٪ در زمان آموزش و ترکیب پیش‌بینی‌های شرطی و غیرشرطی در زمان استنتاج) در جریان تصحیح‌شده نیز دقیقاً مثل قبل کار می‌کند. اکثر مدل‌های سال 2026 از مقیاس هدایت (guidance scale) بین 3.5 تا 5 استفاده می‌کنند؛ مقداری کمتر از عدد 7.5 در SD1.5، چرا که مدل‌های مبتنی بر جریان تصحیح‌شده ذاتاً پرامپت‌ها را با دقت بسیار بالاتری دنبال می‌کنند.

سازگاری، توربو، اشنل و LCM

این چهار عنوان در واقع نام‌های متفاوتی برای یک ایده‌ی واحد هستند: تقطیر (distil) یک مدل کند و چندگامی به یک مدل سریع با گام‌های اندک.

  • LCM (مدل سازگاری نهفته) — آموزش یک مدل شاگرد (student) که می‌تواند از هر نقطه‌ی میانی x_t، خروجی نهایی x_0 را تنها در یک گام پیش‌بینی کند.
  • SDXL Turbo / FLUX schnell — مدل‌های 1 تا 4 گامی که با تقطیر دیفیوژن رقابتی (adversarial diffusion distillation) آموزش دیده‌اند.
  • SD Turbo — مدل‌های سازگاری (Consistency Models) سبک OpenAI که برای دیفیوژن در فضای نهفته بهینه‌سازی شده‌اند.

در سرویس‌دهی پروداکشن برای هر مدل جدید، معمولاً دو نسخه‌ی مجزا عرضه می‌شود: یک چک‌پوینت «با کیفیت کامل» و یک نسخه‌ی «turbo / schnell». مدل Schnell (در زبان آلمانی به معنای «سریع»؛ قرارداد نام‌گذاری آزمایشگاه بلک فارست) در 1 تا 4 گام اجرا می‌شود و مناسب پایپ‌لاین‌های بلادرنگ (real-time) است.

چشم‌انداز مدل‌ها در سال 2026

مدل اندازه معماری مجوز
Stable Diffusion 3 Medium 2B MMDiT SAI Community
Stable Diffusion 3.5 Large 8B MMDiT SAI Community
FLUX.1-dev 12B DiT دوجریانی + تک‌جریانی غیرتجاری
FLUX.1-schnell 12B همان، تقطیرشده Apache 2.0
FLUX.2 — نسخه‌ی تکامل‌یافته‌ی FLUX.1 ترکیبی
Z-Image 6B S3-DiT (تک‌جریانی مقیاس‌پذیر) منعطف (permissive)
Qwen-Image ~20B DiT + برج متنی Qwen Apache 2.0
Hunyuan-Image-3.0 ~80B DiT پژوهشی
SD4 Turbo 3B DiT + تقطیر SAI Commercial

در سال 2026، مدل FLUX.1-schnell گزینه‌ی پیش‌فرض متن‌باز است. Z-Image پیشتاز کارایی منابع به شمار می‌رود و FLUX.2 و SD4 پرچم‌داران فعلی کیفیت هستند.

چرا این دگرگونی بنیادین اهمیت دارد؟

ترکیب DDPM + U-Net کار می‌کرد؛ اما فرمول DiT + جریان تصحیح‌شده کیفیت بالاتر و سرعت بیشتری دارد و مقیاس‌پذیری آن بسیار تمیزتر است. این گذار، مشابه گذار از RNNها به ترنسفورمرها در پردازش زبان طبیعی است: هر دو معماری صورت‌مسئله‌ی یکسانی را حل می‌کردند، اما ترنسفورمرها مقیاس‌پذیر بودند و اکنون بر فضا مسلط شده‌اند. تمام مقالات سال 2026 در حوزه‌ی تولید تصویر، ویدیو یا مدل‌های سه‌بعدی از نویززداهایی با معماری DiT و معمولاً تابع هدف جریان تصحیح‌شده بهره می‌برند. امروزه رویکرد U-Net DDPM دیگر اساساً جنبه‌ی آموزشی دارد (درس 10).

جریان تصحیح‌شده (RECTIFIED FLOW)مستقیم‌کردن مسیر، نمونه‌برداری در 20 گام
RECTIFIED FLOWDDPM learns a curved trajectory from noise to data, so faithfully integrating it takes hundreds of small steps. Rectified flow trains the model to follow a straight line between the noise sample and the data point. A straight path needs far fewer integration steps, which is how SD3 and FLUX sample in 20 steps (or 1-4 when distilled) instead of 1000.x_T noisex_0 data‏DDPM: مسیر منحنی، حدود 1000 گامجریان تصحیح‌شده: خط مستقیم، حدود 20 گام
مدل DDPM یک مسیر منحنی را از نویز تا داده یاد می‌گیرد، بنابراین انتگرال‌گیری دقیق آن به صدها گام کوچک نیاز دارد. جریان تصحیح‌شده مدل را آموزش می‌دهد تا خط مستقیمی بین نمونه نویز و نقطه داده را دنبال کند. یک مسیر مستقیم به گام‌های انتگرال‌گیری بسیار کمتری نیاز دارد؛ به همین دلیل است که SD3 و FLUX به جای 1000 گام، در 20 گام (یا در حالت تقطیرشده در 1 تا 4 گام) نمونه‌برداری می‌کنند.

پیاده‌سازی عملی

گام 1: یک بلوک DiT با AdaLN

import torch
import torch.nn as nn


class AdaLNZero(nn.Module):
    """
    Adaptive LayerNorm with a gate. Predicts (scale, shift, gate) from the conditioning.
    Init such that the whole block starts as identity ("zero init").
    """

    def __init__(self, dim, cond_dim):
        super().__init__()
        self.norm = nn.LayerNorm(dim, elementwise_affine=False)
        self.mlp = nn.Linear(cond_dim, dim * 3)
        nn.init.zeros_(self.mlp.weight)
        nn.init.zeros_(self.mlp.bias)

    def forward(self, x, cond):
        scale, shift, gate = self.mlp(cond).chunk(3, dim=-1)
        h = self.norm(x) * (1 + scale.unsqueeze(1)) + shift.unsqueeze(1)
        return h, gate.unsqueeze(1)


class DiTBlock(nn.Module):
    def __init__(self, dim=192, heads=3, mlp_ratio=4, cond_dim=192):
        super().__init__()
        self.adaln1 = AdaLNZero(dim, cond_dim)
        self.attn = nn.MultiheadAttention(dim, heads, batch_first=True)
        self.adaln2 = AdaLNZero(dim, cond_dim)
        self.mlp = nn.Sequential(
            nn.Linear(dim, dim * mlp_ratio),
            nn.GELU(),
            nn.Linear(dim * mlp_ratio, dim),
        )

    def forward(self, x, cond):
        h, gate1 = self.adaln1(x, cond)
        a, _ = self.attn(h, h, h, need_weights=False)
        x = x + gate1 * a
        h, gate2 = self.adaln2(x, cond)
        x = x + gate2 * self.mlp(h)
        return x

بلوک AdaLNZero کار خود را به عنوان یک تبدیل همانی (identity mapping) شروع می‌کند، زیرا وزن‌های لایه‌ی MLP آن با صفر مقداردهی اولیه شده‌اند. فرایند آموزش به‌مرور بلوک را از حالت همانی خارج می‌کند؛ این تکنیک پایداری مدل‌های دیفیوژن ترنسفورمر عمیق را به شکل چشمگیری افزایش می‌دهد.

گام 2: یک مدل DiT جمع‌وجور

def timestep_embedding(t, dim):
    import math
    half = dim // 2
    freqs = torch.exp(-math.log(10000) * torch.arange(half, device=t.device) / half)
    args = t[:, None].float() * freqs[None]
    return torch.cat([args.sin(), args.cos()], dim=-1)


class TinyDiT(nn.Module):
    def __init__(self, image_size=16, patch_size=2, in_channels=3, dim=96, depth=4, heads=3):
        super().__init__()
        self.patch_size = patch_size
        self.num_patches = (image_size // patch_size) ** 2
        self.patch = nn.Conv2d(in_channels, dim, kernel_size=patch_size, stride=patch_size)
        self.pos = nn.Parameter(torch.zeros(1, self.num_patches, dim))
        self.time_mlp = nn.Sequential(
            nn.Linear(dim, dim * 2),
            nn.SiLU(),
            nn.Linear(dim * 2, dim),
        )
        self.blocks = nn.ModuleList([DiTBlock(dim, heads, cond_dim=dim) for _ in range(depth)])
        self.norm_out = nn.LayerNorm(dim, elementwise_affine=False)
        self.head = nn.Linear(dim, patch_size * patch_size * in_channels)

    def forward(self, x, t):
        n = x.size(0)
        x = self.patch(x)
        x = x.flatten(2).transpose(1, 2) + self.pos
        t_emb = self.time_mlp(timestep_embedding(t, self.pos.size(-1)))
        for blk in self.blocks:
            x = blk(x, t_emb)
        x = self.norm_out(x)
        x = self.head(x)
        return self._unpatchify(x, n)

    def _unpatchify(self, x, n):
        p = self.patch_size
        h = w = int(self.num_patches ** 0.5)
        x = x.view(n, h, w, p, p, -1).permute(0, 5, 1, 3, 2, 4).reshape(n, -1, h * p, w * p)
        return x

گام 3: آموزش با جریان تصحیح‌شده

import torch.nn.functional as F

def rectified_flow_train_step(model, x0, optimizer, device):
    model.train()
    x0 = x0.to(device)
    n = x0.size(0)
    t = torch.rand(n, device=device)
    epsilon = torch.randn_like(x0)
    x_t = (1 - t[:, None, None, None]) * x0 + t[:, None, None, None] * epsilon

    target_velocity = epsilon - x0
    pred_velocity = model(x_t, t)

    loss = F.mse_loss(pred_velocity, target_velocity)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss.item()

این کد را با تابع زیان پیش‌بینی نویز در DDPM (درس 10) مقایسه کنید: ساختار یکسان است، اما هدف تغییر کرده. به جای پیش‌بینی مستقیم نویز epsilon، سرعت یعنی epsilon - x_0 را پیش‌بینی می‌کنیم که در طول مسیر درون‌یابی خط مستقیم، از داده به سمت نویز اشاره دارد.

گام 4: نمونه‌بردار اویلر (Euler Sampler)

جریان تصحیح‌شده یک ODE است. روش اویلر ساده‌ترین شیوه‌ی حل آن به شمار می‌رود و برای مدلی که خوب آموزش دیده باشد، در 20 گام به بالا دقت آن تقریباً با حل‌کننده‌های مرتبه بالاتر برابری می‌کند.

@torch.no_grad()
def rectified_flow_sample(model, shape, steps=20, device="cpu"):
    model.eval()
    x = torch.randn(shape, device=device)
    dt = 1.0 / steps
    t = torch.ones(shape[0], device=device)
    for _ in range(steps):
        v = model(x, t)
        x = x - dt * v
        t = t - dt
    return x

تنها 20 گام. خروجی این روش روی یک مدل آموزش‌دیده، نمونه‌هایی قابل مقایسه با 1000 گام DDPM تولید می‌کند.

گام 5: تست اولیه‌ی سرتاسری (Smoke Test)

import numpy as np

def synthetic_blobs(num=200, size=16, seed=0):
    rng = np.random.default_rng(seed)
    out = np.zeros((num, 3, size, size), dtype=np.float32)
    yy, xx = np.meshgrid(np.arange(size), np.arange(size), indexing="ij")
    for i in range(num):
        cx, cy = rng.uniform(4, size - 4, size=2)
        r = rng.uniform(2, 4)
        mask = (xx - cx) ** 2 + (yy - cy) ** 2 < r ** 2
        colour = rng.uniform(-1, 1, size=3)
        for c in range(3):
            out[i, c][mask] = colour[c]
    return torch.from_numpy(out)

مدل TinyDiT را با جریان تصحیح‌شده روی این داده‌ها آموزش دهید. پس از 500 گام، نمونه‌های خروجی باید شبیه لکه‌های محو رنگی باشند.

استفاده‌ی عملی

برای تولید تصاویر واقعی با FLUX، SD3 یا Z-Image، کتابخانه‌ی diffusers همه‌ی آن‌ها را با یک API یکپارچه ارائه می‌دهد:

from diffusers import FluxPipeline, StableDiffusion3Pipeline
import torch

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-schnell",
    torch_dtype=torch.bfloat16,
).to("cuda")

out = pipe(
    prompt="a golden retriever surfing a tsunami, hyperrealistic, studio lighting",
    guidance_scale=0.0,           # schnell was trained without CFG
    num_inference_steps=4,
    max_sequence_length=256,
).images[0]
out.save("surf.png")

تنها سه خط کد. اجرای FLUX.1-schnell در چهار گام. برای رسیدن به کیفیت بالاتر در 20 تا 30 گام به همراه CFG، کافی است شناسه را به black-forest-labs/FLUX.1-dev تغییر دهید.

برای SD3:

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-large",
    torch_dtype=torch.bfloat16,
).to("cuda")
out = pipe(prompt, guidance_scale=3.5, num_inference_steps=28).images[0]

تحویل پروژه

خروجی‌های این درس:

  • outputs/prompt-dit-model-picker.md — پرامپتی برای انتخاب میان مدل‌های SD3، FLUX.1-dev، FLUX.1-schnell، Z-Image و SD4 Turbo بر اساس محدودیت‌های کیفیت، تاخیر و مجوز.
  • outputs/skill-rectified-flow-trainer.md — پیاده‌سازی یک حلقه‌ی آموزش کامل برای جریان تصحیح‌شده با استفاده از DiT مجهز به AdaLN و نمونه‌برداری اویلر.

تمرین‌ها

  1. (ساده) مدل TinyDiT بالا را به مدت 500 گام روی مجموعه‌داده‌ی ساختگی لکه‌ها آموزش دهید. نمونه‌های تولیدشده با 10، 20 و 50 گام اویلر را مقایسه کنید.
  2. (متوسط) با متصل کردن یک امبدینگ کلاس یادگرفتنی به امبدینگ زمان، شرطی‌سازی متنی را اضافه کنید (10 «کلاس» لکه بر اساس رنگ). با کلاس‌های 0، 5 و 9 نمونه‌گیری کنید و بررسی کنید که آیا رنگ‌ها همخوانی دارند یا خیر.
  3. (سخت) فاصله‌ی فرشه (معیاری جایگزین برای FID) را میان نمونه‌های تولیدشده از نسخه‌ی جریان تصحیح‌شده و نسخه‌ی DDPM برای مدلی با ابعاد یکسان محاسبه کنید که روی داده‌های یکسان و به تعداد گام‌های برابر آموزش دیده‌اند. گزارش دهید که کدام مدل سریع‌تر همگرا می‌شود.

اصطلاحات کلیدی

اصطلاح در گفتار عمومی معنای دقیق فنی
DiT «ترنسفورمر دیفیوژن» ترنسفورمری که جایگزین U-Net به عنوان نویززدای مدل دیفیوژن می‌شود؛ روی پچ‌های نهفته عمل می‌کند
AdaLN «نرمال‌سازی لایه‌ای انطباقی» شرطی‌سازی روی گام زمانی/متن از طریق مقیاس، جابه‌جایی و گیت یادگرفتنی بعد از LayerNorm؛ استاندارد تمام مدل‌های مدرن DiT
MMDiT «مدل DiT چندوجهی (SD3)» جریان‌های مجزای وزن برای توکن‌های متن و تصویر که در اتنشن مشترک سهیم هستند
تک‌جریانی / دوجریانی «ترفند مدل FLUX» در NN بلوک ابتدایی دوجریانی است (وزن‌های مجزا برای هر مدالیته)، در بلوک‌های بعدی تک‌جریانی (الحاق + وزن‌های مشترک) برای کارایی در عمق بیشتر
جریان تصحیح‌شده (Rectified flow) «مسیر خط مستقیم از نویز تا داده» درون‌یابی خطی بین داده و نویز؛ شبکه سرعت را پیش‌بینی می‌کند؛ نیاز به گام‌های ODE کمتر در زمان استنتاج
هدف سرعت (Velocity target) «تفاضل نویز از داده (epsilon - x_0)» هدف رگرسیون در جریان تصحیح‌شده؛ از داده‌ی تمیز به سمت نویز جهت‌گیری دارد
هدایت CFG «هدایت بدون طبقه‌بندی‌کننده» ترکیب پیش‌بینی‌های شرطی و غیرشرطی؛ همچنان در مدل‌های مبتنی بر جریان تصحیح‌شده استفاده می‌شود
Schnell / turbo / LCM «تقطیر در 1 تا 4 گام» نسخه‌های با گام‌های اندک که از روی مدل‌های کامل تقطیر شده‌اند؛ آماده برای محیط‌های پروداکشن بلادرنگ

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا مدل‌های پیشرو (SOTA) متن به تصویر سال 2024 به بعد (مانند SD3، FLUX و Z-Image) نویززداهای مبتنی بر U-Net را با ترنسفورمر دیفیوژن (DiT) جایگزین کردند؟
  2. پیش از درسجریان تصحیح‌شده به مدل آموزش می‌دهد تا سرعت `v = epsilon - x_0` را در طول یک درون‌یابی خط مستقیم بین داده و نویز پیش‌بینی کند. چرا این کار امکان نمونه‌برداری در 20 گام به جای 1000 گام را فراهم می‌کند؟
  3. پس از درسمعماری MMDiT (در SD3) از دو مجموعه وزن جداگانه برای توکن‌های متن و تصویر استفاده می‌کند که در یک لایه اتنشن مشترک سهیم هستند. دلیل آن چیست؟
  4. پس از درساصطلاح AdaLN-Zero در یک بلوک DiT به چه معناست و چرا مفید واقع می‌شود؟
  5. پس از درسمدل FLUX.1-schnell می‌تواند تصویر را تنها در 4 گام تولید کند. کدام تکنیک این قابلیت را به آن می‌دهد؟

سؤالات متداول

چرا مدل‌های جدید مثل FLUX و SD3 از DiT به جای U-Net استفاده می‌کنند؟

ترنسفورمرهای دیفیوژن (DiT) قابلیت مقیاس‌پذیری بسیار تمیزتری دارند، درک پرامپت و رندر متن را بهبود می‌دهند و ظرفیت پردازش داده‌های چندوجهی در آن‌ها بالاتر است.

تفاوت کلیدی جریان تصحیح‌شده (Rectified Flow) با DDPM سنتی چیست؟

جریان تصحیح‌شده یک مسیر درون‌یابی خط مستقیم میان داده و نویز تعریف می‌کند؛ در نتیجه به جای پیش‌بینی نویز تصادفی، سرعت حرکت در امتداد این خط پیش‌بینی می‌شود و تعداد گام‌های استنتاج به 20 گام یا کمتر کاهش می‌یابد.

تکنیک AdaLN چیست و چه نقشی در DiT دارد؟

در نرمال‌سازی لایه‌ای انطباقی (AdaLN)، مقادیر scale و shift و گیت از بردار شرطی‌سازی (گام زمانی یا امبدینگ متن) پیش‌بینی شده و پس از LayerNorm اعمال می‌شوند تا شرایط مدنظر به لایه‌های شبکه تزریق شوند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.