Diffusers documentation
CogVideoX
CogVideoX
CogVideoX هو نموذج لتوليد الفيديو من النص يركّز على إنشاء فيديوهات أكثر تماسكاً ومتوافقة مع الأمر النصي. وهو يحقق ذلك باستخدام عدة طرق.
تشفير ذاتي تبايني ثلاثي الأبعاد يضغط مقاطع الفيديو مكانيًا وزمنيًا، مما يحسّن معدل الضغط ودقة الفيديو.
وحدة Transformer خبيرة تساعد في محاذاة النص مع الفيديو، ووحدة انتباه كاملة ثلاثية الأبعاد لالتقاط وإنشاء فيديوهات دقيقة مكانياً وزمنياً.
أظهر الاختبار الفعلي لبُعد تعليمات الفيديو أن CogVideoX يحقق نتائج جيدة فيما يتعلق بالاتساق في الموضوع، والمعلومات الديناميكية، واتساق الخلفية، ومعلومات الكائنات، وسلاسة الحركة، واللون، والمشهد، ونمط المظهر، والأسلوب الزمني، لكنه لا يحقق نتائج جيدة فيما يتعلق بالحركة البشرية، والعلاقات المكانية، والكائنات المتعددة.
يمكن أن يساعد الضبط الدقيق باستخدام Diffusers في تعويض هذه النتائج الضعيفة.
تجهيز البيانات
تقبل سكربتات التدريب البيانات بصيغتين.
يناسب التنسيق الأول التدريب على نطاق صغير، بينما يستخدم التنسيق الثاني تنسيق CSV، وهو أكثر ملاءمة لبث البيانات للتدريب على نطاق واسع. في المستقبل، سيدعم Diffusers وسم <Video>.
تنسيق صغير
ملفان، أحدهما يحتوي على موجهات مفصولة بالسطور والآخر يحتوي على مسارات مفصولة بالسطور لبيانات الفيديو (يجب أن تكون المسارات إلى ملفات الفيديو نسبية بالنسبة للمسار الذي تمرره عند تحديد --instance_data_root). دعونا ننظر إلى مثال لفهم ذلك بشكل أفضل!
افترض أنك حددت --instance_data_root على أنه /dataset، وأن هذا المجلد يحتوي على الملفات: prompts.txt وvideos.txt.
يجب أن يحتوي ملف prompts.txt على أوامر (prompts) مفصولة بسطور:
A black and white animated sequence featuring a rabbit, named Rabbity Ribfried, and an anthropomorphic goat in a musical, playful environment, showcasing their evolving interaction.
A black and white animated sequence on a ship's deck features a bulldog character, named Bully Bulldoger, showcasing exaggerated facial expressions and body language. The character progresses from confident to focused, then to strained and distressed, displaying a range of emotions as it navigates challenges. The ship's interior remains static in the background, with minimalistic details such as a bell and open door. The character's dynamic movements and changing expressions drive the narrative, with no camera movement to distract from its evolving reactions and physical gestures.
...يجب أن يحتوي ملف videos.txt على مسارات منفصلة بسطر لكل ملف فيديو. لاحظ أن المسار يجب أن يكون نسبيًا إلى مجلد --instance_data_root.
videos/00000.mp4
videos/00001.mp4
...بشكل عام، هذا هو شكل مجموعة البيانات الخاصة بك إذا قمت بتشغيل أمر tree على المجلد الجذري لمجموعة البيانات:
/dataset
├── prompts.txt
├── videos.txt
├── videos
├── videos/00000.mp4
├── videos/00001.mp4
├── ...عند استخدام هذا التنسيق، يجب أن يكون --caption_column هو prompts.txt وأن يكون --video_column هو videos.txt.
تنسيق البث
يمكنك استخدام ملف CSV واحد. من أجل هذا المثال، افترض أن لديك ملف metadata.csv. الصيغة المتوقعة هي:
<CAPTION_COLUMN>,<PATH_TO_VIDEO_COLUMN>
"""A black and white animated sequence featuring a rabbit, named Rabbity Ribfried, and an anthropomorphic goat in a musical, playful environment, showcasing their evolving interaction.""","""00000.mp4"""
"""A black and white animated sequence on a ship's deck features a bulldog character, named Bully Bulldoger, showcasing exaggerated facial expressions and body language. The character progresses from confident to focused, then to strained and distressed, displaying a range of emotions as it navigates challenges. The ship's interior remains static in the background, with minimalistic details such as a bell and open door. The character's dynamic movements and changing expressions drive the narrative, with no camera movement to distract from its evolving reactions and physical gestures.""","""00001.mp4"""
...في هذه الحالة، يجب أن يكون --instance_data_root هو الموقع الذي تُخزَّن فيه مقاطع الفيديو، وأن يكون --dataset_name إما مسارًا إلى مجلد محلي أو مجموعة بيانات متوافقة مع load_dataset مستضافة على Hub. بافتراض أن لديك مقاطع فيديو لألعاب ماينكرافت في https://huggingface.co/datasets/my-awesome-username/minecraft-videos، فستحتاج إلى تحديد my-awesome-username/minecraft-videos.
عند استخدام هذا التنسيق، يجب أن يكون --caption_column هو <CAPTION_COLUMN> وأن يكون --video_column هو <PATH_TO_VIDEO_COLUMN>.
لستَ مقيدًا بشكل صارم بتنسيق CSV. يعمل أي تنسيق طالما يدعم أسلوب load_dataset تنسيق الملف لتحميل عمود <PATH_TO_VIDEO_COLUMN> و<CAPTION_COLUMN> الأساسي. والسبب في المرور بهذه الخطوات المعقدة لتنظيم مجموعة البيانات عند تحميل بيانات الفيديو هو أن load_dataset لا يدعم جميع أنواع تنسيقات الفيديو بشكل كامل.
يعمل CogVideoX بشكل أفضل مع الأوامر النصية الطويلة والوصفية المعززة بنماذج اللغة الكبيرة (LLM) لتوليد الفيديو. ننصح بمعالجة مقاطع الفيديو مسبقاً من خلال توليد ملخص أولاً باستخدام نموذج لغة-رؤية (VLM)، ثم تعزيز الأوامر النصية باستخدام نموذج لغة كبير (LLM). ولتوليد التسميات المذكورة أعلاه، استخدمنا MiniCPM-V-26 و Llama-3.1-8B-Instruct. يتوفر مثال بسيط جداً وخالي من التعقيدات لهذا الإجراء هنا. والتوصية الرسمية لتعزيز الأوامر النصية هي استخدام ChatGLM، ويُعتبر طول الأمر بين 50 و100 كلمة مناسباً.
![NOTE] من المتوقع أن يكون مجموعة بياناتك مُعالجة مسبقًا بالفعل. وإذا لم تكن كذلك، يمكن إجراء بعض المعالجة الأساسية الأولية عن طريق التلاعب بالمعاملات التالية:
--height،--width،--fps،--max_num_frames،--skip_frames_startو--skip_frames_end. حاليًا، يجب أن تحتوي جميع مقاطع الفيديو في مجموعة بياناتك على نفس عدد إطارات الفيديو عند استخدام حجم دفعة تدريب > 1.
التدريب
تحتاج إلى إعداد بيئة التطوير من خلال تثبيت المتطلبات اللازمة. الحزم التالية مطلوبة:
- Torch 2.0 أو أحدث بناءً على ميزات التدريب التي تستخدمها (قد يتطلب ذلك أحدث إصدارات أو الإصدارات الليلية للتدريب باستخدام التكميم/deepspeed)
pip install diffusers transformers accelerate peft huggingface_hubلكل ما يتعلق بالنمذجة والتدريبpip install datasets decordلتحميل بيانات التدريب الخاصة بالفيديوpip install bitsandbytesلاستخدام مُحسِّنات Adam أو AdamW بدقة 8 بت للتدريب المُحسَّن من حيث الذاكرةpip install wandbاختياريًا لمراقبة سجلات التدريبpip install deepspeedاختياريًا لتدريب DeepSpeedpip install prodigyoptاختياريًا إذا كنت ترغب في استخدام مُحسِّن Prodigy للتدريب
لضمان قدرتك على تشغيل أحدث إصدارات سكربتات الأمثلة بنجاح، ننصح بشدة بـالتثبيت من المصدر والحفاظ على تحديث التثبيت، حيث نقوم بتحديث سكربتات الأمثلة بشكل متكرر ونثبّت بعض المتطلبات الخاصة بالأمثلة. للقيام بذلك، نفّذ الخطوات التالية في بيئة افتراضية جديدة:
قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:
- PyTorch
cd examples/cogvideo
pip install -r requirements.txtومساحة عمل 🤗 Accelerate مع:
accelerate config
أو للحصول على إعداد accelerate افتراضي دون الإجابة على أسئلة حول بيئة التشغيل
accelerate config default
أو إذا لم يدعم بيئتك shell تفاعليًا (مثل notebook)
from accelerate.utils import write_basic_config
write_basic_config()عند تشغيل accelerate config، إذا كنت تستخدم torch.compile، فقد تتحقق تسارعات هائلة. تُستخدم مكتبة PEFT كواجهة خلفية لتدريب LoRA، لذا تأكد من تثبيت peft>=0.6.0 في بيئتك.
إذا كنت ترغب في رفع نموذجك إلى Hub بعد اكتمال التدريب مع بطاقة نموذج أنيقة، فتأكد من تسجيل الدخول:
hf auth login
# Alternatively, you could upload your model manually using:
# hf upload my-cool-account-name/my-cool-lora-name /path/to/awesome/loraتأكد من أن بياناتك مُعدّة كما هو موضح في تجهيز البيانات. عند الانتهاء، يمكنك البدء بالتدريب!
بافتراض أنك تقوم بالتدريب على 50 فيديو لمفهوم مشابه، فقد وجدنا أن 1500-2000 خطوة تعمل بشكل جيد. ومع ذلك، فإن التوصية الرسمية هي 100 فيديو بإجمالي 4000 خطوة. بافتراض أنك تقوم بالتدريب على وحدة معالجة رسومية واحدة مع --train_batch_size بقيمة 1:
- 1500 خطوة على 50 فيديو تتوافق مع
30من فترات التدريب - 4000 خطوة على 100 فيديو تتوافق مع
40من دورات التدريب
#!/bin/bash
GPU_IDS="0"
accelerate launch --gpu_ids $GPU_IDS examples/cogvideo/train_cogvideox_lora.py \
--pretrained_model_name_or_path THUDM/CogVideoX-2b \
--cache_dir <CACHE_DIR> \
--instance_data_root <PATH_TO_WHERE_VIDEO_FILES_ARE_STORED> \
--dataset_name my-awesome-name/my-awesome-dataset \
--caption_column <CAPTION_COLUMN> \
--video_column <PATH_TO_VIDEO_COLUMN> \
--id_token <ID_TOKEN> \
--validation_prompt "<ID_TOKEN> Spiderman swinging over buildings:::A panda, dressed in a small, red jacket and a tiny hat, sits on a wooden stool in a serene bamboo forest. The panda's fluffy paws strum a miniature acoustic guitar, producing soft, melodic tunes. Nearby, a few other pandas gather, watching curiously and some clapping in rhythm. Sunlight filters through the tall bamboo, casting a gentle glow on the scene. The panda's face is expressive, showing concentration and joy as it plays. The background includes a small, flowing stream and vibrant green foliage, enhancing the peaceful and magical atmosphere of this unique musical performance" \
--validation_prompt_separator ::: \
--num_validation_videos 1 \
--validation_epochs 10 \
--seed 42 \
--rank 64 \
--lora_alpha 64 \
--mixed_precision fp16 \
--output_dir /raid/aryan/cogvideox-lora \
--height 480 --width 720 --fps 8 --max_num_frames 49 --skip_frames_start 0 --skip_frames_end 0 \
--train_batch_size 1 \
--num_train_epochs 30 \
--checkpointing_steps 1000 \
--gradient_accumulation_steps 1 \
--learning_rate 1e-3 \
--lr_scheduler cosine_with_restarts \
--lr_warmup_steps 200 \
--lr_num_cycles 1 \
--enable_slicing \
--enable_tiling \
--optimizer Adam \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--max_grad_norm 1.0 \
--report_to wandbلتتبع تجارب التدريب لدينا بشكل أفضل، نستخدم الأعلام التالية في الأمر أعلاه:
--report_to wandbيضمن تتبع عمليات التدريب على Weights and Biases. لاستخدامه، تأكد من تثبيتwandbباستخدامpip install wandb.validation_promptوvalidation_epochsللسماح للسكريبت بإجراء بعض عمليات الاستدلال للتحقق. وهذا يتيح لنا التحقق النوعي من أن التدريب يتقدم كما هو متوقع.
لا يُشترط تعيين <ID_TOKEN>. فمن خلال بعض التجارب المحدودة، وجدنا أنه يعمل بشكل أفضل (لأنه يشبه تدريب Dreambooth) من دون تعيينه. عند توفيره، يُضاف <ID_TOKEN> إلى بداية كل موجه. لذا، إذا كان <ID_TOKEN> الخاص بك هو "DISNEY" وكان موجهك هو "Spiderman swinging over buildings"، فإن الموجه الفعّال المستخدم في التدريب سيكون "DISNEY Spiderman swinging over buildings". عند عدم توفيره، يمكنك إما التدريب دون أي رمز إضافي، أو تعزيز مجموعة بياناتك لتطبيق الرمز في المكان الذي ترغب فيه قبل بدء التدريب.
يمكنك تمرير
--use_8bit_adamلتقليل متطلبات الذاكرة أثناء التدريب.
تم اختبار الإعدادات التالية عند إضافة دعم تدريب CogVideoX LoRA:
- تم إجراء اختباراتنا بشكل أساسي على CogVideoX-2b. وسنعمل على CogVideoX-5b وCogVideoX-5b-I2V قريباً
- تتألف مجموعة بيانات واحدة من 70 فيديو تدريب بدقة
200 x 480 x 720(F x H x W). ومن هذه المجموعة، باستخدام تخطي الإطارات في المعالجة المسبقة للبيانات، أنشأنا مجموعتي بيانات أصغر مكوّنتين من 49 إطارًا و16 إطارًا لتسريع التجارب، ولأن الحد الأقصى الموصى به من فريق CogVideoX هو 49 إطارًا. ومن بين الفيديوهات السبعين، أنشأنا ثلاث مجموعات مكوّنة من 10 و25 و50 فيديو. كانت جميع الفيديوهات متشابهة من حيث طبيعة المفهوم المُدرَّب.- أظهرت أكثر من 25 فيديو أفضل النتائج عند تدريب مفاهيم وأنماط جديدة.
- وجدنا أنه من الأفضل التدريب باستخدام رمز تعريف يمكن تحديده عبر
--id_token. يشبه هذا التدريب بأسلوب Dreambooth، لكن الضبط الدقيق العادي دون استخدام مثل هذا الرمز يعمل أيضاً.- يبدو أن المفهوم المُدرَّب يعمل بشكل جيد إلى حد ما عند دمجه مع أوامر غير ذات صلة تمامًا. نتوقع الحصول على نتائج أفضل إذا تم ضبط نموذج CogVideoX-5B.
- يستخدم المستودع الأصلي قيمة
lora_alphaتساوي1. وجدنا أن هذه القيمة غير مناسبة في العديد من التشغيلات، ربما بسبب اختلاف في محركات النمذجة وإعدادات التدريب. توصيتنا هي ضبطlora_alphaإما إلىrankأوrank // 2.- إذا كنت تدرب على بيانات تُنتج عناوينها نتائج سيئة مع النموذج الأصلي، فإن قيمة
rankتساوي 64 أو أعلى تكون مناسبة، وهي أيضاً التوصية من الفريق المطوّر لـ CogVideoX. إذا كانت النتائج المولّدة جيدة إلى حد ما مسبقاً على عناوين التدريب الخاصة بك، فيجب أن تعمل قيمةrankتساوي 16/32. وجدنا أن ضبط الرتبة على قيمة منخفضة جداً، مثل4، ليس مثالياً ولا يُنتج نتائج واعدة.- يوصي مؤلفو CogVideoX بأداء 4000 خطوة تدريب و100 فيديو تدريب بشكل عام لتحقيق أفضل نتيجة. وعلى الرغم من أن ذلك قد يحقق أفضل النتائج، فقد وجدنا من تجاربنا المحدودة أن 2000 خطوة و25 فيديو قد تكون كافية أيضاً.
- عند استخدام مُحسِّن Prodigy للتدريب، يمكن اتباع التوصيات الواردة في هذا المدونة. يميل Prodigy إلى الإفراط في التكيّف بسرعة. ومن اختبارات المحدودة جداً، وجدت أن معدل تعلّم قدره
0.5مناسب بالإضافة إلى--prodigy_use_bias_correctionوprodigy_safeguard_warmupو--prodigy_decouple.- معدل التعلم الموصى به من قبل مؤلفي CogVideoX ومن خلال تجاربنا مع Adam/AdamW يتراوح بين
1e-3و1e-4لمجموعة بيانات تتكون من 25 فيديو أو أكثر.يرجى ملاحظة أن اختباراتنا ليست شاملة بسبب الوقت المحدود المخصص للاستكشاف. توصيتنا هي تجربة الإعدادات المختلفة للعثور على أفضل إعدادات لبياناتك.
الاستدلال
بمجرد تدريب نموذج lora، يمكن تنفيذ الاستدلال ببساطة عن طريق تحميل أوزان lora في CogVideoXPipeline.
import torch
from diffusers import CogVideoXPipeline
from diffusers.utils import export_to_video
pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-2b", dtype=torch.float16)
# pipe.load_lora_weights("/path/to/lora/weights", adapter_name="cogvideox-lora") # Or,
pipe.load_lora_weights("my-awesome-hf-username/my-awesome-lora-name", adapter_name="cogvideox-lora") # If loading from the HF Hub
pipe.to("cuda") # or "mps", "xpu", "cpu"
# Assuming lora_alpha=32 and rank=64 for training. If different, set accordingly
pipe.set_adapters(["cogvideox-lora"], [32 / 64])
prompt = "A vast, shimmering ocean flows gracefully under a twilight sky, its waves undulating in a mesmerizing dance of blues and greens. The surface glints with the last rays of the setting sun, casting golden highlights that ripple across the water. Seagulls soar above, their cries blending with the gentle roar of the waves. The horizon stretches infinitely, where the ocean meets the sky in a seamless blend of hues. Close-ups reveal the intricate patterns of the waves, capturing the fluidity and dynamic beauty of the sea in motion."
frames = pipe(prompt, guidance_scale=6, use_dynamic_cfg=True).frames[0]
export_to_video(frames, "output.mp4", fps=8)تقليل استهلاك الذاكرة
أثناء الاختبار باستخدام مكتبة diffusers، تم تفعيل جميع التحسينات المضمنة في مكتبة diffusters. لم يتم اختبار هذا المخطط لاستخدام الذاكرة الفعلي على الأجهزة خارج معماريات NVIDIA A100 / H100. بشكل عام، يمكن تكييف هذا المخطط مع جميع الأجهزة التي تعمل بمعمارية NVIDIA Ampere architecture وما فوق. إذا تم تعطيل التحسينات، فستتضاعف استهلاك الذاكرة، حيث يكون ذروة استخدام الذاكرة حوالي 3 أضعاف القيمة المذكورة في الجدول. ومع ذلك، سيزداد السرعة بحوالي 3-4 أضعاف. يمكنك تعطيل بعض التحسينات بشكل انتقائي، بما في ذلك:
pipe.enable_sequential_cpu_offload()
pipe.vae.enable_slicing()
pipe.vae.enable_tiling()- للاستدلال متعدد وحدات معالجة الرسومات، يجب تعطيل تحسين
enable_sequential_cpu_offload(). - سيؤدي استخدام نماذج INT8 إلى إبطاء الاستدلال، وهو إجراء يُتّخذ لاستيعاب وحدات معالجة الرسومات ذات الذاكرة الأقل مع الحفاظ على فقدانٍ ضئيلٍ في جودة الفيديو، على الرغم من أن سرعة الاستدلال ستنخفض بشكل كبير.
- تم تدريب نموذج CogVideoX-2B بدقة
FP16، وتم تدريب جميع نماذج CogVideoX-5B بدقةBF16. نوصي باستخدام الدقة التي تم بها تدريب النموذج عند الاستدلال. - يمكن استخدام PytorchAO و Optimum-quanto لتكميم وحدات مُشفِّر النص، والتحويلي، وVAE لتقليل متطلبات الذاكرة الخاصة بـ CogVideoX. وهذا يتيح تشغيل النموذج على أجهزة Colabs المجانية من نوع T4 أو على وحدات معالجة رسومية ذات ذاكرة أصغر! كما لاحظ أن تكميم TorchAO متوافق تمامًا مع
torch.compile، مما يمكن أن يحسّن سرعة الاستدلال بشكل كبير. يجب استخدام دقة FP8 على الأجهزة المزودة ببطاقات NVIDIA H100 أو أحدث، ويتطلب ذلك تثبيت حزمtorchوtorchaoوdiffusersوaccelerateبلغة بايثون من المصدر. ويُوصى باستخدام CUDA 12.4. - استخدمت اختبارات سرعة الاستدلال أيضًا مخطط تحسين الذاكرة المذكور أعلاه. بدون تحسين الذاكرة، تزداد سرعة الاستدلال بنسبة 10% تقريبًا. يدعم إصدار
diffusersمن النموذج فقط عملية التكميم. - يدعم النموذج مدخلات باللغة الإنجليزية فقط؛ يمكن ترجمة اللغات الأخرى إلى الإنجليزية للاستخدام عبر تحسين النموذج الكبير.
- يتم اختبار استهلاك الذاكرة في ضبط نموذج في بيئة
8 * H100، ويستخدم البرنامج تلقائيًا تحسينZero 2. إذا تم تحديد عدد معين من وحدات معالجة الرسومات في الجدول، فيجب استخدام هذا العدد أو أكثر من وحدات معالجة الرسومات لضبط النموذج.
| الخاصية | CogVideoX-2B | CogVideoX-5B |
|---|---|---|
| اسم النموذج | CogVideoX-2B | CogVideoX-5B |
| دقة الاستدلال | FP16(موصى به)، BF16، FP32، FP8، INT8، INT4 غير مدعوم | BF16 (موصى به)، FP16، FP32، FP8*، INT8، INT4 غير مدعوم |
| ذاكرة VRAM للاستدلال على GPU واحد | FP16: استخدام diffusers 12.5GBINT8: استخدام diffusers مع torchao 7.8GB | BF16: استخدام diffusers 20.7GBINT8: استخدام diffusers مع torchao 11.4GB |
| ذاكرة VRAM للاستدلال متعدد وحدات GPU | FP16: باستخدام diffusers 10GB* | BF16: باستخدام diffusers 15GB* |
| سرعة الاستدلال | وحدة A100 واحدة: ~90 ثانية، وحدة H100 واحدة: ~45 ثانية | وحدة A100 واحدة: ~180 ثانية، وحدة H100 واحدة: ~90 ثانية |
| دقة الضبط الدقيق | FP16 | BF16 |
| استهلاك ذاكرة VRAM أثناء الضبط الدقيق | 47 جيجابايت (bs=1, LORA) 61 جيجابايت (bs=2, LORA) 62 جيجابايت (bs=1, SFT) | 63 جيجابايت (bs=1, LORA) 80 جيجابايت (bs=2, LORA) 75 جيجابايت (bs=1, SFT) |