Stable Diffusion 3 (SD3)، أحدث إصدار من Stability AI لعائلة نماذج Stable Diffusion، متوفر الآن على Hugging Face Hub ويمكن استخدامه مع 🧨 Diffusers.
النموذج الذي تم إصداره اليوم هو Stable Diffusion 3 Medium، مع معلمات 2B.
كجزء من هذا الإصدار، قدمنا:
- نماذج على المحور
- تكامل الناشرون
- البرامج النصية للتدريب SD3 Dreambooth وLoRA
جدول المحتويات
ما الجديد في SD3؟
نموذج
SD3 هو نموذج نشر كامن يتكون من ثلاثة أجهزة تشفير نصية مختلفة (CLIP L/14، وOpenCLIP bigG/14، وT5-v1.1-XXL)، ونموذج جديد لمحول الانتشار متعدد الوسائط (MMDiT)، ونموذج AutoEncoder ذو 16 قناة مشابه للنموذج المستخدم في Stable Diffusion XL.
يقوم SD3 بمعالجة مدخلات النص والبكسلات الكامنة كسلسلة من عمليات التضمين. تتم إضافة الترميزات الموضعية إلى تصحيحات 2×2 من العناصر الكامنة والتي يتم بعد ذلك تسويتها في تسلسل ترميز التصحيح. يتم تغذية هذا التسلسل، جنبًا إلى جنب مع تسلسل ترميز النص، في كتل MMDiT، حيث يتم تضمينها في أبعاد مشتركة، ومتسلسلة، وتمريرها عبر سلسلة من الاهتمامات المعدلة وMLPs.
من أجل مراعاة الاختلافات بين الطريقتين، تستخدم كتل MMDiT مجموعتين منفصلتين من الأوزان لتضمين تسلسل النص والصور في أبعاد مشتركة. يتم ضم هذه التسلسلات قبل عملية الانتباه، مما يسمح لكلا التمثيلين بالعمل في مساحتهما الخاصة مع أخذ الآخر في الاعتبار أثناء عملية الانتباه. يختلف هذا التدفق ثنائي الاتجاه للمعلومات بين بيانات النص والصورة عن الأساليب السابقة لتركيب النص إلى الصورة، حيث يتم دمج معلومات النص في الكامنة عبر الانتباه المتبادل مع تمثيل نص ثابت.
يستفيد SD3 أيضًا من تضمينات النص المجمعة من كلا طرازي CLIP الخاصين به كجزء من تكييف الخطوات الزمنية الخاص به. يتم أولاً ربط هذه التضمينات وإضافتها إلى تضمين الخطوة الزمنية قبل تمريرها إلى كل كتلة من كتل MMDiT.
التدريب على مطابقة التدفق المصحح
بالإضافة إلى التغييرات المعمارية، يطبق SD3 هدف مطابقة التدفق المشروط لتدريب النموذج. في هذا النهج، يتم تعريف عملية الضوضاء الأمامية على أنها تدفق مصحح يربط البيانات وتوزيعات الضوضاء على خط مستقيم.
تعد عملية أخذ عينات مطابقة التدفق المصححة أبسط وتؤدي بشكل جيد عند تقليل عدد خطوات أخذ العينات. لدعم الاستدلال باستخدام SD3، قمنا بتقديم برنامج جدولة جديد (FlowMatchEulerDiscreteScheduler) مع صياغة مطابقة التدفق وخطوات طريقة أويلر. كما أنه ينفذ أيضًا التحويل المعتمد على الدقة لجدول الخطوات الزمنية عبر أ shift المعلمة. زيادة shift تتعامل القيمة مع قياس الضوضاء بشكل أفضل للحصول على دقة أعلى. يوصى باستخدامه shift=3.0 للنموذج 2B.
لتجربة SD3 بسرعة، راجع التطبيق أدناه:
استخدام SD3 مع الناشرون
لاستخدام SD3 مع Diffusers، تأكد من الترقية إلى أحدث إصدار من Diffusers.
pip install --upgrade diffusers
كما هو بوابات النموذج، قبل استخدامه مع diffusers عليك أولاً الذهاب إلى صفحة Stable Diffusion 3 Medium Hugging Face، وملء النموذج وقبول البوابة. بمجرد دخولك، ستحتاج إلى تسجيل الدخول حتى يعرف نظامك أنك قبلت البوابة. استخدم الأمر أدناه لتسجيل الدخول:
huggingface-cli login
سيقوم المقتطف التالي بتنزيل إصدار المعلمة 2B من SD3 في fp16 دقة. هذا هو التنسيق المستخدم في نقطة التحقق الأصلية التي نشرتها Stability AI، وهي الطريقة الموصى بها لتشغيل الاستدلال.
تحويل النص إلى صورة
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers", torch_dtype=torch.float16
).to("cuda")
image = pipe(
"A cat holding a sign that says hello world",
negative_prompt="",
num_inference_steps=28,
guidance_scale=7.0,
).images[0]
image
صورة إلى صورة
import torch
from diffusers import StableDiffusion3Img2ImgPipeline
from diffusers.utils import load_image
pipe = StableDiffusion3Img2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers", torch_dtype=torch.float16
).to("cuda")
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
prompt = "cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney, 8k"
image = pipe(prompt, image=init_image).images[0]
image

يمكنك الاطلاع على وثائق SD3 هنا.
تحسينات الذاكرة لSD3
يستخدم SD3 ثلاثة برامج تشفير نصية، أحدها هو الطراز T5-XXL الكبير جدًا. وهذا يجعل تشغيل النموذج على وحدات معالجة الرسومات التي تحتوي على أقل من 24 جيجابايت من VRAM أمرًا صعبًا، حتى عند الاستخدام fp16 دقة.
ولمراعاة ذلك، يأتي تكامل Diffusers مع تحسينات للذاكرة تسمح بتشغيل SD3 على نطاق أوسع من الأجهزة.
تشغيل الاستدلال مع تفريغ النموذج
يتيح لك تحسين الذاكرة الأساسي المتوفر في Diffusers إمكانية إلغاء تحميل مكونات النموذج إلى وحدة المعالجة المركزية أثناء الاستدلال من أجل حفظ الذاكرة مع رؤية زيادة طفيفة في زمن انتقال الاستدلال. سيؤدي تفريغ النموذج إلى نقل مكون النموذج إلى وحدة معالجة الرسومات فقط عندما يلزم تنفيذه مع الاحتفاظ بالمكونات المتبقية على وحدة المعالجة المركزية.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers", torch_dtype=torch.float16
)
pipe.enable_model_cpu_offload()
prompt = "smiling cartoon dog sits at a table, coffee mug on hand, as a room goes up in flames. “This is fine,” the dog assures himself."
image = pipe(prompt).images[0]
إسقاط أداة تشفير النص T5 أثناء الاستدلال
يمكن أن تؤدي إزالة أداة تشفير النص T5-XXL ذات المعلمة 4.7B كثيفة الذاكرة أثناء الاستدلال إلى تقليل متطلبات الذاكرة لـ SD3 بشكل كبير مع خسارة طفيفة فقط في الأداء.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers",
text_encoder_3=None,
tokenizer_3=None,
torch_dtype=torch.float16
).to("cuda")
prompt = "smiling cartoon dog sits at a table, coffee mug on hand, as a room goes up in flames. “This is fine,” the dog assures himself."
image = pipe(prompt).images[0]
استخدام نسخة كمية من نموذج T5-XXL
يمكنك تحميل نموذج T5-XXL بـ 8 بتات باستخدام ملف bitsandbytes مكتبة لتقليل متطلبات الذاكرة بشكل أكبر.
import torch
from diffusers import StableDiffusion3Pipeline
from transformers import T5EncoderModel, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
model_id = "stabilityai/stable-diffusion-3-medium-diffusers"
text_encoder = T5EncoderModel.from_pretrained(
model_id,
subfolder="text_encoder_3",
quantization_config=quantization_config,
)
pipe = StableDiffusion3Pipeline.from_pretrained(
model_id,
text_encoder_3=text_encoder,
device_map="balanced",
torch_dtype=torch.float16
)
يمكنك العثور على مقتطف الكود الكامل هنا.
ملخص تحسينات الذاكرة
تم إجراء جميع عمليات التشغيل المعيارية باستخدام الإصدار 2B من طراز SD3 على وحدة معالجة الرسومات A100 مع 80 جيجابايت من VRAM باستخدام fp16 الدقة وPyTorch 2.3.
بالنسبة لمعايير الذاكرة الخاصة بنا، نستخدم 3 تكرارات لاستدعاءات خطوط الأنابيب للإحماء ونبلغ عن متوسط وقت الاستدلال البالغ 10 تكرارات لاستدعاءات خطوط الأنابيب. نحن نستخدم الوسائط الافتراضية لـ StableDiffusion3Pipeline __call__() طريقة.
| تقنية | وقت الاستدلال (بالثواني) | الذاكرة (جيجابايت) |
|---|---|---|
| تقصير | 4.762 | 18.765 |
| التفريغ | 32.765 (~6.8x 🔼) | 12.0645 (~1.55x 🔽) |
| التفريغ + لا T5 | 19.110 (~4.013x 🔼) | 4.266 (~4.398x 🔽) |
| 8 بت T5 | 4.932 (~1.036x 🔼) | 10.586 (~1.77x 🔽) |
تحسينات الأداء لSD3
لتعزيز زمن الوصول الاستدلال، يمكننا استخدام torch.compile() للحصول على رسم بياني حسابي محسّن لـ vae و transformer عناصر.
import torch
from diffusers import StableDiffusion3Pipeline
torch.set_float32_matmul_precision("high")
torch._inductor.config.conv_1x1_as_mm = True
torch._inductor.config.coordinate_descent_tuning = True
torch._inductor.config.epilogue_fusion = False
torch._inductor.config.coordinate_descent_check_all_directions = True
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers",
torch_dtype=torch.float16
).to("cuda")
pipe.set_progress_bar_config(disable=True)
pipe.transformer.to(memory_format=torch.channels_last)
pipe.vae.to(memory_format=torch.channels_last)
pipe.transformer = torch.compile(pipe.transformer, mode="max-autotune", fullgraph=True)
pipe.vae.decode = torch.compile(pipe.vae.decode, mode="max-autotune", fullgraph=True)
prompt = "a photo of a cat holding a sign that says hello world",
for _ in range(3):
_ = pipe(prompt=prompt, generator=torch.manual_seed(1))
image = pipe(prompt=prompt, generator=torch.manual_seed(1)).images[0]
image.save("sd3_hello_world.png")
الرجوع هنا للحصول على النص الكامل.
لقد قمنا بقياس أداء torch.compile()على SD3 على جهاز واحد بسعة 80 جيجابايت A100 يستخدم fp16 الدقة وPyTorch 2.3. أجرينا 10 تكرارات لاستدعاء استنتاج خط الأنابيب مع 20 خطوة نشر. لقد وجدنا أن متوسط وقت الاستدلال مع الإصدارات المجمعة من النماذج كان 0.585 ثانية، تسريع 4X على التنفيذ المتلهف.
ضبط Dreambooth وLoRA
بالإضافة إلى ذلك، نحن نقدم برنامج DreamBooth النصي للضبط الدقيق لـ SD3 للاستفادة من LoRA. يمكن استخدام البرنامج النصي لضبط SD3 بكفاءة ويعمل كمرجع لتنفيذ خطوط أنابيب التدريب المصححة القائمة على التدفق. تشمل التطبيقات الشائعة الأخرى للتدفق المصحح minRF.
للبدء في استخدام البرنامج النصي، تأكد أولاً من أن لديك الإعداد الصحيح ومجموعة بيانات تجريبية متاحة (مثل هذه). الرجوع هنا للحصول على التفاصيل. ثَبَّتَ peft و bitsandbytes ومن ثم نحن على ما يرام:
export MODEL_NAME="stabilityai/stable-diffusion-3-medium-diffusers"
export INSTANCE_DIR="dog"
export OUTPUT_DIR="dreambooth-sd3-lora"
accelerate launch train_dreambooth_lora_sd3.py \
--pretrained_model_name_or_path=${MODEL_NAME} \
--instance_data_dir=${INSTANCE_DIR} \
--output_dir=/raid/.cache/${OUTPUT_DIR} \
--mixed_precision="fp16" \
--instance_prompt="a photo of sks dog" \
--resolution=1024 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--learning_rate=1e-5 \
--report_to="wandb" \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--max_train_steps=500 \
--weighting_scheme="logit_normal" \
--validation_prompt="A photo of sks dog in a bucket" \
--validation_epochs=25 \
--seed="0" \
--push_to_hub
شكر وتقدير
شكرًا لفريق Stability AI على تحقيق Stable Diffusion 3 وتزويدنا بإمكانية الوصول المبكر إليها. شكرًا لـ Linoy لمساعدتنا في الصورة المصغرة للمدونة.