Diffusers documentation
Stable Video Diffusion
Stable Video Diffusion
Stable Video Diffusion diusulkan dalam Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets oleh Andreas Blattmann, Tim Dockhorn, Sumith Kulal, Daniel Mendelevitch, Maciej Kilian, Dominik Lorenz, Yam Levi, Zion English, Vikram Voleti, Adam Letts, Varun Jampani, Robin Rombach.
Abstrak dari makalah tersebut adalah:
Kami memperkenalkan Stable Video Diffusion - model difusi video laten untuk generasi teks-ke-video dan gambar-ke-video resolusi tinggi yang mutakhir. Baru-baru ini, model difusi laten yang dilatih untuk sintesis gambar 2D telah diubah menjadi model video generatif dengan menyisipkan lapisan temporal dan melakukan penyesuaian halus (finetuning) pada dataset video kecil berkualitas tinggi. Namun, metode pelatihan dalam literatur bervariasi secara luas, dan bidang ini belum mencapai kesepakatan tentang strategi terpadu untuk kurasi data video. Dalam makalah ini, kami mengidentifikasi dan mengevaluasi tiga tahap berbeda untuk pelatihan LDM video yang sukses: pra-pelatihan teks-ke-gambar, pra-pelatihan video, dan penyesuaian halus video berkualitas tinggi. Selain itu, kami mendemonstrasikan kebutuhan akan dataset pra-pelatihan yang dikurasi dengan baik untuk menghasilkan video berkualitas tinggi dan menyajikan proses kurasi sistematis untuk melatih model dasar yang kuat, termasuk strategi penulisan keterangan (captioning) dan penyaringan (filtering). Kami kemudian mengeksplorasi dampak dari penyesuaian halus model dasar kami pada data berkualitas tinggi dan melatih model teks-ke-video yang kompetitif dengan generasi video sumber tertutup. Kami juga menunjukkan bahwa model dasar kami menyediakan representasi gerakan yang kuat untuk tugas turunan seperti generasi gambar-ke-video dan kemampuan adaptasi terhadap modul LoRA yang spesifik untuk gerakan kamera. Terakhir, kami mendemonstrasikan bahwa model kami menyediakan prior 3D multi-view yang kuat dan dapat berfungsi sebagai dasar untuk melatih model difusi multi-view yang secara bersama-sama menghasilkan beberapa tampilan objek secara feedforward, melampaui metode berbasis gambar dengan sepersekian dari anggaran komputasi mereka. Kami merilis kode dan bobot model di https URL ini.
Lihat organisasi Stability AI di Hub untuk checkpoint base dan extended frame!
Pastikan Anda telah menginstal pustaka berikut.
# Uncomment to install the necessary libraries in Colab
!pip install -q -U diffusers transformers accelerateTerdapat dua varian dari model ini, yaitu SVD dan SVD-XT. Checkpoint SVD dilatih untuk menghasilkan 14 frame, sedangkan checkpoint SVD-XT dipoles lebih lanjut untuk menghasilkan 25 frame.
Anda akan menggunakan checkpoint SVD-XT untuk panduan ini.
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
export_to_video(frames, "generated.mp4", fps=7)
torch.compile
Anda dapat memperoleh peningkatan kecepatan 20-25% dengan sedikit peningkatan memori melalui kompilasi UNet.
- pipe.enable_model_cpu_offload()
+ pipe.to("cuda") # or "mps", "xpu", "cpu"
+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)Kurangi penggunaan memori
Generasi video sangat intensif terhadap memori karena pada dasarnya Anda menghasilkan num_frames sekaligus, mirip dengan generasi teks-ke-gambar dengan ukuran batch yang tinggi. Untuk mengurangi kebutuhan memori, terdapat beberapa opsi yang mengorbankan kecepatan inferensi demi kebutuhan memori yang lebih rendah:
- mengaktifkan offloading model: setiap komponen pipeline akan di-offload ke CPU begitu tidak lagi dibutuhkan.
- aktifkan chunking feed-forward: lapisan feed-forward dijalankan dalam sebuah loop alih-alih menjalankan satu feed-forward dengan ukuran batch yang sangat besar.
- reduce
decode_chunk_size: VAE mengodekan ulang frame dalam chunk alih-alih mengodekan semuanya sekaligus. Mengaturdecode_chunk_size=1akan mengodekan satu frame pada satu waktu dan menggunakan memori paling sedikit (kami menyarankan untuk menyesuaikan nilai ini berdasarkan memori GPU Anda) tetapi video mungkin mengalami beberapa flickering.
- pipe.enable_model_cpu_offload()
- frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
+ pipe.enable_model_cpu_offload()
+ pipe.unet.enable_forward_chunking()
+ frames = pipe(image, decode_chunk_size=2, generator=generator, num_frames=25).frames[0]Menggunakan semua trik ini secara bersamaan seharusnya dapat menurunkan kebutuhan memori menjadi kurang dari 8GB VRAM.
Micro-conditioning
Stable Diffusion Video juga menerima micro-conditioning, selain gambar conditioning, yang memungkinkan kontrol lebih besar terhadap video yang dihasilkan:
fps: jumlah frame per detik dari video yang dihasilkan.motion_bucket_id: id bucket gerak yang akan digunakan untuk video yang dihasilkan. Parameter ini dapat digunakan untuk mengontrol gerak pada video yang dihasilkan. Meningkatkan nilai id bucket gerak akan meningkatkan gerak pada video yang dihasilkan.noise_aug_strength: jumlah noise yang ditambahkan ke gambar conditioning. Semakin tinggi nilainya, semakin kecil kemiripan video dengan gambar conditioning. Meningkatkan nilai ini juga meningkatkan gerakan pada video yang dihasilkan.
Sebagai contoh, untuk menghasilkan video dengan lebih banyak gerakan, gunakan parameter mikro-kondisi motion_bucket_id dan noise_aug_strength:
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator, motion_bucket_id=180, noise_aug_strength=0.1).frames[0]
export_to_video(frames, "generated.mp4", fps=7)
StableVideoDiffusionPipeline
kelas diffusers.StableVideoDiffusionPipeline
< source >( vae: AutoencoderKLTemporalDecoderimage_encoder: CLIPVisionModelWithProjectionunet: UNetSpatioTemporalConditionModelscheduler: EulerDiscreteSchedulerfeature_extractor: CLIPImageProcessorPil )
Parameter
- vae (
AutoencoderKLTemporalDecoder) — Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten. - image_encoder (CLIPVisionModelWithProjection) — Encoder gambar CLIP yang dibekukan (laion/CLIP-ViT-H-14-laion2B-s32B-b79K).
- unet (
UNetSpatioTemporalConditionModel) —UNetSpatioTemporalConditionModeluntuk menghilangkan noise pada latens gambar yang telah dienkod. - scheduler (EulerDiscreteScheduler) —
Scheduler yang digunakan bersama
unetuntuk menghilangkan noise pada latens gambar yang telah dikodekan. - feature_extractor (CLIPImageProcessor) —
CLIPImageProcessoruntuk mengekstrak fitur dari gambar yang dihasilkan.
Pipeline untuk menghasilkan video dari gambar input menggunakan Stable Video Diffusion.
Model ini mewarisi dari DiffusionPipeline. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.).
StableVideoDiffusionPipelineOutput
kelas diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput
< source >( frames: typing.Union[list[list[PIL.Image.Image]], numpy.ndarray, torch.Tensor] )
Kelas output untuk pipeline Stable Video Diffusion.