Buckets:
| # ControlNet | |
| نماذج [ControlNet](https://hf.co/papers/2302.05543) هي محوِّلات (adapters) مُدرَّبة فوق نموذج آخر مُدرَّب مسبقًا. تتيح هذه المحوِّلات درجة أعلى من التحكم في توليد الصور من خلال تكييف النموذج باستخدام صورة إدخال إضافية. يمكن أن تكون صورة الإدخال حافة canny، أو خريطة عمق، أو وضعية بشري، والعديد من الخيارات الأخرى. | |
| إذا كنت تدرب على وحدة معالجة رسومية ذات ذاكرة vRAM محدودة، فيجب عليك محاولة تفعيل المعاملات `gradient_checkpointing` و`gradient_accumulation_steps` و`mixed_precision` في أمر التدريب. كما يمكنك تقليل بصمتك الذاكرة باستخدام الانتباه الموفر للذاكرة مع [xFormers](../optimization/attention_backends). | |
| ستستكشف هذه الدليل سكربت التدريب [train_controlnet.py](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet.py) لمساعدتك على الاطلاع عليه، وكيفية تكييفه ليناسب حالتك الخاصة. | |
| قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر: | |
| ```bash | |
| git clone https://github.com/huggingface/diffusers | |
| cd diffusers | |
| pip install . | |
| ``` | |
| ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه: | |
| ```bash | |
| cd examples/controlnet | |
| pip install -r requirements.txt | |
| ``` | |
| > [!TIP] | |
| > 🤗 Accelerate هي مكتبة تساعدك على التدريب على عدة وحدات معالجة رسومية (GPU) أو وحدات معالجة مخصصة (TPU) أو باستخدام دقة مختلطة. ستقوم تلقائيًا بإعداد بيئة التدريب الخاصة بك بناءً على عتادك وبيئتك. اطّلع على [الجولة السريعة](https://huggingface.co/docs/accelerate/quicktour) في 🤗 Accelerate لمعرفة المزيد. | |
| قم بتهيئة بيئة 🤗 Accelerate: | |
| ```bash | |
| accelerate config | |
| ``` | |
| لإعداد بيئة 🤗 Accelerate افتراضية دون اختيار أي تكوينات: | |
| ```bash | |
| accelerate config default | |
| ``` | |
| أو إذا لم يدعم بيئتك shell تفاعليًا، كما هو الحال في notebook، يمكنك استخدام: | |
| ```py | |
| from accelerate.utils import write_basic_config | |
| write_basic_config() | |
| ``` | |
| أخيرًا، إذا كنت ترغب في تدريب نموذج على مجموعة بياناتك الخاصة، فاطّلع على دليل [إنشاء مجموعة بيانات للتدريب](create_dataset) لمعرفة كيفية إنشاء مجموعة بيانات تعمل مع سكربت التدريب. | |
| > [!TIP] | |
| > تسلّط الأقسام التالية الضوء على أجزاء من سكربت التدريب التي تُعدّ مهمة لفهم كيفية تعديله، لكنها لا تغطي كل جانب من جوانب السكربت بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في قراءة [السكربت](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet.py) وإعلامنا بأي أسئلة أو مخاوف لديك. | |
| ## معاملات السكربت | |
| يوفر سكربت التدريب العديد من المعلمات لمساعدتك على تخصيص عملية التدريب. يمكنك العثور على جميع المعلمات ووصفاتها في الدالة [`parse_args()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L231). توفر هذه الدالة قيمًا افتراضية لكل معلمة، مثل حجم الدفعة التدريبية ومعدل التعلم، لكن يمكنك أيضًا تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك. | |
| على سبيل المثال، لتسريع التدريب باستخدام الدقة المختلطة بتنسيق fp16، أضف معامل `--mixed_precision` إلى أمر التدريب: | |
| ```bash | |
| accelerate launch train_controlnet.py \ | |
| --mixed_precision="fp16" | |
| ``` | |
| يُوصف العديد من المعلمات الأساسية والمهمة في دليل تدريب [النص إلى صورة](text2image#script-parameters)، لذا يركّز هذا الدليل فقط على المعلمات ذات الصلة بـ ControlNet: | |
| - `--max_train_samples`: عدد عينات التدريب؛ يمكن خفض هذا العدد لتسريع التدريب، لكن إذا كنت ترغب في بث مجموعات بيانات ضخمة حقًا، فستحتاج إلى تضمين هذا المعامل ومعامل `--streaming` في أمر التدريب الخاص بك | |
| - `--gradient_accumulation_steps`: عدد خطوات التحديث التي يتم تراكمها قبل المرور العكسي؛ مما يتيح لك التدريب بحجم دفعة أكبر مما يمكن لذاكرة وحدة معالجة الرسومات لديك التعامل معه عادةً | |
| ### وزن Min-SNR | |
| يمكن لاستراتيجية وزن [Min-SNR](https://huggingface.co/papers/2303.09556) أن تساعد في التدريب من خلال إعادة موازنة الدالة الخاسرة لتحقيق تقارب أسرع. يدعم سكربت التدريب التنبؤ بـ `epsilon` (الضوضاء) أو `v_prediction`، لكن Min-SNR متوافق مع كلا نوعي التنبؤ. هذه الاستراتيجية المدعومة فقط بواسطة PyTorch. | |
| أضف معامل `--snr_gamma` واضبطه على القيمة الموصى بها وهي 5.0: | |
| ```bash | |
| accelerate launch train_controlnet.py \ | |
| --snr_gamma=5.0 | |
| ``` | |
| ## سكربت التدريب | |
| كما هو الحال مع معاملات السكربت، يوفر دليل تدريب [النص إلى صورة](text2image#training-script) شرحًا عامًا لسكربت التدريب. وبدلاً من ذلك، يتناول هذا الدليل الأجزاء ذات الصلة من سكربت ControlNet. | |
| يحتوي سكربت التدريب على دالة [`make_train_dataset`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L582) لمعالجة مسبقة للبيانات تتضمن تحويلات الصور وتجزئة التسميات. ستلاحظ أن السكربت يتضمن، إلى جانب تجزئة التسميات وتحويلات الصور المعتادة، تحويلات مخصصة لصورة الشرط. | |
| > [!TIP] | |
| > إذا كنت تبث مجموعة بيانات على TPU، فقد تكون الأداء مقيدًا بمكتبة 🤗 Datasets التي ليست مُحسَّنة للصور. لضمان أقصى معدل نقل، يُشجعك على استكشاف صيغ مجموعات بيانات أخرى مثل [WebDataset](https://github.com/webdataset/webdataset) و[TorchData](https://github.com/pytorch/data) و[TensorFlow Datasets](https://www.tensorflow.org/datasets/tfless_tfds). | |
| ```py | |
| conditioning_image_transforms = transforms.Compose( | |
| [ | |
| transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR), | |
| transforms.CenterCrop(args.resolution), | |
| transforms.ToTensor(), | |
| ] | |
| ) | |
| ``` | |
| داخل الدالة [`main()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L713)، ستجد الكود الخاص بتحميل مُجزّئ النص (tokenizer) ومُشفّر النص (text encoder) والمُجدول (scheduler) والنماذج. كما يتم هنا تحميل نموذج ControlNet إما من أوزان موجودة مسبقاً أو عبر تهيئته عشوائياً من UNet: | |
| ```py | |
| 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](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L871) لتحديث معاملات ControlNet: | |
| ```py | |
| 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, | |
| ) | |
| ``` | |
| أخيراً، في [حلقة التدريب](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L943)، تُمرَّر تضمينات النص الشرطي والصورة إلى الكتل السفلية والوسطى من نموذج ControlNet: | |
| ```py | |
| 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, | |
| ) | |
| ``` | |
| إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات [فهم خطوط الأنابيب والنماذج والمجدولين](../using-diffusers/write_own_pipeline) التي تفصّل النمط الأساسي لعملية إزالة الضوضاء. | |
| ## تشغيل السكربت | |
| الآن أنت مستعد لإطلاق سكربت التدريب! 🚀 | |
| تستخدم هذه الدليل مجموعة بيانات [fusing/fill50k](https://huggingface.co/datasets/fusing/fill50k)، لكن تذكّر أنه يمكنك إنشاء واستخدام مجموعة بياناتك الخاصة إذا أردت (انظر دليل [إنشاء مجموعة بيانات للتدريب](create_dataset)). | |
| اضبط متغير البيئة `MODEL_NAME` على معرّف نموذج في Hub أو مسار لنموذج محلي، و`OUTPUT_DIR` على المكان الذي تريد حفظ النموذج فيه. | |
| قم بتنزيل الصور التالية لتدريب نموذجك الشرطي باستخدامها: | |
| ```bash | |
| 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: | |
| ```py | |
| pip install bitsandbytes | |
| ``` | |
| ثم، أضف المعامل التالي إلى أمر التدريب الخاص بك: | |
| ```bash | |
| accelerate launch train_controlnet.py \ | |
| --gradient_checkpointing \ | |
| --use_8bit_adam \ | |
| ``` | |
| على بطاقة رسومية بسعة 12GB، ستحتاج إلى محسّن 8-bit من bitsandbytes، ونقطة تدرّج (gradient checkpointing)، وxFormers، وإعداد التدرّجات إلى `None` بدلاً من الصفر لتقليل استهلاك الذاكرة. | |
| ```bash | |
| accelerate launch train_controlnet.py \ | |
| --use_8bit_adam \ | |
| --gradient_checkpointing \ | |
| --enable_xformers_memory_efficient_attention \ | |
| --set_grads_to_none \ | |
| ``` | |
| على بطاقة GPU بسعة 8GB، ستحتاج إلى استخدام [DeepSpeed](https://www.deepspeed.ai/) لنقل بعض المتجهات من الذاكرة vRAM إلى وحدة المعالجة المركزية CPU أو وحدة التخزين NVME، مما يتيح التدريب باستخدام ذاكرة GPU أقل. | |
| نفّذ الأمر التالي لتكوين بيئة 🤗 Accelerate الخاصة بك: | |
| ```bash | |
| accelerate config | |
| ``` | |
| أثناء التهيئة، تأكد من أنك تريد استخدام DeepSpeed المرحلة 2. الآن يجب أن يصبح من الممكن التدريب باستخدام أقل من 8GB من ذاكرة vRAM من خلال الجمع بين DeepSpeed المرحلة 2، والدقة المختلطة fp16، ونقل معاملات النموذج وحالة المُحسِّن إلى المعالج المركزي. العيب هو أن هذا يتطلب ذاكرة نظام أكبر (حوالي 25 GB). راجع [توثيق DeepSpeed](https://huggingface.co/docs/accelerate/usage_guides/deepspeed) لمعرفة المزيد من خيارات التهيئة. يجب أن يبدو ملف التهيئة الخاص بك على النحو التالي: | |
| ```bash | |
| 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`](https://deepspeed.readthedocs.io/en/latest/optimizers.html#adam-cpu) لتحقيق تسريع كبير. يتطلب تفعيل `DeepSpeedCPUAdam` أن تكون إصدار سلسلة أدوات CUDA في نظامك مطابقاً للإصدار المثبت مع PyTorch. | |
| يبدو أن مُحسّنات bitsandbytes ذات 8 بت غير متوافقة مع DeepSpeed في الوقت الحالي. | |
| هذا كل شيء! لا تحتاج إلى إضافة أي معاملات إضافية إلى أمر التدريب الخاص بك. | |
| ```bash | |
| 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 | |
| ``` | |
| بمجرد اكتمال التدريب، يمكنك استخدام النموذج الذي درّبته للتو للاستدلال! | |
| ```py | |
| 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`](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet_sdxl.py) لتدريب مُكيّف ControlNet لنموذج SDXL. | |
| يتم مناقشة سكربت تدريب SDXL بتفصيل أكبر في دليل [تدريب SDXL](sdxl). | |
| ## الخطوات التالية | |
| تهانينا على تدريب نموذج ControlNet الخاص بك! للتعرف على المزيد حول كيفية استخدام نموذجك الجديد، قد تكون الأدلة التالية مفيدة: | |
| - تعلّم كيفية [استخدام ControlNet](../using-diffusers/controlnet) للاستدلال على مجموعة متنوعة من المهام. | |
Xet Storage Details
- Size:
- 16.8 kB
- Xet hash:
- 4acaec083e10a8b1aba479ef0bfac6c5879f0c19aed2e0db186f3d76293f0675
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.