Diffusers documentation

SDXL Turbo

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

SDXL Turbo

قُدم Stable Diffusion XL (SDXL) Turbo في Adversarial Diffusion Distillation بواسطة Axel Sauer وDominik Lorenz وAndreas Blattmann وRobin Rombach.

ملخص الورقة البحثية هو:

نقدّم تقطير الانتشار العدائي (ADD)، وهو نهج تدريب جديد يُتيح أخذ عينات بكفاءة من نماذج انتشار الصور الأساسية واسعة النطاق في خطوة إلى أربع خطوات فقط مع الحفاظ على جودة صورة عالية. نستخدم تقطير الدرجات للاستفادة من نماذج انتشار الصور الجاهزة واسعة النطاق كإشارة معلّم، بالاقتران مع خسارة عدائية لضمان دقة صورة عالية حتى في نطاق الخطوات المنخفضة الذي يتألف من خطوة أو خطوتين لأخذ العينات. تُظهر تحليلاتنا أن نموذجنا يتفوق بوضوح على طرق الخطوات القليلة الموجودة (GANs، نماذج الاتساق الكامن) في خطوة واحدة، ويصل إلى أداء نماذج انتشار متقدمة (SDXL) في أربع خطوات فقط. يُعدّ ADD الطريقة الأولى التي تفتح الباب أمام تركيب صور أحادية الخطوة في الوقت الفعلي باستخدام النماذج الأساسية.

نصائح

  • يستخدم SDXL Turbo نفس البنية المعمارية تمامًا مثل SDXL، مما يعني أنه يمتلك أيضًا نفس واجهة برمجة التطبيقات. يرجى الرجوع إلى مرجع واجهة برمجة التطبيقات الخاص بـ SDXL لمزيد من التفاصيل.
  • يجب أن يعطّل SDXL Turbo مقياس التوجيه عن طريق تعيين guidance_scale=0.0.
  • يجب أن يستخدم SDXL Turbo timestep_spacing='trailing' للمجدول، وأن يستخدم ما بين خطوة واحدة وأربع خطوات.
  • تم تدريب SDXL Turbo على توليد صور بحجم 512x512.
  • SDXL Turbo متاح للوصول المفتوح، لكنه ليس مفتوح المصدر، مما يعني أنه قد يكون من الضروري شراء ترخيص للنموذج لاستخدامه في التطبيقات التجارية. تأكد من قراءة بطاقة النموذج الرسمية لمعرفة المزيد.

اطّلع على منظمة Stability AI على Hub للحصول على نقاط التفتيش الرسمية لنماذج الأساس والمُحسّن!

تأكد من تثبيت المكتبات التالية.

# uncomment to install the necessary libraries in Colab
#!pip install -q diffusers transformers accelerate

تحميل نقاط التفتيش للنماذج

قد تُخزَّن أوزان النموذج في مجلدات فرعية منفصلة على Hub أو محليًا، وفي هذه الحالة، يجب عليك استخدام طريقة from_pretrained():

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"

يمكنك أيضًا استخدام طريقة from_single_file() لتحميل نقطة فحص نموذج محفوظة بتنسيق ملف واحد (.ckpt أو .safetensors) من Hub أو محليًا. لطريقة التحميل هذه، تحتاج إلى تعيين timestep_spacing="trailing" (لا تتردد في تجربة قيم إعدادات الجدولة الأخرى للحصول على نتائج أفضل):

from diffusers import StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler
import torch

pipeline = StableDiffusionXLPipeline.from_single_file(
    "https://huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors",
    dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
pipeline.scheduler = EulerAncestralDiscreteScheduler.from_config(pipeline.scheduler.config, timestep_spacing="trailing")

النص إلى صورة

لتوليد الصور من النص، مرّر موجهًا نصيًا. افتراضيًا، يولّد SDXL Turbo صورة بدقة 512x512، وهذه الدقة تعطي أفضل النتائج. يمكنك تجربة ضبط المعاملين height وwidth على 768x768 أو 1024x1024، لكن يجب أن تتوقع تدهورًا في الجودة عند القيام بذلك.

تأكد من ضبط guidance_scale على 0.0 لتعطيله، حيث تم تدريب النموذج دون استخدامه. خطوة استدلال واحدة كافية لتوليد صور عالية الجودة. زيادة عدد الخطوات إلى 2 أو 3 أو 4 ينبغي أن تحسّن جودة الصورة.

from diffusers import AutoPipelineForText2Image
import torch

pipeline_text2image = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", dtype=torch.float16, variant="fp16")
pipeline_text2image = pipeline_text2image.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."

image = pipeline_text2image(prompt=prompt, guidance_scale=0.0, num_inference_steps=1).images[0]
image
generated image of a racoon in a robe

من صورة إلى صورة

في توليد صورة من صورة، تأكد من أن num_inference_steps * strength أكبر من أو يساوي 1. ستعمل خط أنابيب توليد صورة من صورة لعدد خطوات يساوي int(num_inference_steps * strength)، على سبيل المثال 0.5 * 2.0 = 1 خطوة في مثالنا أدناه.

from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image, make_image_grid

# use from_pipe to avoid consuming additional memory when loading a checkpoint
pipeline_image2image = AutoPipelineForImage2Image.from_pipe(pipeline_text2image).to("cuda")  # or "mps", "xpu", "cpu"

init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
init_image = init_image.resize((512, 512))

prompt = "cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney, 8k"

image = pipeline_image2image(prompt, image=init_image, strength=0.5, guidance_scale=0.0, num_inference_steps=2).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
Image-to-image generation sample using SDXL Turbo

تسريع SDXL Turbo بشكل أكبر

  • قم بتجميع UNet إذا كنت تستخدم إصدار PyTorch 2.0 أو أحدث. ستكون أول عملية استنتاج بطيئة جدًا، لكن العمليات اللاحقة ستكون أسرع بكثير.
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
  • عند استخدام VAE الافتراضي، احتفظ به في float32 لتجنب تحويلات dtype المكلفة قبل كل توليد وبعده. لا تحتاج إلى القيام بذلك إلا مرة واحدة قبل أول توليد:
pipe.upcast_vae()

كبديل، يمكنك أيضاً استخدام VAE بدقة 16 بت أنشأه عضو المجتمع @madebyollin والذي لا يحتاج إلى الترقية إلى float32.

Update on GitHub