Diffusers documentation
النص إلى صورة
النص إلى صورة
نموذج النص إلى الصورة تجريبي، ومن السهل أن يعاني من الإفراط في التخصيص (overfitting) ويواجه مشكلات مثل النسيان الكارثي. جرّب استكشاف معاملات فائقة مختلفة للحصول على أفضل النتائج على مجموعة البيانات الخاصة بك.
تُشترط نماذج النص إلى الصورة مثل Stable Diffusion لتوليد الصور بناءً على موجه نصي.
قد يكون تدريب النموذج مرهقًا لمواردك المادية، ولكن إذا فعّلت gradient_checkpointing وmixed_precision، فمن الممكن تدريب النموذج على وحدة معالجة رسومية واحدة بسعة 24 جيجابايت. إذا كنت تتدرب بحجم دفعة أكبر أو ترغب في التدريب بشكل أسرع، فمن الأفضل استخدام وحدات معالجة رسومية بسعة تتجاوز 30 جيجابايت. يمكنك تقليل بصمتك الذاكرة عن طريق تفعيل الانتباه الموفر للذاكرة باستخدام xFormers.
ستستكشف هذه الدليل سكربت التدريب train_text_to_image.py لمساعدتك على الاطلاع عليه، وكيفية تكييفه ليناسب حالتك الخاصة.
قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:
cd examples/text_to_image
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_text_to_image.py \
--mixed_precision="fp16"تشمل بعض المعلمات الأساسية والمهمة:
--pretrained_model_name_or_path: اسم النموذج على Hub أو مسار محلي إلى النموذج المُدرَّب مسبقًا--dataset_name: اسم مجموعة البيانات على Hub أو مسار محلي لمجموعة البيانات التي سيتم التدريب عليها--image_column: اسم عمود الصور في مجموعة البيانات التي سيتم التدريب عليها--caption_column: اسم عمود النص في مجموعة البيانات للتدريب عليها--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_text_to_image.py \ --snr_gamma=5.0
يمكنك مقارنة أسطح الخسارة لقيم مختلفة من snr_gamma في هذا التقرير على Weights and Biases. ففي مجموعات البيانات الأصغر، قد لا تكون آثار Min-SNR واضحة بالقدر نفسه مقارنةً بمجموعات البيانات الأكبر.
سكربت التدريب
تُوجد كود معالجة مسبقة للبيانات وحلقة التدريب في الدالة main(). إذا كنت بحاجة إلى تكييف سكربت التدريب، فهنا ستحتاج إلى إجراء تعديلاتك.
يبدأ سكربت train_text_to_image بـ تحميل مُجدول ومُرمّز. يمكنك اختيار استخدام مُجدول مختلف هنا إذا أردت:
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
tokenizer = CLIPTokenizer.from_pretrained(
args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision
)ثم يقوم السكربت بتحميل نموذج UNet:
load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder="unet")
model.register_to_config(**load_model.config)
model.load_state_dict(load_model.state_dict())في الخطوة التالية، يجب معالجة أعمدة النص والصورة في مجموعة البيانات مسبقاً. يتولى الدالة tokenize_captions مهمة تقسيم المدخلات إلى رموز، بينما تحدد الدالة train_transforms نوع التحويلات التي سيتم تطبيقها على الصورة. وقد تم دمج هاتين الدالتين معاً في preprocess_train:
def preprocess_train(examples):
images = [image.convert("RGB") for image in examples[image_column]]
examples["pixel_values"] = [train_transforms(image) for image in images]
examples["input_ids"] = tokenize_captions(examples)
return examplesأخيرًا، يتولى حلقة التدريب كل ما تبقى. فهي ترمّز الصور إلى الفضاء الكامن، وتضيف ضوضاء إلى القيم الكامنة، وتحسب تضمينات النص التي تُشترط عليها، وتحديث معاملات النموذج، ثم تحفظ النموذج وتُرفعه إلى Hub. إذا أردتَ معرفة المزيد حول كيفية عمل حلقة التدريب، فتعرّف على شروحات فهم خطوط الأنابيب والنماذج والمجدولات التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.
تشغيل السكربت
بمجرد أن تُجري جميع تعديلاتك أو تكون راضياً عن الإعداد الافتراضي، تكون مستعداً لإطلاق سكربت التدريب! 🚀
لنقم بالتدريب على مجموعة بيانات Naruto BLIP captions لتوليد شخصيات ناروتو الخاصة بك. اضبط متغيرات البيئة MODEL_NAME وdataset_name على النموذج ومجموعة البيانات (سواءً من Hub أو مسار محلي). إذا كنت تتدرب على أكثر من وحدة معالجة رسومية واحدة، أضف معامل --multi_gpu إلى أمر accelerate launch.
لتدريب النموذج على مجموعة بيانات محلية، اضبط متغيرات البيئة
TRAIN_DIRوOUTPUT_DIRعلى مسار مجموعة البيانات والمكان الذي تريد حفظ النموذج فيه.
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export dataset_name="lambdalabs/naruto-blip-captions"
accelerate launch --mixed_precision="fp16" train_text_to_image.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--dataset_name=$dataset_name \
--use_ema \
--resolution=512 --center_crop --random_flip \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--max_train_steps=15000 \
--learning_rate=1e-05 \
--max_grad_norm=1 \
--enable_xformers_memory_efficient_attention \
--lr_scheduler="constant" --lr_warmup_steps=0 \
--output_dir="sd-naruto-model" \
--push_to_hubبمجرد اكتمال التدريب، يمكنك استخدام النموذج المدرَّب حديثًا للاستدلال:
from diffusers import StableDiffusionPipeline
import torch
pipeline = StableDiffusionPipeline.from_pretrained("path/to/saved_model", dtype=torch.float16, use_safetensors=True).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(prompt="yoda").images[0]
image.save("yoda-naruto.png")الخطوات التالية
تهانينا على تدريب نموذجك الخاص لتوليد الصور من النص! لمعرفة المزيد حول كيفية استخدام نموذجك الجديد، قد تكون الأدلة التالية مفيدة:
- تعلّم كيفية تحميل أوزان LoRA للاستدلال إذا كنت قد درّبت نموذجك باستخدام LoRA.
- تعرّف على المزيد حول كيفية مساعدة معلمات معينة مثل guidance scale أو تقنيات مثل prompt weighting في التحكم في الاستدلال في دليل مهمة Text-to-image.