Diffusers documentation

Textual Inversion

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Textual Inversion

Textual Inversion هي تقنية تدريب لتخصيص نماذج توليد الصور باستخدام عدد قليل فقط من الصور الأمثلة لما تريد أن تتعلمه. تعمل هذه التقنية من خلال تعلّم وتحديث تمثيلات النص (التمثيلات الجديدة مرتبطة بكلمة خاصة يجب استخدامها في الأمر النصي) لتتطابق مع الصور الأمثلة التي تقدمها.

بالنسبة إلى الاستدلال باستخدام التضمينات المدربة، راجع استدلال الانعكاس النصي.

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

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

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

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

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

cd examples/textual_inversion
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(). حيثما كان ذلك مناسباً، يوفر Diffusers قيماً افتراضية لكل معاملة مثل حجم الدفعة التدريبية ومعدل التعلم، لكن لا تتردد في تغيير هذه القيم في أمر التدريب إذا رغبت في ذلك.

على سبيل المثال، لزيادة عدد خطوات تراكم التدرج فوق القيمة الافتراضية 1:

accelerate launch textual_inversion.py \
  --gradient_accumulation_steps=4

تشمل بعض المعلمات الأساسية والمهمة الأخرى التي يجب تحديدها:

  • --pretrained_model_name_or_path: اسم النموذج على Hub أو مسار محلي إلى النموذج المُدرَّب مسبقًا
  • --train_data_dir: المسار إلى مجلد يحتوي على مجموعة بيانات التدريب (صور أمثلة)
  • --output_dir: مكان حفظ النموذج المُدرَّب
  • --push_to_hub: ما إذا كان سيتم دفع النموذج المُدرَّب إلى Hub
  • --checkpointing_steps: تكرار حفظ نقطة تفتيش أثناء تدريب النموذج؛ وهذا مفيد إذا ما انقطع التدريب لسبب ما، إذ يمكنك مواصلة التدريب من تلك النقطة بإضافة --resume_from_checkpoint إلى أمر التدريب الخاص بك
  • --num_vectors: عدد المتجهات المستخدمة لتعلم التضمينات؛ زيادة هذا المعامل تساعد النموذج على التعلم بشكل أفضل لكنها تأتي مع تكاليف تدريب أعلى
  • --placeholder_token: الكلمة الخاصة التي تُربط بها التضمينات المُتعلَّمة (يجب استخدام هذه الكلمة في موجه الاستدلال)
  • --initializer_token: كلمة واحدة تصف بشكل تقريبي الكائن أو النمط الذي تحاول التدريب عليه
  • --learnable_property: ما إذا كنت تُدرّب النموذج ليتعلم "أسلوبًا" جديدًا (مثل أسلوب فان غوخ في الرسم) أو "كائنًا" (مثل كلبك)

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

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

فيما يلي، ستجد كود معالجة مسبقة للبيانات وحلقة التدريب في الدالة main().

يبدأ السكربت بتحميل المُرمِّز، المُجدوِل والنموذج:

# Load tokenizer
if args.tokenizer_name:
    tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name)
elif args.pretrained_model_name_or_path:
    tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer")

# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = CLIPTextModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)
vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
unet = UNet2DConditionModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)

يُضاف رمز الوكيل الخاص بجانب مُجزّئ النص، ويُعاد ضبط التضمين ليأخذ في الاعتبار الرمز الجديد.

ثمّ، ينشئ السكربت مجموعة بيانات من TextualInversionDataset:

train_dataset = TextualInversionDataset(
    data_root=args.train_data_dir,
    tokenizer=tokenizer,
    size=args.resolution,
    placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))),
    repeats=args.repeats,
    learnable_property=args.learnable_property,
    center_crop=args.center_crop,
    set="train",
)
train_dataloader = torch.utils.data.DataLoader(
    train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers
)

أخيرًا، يتولى حلقة التدريب كل ما يتبقى، بدءًا من التنبؤ بالمتبقي الضوضائي وصولًا إلى تحديث أوزان التضمين للرمز الخاص المحلّي.

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

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

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

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

from huggingface_hub import snapshot_download

local_dir = "./cat"
snapshot_download(
    "diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes"
)

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

  • learned_embeds.bin: متجهات التضمين المُتعلَّمة المقابلة لصورك
  • token_identifier.txt: رمز المحل الخاص
  • type_of_concept.txt: نوع المفهوم الذي تتدرب عليه (إما “object” أو “style”)

يستغرق التدريب الكامل حوالي ساعة واحدة على وحدة معالجة رسومات V100 واحدة.

شيء آخر قبل تشغيل السكربت. إذا كنت مهتمًا بمتابعة عملية التدريب، يمكنك حفظ الصور المولّدة دوريًا أثناء تقدم التدريب. أضف المعاملات التالية إلى أمر التدريب:

--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./cat"

accelerate launch textual_inversion.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --train_data_dir=$DATA_DIR \
  --learnable_property="object" \
  --placeholder_token="<cat-toy>" \
  --initializer_token="toy" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=3000 \
  --learning_rate=5.0e-04 \
  --scale_lr \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --output_dir="textual_inversion_cat" \
  --push_to_hub

بعد اكتمال التدريب، يمكنك استخدام النموذج المدرَّب حديثًا للاستدلال على النحو التالي:

from diffusers import StableDiffusionPipeline
import torch

pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/cat-toy")
image = pipeline("A <cat-toy> train", num_inference_steps=50).images[0]
image.save("cat-train.png")

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

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

Update on GitHub