Diffusers documentation
CogVideoX
CogVideoX
CogVideoX là một mô hình tạo video từ văn bản, tập trung vào việc tạo ra các video nhất quán hơn, bám sát theo prompt. Nó đạt được điều này bằng cách sử dụng một số phương pháp.
một autoencoder biến phân 3D nén video theo không gian và thời gian, cải thiện tỷ lệ nén và độ chính xác của video.
một khối transformer chuyên gia để giúp căn chỉnh văn bản và video, cùng một module chú ý toàn phần 3D để nắm bắt và tạo ra các video chính xác về mặt không gian và thời gian.
Kết quả kiểm tra thực tế về chiều hướng dẫn video cho thấy CogVideoX đạt hiệu quả tốt ở các khía cạnh chủ đề nhất quán, thông tin động, nền nhất quán, thông tin đối tượng, chuyển động mượt mà, màu sắc, cảnh, phong cách ngoại hình và phong cách thời gian, nhưng không thể đạt kết quả tốt với hành động con người, quan hệ không gian và nhiều đối tượng.
Việc tinh chỉnh với Diffusers có thể giúp bù đắp cho những kết quả kém này.
Chuẩn bị dữ liệu
Các script huấn luyện chấp nhận dữ liệu ở hai định dạng.
Định dạng đầu tiên phù hợp cho huấn luyện quy mô nhỏ, còn định dạng thứ hai sử dụng định dạng CSV, phù hợp hơn cho việc truyền trực tiếp dữ liệu trong huấn luyện quy mô lớn. Trong tương lai, Diffusers sẽ hỗ trợ thẻ <Video>.
Định dạng nhỏ
Hai tệp, trong đó một tệp chứa các prompt phân tách theo dòng và tệp còn lại chứa các đường dẫn đến dữ liệu video phân tách theo dòng (đường dẫn đến tệp video phải là đường dẫn tương đối so với đường dẫn bạn truyền khi chỉ định --instance_data_root). Hãy xem một ví dụ để hiểu rõ hơn!
Giả sử bạn đã chỉ định --instance_data_root là /dataset, và thư mục này chứa các tệp: prompts.txt và videos.txt.
Tệp prompts.txt nên chứa các prompt được phân tách bằng dòng:
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.
...Tệp videos.txt nên chứa các đường dẫn đến tệp video, mỗi đường dẫn trên một dòng. Lưu ý rằng đường dẫn phải là tương đối so với thư mục --instance_data_root.
videos/00000.mp4
videos/00001.mp4
...Nhìn chung, đây là cách bộ dữ liệu của bạn sẽ trông như thế nào nếu bạn chạy lệnh tree trên thư mục gốc của bộ dữ liệu:
/dataset
├── prompts.txt
├── videos.txt
├── videos
├── videos/00000.mp4
├── videos/00001.mp4
├── ...Khi sử dụng định dạng này, --caption_column phải là prompts.txt và --video_column phải là videos.txt.
Định dạng luồng
Bạn có thể sử dụng một tệp CSV duy nhất. Để phục vụ cho ví dụ này, giả sử bạn có tệp metadata.csv. Định dạng mong đợi là:
<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"""
...Trong trường hợp này, --instance_data_root phải là vị trí lưu trữ các video và --dataset_name phải là đường dẫn đến thư mục cục bộ hoặc một dataset tương thích với load_dataset được lưu trữ trên Hub. Giả sử bạn có các video gameplay Minecraft tại https://huggingface.co/datasets/my-awesome-username/minecraft-videos, bạn sẽ phải chỉ định my-awesome-username/minecraft-videos.
Khi sử dụng định dạng này, --caption_column phải là <CAPTION_COLUMN> và --video_column phải là <PATH_TO_VIDEO_COLUMN>.
Bạn không bị giới hạn cứng nhắc ở định dạng CSV. Bất kỳ định dạng nào cũng được, miễn là phương thức load_dataset hỗ trợ định dạng tệp để nạp một <PATH_TO_VIDEO_COLUMN> và <CAPTION_COLUMN> cơ bản. Lý do phải sắp xếp dữ liệu theo cách này khi nạp dữ liệu video là vì load_dataset không hỗ trợ đầy đủ mọi loại định dạng video.
CogVideoX hoạt động tốt nhất với các prompt dài và mô tả chi tiết, được tăng cường bằng LLM, cho việc tạo video. Chúng tôi khuyến nghị tiền xử lý video của bạn bằng cách đầu tiên tạo một bản tóm tắt sử dụng VLM, sau đó tăng cường các prompt bằng LLM. Để tạo các chú thích ở trên, chúng tôi sử dụng MiniCPM-V-26 và Llama-3.1-8B-Instruct. Một ví dụ rất tối giản và không rườm rà cho quy trình này có sẵn tại đây. Khuyến nghị chính thức để tăng cường prompt là ChatGLM và độ dài 50-100 từ được coi là tốt.
![NOTE] Bộ dữ liệu của bạn được kỳ vọng đã được tiền xử lý. Nếu chưa, một số tiền xử lý cơ bản có thể được thực hiện bằng cách điều chỉnh các tham số sau:
--height,--width,--fps,--max_num_frames,--skip_frames_startvà--skip_frames_end. Hiện tại, tất cả các video trong bộ dữ liệu của bạn phải chứa cùng một số lượng khung hình khi sử dụng kích thước batch huấn luyện > 1.
Huấn luyện
Bạn cần thiết lập môi trường phát triển bằng cách cài đặt các yêu cầu cần thiết. Các gói sau là bắt buộc:
- Torch 2.0 trở lên dựa trên các tính năng huấn luyện mà bạn đang sử dụng (có thể yêu cầu phiên bản mới nhất hoặc nightly cho huấn luyện quantized/deepspeed)
pip install diffusers transformers accelerate peft huggingface_hubcho mọi thứ liên quan đến mô hình hóa và huấn luyệnpip install datasets decordđể nạp dữ liệu huấn luyện videopip install bitsandbytesđể sử dụng các bộ tối ưu hóa Adam hoặc AdamW 8-bit cho việc huấn luyện tối ưu bộ nhớpip install wandbtùy chọn để theo dõi nhật ký huấn luyệnpip install deepspeedtùy chọn để huấn luyện DeepSpeedpip install prodigyopttùy chọn nếu bạn muốn sử dụng trình tối ưu Prodigy cho việc huấn luyện
Để đảm bảo bạn có thể chạy thành công các phiên bản mới nhất của các script mẫu, chúng tôi rất khuyến khích cài đặt từ mã nguồn và giữ cho bản cài đặt luôn được cập nhật, vì chúng tôi thường xuyên cập nhật các script mẫu và cài đặt một số yêu cầu riêng cho từng script. Để thực hiện điều này, hãy thực hiện các bước sau trong một môi trường ảo mới:
Trước khi chạy script, hãy đảm bảo bạn cài đặt thư viện từ mã nguồn:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .Sau đó, điều hướng đến thư mục ví dụ chứa script huấn luyện và cài đặt các phụ thuộc cần thiết cho script bạn đang sử dụng:
- PyTorch
cd examples/cogvideo
pip install -r requirements.txtVà khởi tạo một môi trường 🤗 Accelerate với:
accelerate config
Hoặc để có một cấu hình accelerate mặc định mà không cần trả lời các câu hỏi về môi trường của bạn
accelerate config default
Hoặc nếu môi trường của bạn không hỗ trợ shell tương tác (ví dụ: notebook)
from accelerate.utils import write_basic_config
write_basic_config()Khi chạy accelerate config, nếu bạn sử dụng torch.compile, có thể đạt được tốc độ tăng lên đáng kể. Thư viện PEFT được dùng làm backend cho việc huấn luyện LoRA, vì vậy hãy đảm bảo rằng peft>=0.6.0 đã được cài đặt trong môi trường của bạn.
Nếu bạn muốn đẩy mô hình của mình lên Hub sau khi huấn luyện hoàn tất với một model card gọn gàng, hãy đảm bảo bạn đã đăng nhập:
hf auth login
# Alternatively, you could upload your model manually using:
# hf upload my-cool-account-name/my-cool-lora-name /path/to/awesome/loraHãy đảm bảo dữ liệu của bạn đã được chuẩn bị như mô tả trong Chuẩn bị dữ liệu. Khi sẵn sàng, bạn có thể bắt đầu huấn luyện!
Giả sử bạn đang huấn luyện trên 50 video có cùng một khái niệm, chúng tôi nhận thấy 1500-2000 bước hoạt động tốt. Tuy nhiên, khuyến nghị chính thức là 100 video với tổng cộng 4000 bước. Giả sử bạn đang huấn luyện trên một GPU duy nhất với --train_batch_size là 1:
- 1500 bước trên 50 video sẽ tương ứng với
30epoch huấn luyện - 4000 bước trên 100 video sẽ tương ứng với
40epoch huấn luyện
#!/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Để theo dõi tốt hơn các thí nghiệm huấn luyện của chúng ta, chúng tôi sử dụng các cờ sau trong lệnh ở trên:
--report_to wandbsẽ đảm bảo các phiên chạy huấn luyện được theo dõi trên Weights and Biases. Để sử dụng, hãy chắc chắn cài đặtwandbbằngpip install wandb.validation_promptvàvalidation_epochsđể cho phép script thực hiện một vài lần suy luận kiểm tra. Điều này cho phép chúng ta kiểm tra định tính xem quá trình huấn luyện có đang diễn ra như mong đợi hay không.
Việc đặt <ID_TOKEN> không bắt buộc. Từ một số thử nghiệm giới hạn, chúng tôi nhận thấy nó hoạt động tốt hơn (vì nó giống với quá trình huấn luyện Dreambooth) so với khi không có. Khi được cung cấp, <ID_TOKEN> sẽ được thêm vào đầu mỗi prompt. Vì vậy, nếu <ID_TOKEN> của bạn là "DISNEY" và prompt của bạn là "Spiderman swinging over buildings", prompt hiệu quả được sử dụng trong huấn luyện sẽ là "DISNEY Spiderman swinging over buildings". Khi không được cung cấp, bạn sẽ huấn luyện mà không có token bổ sung nào hoặc có thể bổ sung cho bộ dữ liệu của mình để áp dụng token vào vị trí mong muốn trước khi bắt đầu huấn luyện.
Bạn có thể truyền
--use_8bit_adamđể giảm yêu cầu về bộ nhớ khi huấn luyện.
Các cài đặt sau đã được kiểm tra tại thời điểm thêm hỗ trợ huấn luyện LoRA cho CogVideoX:
- Quá trình kiểm thử của chúng tôi chủ yếu được thực hiện trên CogVideoX-2b. Chúng tôi sẽ sớm làm việc với CogVideoX-5b và CogVideoX-5b-I2V
- Một tập dữ liệu gồm 70 video huấn luyện có độ phân giải
200 x 480 x 720(F x H x W). Từ đó, bằng cách sử dụng bỏ qua khung hình trong tiền xử lý dữ liệu, chúng tôi đã tạo ra hai tập dữ liệu nhỏ hơn gồm 49 khung hình và 16 khung hình để thử nghiệm nhanh hơn và vì giới hạn tối đa được đội ngũ CogVideoX khuyến nghị là 49 khung hình. Trong số 70 video, chúng tôi đã tạo ra ba nhóm gồm 10, 25 và 50 video. Tất cả các video đều có tính chất tương tự nhau về khái niệm đang được huấn luyện.- 25+ video hoạt động tốt nhất cho việc huấn luyện các khái niệm và phong cách mới.
- Chúng tôi nhận thấy rằng việc huấn luyện với một token định danh có thể được chỉ định bằng
--id_tokenlà tốt hơn. Điều này tương tự như huấn luyện kiểu Dreambooth, nhưng việc finetuning thông thường mà không có token như vậy cũng hoạt động được.- Khái niệm đã được huấn luyện dường như hoạt động khá tốt khi kết hợp với các prompt hoàn toàn không liên quan. Chúng tôi kỳ vọng sẽ đạt được kết quả tốt hơn nữa nếu CogVideoX-5B được tinh chỉnh (finetune).
- Kho lưu trữ gốc sử dụng
lora_alphalà1. Chúng tôi nhận thấy giá trị này không phù hợp trong nhiều lần chạy, có thể do sự khác biệt về backend mô hình hóa và cài đặt huấn luyện. Khuyến nghị của chúng tôi là đặtlora_alphabằngrankhoặcrank // 2.- Nếu bạn đang huấn luyện trên dữ liệu có chú thích tạo ra kết quả kém với mô hình gốc, một
ranktừ 64 trở lên là tốt và cũng là khuyến nghị của nhóm đứng sau CogVideoX. Nếu các kết quả tạo ra đã khá ổn trên các chú thích huấn luyện của bạn, mộtranklà 16/32 nên hoạt động tốt. Chúng tôi nhận thấy rằng việc đặt rank quá thấp, ví dụ4, là không lý tưởng và không tạo ra kết quả hứa hẹn.- Các tác giả của CogVideoX khuyến nghị 4000 bước huấn luyện và 100 video huấn luyện tổng thể để đạt được kết quả tốt nhất. Mặc dù điều đó có thể mang lại kết quả tối ưu, nhưng từ những thử nghiệm hạn chế của chúng tôi, chúng tôi nhận thấy rằng 2000 bước và 25 video cũng có thể là đủ.
- Khi sử dụng trình tối ưu Prodigy để huấn luyện, bạn có thể làm theo các khuyến nghị từ blog này. Prodigy có xu hướng overfit nhanh. Từ những thử nghiệm rất hạn chế của tôi, tôi thấy rằng tốc độ học
0.5là phù hợp, kết hợp với--prodigy_use_bias_correction,prodigy_safeguard_warmupvà--prodigy_decouple.- Tốc độ học được các tác giả của CogVideoX khuyến nghị và từ quá trình thử nghiệm của chúng tôi với Adam/AdamW nằm trong khoảng từ
1e-3đến1e-4cho một bộ dữ liệu gồm 25+ video.Lưu ý rằng việc kiểm thử của chúng tôi không mang tính toàn diện do thời gian khám phá có hạn. Khuyến nghị của chúng tôi là hãy thử nghiệm với các tùy chỉnh khác nhau để tìm ra cấu hình tối ưu nhất cho dữ liệu của bạn.
Suy luận
Sau khi bạn đã huấn luyện một mô hình lora, việc suy luận có thể được thực hiện đơn giản bằng cách nạp trọng số lora vào 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)Giảm mức sử dụng bộ nhớ
Trong quá trình kiểm thử sử dụng thư viện diffusers, tất cả các tối ưu hóa có trong thư viện diffusers đều được bật. Phương án này chưa được kiểm thử về mức sử dụng bộ nhớ thực tế trên các thiết bị ngoài kiến trúc NVIDIA A100 / H100. Nhìn chung, phương án này có thể được áp dụng cho tất cả các thiết bị có kiến trúc NVIDIA Ampere trở lên. Nếu tắt các tối ưu hóa, mức tiêu thụ bộ nhớ sẽ tăng lên, với bộ nhớ đỉnh khoảng 3 lần so với giá trị trong bảng. Tuy nhiên, tốc độ sẽ tăng khoảng 3-4 lần. Bạn có thể tắt chọn lọc một số tối ưu hóa, bao gồm:
pipe.enable_sequential_cpu_offload()
pipe.vae.enable_slicing()
pipe.vae.enable_tiling()- Đối với suy luận đa GPU, tối ưu hóa
enable_sequential_cpu_offload()cần phải được tắt. - Việc sử dụng các mô hình INT8 sẽ làm chậm quá trình suy luận, điều này được thực hiện để phù hợp với các GPU có bộ nhớ thấp hơn trong khi vẫn duy trì mức mất chất lượng video tối thiểu, mặc dù tốc độ suy luận sẽ giảm đáng kể.
- Mô hình CogVideoX-2B được huấn luyện ở độ chính xác
FP16, và tất cả các mô hình CogVideoX-5B được huấn luyện ở độ chính xácBF16. Chúng tôi khuyến nghị sử dụng độ chính xác mà mô hình đã được huấn luyện để suy luận. - PytorchAO và Optimum-quanto có thể được sử dụng để lượng tử hóa các module text encoder, transformer và VAE nhằm giảm yêu cầu bộ nhớ của CogVideoX. Điều này cho phép mô hình chạy trên các Colab T4 miễn phí hoặc các GPU có bộ nhớ nhỏ hơn! Ngoài ra, hãy lưu ý rằng lượng tử hóa TorchAO tương thích hoàn toàn với
torch.compile, có thể cải thiện đáng kể tốc độ suy luận. Độ chính xác FP8 phải được sử dụng trên các thiết bị từ NVIDIA H100 trở lên, yêu cầu cài đặt từ mã nguồn các gói Pythontorch,torchao,diffusersvàaccelerate. Khuyến nghị sử dụng CUDA 12.4. - Các bài kiểm tra tốc độ suy luận cũng sử dụng phương án tối ưu hóa bộ nhớ nêu trên. Nếu không có tối ưu hóa bộ nhớ, tốc độ suy luận tăng khoảng 10%. Chỉ phiên bản
diffuserscủa mô hình mới hỗ trợ lượng tử hóa. - Mô hình chỉ hỗ trợ đầu vào tiếng Anh; các ngôn ngữ khác có thể được dịch sang tiếng Anh để sử dụng thông qua tinh chỉnh bằng mô hình lớn.
- Lượng bộ nhớ sử dụng khi tinh chỉnh mô hình được kiểm tra trong môi trường
8 * H100, và chương trình tự động sử dụng tối ưu hóaZero 2. Nếu một số lượng GPU cụ thể được đánh dấu trong bảng, thì phải sử dụng số lượng GPU đó hoặc nhiều hơn để tinh chỉnh.
| Thuộc tính | CogVideoX-2B | CogVideoX-5B |
|---|---|---|
| Tên mô hình | CogVideoX-2B | CogVideoX-5B |
| Độ chính xác suy luận | FP16(Đề xuất), BF16, FP32, FP8, INT8, INT4 không được hỗ trợ | BF16 (Đề xuất), FP16, FP32, FP8*, INT8, INT4 không được hỗ trợ |
| VRAM suy luận trên GPU đơn | FP16: Sử dụng diffusers 12.5GBINT8: Sử dụng diffusers với torchao 7.8GB | BF16: Sử dụng diffusers 20.7GBINT8: Sử dụng diffusers với torchao 11.4GB |
| VRAM suy luận đa GPU | FP16: Sử dụng diffusers 10GB* | BF16: Sử dụng diffusers 15GB* |
| Tốc độ suy luận | Một A100: ~90 giây, Một H100: ~45 giây | Một A100: ~180 giây, Một H100: ~90 giây |
| Độ chính xác tinh chỉnh | FP16 | BF16 |
| Tiêu thụ VRAM khi tinh chỉnh | 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) |