Diffusers documentation

DreamBooth

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

DreamBooth

DreamBooth هي تقنية تدريب تحدّث نموذج الانتشار بالكامل من خلال التدريب على عدد قليل من الصور لموضوع أو أسلوب معين. تعمل عن طريق ربط كلمة خاصة في الأمر النصي بالصور النموذجية.

لتحميل نقطة تحقق مدربة للاستدلال، راجع تحميل نموذج DreamBooth للاستدلال.

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

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

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

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

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

cd examples/dreambooth
pip install -r requirements.txt

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

قم بتهيئة بيئة 🤗 Accelerate:

accelerate config

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

accelerate config default

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

from accelerate.utils import write_basic_config

write_basic_config()

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

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

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

تُعد DreamBooth حساسة للغاية لمعاملات التدريب الفائقة، ومن السهل حدوث الإفراط في التخصيص (overfitting). اقرأ منشور المدونة تدريب Stable Diffusion باستخدام Dreambooth مع 🧨 Diffusers للاطلاع على الإعدادات الموصى بها لمواضيع مختلفة لمساعدتك في اختيار المعاملات الفائقة المناسبة.

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

على سبيل المثال، للتدريب في صيغة bf16:

accelerate launch train_dreambooth.py \
    --mixed_precision="bf16"

بعض المعلمات الأساسية والمهمة التي يجب معرفتها وتحديد

  • --pretrained_model_name_or_path: اسم النموذج على Hub أو مسار محلي إلى النموذج المُدرَّب مسبقًا
  • --instance_data_dir: مسار إلى مجلد يحتوي على مجموعة بيانات التدريب (صور أمثلة)
  • --instance_prompt: النص التوجيهي الذي يحتوي على الكلمة الخاصة للصور الممثّلة
  • --train_text_encoder: ما إذا كان سيتم تدريب مُشفِّر النص أيضًا
  • --output_dir: مكان حفظ النموذج المُدرَّب
  • --push_to_hub: ما إذا كان سيتم دفع النموذج المُدرَّب إلى Hub
  • --checkpointing_steps: تكرار حفظ نقطة تفتيش أثناء تدريب النموذج؛ وهذا مفيد إذا ما انقطع التدريب لسبب ما، إذ يمكنك مواصلة التدريب من تلك النقطة بإضافة --resume_from_checkpoint إلى أمر التدريب الخاص بك

وزن Min-SNR

يمكن لاستراتيجية وزن Min-SNR أن تساعد في التدريب من خلال إعادة موازنة الدالة الخاسرة لتحقيق تقارب أسرع. يدعم سكربت التدريب التنبؤ بـ epsilon (الضوضاء) أو v_prediction، لكن Min-SNR متوافق مع كلا نوعي التنبؤ. هذه الاستراتيجية المدعومة فقط بواسطة PyTorch.

أضف معامل --snr_gamma واضبطه على القيمة الموصى بها وهي 5.0:

accelerate launch train_dreambooth.py \
  --snr_gamma=5.0

خسارة الحفاظ على المسبق

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

  • --with_prior_preservation: ما إذا كان سيتم استخدام خسارة الحفاظ على المسبق
  • --prior_loss_weight: يتحكم في تأثير خسارة الحفاظ على المسبق على النموذج
  • --class_data_dir: المسار إلى مجلد يحتوي على صور عينات الفئات المولّدة
  • --class_prompt: النص الوصفي الذي يحدد فئة الصور المولّدة
accelerate launch train_dreambooth.py \
  --with_prior_preservation \
  --prior_loss_weight=1.0 \
  --class_data_dir="path/to/class/images" \
  --class_prompt="text prompt describing class"

تدريب مُشفِّر النص

لتحسين جودة المخرجات المولّدة، يمكنك أيضًا تدريب مُشفّر النص بالإضافة إلى UNet. يتطلب ذلك ذاكرة إضافية وستحتاج إلى وحدة معالجة رسومية (GPU) بذاكرة vRAM تبلغ 24 جيجابايت على الأقل. إذا كان لديك العتاد اللازم، فإن تدريب مُشفّر النص يُنتج نتائج أفضل، خاصةً عند توليد صور للوجوه. فعّل هذا الخيار من خلال:

accelerate launch train_dreambooth.py \
  --train_text_encoder

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

يأتي DreamBooth مع فئات مجموعات بيانات خاصة به:

  • DreamBoothDataset: يعالج الصور وصور الفئة مسبقًا، ويقوم بتجزئة الأوامر النصية للتدريب
  • PromptDataset: يولّد تمثيلات المحفّزات (prompt embeddings) لتوليد صور الفئات

إذا قمت بتفعيل prior preservation loss، يتم توليد صور الفئات هنا:

sample_dataset = PromptDataset(args.class_prompt, num_new_images)
sample_dataloader = torch.utils.data.DataLoader(sample_dataset, batch_size=args.sample_batch_size)

sample_dataloader = accelerator.prepare(sample_dataloader)
pipeline.to(accelerator.device)

for example in tqdm(
    sample_dataloader, desc="Generating class images", disable=not accelerator.is_local_main_process
):
    images = pipeline(example["prompt"]).images

التالي هو الدالة main() التي تتولى إعداد مجموعة البيانات للتدريب وحلقة التدريب نفسها. يقوم السكربت بتحميل tokenizer، المجدول والنماذج:

# Load the tokenizer
if args.tokenizer_name:
    tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)
elif args.pretrained_model_name_or_path:
    tokenizer = AutoTokenizer.from_pretrained(
        args.pretrained_model_name_or_path,
        subfolder="tokenizer",
        revision=args.revision,
        use_fast=False,
    )

# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = text_encoder_cls.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)

if model_has_vae(args):
    vae = AutoencoderKL.from_pretrained(
        args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision
    )
else:
    vae = None

unet = UNet2DConditionModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)

ثم، حان الوقت لـ إنشاء مجموعة بيانات التدريب و DataLoader من DreamBoothDataset:

train_dataset = DreamBoothDataset(
    instance_data_root=args.instance_data_dir,
    instance_prompt=args.instance_prompt,
    class_data_root=args.class_data_dir if args.with_prior_preservation else None,
    class_prompt=args.class_prompt,
    class_num=args.num_class_images,
    tokenizer=tokenizer,
    size=args.resolution,
    center_crop=args.center_crop,
    encoder_hidden_states=pre_computed_encoder_hidden_states,
    class_prompt_encoder_hidden_states=pre_computed_class_prompt_encoder_hidden_states,
    tokenizer_max_length=args.tokenizer_max_length,
)

train_dataloader = torch.utils.data.DataLoader(
    train_dataset,
    batch_size=args.train_batch_size,
    shuffle=True,
    collate_fn=lambda examples: collate_fn(examples, args.with_prior_preservation),
    num_workers=args.dataloader_num_workers,
)

أخيرًا، يتولى حلقة التدريب باقي الخطوات مثل تحويل الصور إلى الفضاء الكامن، وإضافة الضوضاء إلى المدخلات، والتنبؤ بباقي الضوضاء، وحساب الخسارة.

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

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

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

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

from huggingface_hub import snapshot_download

local_dir = "./dog"
snapshot_download(
    "diffusers/dog-example",
    local_dir=local_dir,
    repo_type="dataset",
    ignore_patterns=".gitattributes",
)

اضبط متغير البيئة MODEL_NAME على معرّف نموذج في Hub أو مسار لنموذج محلي، وINSTANCE_DIR على المسار الذي حمّلت إليه صور الكلاب للتو، وOUTPUT_DIR على المكان الذي تريد حفظ النموذج فيه. ستستخدم sks ككلمة خاصة لربط التدريب بها.

إذا كنت مهتمًا بمتابعة عملية التدريب، يمكنك حفظ الصور المولّدة بشكل دوري أثناء تقدم التدريب. أضف المعاملات التالية إلى أمر التدريب:

--validation_prompt="a photo of a sks dog"
--num_validation_images=4
--validation_steps=100

شيء آخر قبل أن تبدأ تشغيل السكربت! اعتمادًا على وحدة معالجة الرسوميات (GPU) التي تمتلكها، قد تحتاج إلى تفعيل بعض التحسينات لتدريب DreamBooth.

16GB
12GB
8GB

على بطاقة رسومية بسعة 16GB، يمكنك استخدام مُحسِّن bitsandbytes بدقة 8 بت وتقنية gradient checkpointing لمساعدتك في تدريب نموذج DreamBooth. قم بتثبيت bitsandbytes:

pip install bitsandbytes

ثم، أضف المعامل التالي إلى أمر التدريب الخاص بك:

accelerate launch train_dreambooth.py \
  --gradient_checkpointing \
  --use_8bit_adam \
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export INSTANCE_DIR="./dog"
export OUTPUT_DIR="path_to_saved_model"

accelerate launch train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME  \
  --instance_data_dir=$INSTANCE_DIR \
  --output_dir=$OUTPUT_DIR \
  --instance_prompt="a photo of sks dog" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=400 \
  --push_to_hub

بمجرد اكتمال التدريب، يمكنك استخدام النموذج الذي درّبته للتو للاستدلال!

هل لا تستطيع الانتظار لتجربة نموذجك للاستدلال قبل اكتمال التدريب؟ 🤭 تأكد من تثبيت أحدث إصدار من 🤗 Accelerate.

from diffusers import DiffusionPipeline, UNet2DConditionModel
from transformers import CLIPTextModel
import torch

unet = UNet2DConditionModel.from_pretrained("path/to/model/checkpoint-100/unet")

# if you have trained with `--args.train_text_encoder` make sure to also load the text encoder
text_encoder = CLIPTextModel.from_pretrained("path/to/model/checkpoint-100/checkpoint-100/text_encoder")

pipeline = DiffusionPipeline.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5", unet=unet, text_encoder=text_encoder, dtype=torch.float16,
).to("cuda")

image = pipeline("A photo of sks dog in a bucket", num_inference_steps=50, guidance_scale=7.5).images[0]
image.save("dog-bucket.png")
from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("path_to_saved_model", dtype=torch.float16, use_safetensors=True).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline("A photo of sks dog in a bucket", num_inference_steps=50, guidance_scale=7.5).images[0]
image.save("dog-bucket.png")

LoRA

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

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

Stable Diffusion XL

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

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

DeepFloyd IF

DeepFloyd IF هو نموذج انتشار بكسل متسلسل يتكون من ثلاث مراحل. تولّد المرحلة الأولى صورة أساسية، بينما تقوم المرحلتان الثانية والثالثة بزيادة دقة الصورة الأساسية تدريجياً لتحويلها إلى صورة عالية الدقة بمقاس 1024x1024. استخدم سكربت train_dreambooth_lora.py أو train_dreambooth.py لتدريب نموذج DeepFloyd IF باستخدام LoRA أو النموذج الكامل.

يستخدم DeepFloyd IF التباين المتوقع، لكن سكربتات التدريب في Diffusers تستخدم الخطأ المتوقع، لذا يتم تبديل النماذج المدرَّبة من DeepFloyd IF إلى جدول تباين ثابت. سيقوم سكربتات التدريب بتحديث إعدادات المجدول (scheduler) للنموذج المدرَّب بالكامل نيابةً عنك. ومع ذلك، عند تحميل أوزان LoRA المحفوظة، يجب عليك أيضًا تحديث إعدادات المجدول (scheduler) في خط الأنابيب (pipeline).

from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained("DeepFloyd/IF-I-XL-v1.0", use_safetensors=True)

pipe.load_lora_weights("<lora weights path>")

# Update scheduler config to fixed variance schedule
pipe.scheduler = pipe.scheduler.__class__.from_config(pipe.scheduler.config, variance_type="fixed_small")

يتطلب النموذج في المرحلة 2 صور تحقق إضافية لرفع الدقة. يمكنك تنزيل نسخة مصغّرة من صور التدريب واستخدامها لهذا الغرض.

from huggingface_hub import snapshot_download

local_dir = "./dog_downsized"
snapshot_download(
    "diffusers/dog-example-downsized",
    local_dir=local_dir,
    repo_type="dataset",
    ignore_patterns=".gitattributes",
)

توفر أمثلة الأكواد أدناه نظرة عامة موجزة حول كيفية تدريب نموذج DeepFloyd IF باستخدام مزيج من DreamBooth وLoRA. بعض المعلمات المهمة التي يجب ملاحظتها هي:

  • --resolution=64، حيث يتطلب الأمر دقة أصغر بكثير لأن DeepFloyd IF هو نموذج انتشار بكسل، وللتعامل مع البكسلات غير المضغوطة، يجب أن تكون الصور المدخلة أصغر
  • --pre_compute_text_embeddings، لحساب تمثيلات النص مسبقًا لتوفير الذاكرة، لأن T5Model قد يستهلك مساحة ذاكرة كبيرة
  • --tokenizer_max_length=77، يمكنك استخدام طول نص افتراضي أطول مع T5 كمشفّر للنص، لكن إجراء ترميز النموذج الافتراضي يستخدم طول نص أقصر
  • --text_encoder_use_attention_mask، لتحويل قناع الانتباه إلى مُشفّر النص
المرحلة 1 لورا دريم بوث
المرحلة 2 لورا دريم بوث
المرحلة 1 DreamBooth
المرحلة 2 DreamBooth

يتطلب تدريب المرحلة 1 من DeepFloyd IF باستخدام LoRA وDreamBooth حوالي 28 جيجابايت من الذاكرة.

export MODEL_NAME="DeepFloyd/IF-I-XL-v1.0"
export INSTANCE_DIR="dog"
export OUTPUT_DIR="dreambooth_dog_lora"

accelerate launch train_dreambooth_lora.py \
  --report_to wandb \
  --pretrained_model_name_or_path=$MODEL_NAME  \
  --instance_data_dir=$INSTANCE_DIR \
  --output_dir=$OUTPUT_DIR \
  --instance_prompt="a sks dog" \
  --resolution=64 \
  --train_batch_size=4 \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --scale_lr \
  --max_train_steps=1200 \
  --validation_prompt="a sks dog" \
  --validation_epochs=25 \
  --checkpointing_steps=100 \
  --pre_compute_text_embeddings \
  --tokenizer_max_length=77 \
  --text_encoder_use_attention_mask

نصائح التدريب

قد يكون تدريب نموذج DeepFloyd IF صعبًا، لكن إليك بعض النصائح التي وجدناها مفيدة:

  • يكفي استخدام LoRA لتدريب نموذج المرحلة 1، لأن دقة النموذج المنخفضة تجعل تمثيل التفاصيل الدقيقة صعبًا على أي حال.
  • بالنسبة إلى الكائنات الشائعة أو البسيطة، لا يكون ضبط المُكبِّر (upscaler) ضروريًا بالضرورة. تأكد من تعديل الوصف (prompt) المُمرَّر إلى المُكبِّر لإزالة الرمز الجديد (token) من وصف الكائن (instance prompt). على سبيل المثال، إذا كان وصف المرحلة 1 هو “a sks dog” فيجب أن يكون وصف المرحلة 2 هو “a dog”.
  • لتفاصيل أدق مثل الوجوه، يكون تدريب مُكبِّر المرحلة 2 بالكامل أفضل من تدريب نموذج المرحلة 2 باستخدام LoRA. كما يساعد استخدام معدلات تعلم أدنى مع أحجام دفع أكبر.
  • يجب استخدام معدلات تعلم أدنى لتدريب نموذج المرحلة 2.
  • يعمل DDPMScheduler بشكل أفضل من DPMSolver المستخدم في سكربتات التدريب.

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

تهانينا على تدريب نموذج DreamBooth الخاص بك! لمعرفة المزيد حول كيفية استخدام نموذجك الجديد، قد يكون الدليل التالي مفيدًا:

Update on GitHub