Diffusers documentation

LoRA

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

LoRA

هذا تجريبي وقد تتغير واجهة برمجة التطبيقات في المستقبل.

LoRA (Low-Rank Adaptation of Large Language Models) هي تقنية تدريب خفيفة وشائعة تقلل بشكل كبير من عدد المعاملات القابلة للتدريب. تعمل عن طريق إدراج عدد أصغر من الأوزان الجديدة في النموذج، ولا يتم تدريب هذه الأوزان فقط. وهذا يجعل التدريب باستخدام LoRA أسرع بكثير، وأكثر كفاءة في استخدام الذاكرة، وينتج أوزان نموذج أصغر (بضعة مئات من الميجابايت)، مما يسهل تخزينها ومشاركتها. كما يمكن دمج LoRA مع تقنيات تدريب أخرى مثل DreamBooth لتسريع التدريب.

تتميز LoRA بتعدد استخداماتها، وهي مدعومة في DreamBooth وKandinsky 2.2 وStable Diffusion XL وtext-to-image.

This guide will explore the train_text_to_image_lora.py script to help you become more familiar with it, and how you can adapt it for your own use-case.

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

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(). يتم تقديم قيم افتراضية لمعظم المعاملات التي تعمل بشكل جيد جداً، لكن يمكنك أيضاً تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.

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

accelerate launch train_text_to_image_lora.py \
  --num_train_epochs=150 \

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

  • --rank: البُعد الداخلي للمصفوفات منخفضة الرتبة المراد تدريبها؛ فكلما زادت الرتبة، زاد عدد المعاملات القابلة للتدريب
  • --learning_rate: معدل التعلم الافتراضي هو 1e-4، ولكن مع LoRA، يمكنك استخدام معدل تعلم أعلى

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

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

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

UNet
مُشفِّر النص

يستخدم Diffusers LoraConfig من مكتبة PEFT لضبط معاملات مُكيّف LoRA مثل الرتبة (rank) وقيمة alpha والوحدات التي سيتم إدراج أوزان LoRA فيها. يُضاف المُكيّف إلى UNet، ولا يتم تصفية طبقات LoRA فقط لأغراض التحسين في lora_layers.

unet_lora_config = LoraConfig(
    r=args.rank,
    lora_alpha=args.rank,
    init_lora_weights="gaussian",
    target_modules=["to_k", "to_q", "to_v", "to_out.0"],
)

unet.add_adapter(unet_lora_config)
lora_layers = filter(lambda p: p.requires_grad, unet.parameters())

يتم تهيئة optimizer باستخدام lora_layers لأن هذه هي الأوزان الوحيدة التي سيتم تحسينها:

optimizer = optimizer_cls(
    lora_layers,
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

Aside from setting up the LoRA layers, the training script is more or less the same as train_text_to_image.py!

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

بمجرد أن تُجري جميع تعديلاتك أو تكون راضياً عن الإعداد الافتراضي، تكون مستعداً لإطلاق سكربت التدريب! 🚀

لنقم بالتدريب على مجموعة بيانات Naruto BLIP captions لتوليد شخصيات ناروتو الخاصة بك. اضبط متغيرات البيئة MODEL_NAME وDATASET_NAME على النموذج ومجموعة البيانات على التوالي. يجب عليك أيضاً تحديد مكان حفظ النموذج في OUTPUT_DIR، واسم النموذج الذي سيتم حفظه على Hub باستخدام HUB_MODEL_ID. ينشئ السكربت ويحفظ الملفات التالية في مستودعك:

  • نقاط التفتيش المحفوظة للنموذج
  • pytorch_lora_weights.safetensors (أوزان LoRA المدربة)

إذا كنت تدرب على أكثر من وحدة معالجة رسومية واحدة، أضف معامل --multi_gpu إلى أمر accelerate launch.

يستغرق التدريب الكامل حوالي 5 ساعات على بطاقة رسومات 2080 Ti بذاكرة فيديو (VRAM) سعة 11 جيجابايت.

export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/naruto"
export HUB_MODEL_ID="naruto-lora"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_lora.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --dataloader_num_workers=8 \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --max_grad_norm=1 \
  --lr_scheduler="cosine" \
  --lr_warmup_steps=0 \
  --output_dir=${OUTPUT_DIR} \
  --push_to_hub \
  --hub_model_id=${HUB_MODEL_ID} \
  --report_to=wandb \
  --checkpointing_steps=500 \
  --validation_prompt="A naruto with blue eyes." \
  --seed=1337

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

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A naruto with blue eyes").images[0]

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

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

Update on GitHub