Diffusers documentation

ControlNet

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

and get access to the augmented documentation experience

to get started

ControlNet

نماذج ControlNet هي محوِّلات (adapters) مُدرَّبة فوق نموذج آخر مُدرَّب مسبقًا. تتيح هذه المحوِّلات درجة أعلى من التحكم في توليد الصور من خلال تكييف النموذج باستخدام صورة إدخال إضافية. يمكن أن تكون صورة الإدخال حافة canny، أو خريطة عمق، أو وضعية بشري، والعديد من الخيارات الأخرى.

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

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

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

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

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

cd examples/controlnet
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()

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

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

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

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

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

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

يُوصف العديد من المعلمات الأساسية والمهمة في دليل تدريب النص إلى صورة، لذا يركّز هذا الدليل فقط على المعلمات ذات الصلة بـ ControlNet:

  • --max_train_samples: عدد عينات التدريب؛ يمكن خفض هذا العدد لتسريع التدريب، لكن إذا كنت ترغب في بث مجموعات بيانات ضخمة حقًا، فستحتاج إلى تضمين هذا المعامل ومعامل --streaming في أمر التدريب الخاص بك
  • --gradient_accumulation_steps: عدد خطوات التحديث التي يتم تراكمها قبل المرور العكسي؛ مما يتيح لك التدريب بحجم دفعة أكبر مما يمكن لذاكرة وحدة معالجة الرسومات لديك التعامل معه عادةً

وزن Min-SNR

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

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

accelerate launch train_controlnet.py \
  --snr_gamma=5.0

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

كما هو الحال مع معاملات السكربت، يوفر دليل تدريب النص إلى صورة شرحًا عامًا لسكربت التدريب. وبدلاً من ذلك، يتناول هذا الدليل الأجزاء ذات الصلة من سكربت ControlNet.

يحتوي سكربت التدريب على دالة make_train_dataset لمعالجة مسبقة للبيانات تتضمن تحويلات الصور وتجزئة التسميات. ستلاحظ أن السكربت يتضمن، إلى جانب تجزئة التسميات وتحويلات الصور المعتادة، تحويلات مخصصة لصورة الشرط.

إذا كنت تبث مجموعة بيانات على TPU، فقد تكون الأداء مقيدًا بمكتبة 🤗 Datasets التي ليست مُحسَّنة للصور. لضمان أقصى معدل تدفق، يُنصح باستكشاف صيغ مجموعات بيانات أخرى مثل WebDataset وTorchData وTensorFlow Datasets.

conditioning_image_transforms = transforms.Compose(
    [
        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
        transforms.CenterCrop(args.resolution),
        transforms.ToTensor(),
    ]
)

داخل الدالة main()، ستجد الكود الخاص بتحميل مُجزّئ النص (tokenizer) ومُشفّر النص (text encoder) والمُجدول (scheduler) والنماذج. كما يتم هنا تحميل نموذج ControlNet إما من أوزان موجودة مسبقاً أو عبر تهيئته عشوائياً من UNet:

if args.controlnet_model_name_or_path:
    logger.info("Loading existing controlnet weights")
    controlnet = ControlNetModel.from_pretrained(args.controlnet_model_name_or_path)
else:
    logger.info("Initializing controlnet weights from unet")
    controlnet = ControlNetModel.from_unet(unet)

يتم إعداد optimizer لتحديث معاملات ControlNet:

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

أخيراً، في حلقة التدريب، تُمرَّر تضمينات النص الشرطي والصورة إلى الكتل السفلية والوسطى من نموذج ControlNet:

encoder_hidden_states = text_encoder(batch["input_ids"])[0]
controlnet_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype)

down_block_res_samples, mid_block_res_sample = controlnet(
    noisy_latents,
    timesteps,
    encoder_hidden_states=encoder_hidden_states,
    controlnet_cond=controlnet_image,
    return_dict=False,
)

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

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

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

تستخدم هذه الدليل مجموعة بيانات fusing/fill50k، لكن تذكّر أنه يمكنك إنشاء واستخدام مجموعة بياناتك الخاصة إذا أردت (انظر دليل إنشاء مجموعة بيانات للتدريب).

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

قم بتنزيل الصور التالية لتدريب نموذجك الشرطي باستخدامها:

wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png

أمرٌ آخر قبل تشغيل السكربت! اعتمادًا على بطاقة الرسوميات (GPU) التي تمتلكها، قد تحتاج إلى تفعيل تحسينات معينة لتدريب ControlNet. يتطلب التكوين الافتراضي في هذا السكربت حوالي 38 جيجابايت من ذاكرة الفيديو (vRAM). إذا كنت تتدرب على أكثر من بطاقة رسوميات واحدة، أضف معامل --multi_gpu إلى أمر accelerate launch.

16GB
12GB
8GB

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

pip install bitsandbytes

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

accelerate launch train_controlnet.py \
  --gradient_checkpointing \
  --use_8bit_adam \
export MODEL_DIR="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="path/to/save/model"

accelerate launch train_controlnet.py \
 --pretrained_model_name_or_path=$MODEL_DIR \
 --output_dir=$OUTPUT_DIR \
 --dataset_name=fusing/fill50k \
 --resolution=512 \
 --learning_rate=1e-5 \
 --validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
 --validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
 --train_batch_size=1 \
 --gradient_accumulation_steps=4 \
 --push_to_hub

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

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from diffusers.utils import load_image
import torch

controlnet = ControlNetModel.from_pretrained("path/to/controlnet", dtype=torch.float16)
pipeline = StableDiffusionControlNetPipeline.from_pretrained(
    "path/to/base/model", controlnet=controlnet, dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

control_image = load_image("./conditioning_image_1.png")
prompt = "pale golden rod circle with old lace background"

generator = torch.manual_seed(0)
image = pipeline(prompt, num_inference_steps=20, generator=generator, image=control_image).images[0]
image.save("./output.png")

Stable Diffusion XL

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

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

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

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

Update on GitHub