Diffusers documentation
T2I-Adapter
T2I-Adapter
T2I-Adapter هو نموذج مُكيّف خفيف الوزن يوفر صورة إدخال إضافية كشرط (رسم خطي، canny، رسم تخطيطي، عمق، وضعية) للتحكم بشكل أفضل في توليد الصور. يشبه ControlNet، لكنه أصغر بكثير (حوالي 77 مليون معامل وحجم ملف حوالي 300 ميغابايت) لأنه يدرج الأوزان في UNet بدلاً من نسخه وتدريبه.
يتوفر T2I-Adapter للتدريب مع نموذج Stable Diffusion XL (SDXL) فقط.
ستستكشف هذه الدليل سكربت التدريب train_t2i_adapter_sdxl.py لمساعدتك على الاطلاع عليه، وكيفية تكييفه ليناسب حالتك الخاصة.
قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:
cd examples/t2i_adapter
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(). وتوفر هذه الدالة قيمًا افتراضية لكل معامِل، مثل حجم الدفعة التدريبية ومعدل التعلم، لكن يمكنك أيضًا تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.
على سبيل المثال، لتفعيل تراكم التدرجات، أضف معامل --gradient_accumulation_steps إلى أمر التدريب:
accelerate launch train_t2i_adapter_sdxl.py \ ----gradient_accumulation_steps=4
يُوصف العديد من المعلمات الأساسية والمهمة في دليل تدريب النص إلى صورة، لذا يركّز هذا الدليل فقط على معلمات T2I-Adapter ذات الصلة:
--pretrained_vae_model_name_or_path: المسار إلى نموذج VAE مُدرَّب مسبقًا؛ يُعرف أن VAE الخاص بـ SDXL يعاني من عدم استقرار عددي، لذا يتيح لك هذا المعامل تحديد VAE أفضل--crops_coords_top_left_hو--crops_coords_top_left_w: إحداثيات الارتفاع والعرض التي يجب تضمينها في تضمينات إحداثيات الاقتصاص الخاصة بـ SDXL--conditioning_image_column: عمود صور التكييف في مجموعة البيانات--proportion_empty_prompts: نسبة أوامر الصور التي سيتم استبدالها بنصوص فارغة
سكربت التدريب
كما هو الحال مع معاملات السكربت، يتوفر شرح تفصيلي لسكربت التدريب في دليل التدريب من النص إلى الصورة. وبدلاً من ذلك، يتناول هذا الدليل الأجزاء ذات الصلة بـ T2I-Adapter في السكربت.
يبدأ سكربت التدريب بتحضير مجموعة البيانات. ويتضمن ذلك تجزئة الرموز للموجّه وتطبيق التحويلات على الصور وصور الشروط.
conditioning_image_transforms = transforms.Compose(
[
transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
transforms.CenterCrop(args.resolution),
transforms.ToTensor(),
]
)داخل الدالة main()، يتم تحميل T2I-Adapter إما من مُكيّف مُدرَّب مسبقًا أو يتم تهيئته عشوائيًا:
if args.adapter_model_name_or_path:
logger.info("Loading existing adapter weights.")
t2iadapter = T2IAdapter.from_pretrained(args.adapter_model_name_or_path)
else:
logger.info("Initializing t2iadapter weights.")
t2iadapter = T2IAdapter(
in_channels=3,
channels=(320, 640, 1280, 1280),
num_res_blocks=2,
downscale_factor=16,
adapter_type="full_adapter_xl",
)يتم تهيئة optimizer لمعاملات T2I-Adapter:
params_to_optimize = t2iadapter.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,
)أخيرًا، في حلقة التدريب، تُمرَّر صورة التكييف الخاصة بالمُكيِّف (adapter) وتضمينات النص إلى UNet للتنبؤ بباقي الضوضاء:
t2iadapter_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype)
down_block_additional_residuals = t2iadapter(t2iadapter_image)
down_block_additional_residuals = [
sample.to(dtype=weight_dtype) for sample in down_block_additional_residuals
]
model_pred = unet(
inp_noisy_latents,
timesteps,
encoder_hidden_states=batch["prompt_ids"],
added_cond_kwargs=batch["unet_added_conditions"],
down_block_additional_residuals=down_block_additional_residuals,
).sampleإذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات فهم خطوط الأنابيب والنماذج والمجدولين التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.
تشغيل السكربت
الآن أنت مستعد لإطلاق سكربت التدريب! 🚀
لتدريب هذا المثال، ستستخدم مجموعة البيانات fusing/fill50k. يمكنك أيضًا إنشاء مجموعة بياناتك الخاصة واستخدامها إذا رغبت في ذلك (انظر دليل إنشاء مجموعة بيانات للتدريب).
اضبط متغير البيئة MODEL_DIR على معرّف نموذج في Hub أو مسار لنموذج محلي، وOUTPUT_DIR على المكان الذي تريد حفظ النموذج فيه.
قم بتنزيل الصور التالية لتدريب نموذجك الشرطي باستخدامها:
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
لمراقبة تقدم التدريب باستخدام Weights & Biases، أضف معامل
--report_to=wandbإلى أمر التدريب. كما ستحتاج إلى إضافة--validation_imageو--validation_promptو--validation_stepsإلى أمر التدريب لتتبع النتائج. وقد يكون ذلك مفيدًا للغاية لتصحيح أخطاء النموذج وعرض النتائج الوسيطة.
export MODEL_DIR="stabilityai/stable-diffusion-xl-base-1.0"
export OUTPUT_DIR="path to save model"
accelerate launch train_t2i_adapter_sdxl.py \
--pretrained_model_name_or_path=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--dataset_name=fusing/fill50k \
--mixed_precision="fp16" \
--resolution=1024 \
--learning_rate=1e-5 \
--max_train_steps=15000 \
--validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
--validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
--validation_steps=100 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--report_to="wandb" \
--seed=42 \
--push_to_hubبمجرد اكتمال التدريب، يمكنك استخدام T2I-Adapter الخاص بك للاستدلال:
from diffusers import StableDiffusionXLAdapterPipeline, T2IAdapter, EulerAncestralDiscreteSchedulerTest
from diffusers.utils import load_image
import torch
adapter = T2IAdapter.from_pretrained("path/to/adapter", dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", adapter=adapter, dtype=torch.float16
)
pipeline.scheduler = EulerAncestralDiscreteSchedulerTest.from_config(pipe.scheduler.config)
pipeline.enable_xformers_memory_efficient_attention()
pipeline.enable_model_cpu_offload()
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, image=control_image, generator=generator
).images[0]
image.save("./output.png")الخطوات التالية
تهانينا على تدريب نموذج T2I-Adapter! 🎉 لمعرفة المزيد:
- اقرأ منشور المدونة التوليد القابل للتحكم بكفاءة لـ SDXL باستخدام T2I-Adapters لمعرفة المزيد من التفاصيل حول النتائج التجريبية من فريق T2I-Adapter.