Diffusers documentation
CogVideoX
CogVideoX
CogVideoX adalah model generasi teks-ke-video yang berfokus pada pembuatan video yang lebih koheren dan selaras dengan prompt. Hal ini dicapai dengan menggunakan beberapa metode.
autoencoder variational 3D yang mengompresi video secara spasial dan temporal, meningkatkan rasio kompresi dan akurasi video.
blok transformer ahli untuk membantu menyelaraskan teks dan video, serta modul perhatian penuh 3D untuk menangkap dan membuat video yang akurat secara spasial dan temporal.
Uji aktual pada dimensi instruksi video menemukan bahwa CogVideoX memiliki efek yang baik pada tema yang konsisten, informasi dinamis, latar belakang yang konsisten, informasi objek, gerakan yang halus, warna, adegan, gaya penampilan, dan gaya temporal, tetapi tidak dapat mencapai hasil yang baik pada aksi manusia, hubungan spasial, dan beberapa objek.
Finetuning dengan Diffusers dapat membantu mengatasi hasil yang kurang baik tersebut.
Persiapan Data
Skrip pelatihan menerima data dalam dua format.
Format pertama cocok untuk pelatihan skala kecil, dan format kedua menggunakan format CSV, yang lebih sesuai untuk streaming data untuk pelatihan skala besar. Di masa depan, Diffusers akan mendukung tag <Video>.
Format kecil
Dua file, di mana satu file berisi prompt yang dipisahkan baris dan file lainnya berisi path ke data video yang dipisahkan baris (path ke file video harus relatif terhadap path yang Anda berikan saat menentukan --instance_data_root). Mari kita lihat sebuah contoh untuk memahaminya lebih baik!
Asumsikan Anda telah menentukan --instance_data_root sebagai /dataset, dan direktori ini berisi file: prompts.txt dan videos.txt.
File prompts.txt harus berisi prompt yang dipisahkan per baris:
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.
...File videos.txt harus berisi jalur ke file video yang dipisahkan per baris. Perhatikan bahwa jalur tersebut harus relatif terhadap direktori --instance_data_root.
videos/00000.mp4
videos/00001.mp4
...Secara keseluruhan, berikut adalah tampilan dataset Anda jika Anda menjalankan perintah tree pada direktori root dataset:
/dataset
├── prompts.txt
├── videos.txt
├── videos
├── videos/00000.mp4
├── videos/00001.mp4
├── ...Saat menggunakan format ini, --caption_column harus berupa prompts.txt dan --video_column harus berupa videos.txt.
Format stream
Anda dapat menggunakan satu file CSV. Untuk keperluan contoh ini, asumsikan Anda memiliki file metadata.csv. Format yang diharapkan adalah:
<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"""
...Dalam kasus ini, --instance_data_root harus menjadi lokasi tempat video disimpan dan --dataset_name harus berupa path ke folder lokal atau dataset yang kompatibel dengan load_dataset yang di-host di Hub. Mengasumsikan Anda memiliki video gameplay Minecraft di https://huggingface.co/datasets/my-awesome-username/minecraft-videos, Anda harus menentukan my-awesome-username/minecraft-videos.
Saat menggunakan format ini, --caption_column harus <CAPTION_COLUMN> dan --video_column harus <PATH_TO_VIDEO_COLUMN>.
Anda tidak secara ketat dibatasi pada format CSV. Format apa pun dapat digunakan selama metode load_dataset mendukung format file untuk memuat <PATH_TO_VIDEO_COLUMN> dan <CAPTION_COLUMN> dasar. Alasan untuk melakukan berbagai pengaturan organisasi dataset ini untuk memuat data video adalah karena load_dataset tidak sepenuhnya mendukung semua jenis format video.
CogVideoX bekerja paling baik dengan prompt yang panjang dan deskriptif yang diperkaya oleh LLM untuk generasi video. Kami merekomendasikan pra-pemrosesan video Anda dengan terlebih dahulu menghasilkan ringkasan menggunakan VLM, lalu memperkaya prompt dengan LLM. Untuk menghasilkan caption di atas, kami menggunakan MiniCPM-V-26 dan Llama-3.1-8B-Instruct. Contoh yang sangat sederhana dan tanpa fitur tambahan untuk hal ini tersedia di sini. Rekomendasi resmi untuk memperkaya prompt adalah ChatGLM dan panjang 50-100 kata dianggap baik.
![NOTE] Diharapkan bahwa dataset Anda sudah diproses sebelumnya. Jika belum, beberapa pra-pemrosesan dasar dapat dilakukan dengan mengatur parameter berikut:
--height,--width,--fps,--max_num_frames,--skip_frames_startdan--skip_frames_end. Saat ini, semua video dalam dataset Anda harus berisi jumlah frame video yang sama ketika menggunakan ukuran batch pelatihan > 1.
Pelatihan
Anda perlu menyiapkan lingkungan pengembangan dengan menginstal persyaratan yang diperlukan. Paket-paket berikut diperlukan:
- Torch 2.0 atau di atasnya berdasarkan fitur pelatihan yang Anda gunakan (mungkin memerlukan versi terbaru atau nightly untuk pelatihan kuantisasi/deepspeed)
pip install diffusers transformers accelerate peft huggingface_hubuntuk semua hal yang berkaitan dengan pemodelan dan pelatihanpip install datasets decorduntuk memuat data pelatihan videopip install bitsandbytesuntuk menggunakan optimizer 8-bit Adam atau AdamW untuk pelatihan yang dioptimalkan untuk memoripip install wandbopsional untuk memantau log pelatihanpip install deepspeedopsional untuk pelatihan DeepSpeedpip install prodigyoptsecara opsional jika Anda ingin menggunakan optimizer Prodigy untuk pelatihan
Untuk memastikan Anda dapat menjalankan versi terbaru dari skrip contoh dengan sukses, kami sangat merekomendasikan memasang dari sumber dan menjaga instalasi tetap mutakhir karena kami memperbarui skrip contoh secara berkala dan memasang beberapa persyaratan khusus untuk contoh. Untuk melakukan ini, jalankan langkah-langkah berikut di lingkungan virtual baru:
Sebelum menjalankan skrip, pastikan Anda menginstal pustaka dari sumber:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .Lalu, navigasikan ke folder contoh yang berisi skrip pelatihan dan instal dependensi yang diperlukan untuk skrip yang Anda gunakan:
- PyTorch
cd examples/cogvideo
pip install -r requirements.txtDan inisialisasi lingkungan 🤗 Accelerate dengan:
accelerate config
Atau untuk konfigurasi accelerate default tanpa menjawab pertanyaan tentang lingkungan Anda
accelerate config default
Atau jika lingkungan Anda tidak mendukung shell interaktif (misalnya, notebook)
from accelerate.utils import write_basic_config
write_basic_config()Saat menjalankan accelerate config, jika Anda menggunakan torch.compile, dapat terjadi peningkatan kecepatan yang signifikan. Perpustakaan PEFT digunakan sebagai backend untuk pelatihan LoRA, jadi pastikan peft>=0.6.0 terinstal di lingkungan Anda.
Jika Anda ingin mendorong model Anda ke Hub setelah pelatihan selesai dengan kartu model yang rapi, pastikan Anda sudah masuk:
hf auth login
# Alternatively, you could upload your model manually using:
# hf upload my-cool-account-name/my-cool-lora-name /path/to/awesome/loraPastikan data Anda telah disiapkan seperti yang dijelaskan dalam Persiapan Data. Saat siap, Anda dapat mulai melatih!
Dengan asumsi Anda melatih pada 50 video dengan konsep serupa, kami menemukan bahwa 1500-2000 langkah bekerja dengan baik. Namun, rekomendasi resmi adalah 100 video dengan total 4000 langkah. Dengan asumsi Anda melatih pada satu GPU dengan --train_batch_size sebesar 1:
- 1500 langkah pada 50 video akan setara dengan
30epoch pelatihan - 4000 langkah pada 100 video akan setara dengan
40epoch pelatihan
#!/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 wandbUntuk melacak eksperimen pelatihan kami dengan lebih baik, kami menggunakan flag berikut dalam perintah di atas:
--report_to wandbakan memastikan jalannya pelatihan dilacak di Weights and Biases. Untuk menggunakannya, pastikan Anda menginstalwandbdenganpip install wandb.validation_promptdanvalidation_epochsuntuk memungkinkan skrip melakukan beberapa eksekusi inferensi validasi. Hal ini memungkinkan kami untuk memeriksa secara kualitatif apakah pelatihan berjalan sesuai harapan.
Menetapkan <ID_TOKEN> tidak diperlukan. Dari beberapa eksperimen terbatas, kami menemukan bahwa hasilnya lebih baik (karena menyerupai pelatihan Dreambooth) jika token ini disertakan. Jika disediakan, <ID_TOKEN> akan ditambahkan di awal setiap prompt. Jadi, jika <ID_TOKEN> Anda adalah "DISNEY" dan prompt Anda adalah "Spiderman swinging over buildings", prompt efektif yang digunakan dalam pelatihan akan menjadi "DISNEY Spiderman swinging over buildings". Jika tidak disediakan, Anda dapat melatih model tanpa token tambahan apa pun, atau memperkaya dataset Anda untuk menerapkan token di posisi yang diinginkan sebelum memulai pelatihan.
Anda dapat meneruskan
--use_8bit_adamuntuk mengurangi kebutuhan memori pelatihan.
Pengaturan berikut telah diuji pada saat dukungan pelatihan LoRA untuk CogVideoX ditambahkan:
- Pengujian kami terutama dilakukan pada CogVideoX-2b. Kami akan segera mengerjakan CogVideoX-5b dan CogVideoX-5b-I2V
- Satu dataset terdiri dari 70 video pelatihan dengan resolusi
200 x 480 x 720(F x H x W). Dari sini, dengan menggunakan frame skipping dalam pra-pemrosesan data, kami membuat dua dataset yang lebih kecil, yaitu 49-frame dan 16-frame, untuk eksperimen yang lebih cepat dan karena batas maksimum yang direkomendasikan oleh tim CogVideoX adalah 49 frame. Dari 70 video tersebut, kami membuat tiga kelompok berisi 10, 25, dan 50 video. Semua video memiliki sifat yang serupa dalam hal konsep yang dilatihkan.- 25+ video bekerja paling baik untuk melatih konsep dan gaya baru.
- Kami menemukan bahwa lebih baik melatih dengan token pengenal yang dapat ditentukan sebagai
--id_token. Ini mirip dengan pelatihan seperti Dreambooth, tetapi penyesuaian halus normal tanpa token semacam itu juga berhasil.- Konsep yang telah dilatih tampaknya bekerja cukup baik ketika dikombinasikan dengan prompt yang sama sekali tidak terkait. Kami mengharapkan hasil yang bahkan lebih baik jika CogVideoX-5B di-finetune.
- Repositori asli menggunakan
lora_alphasebesar1. Kami menemukan bahwa nilai ini tidak cocok dalam banyak eksekusi, kemungkinan karena perbedaan dalam backend pemodelan dan pengaturan pelatihan. Rekomendasi kami adalah mengaturlora_alphamenjadirankataurank // 2.- Jika Anda melatih pada data yang caption-nya menghasilkan hasil buruk dengan model asli,
rank64 ke atas adalah pilihan yang baik dan juga merupakan rekomendasi dari tim di balik CogVideoX. Jika hasil generasi sudah cukup baik pada caption pelatihan Anda,rank16/32 seharusnya sudah memadai. Kami menemukan bahwa mengatur rank terlalu rendah, misalnya4, tidak ideal dan tidak menghasilkan hasil yang menjanjikan.- Para penulis CogVideoX merekomendasikan 4000 langkah pelatihan dan 100 video pelatihan secara keseluruhan untuk mencapai hasil terbaik. Meskipun hal itu mungkin menghasilkan hasil terbaik, kami menemukan dari eksperimen terbatas kami bahwa 2000 langkah dan 25 video juga bisa menjadi cukup.
- Saat menggunakan optimizer Prodigy untuk pelatihan, Anda dapat mengikuti rekomendasi dari blog ini. Prodigy cenderung overfit dengan cepat. Dari pengujian saya yang sangat terbatas, saya menemukan bahwa learning rate
0.5cocok digunakan selain--prodigy_use_bias_correction,prodigy_safeguard_warmup, dan--prodigy_decouple.- Learning rate yang direkomendasikan oleh para penulis CogVideoX dan dari eksperimen kami dengan Adam/AdamW adalah antara
1e-3dan1e-4untuk dataset berisi 25+ video.Perlu dicatat bahwa pengujian kami tidak bersifat menyeluruh karena waktu eksplorasi yang terbatas. Rekomendasi kami adalah untuk bereksperimen dengan berbagai pengaturan untuk menemukan konfigurasi terbaik untuk data Anda.
Inferensi
Setelah Anda melatih model lora, inferensi dapat dilakukan dengan mudah dengan memuat bobot lora ke dalam 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)Kurangi penggunaan memori
Saat pengujian menggunakan pustaka diffusers, semua optimasi yang disertakan dalam pustaka diffusers diaktifkan. Skema ini belum diuji untuk penggunaan memori aktual pada perangkat di luar arsitektur NVIDIA A100 / H100. Secara umum, skema ini dapat diadaptasi untuk semua perangkat NVIDIA Ampere architecture dan di atasnya. Jika optimasi dinonaktifkan, konsumsi memori akan berlipat ganda, dengan penggunaan memori puncak sekitar 3 kali nilai dalam tabel. Namun, kecepatan akan meningkat sekitar 3-4 kali. Anda dapat secara selektif menonaktifkan beberapa optimasi, termasuk:
pipe.enable_sequential_cpu_offload()
pipe.vae.enable_slicing()
pipe.vae.enable_tiling()- Untuk inferensi multi-GPU, optimasi
enable_sequential_cpu_offload()harus dinonaktifkan. - Menggunakan model INT8 akan memperlambat inferensi, yang dilakukan untuk mengakomodasi GPU dengan memori lebih rendah sambil mempertahankan kehilangan kualitas video yang minimal, meskipun kecepatan inferensi akan menurun secara signifikan.
- Model CogVideoX-2B dilatih dalam presisi
FP16, dan semua model CogVideoX-5B dilatih dalam presisiBF16. Kami merekomendasikan untuk menggunakan presisi tempat model dilatih untuk inferensi. - PytorchAO dan Optimum-quanto dapat digunakan untuk mengkuantisasi modul text encoder, transformer, dan VAE guna mengurangi kebutuhan memori CogVideoX. Hal ini memungkinkan model berjalan di Colab T4 gratis atau GPU dengan memori lebih kecil! Selain itu, perhatikan bahwa kuantisasi TorchAO sepenuhnya kompatibel dengan
torch.compile, yang dapat meningkatkan kecepatan inferensi secara signifikan. Presisi FP8 harus digunakan pada perangkat dengan NVIDIA H100 ke atas, yang memerlukan instalasi dari sumbertorch,torchao,diffusers, danacceleratepaket Python. CUDA 12.4 direkomendasikan. - Tes kecepatan inferensi juga menggunakan skema optimasi memori di atas. Tanpa optimasi memori, kecepatan inferensi meningkat sekitar 10%. Hanya versi
diffusersdari model yang mendukung kuantisasi. - Model ini hanya mendukung input dalam bahasa Inggris; bahasa lain dapat diterjemahkan ke bahasa Inggris untuk digunakan melalui penyempurnaan model besar.
- Penggunaan memori untuk fine-tuning model diuji dalam lingkungan
8 * H100, dan program secara otomatis menggunakan optimasiZero 2. Jika jumlah GPU tertentu ditandai dalam tabel, maka jumlah GPU tersebut atau lebih harus digunakan untuk fine-tuning.
| Atribut | CogVideoX-2B | CogVideoX-5B |
|---|---|---|
| Nama Model | CogVideoX-2B | CogVideoX-5B |
| Presisi Inferensi | FP16(Disarankan), BF16, FP32, FP8, INT8, INT4 tidak didukung | BF16 (Disarankan), FP16, FP32, FP8*, INT8, Tidak didukung INT4 |
| VRAM Inferensi GPU Tunggal | FP16: Menggunakan diffusers 12,5GBINT8: Menggunakan diffusers dengan torchao 7,8GB | BF16: Menggunakan diffusers 20,7GBINT8: Menggunakan diffusers dengan torchao 11,4GB |
| VRAM Inferensi Multi GPU | FP16: Menggunakan diffusers 10GB* | BF16: Menggunakan diffusers 15GB* |
| Kecepatan Inferensi | Satu A100: ~90 detik, Satu H100: ~45 detik | Satu A100: ~180 detik, Satu H100: ~90 detik |
| Penyesuaian Presisi | FP16 | BF16 |
| Konsumsi VRAM Fine-tuning | 47 GB (bs=1, LORA) 61 GB (bs=2, LORA) 62GB (bs=1, SFT) | 63 GB (bs=1, LORA) 80 GB (bs=2, LORA) 75GB (bs=1, SFT) |