Diffusers documentation

التقطير الاتساق الكامن

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

التقطير الاتساق الكامن

تتميز نماذج الاتساق الكامن (LCMs) بقدرتها على توليد صور عالية الجودة في خطوات قليلة فقط، مما يمثل قفزة كبيرة إلى الأمام لأن العديد من خطوط الأنابيب تتطلب 25 خطوة على الأقل. يتم إنتاج LCMs من خلال تطبيق طريقة التقطير الاتساق الكامن على أي نموذج من نماذج Stable Diffusion. تعمل هذه الطريقة من خلال تطبيق التقطير الموجّه من مرحلة واحدة على الفضاء الكامن، مع دمج طريقة تخطي الخطوات لتخطي خطوات الزمن بشكل متسق لتسريع عملية التقطير (راجع الأقسام 4.1 و4.2 و4.3 من الورقة البحثية لمزيد من التفاصيل).

إذا كنت تدرب على وحدة معالجة رسومية ذات ذاكرة vRAM محدودة، فحاول تفعيل gradient_checkpointing وgradient_accumulation_steps وmixed_precision لتقليل استهلاك الذاكرة وتسريع التدريب. يمكنك تقليل استهلاك الذاكرة بشكل أكبر عن طريق تفعيل الانتباه الموفر للذاكرة باستخدام xFormers ومحسّن 8 بت من bitsandbytes.

ستستكشف هذه الدليل سكربت train_lcm_distill_sd_wds.py لمساعدتك على الاطلاع عليه بشكل أعمق، وكيفية تكييفه ليناسب حالتك الخاصة.

قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:

cd examples/consistency_distillation
pip install -r requirements.txt

🤗 Accelerate هي مكتبة تساعدك على التدريب على عدة وحدات معالجة رسومية (GPU) أو وحدات معالجة مخصصة (TPU) أو باستخدام دقة مختلطة. ستقوم تلقائيًا بإعداد بيئة التدريب الخاصة بك بناءً على عتادك وبيئتك. اطّلع على جولة سريعة في 🤗 Accelerate لمعرفة المزيد.

قم بتهيئة بيئة 🤗 Accelerate (جرّب تفعيل torch.compile لتسريع التدريب بشكل كبير):

accelerate config

لإعداد بيئة 🤗 Accelerate افتراضية دون اختيار أي تكوينات:

accelerate config default

أو إذا لم يدعم بيئتك shell تفاعليًا، كما هو الحال في notebook، يمكنك استخدام:

from accelerate.utils import write_basic_config

write_basic_config()

أخيرًا، إذا كنت ترغب في تدريب نموذج على مجموعة بياناتك الخاصة، فاطّلع على دليل إنشاء مجموعة بيانات للتدريب لمعرفة كيفية إنشاء مجموعة بيانات تعمل مع سكربت التدريب.

معاملات السكربت

تسلّط الأقسام التالية الضوء على أجزاء من سكربت التدريب التي تُعدّ مهمة لفهم كيفية تعديله، لكنها لا تغطي كل جانب من جوانب السكربت بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في الاطلاع على السكربت وإعلامنا بأي أسئلة أو مخاوف لديك.

يوفر سكربت التدريب العديد من المعلمات لمساعدتك على تخصيص عملية التدريب. يمكنك العثور على جميع المعلمات ووصفاتها في الدالة parse_args(). توفر هذه الدالة قيمًا افتراضية لكل معلمة، مثل حجم الدفعة التدريبية ومعدل التعلم، لكن يمكنك أيضًا تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.

على سبيل المثال، لتسريع التدريب باستخدام الدقة المختلطة بتنسيق fp16، أضف معامل --mixed_precision إلى أمر التدريب:

accelerate launch train_lcm_distill_sd_wds.py \
  --mixed_precision="fp16"

معظم المعلمات متطابقة مع المعلمات في دليل تدريب النص إلى صورة، لذا ستركّز على المعلمات ذات الصلة بالتقطير الاتساق الكامن في هذا الدليل.

  • --pretrained_teacher_model: المسار إلى نموذج انتشار كامن مُدرَّب مسبقًا لاستخدامه كنموذج المعلم
  • --pretrained_vae_model_name_or_path: مسار إلى نموذج VAE مُدرَّب مسبقًا؛ يُعرف أن VAE الخاص بـ SDXL يعاني من عدم استقرار عددي، لذا يتيح لك هذا المعامل تحديد VAE بديل (مثل هذا VAE) من صنع madebyollin والذي يعمل بدقة fp16)
  • --w_min و--w_max: القيم الدنيا والعليا لمقياس التوجيه (guidance scale) عند أخذ عينات من مقياس التوجيه
  • --num_ddim_timesteps: عدد خطوات الزمن لعينة DDIM
  • --loss_type: نوع الدالة (L2 أو Huber) التي تُحسب للتقطير المتسق الكامن؛ يُفضَّل عادةً استخدام دالة Huber لأنها أكثر مقاومة للقيم الشاذة
  • --huber_c: معامل خسارة هوبر

سكربت التدريب

يبدأ سكربت التدريب بإنشاء فئة بيانات - Text2ImageDataset - لمعالجة الصور مسبقًا وإنشاء مجموعة بيانات للتدريب.

def transform(example):
    image = example["image"]
    image = TF.resize(image, resolution, interpolation=transforms.InterpolationMode.BILINEAR)

    c_top, c_left, _, _ = transforms.RandomCrop.get_params(image, output_size=(resolution, resolution))
    image = TF.crop(image, c_top, c_left, resolution, resolution)
    image = TF.to_tensor(image)
    image = TF.normalize(image, [0.5], [0.5])

    example["image"] = image
    return example

لتحسين الأداء في قراءة مجموعات البيانات الكبيرة والكتابة عليها المخزنة في السحابة، يستخدم هذا السكربت صيغة WebDataset لإنشاء خط أنابيب للمعالجة المسبقة لتطبيق التحويلات وإنشاء مجموعة بيانات ومحمّل بيانات للتدريب. تُعالَج الصور وتُغذّى حلقة التدريب دون الحاجة إلى تنزيل مجموعة البيانات كاملةً أولاً.

processing_pipeline = [
    wds.decode("pil", handler=wds.ignore_and_continue),
    wds.rename(image="jpg;png;jpeg;webp", text="text;txt;caption", handler=wds.warn_and_continue),
    wds.map(filter_keys({"image", "text"})),
    wds.map(transform),
    wds.to_tuple("image", "text"),
]

في الدالة main()، يتم تحميل جميع المكونات اللازمة مثل مُجدول الضوضاء (noise scheduler) ومُرمّزات الرموز (tokenizers) ومُرمّزات النص (text encoders) ووحدة الترميز/فك الترميز التحويلية (VAE). كما يتم تحميل شبكة UNet المعلمة هنا، ومن ثم يمكنك إنشاء شبكة UNet طالبة من شبكة UNet المعلمة. يتم تحديث شبكة UNet الطالبة بواسطة المُحسّن (optimizer) أثناء التدريب.

teacher_unet = UNet2DConditionModel.from_pretrained(
    args.pretrained_teacher_model, subfolder="unet", revision=args.teacher_revision
)

unet = UNet2DConditionModel(**teacher_unet.config)
unet.load_state_dict(teacher_unet.state_dict(), strict=False)
unet.train()

الآن يمكنك إنشاء optimizer لتحديث معاملات UNet:

optimizer = optimizer_class(
    unet.parameters(),
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

أنشئ مجموعة البيانات:

dataset = Text2ImageDataset(
    train_shards_path_or_url=args.train_shards_path_or_url,
    num_train_examples=args.max_train_samples,
    per_gpu_batch_size=args.train_batch_size,
    global_batch_size=args.train_batch_size * accelerator.num_processes,
    num_workers=args.dataloader_num_workers,
    resolution=args.resolution,
    shuffle_buffer_size=1000,
    pin_memory=True,
    persistent_workers=True,
)
train_dataloader = dataset.train_dataloader

بعد ذلك، تكون مستعدًا لإعداد حلقة التدريب وتنفيذ طريقة التقطير الاتساق الكامن (انظر الخوارزمية 1 في الورقة لمزيد من التفاصيل). تتولى هذه الأجزاء من السكربت إضافة الضوضاء إلى الكمونيات، وعينة وإنشاء تضمين مقياس التوجيه، والتنبؤ بالصورة الأصلية من الضوضاء.

pred_x_0 = predicted_origin(
    noise_pred,
    start_timesteps,
    noisy_model_input,
    noise_scheduler.config.prediction_type,
    alpha_schedule,
    sigma_schedule,
)

model_pred = c_skip_start * noisy_model_input + c_out_start * pred_x_0

ثم يحصل على توقعات النموذج المعلم وتوقعات LCM، ويحسب الخسارة، ثم يعكس انتشارها إلى LCM.

if args.loss_type == "l2":
    loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
elif args.loss_type == "huber":
    loss = torch.mean(
        torch.sqrt((model_pred.float() - target.float()) ** 2 + args.huber_c**2) - args.huber_c
    )

إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى دليل فهم خطوط الأنابيب والنماذج والمجدولات الذي يشرح النمط الأساسي لعملية إزالة الضوضاء.

تشغيل السكربت

الآن أنت مستعد لإطلاق سكربت التدريب والبدء في التقطير!

في هذا الدليل، ستستخدم --train_shards_path_or_url لتحديد المسار إلى مجموعة بيانات Conceptual Captions 12M المخزنة على Hub هنا. اضبط متغير البيئة MODEL_DIR على اسم النموذج المعلم وOUTPUT_DIR على المكان الذي تريد حفظ النموذج فيه.

export MODEL_DIR="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="path/to/saved/model"

accelerate launch train_lcm_distill_sd_wds.py \
    --pretrained_teacher_model=$MODEL_DIR \
    --output_dir=$OUTPUT_DIR \
    --mixed_precision=fp16 \
    --resolution=512 \
    --learning_rate=1e-6 --loss_type="huber" --ema_decay=0.95 --adam_weight_decay=0.0 \
    --max_train_steps=1000 \
    --max_train_samples=4000000 \
    --dataloader_num_workers=8 \
    --train_shards_path_or_url="pipe:curl -L -s https://huggingface.co/datasets/laion/conceptual-captions-12m-webdataset/resolve/main/data/{00000..01099}.tar?download=true" \
    --validation_steps=200 \
    --checkpointing_steps=200 --checkpoints_total_limit=10 \
    --train_batch_size=12 \
    --gradient_checkpointing --enable_xformers_memory_efficient_attention \
    --gradient_accumulation_steps=1 \
    --use_8bit_adam \
    --resume_from_checkpoint=latest \
    --report_to=wandb \
    --seed=453645634 \
    --push_to_hub

بمجرد اكتمال التدريب، يمكنك استخدام نموذج LCM الجديد لديك للاستدلال.

from diffusers import UNet2DConditionModel, DiffusionPipeline, LCMScheduler
import torch

unet = UNet2DConditionModel.from_pretrained("your-username/your-model", dtype=torch.float16, variant="fp16")
pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", unet=unet, dtype=torch.float16, variant="fp16")

pipeline.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "sushi rolls in the form of panda heads, sushi platter"

image = pipeline(prompt, num_inference_steps=4, guidance_scale=1.0).images[0]

LoRA

تُعد LoRA تقنية تدريب تُقلّل بشكل كبير من عدد المعاملات القابلة للتدريب. ونتيجةً لذلك، يصبح التدريب أسرع ويصبح تخزين الأوزان الناتجة أسهل لأنها أصغر بكثير (حوالي 100 ميغابايت). استخدم السكربت train_lcm_distill_lora_sd_wds.py أو train_lcm_distill_lora_sdxl.wds.py للتدريب باستخدام LoRA.

يتم مناقشة سكربت تدريب LoRA بتفصيل أكبر في دليل تدريب LoRA.

Stable Diffusion XL

يعتبر Stable Diffusion XL (SDXL) نموذجًا قويًا لتحويل النص إلى صور، حيث يولّد صورًا عالية الدقة، كما يضيف مشفّرًا نصيًا ثانيًا إلى بنيته. استخدم سكربت train_lcm_distill_sdxl_wds.py لتدريب نموذج SDXL باستخدام LoRA.

يتم مناقشة سكربت تدريب SDXL بتفصيل أكبر في دليل تدريب SDXL.

الخطوات التالية

تهانينا على تقطير نموذج LCM! للتعرف على المزيد حول LCM، قد تكون الموارد التالية مفيدة:

  • تعلّم كيفية استخدام LCMs للاستدلال لتوليد الصور من النص، وتحويل الصور إلى صور، ومع نقاط التفتيش LoRA.
  • اقرأ منشور المدونة SDXL في 4 خطوات باستخدام Latent Consistency LoRAs لمعرفة المزيد حول SDXL LCM-LoRA للاستدلال فائق السرعة، ومقارنات الجودة، والاختبارات المرجعية، والمزيد.
Update on GitHub