Diffusers documentation
ControlNet
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.
على وحدة معالجة رسومية بسعة 16 جيجابايت، يمكنك استخدام مُحسِّن bitsandbytes بدقة 8 بت وفحص النقاط (gradient checkpointing) لتحسين عملية التدريب. قم بتثبيت bitsandbytes:
pip install bitsandbytes
ثم، أضف المعامل التالي إلى أمر التدريب الخاص بك:
accelerate launch train_controlnet.py \ --gradient_checkpointing \ --use_8bit_adam \
على بطاقة رسومات بسعة 12 جيجابايت، ستحتاج إلى مُحسِّن bitsandbytes بدقة 8 بت، ونقطة تفتيش التدرجات، وxFormers، وإعداد التدرجات إلى None بدلاً من الصفر لتقليل استهلاك الذاكرة.
accelerate launch train_controlnet.py \ --use_8bit_adam \ --gradient_checkpointing \ --enable_xformers_memory_efficient_attention \ --set_grads_to_none \
على بطاقة GPU بسعة 8GB، ستحتاج إلى استخدام DeepSpeed لنقل بعض المتجهات من الذاكرة vRAM إلى وحدة المعالجة المركزية CPU أو وحدة التخزين NVME، مما يتيح التدريب باستخدام ذاكرة GPU أقل.
نفّذ الأمر التالي لتكوين بيئة 🤗 Accelerate الخاصة بك:
accelerate config
أثناء التهيئة، تأكد من أنك تريد استخدام DeepSpeed المرحلة 2. الآن يجب أن يصبح من الممكن التدريب باستخدام أقل من 8GB من ذاكرة vRAM من خلال الجمع بين DeepSpeed المرحلة 2، والدقة المختلطة fp16، ونقل معاملات النموذج وحالة المُحسِّن إلى المعالج المركزي. العيب هو أن هذا يتطلب ذاكرة نظام أكبر (حوالي 25 GB). راجع توثيق DeepSpeed لمعرفة المزيد من خيارات التهيئة. يجب أن يبدو ملف التهيئة الخاص بك على النحو التالي:
compute_environment: LOCAL_MACHINE
deepspeed_config:
gradient_accumulation_steps: 4
offload_optimizer_device: cpu
offload_param_device: cpu
zero3_init_flag: false
zero_stage: 2
distributed_type: DEEPSPEEDيجب أيضاً تغيير مُحسِّن Adam الافتراضي إلى النسخة المُحسَّنة من Adam الخاصة بـ DeepSpeed deepspeed.ops.adam.DeepSpeedCPUAdam لتحقيق تسريع كبير. يتطلب تفعيل DeepSpeedCPUAdam أن تكون إصدار سلسلة أدوات CUDA في نظامك مطابقاً للإصدار المثبت مع PyTorch.
يبدو أن مُحسّنات bitsandbytes ذات 8 بت غير متوافقة مع DeepSpeed في الوقت الحالي.
هذا كل شيء! لا تحتاج إلى إضافة أي معاملات إضافية إلى أمر التدريب الخاص بك.
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 الخاص بك! للتعرف على المزيد حول كيفية استخدام نموذجك الجديد، قد تكون الأدلة التالية مفيدة:
- تعلّم كيفية استخدام ControlNet للاستدلال على مجموعة متنوعة من المهام.