Diffusers documentation
Kandinsky 2.2
Kandinsky 2.2
هذا النص برمجي تجريبي، ومن السهل أن يحدث فيه ملاءمة زائدة (overfitting) أو أن تواجه مشاكل مثل النسيان الكارثي (catastrophic forgetting). جرّب استكشاف معاملات فائقة (hyperparameters) مختلفة للحصول على أفضل النتائج على مجموعة البيانات الخاصة بك.
Kandinsky 2.2 هو نموذج نص إلى صورة متعدد اللغات قادر على إنتاج صور أكثر واقعية. يتضمن النموذج نموذجًا مسبقًا للصور لإنشاء تمثيلات (embeddings) للصور من أوامر نصية، ونموذج فك ترميز يولّد الصور بناءً على تمثيلات النموذج المسبق. ولهذا السبب ستجد سكريبتين منفصلين في Diffusers خاصين بـ Kandinsky 2.2، أحدهما لتدريب النموذج المسبق والآخر لتدريب نموذج فك الترميز. يمكنك تدريب كلا النموذجين بشكل منفصل، لكن للحصول على أفضل النتائج، يجب عليك تدريب كل من النموذج المسبق ونموذج فك الترميز.
اعتمادًا على بطاقة الرسوميات لديك، قد تحتاج إلى تفعيل gradient_checkpointing (⚠️ غير مدعوم للنموذج السابق!)، وmixed_precision، وgradient_accumulation_steps للمساعدة في ملاءمة النموذج في الذاكرة وتسريع التدريب. يمكنك تقليل استهلاك الذاكرة بشكل أكبر عن طريق تفعيل الانتباه الموفر للذاكرة باستخدام xFormers (فشل الإصدار v0.0.16 في التدريب على بعض بطاقات الرسوميات، لذا قد تحتاج إلى تثبيت إصدار تطويري بدلاً من ذلك).
This guide explores the train_text_to_image_prior.py and the train_text_to_image_decoder.py scripts 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/kandinsky2_2/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_prior.py \
--mixed_precision="fp16"معظم المعلمات متطابقة مع المعلمات في دليل تدريب النص إلى صورة، لذا دعونا نتوجه مباشرة إلى شرح سكربتات تدريب Kandinsky!
وزن Min-SNR
يمكن لاستراتيجية وزن Min-SNR أن تساعد في التدريب من خلال إعادة موازنة الدالة الخاسرة لتحقيق تقارب أسرع. يدعم سكربت التدريب التنبؤ بـ epsilon (الضوضاء) أو v_prediction، لكن Min-SNR متوافق مع كلا نوعي التنبؤ. هذه الاستراتيجية المدعومة فقط بواسطة PyTorch.
أضف معامل --snr_gamma واضبطه على القيمة الموصى بها وهي 5.0:
accelerate launch train_text_to_image_prior.py \ --snr_gamma=5.0
سكربت التدريب
يُشبه سكربت التدريب أيضًا دليل تدريب النص إلى صورة، لكنه تم تعديله لدعم تدريب نماذج المسبق والمفكك. يركّز هذا الدليل على الكود الفريد لسكربتات تدريب Kandinsky 2.2.
تحتوي الدالة main() على الكود الخاص بإعداد مجموعة البيانات وتدريب النموذج.
من أبرز الفروقات التي ستلاحظها فوراً هو أن سكربت التدريب يُحمّل أيضاً CLIPImageProcessor - إلى جانب مُجدول ومُرمّز - لمعالجة الصور مسبقاً، ونموذج CLIPVisionModelWithProjection لتشفير الصور:
noise_scheduler = DDPMScheduler(beta_schedule="squaredcos_cap_v2", prediction_type="sample")
image_processor = CLIPImageProcessor.from_pretrained(
args.pretrained_prior_model_name_or_path, subfolder="image_processor"
)
tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="tokenizer")
with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
).eval()
text_encoder = CLIPTextModelWithProjection.from_pretrained(
args.pretrained_prior_model_name_or_path, subfolder="text_encoder", dtype=weight_dtype
).eval()يستخدم Kandinsky نموذج PriorTransformer لتوليد تمثيلات الصور، لذا ستحتاج إلى إعداد المُحسِّن (optimizer) ليتعلم معاملات وضع المسبق (prior mode).
prior = PriorTransformer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="prior")
prior.train()
optimizer = optimizer_cls(
prior.parameters(),
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
)بعد ذلك، يتم تحويل عناوين الإدخال إلى رموز، وتتم معالجة الصور مسبقاً بواسطة CLIPImageProcessor:
def preprocess_train(examples):
images = [image.convert("RGB") for image in examples[image_column]]
examples["clip_pixel_values"] = image_processor(images, return_tensors="pt").pixel_values
examples["text_input_ids"], examples["text_mask"] = tokenize_captions(examples)
return examplesأخيرًا، يقوم حلقة التدريب بتحويل الصور المدخلة إلى كامنات، وإضافة ضوضاء إلى تضمينات الصور، وإجراء تنبؤ:
model_pred = prior(
noisy_latents,
timestep=timesteps,
proj_embedding=prompt_embeds,
encoder_hidden_states=text_encoder_hidden_states,
attention_mask=text_mask,
).predicted_image_embeddingإذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات فهم خطوط الأنابيب والنماذج والمجدولين التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.
تحتوي الدالة main() على الكود الخاص بإعداد مجموعة البيانات وتدريب النموذج.
على عكس النموذج السابق، يقوم المُفكِّك بتهيئة VQModel لفك ترميز الكمونيات إلى صور، كما يستخدم UNet2DConditionModel:
with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
vae = VQModel.from_pretrained(
args.pretrained_decoder_model_name_or_path, subfolder="movq", dtype=weight_dtype
).eval()
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
).eval()
unet = UNet2DConditionModel.from_pretrained(args.pretrained_decoder_model_name_or_path, subfolder="unet")بعد ذلك، يتضمن السكربت عدة تحويلات للصور ودالة معالجة مسبقة لتطبيق هذه التحويلات على الصور وإرجاع قيم البكسل:
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["clip_pixel_values"] = image_processor(images, return_tensors="pt").pixel_values
return examplesأخيرًا، يتولى حلقة التدريب تحويل الصور إلى كامنات، وإضافة الضوضاء، والتنبؤ بباقي الضوضاء.
إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات فهم خطوط الأنابيب والنماذج والمجدولين التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.
model_pred = unet(noisy_latents, timesteps, None, added_cond_kwargs=added_cond_kwargs).sample[:, :4]تشغيل السكربت
بمجرد أن تُجري جميع تعديلاتك أو تكون راضياً عن الإعداد الافتراضي، تكون مستعداً لإطلاق سكربت التدريب! 🚀
ستقوم بالتدريب على مجموعة بيانات Naruto BLIP captions لتوليد شخصيات ناروتو الخاصة بك، لكن يمكنك أيضاً إنشاء مجموعة بياناتك الخاصة والتدريب عليها باتباع دليل Create a dataset for training. اضبط متغير البيئة DATASET_NAME على اسم مجموعة البيانات على Hub، أو إذا كنت تتدرب على ملفاتك الخاصة، اضبط متغير البيئة TRAIN_DIR على مسار مجموعة بياناتك.
إذا كنت تدرب على أكثر من وحدة معالجة رسومية واحدة، أضف معامل --multi_gpu إلى أمر accelerate launch.
لمراقبة تقدم التدريب باستخدام Weights & Biases، أضف معامل
--report_to=wandbإلى أمر التدريب. كما ستحتاج إلى إضافة--validation_promptإلى أمر التدريب لتتبع النتائج. وقد يكون ذلك مفيدًا للغاية لتصحيح أخطاء النموذج وعرض النتائج الوسيطة.
export DATASET_NAME="lambdalabs/naruto-blip-captions"
accelerate launch --mixed_precision="fp16" train_text_to_image_prior.py \
--dataset_name=$DATASET_NAME \
--resolution=768 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=15000 \
--learning_rate=1e-05 \
--max_grad_norm=1 \
--checkpoints_total_limit=3 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--validation_prompts="A robot naruto, 4k photo" \
--report_to="wandb" \
--push_to_hub \
--output_dir="kandi2-prior-naruto-model"export DATASET_NAME="lambdalabs/naruto-blip-captions"
accelerate launch --mixed_precision="fp16" train_text_to_image_decoder.py \
--dataset_name=$DATASET_NAME \
--resolution=768 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--max_train_steps=15000 \
--learning_rate=1e-05 \
--max_grad_norm=1 \
--checkpoints_total_limit=3 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--validation_prompts="A robot naruto, 4k photo" \
--report_to="wandb" \
--push_to_hub \
--output_dir="kandi2-decoder-naruto-model"بمجرد اكتمال التدريب، يمكنك استخدام النموذج الذي درّبته للتو للاستدلال!
from diffusers import AutoPipelineForText2Image, DiffusionPipeline
import torch
prior_pipeline = DiffusionPipeline.from_pretrained(output_dir, dtype=torch.float16)
prior_components = {"prior_" + k: v for k,v in prior_pipeline.components.items()}
pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", **prior_components, dtype=torch.float16)
pipe.enable_model_cpu_offload()
prompt="A robot naruto, 4k photo"
image = pipeline(prompt=prompt, negative_prompt=negative_prompt).images[0]لا تتردد في استبدال
kandinsky-community/kandinsky-2-2-decoderبنقطة فحص decoder التي دربتها بنفسك!
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("path/to/saved/model", dtype=torch.float16)
pipeline.enable_model_cpu_offload()
prompt="A robot naruto, 4k photo"
image = pipeline(prompt=prompt).images[0]لنموذج المُفكِّك، يمكنك أيضًا تنفيذ الاستدلال من نقطة حفظ محفوظة، وهو ما قد يكون مفيدًا لعرض النتائج الوسيطة. في هذه الحالة، حمّل نقطة الحفظ إلى UNet:
from diffusers import AutoPipelineForText2Image, UNet2DConditionModel
unet = UNet2DConditionModel.from_pretrained("path/to/saved/model" + "/checkpoint-<N>/unet")
pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", unet=unet, dtype=torch.float16)
pipeline.enable_model_cpu_offload()
image = pipeline(prompt="A robot naruto, 4k photo").images[0]الخطوات التالية
تهانينا على تدريب نموذج Kandinsky 2.2! لمعرفة المزيد حول كيفية استخدام نموذجك الجديد، قد تكون الأدلة التالية مفيدة:
- اقرأ دليل Kandinsky لمعرفة كيفية استخدامه لمجموعة متنوعة من المهام المختلفة (النص إلى الصورة، الصورة إلى الصورة، إعادة الرسم، الاستيفاء)، وكيف يمكن دمجه مع ControlNet.
- اطّلع على أدلة تدريب DreamBooth وLoRA لمعرفة كيفية تدريب نموذج Kandinsky مخصص باستخدام عدد قليل من الصور الممثّلة. يمكن حتى دمج هاتين تقنيتي التدريب!