Wan2.1 文生视频 Wan2.1-T2V-14B-Diffusers
Wan2.1 文生视频 Wan2.1-T2V-14B-Diffusers
flyfish
# 设置环境变量,禁用TOKENIZERS_PARALLELISM以避免并行性警告
os.environ["TOKENIZERS_PARALLELISM"] = "false"# 导入必要的库
import torch
from diffusers import AutoencoderKLWan, WanPipeline # Wan模型相关的类
from diffusers.utils import export_to_video # 工具函数,用于导出视频# 定义模型路径
# Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
model_id = "/home/models/Wan-AI/Wan2.1-T2V-14B-Diffusers/"# 加载VAE(变分自编码器)模型
# VAE的作用是将图像压缩到潜在空间(latent space),以及从潜在空间重建图像
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", # 指定子文件夹为"vae"torch_dtype=torch.float32 # 使用float32精度加载模型
)# 加载WanPipeline管道
# WanPipeline是一个完整的文本到视频生成管道,包含所有必要组件
pipe = WanPipeline.from_pretrained(model_id, vae=vae, # 将加载的VAE模型传入管道torch_dtype=torch.bfloat16 # 使用bfloat16精度加载模型,节省显存
)# 将模型移动到GPU设备上以加速计算
pipe.to("cuda")# 定义生成视频的正向提示(prompt)
# 这个提示描述了希望生成的内容
prompt = "A cat walks on the grass, realistic"# 定义负向提示(negative prompt)
# 负向提示用于指定不希望在生成内容中出现的特征
negative_prompt = ("Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, ""static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, ""extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, ""fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
)# 使用管道生成视频
output = pipe(prompt=prompt, # 正向提示negative_prompt=negative_prompt, # 负向提示height=480, # 视频的高度width=832, # 视频的宽度num_frames=81, # 视频的帧数guidance_scale=5.0 # 引导比例,控制生成内容与提示的匹配程度
).frames[0] # 提取生成的第一段视频帧序列# 将生成的视频帧导出为MP4格式文件
export_to_video(output, # 视频帧数据"output.mp4", # 输出文件名fps=15 # 视频帧率(每秒15帧)
)
1. 环境变量设置
import os
os.environ["TOKENIZERS_PARALLELISM"] = "false"
这部分代码的作用是设置环境变量 TOKENIZERS_PARALLELISM
为 "false"
。在使用 huggingface/tokenizers
库时,该设置可以避免在多进程环境下由于并行化和进程分叉导致的死锁问题,消除相应的警告信息。
2. 导入必要的库
import torch
from diffusers import AutoencoderKLWan, WanPipeline
from diffusers.utils import export_to_video
AutoencoderKLWan
和WanPipeline
:这两个类来自diffusers
库,AutoencoderKLWan
通常用于处理自动编码器,它可以将输入数据编码为低维表示,再解码回原始数据;WanPipeline
是一个预定义的管道,用于简化模型的推理过程。export_to_video
:是diffusers
库中的一个实用函数,用于将生成的视频帧序列导出为视频文件。
3. 模型相关设置
# Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
model_id = "/home/models/Wan-AI/Wan2.1-T2V-14B-Diffusers/"
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
pipe = WanPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16)
pipe.to("cuda:1")
model_id
:指定了要使用的模型的路径,这里使用的是Wan-AI/Wan2.1-T2V-14B-Diffusers
模型。AutoencoderKLWan.from_pretrained
:从指定的模型路径加载自动编码器,subfolder="vae"
表示从模型目录下的vae
子文件夹中加载相关文件,torch_dtype=torch.float32
表示使用单精度浮点数进行计算。WanPipeline.from_pretrained
:从指定的模型路径加载预训练的管道,同时传入之前加载的自动编码器vae
,torch_dtype=torch.bfloat16
表示使用bfloat16
数据类型进行计算,这种数据类型在一些 GPU 上可以提高计算效率。
4. 定义提示词和负提示词
prompt = "A cat walks on the grass, realistic"
negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
prompt
:是一个文本提示,用于描述用户希望生成的视频内容,这里描述的是一只猫在草地上行走的逼真场景。negative_prompt
:是一个负提示,用于指定不希望在生成的视频中出现的特征,例如明亮的色调、过度曝光、静态画面、模糊的细节等。
5. 生成视频帧并导出视频
output = pipe(prompt=prompt,negative_prompt=negative_prompt,height=480,width=832,num_frames=81,guidance_scale=5.0
).frames[0]
export_to_video(output, "output.mp4", fps=15)
pipe
:调用加载的管道模型进行推理,传入提示词、负提示词、视频的高度和宽度、帧数以及引导系数等参数。height
和width
:指定生成视频的分辨率。num_frames
:指定生成视频的帧数。guidance_scale
:引导系数,用于控制生成结果与提示词的匹配程度,值越大,生成结果越接近提示词描述的内容。
output
:获取生成的视频帧序列,frames[0]
表示取第一个视频帧序列。export_to_video
:将生成的视频帧序列导出为名为output.mp4
的视频文件,fps=15
表示视频的帧率为 15 帧每秒。
WanPipeline
WanPipeline
类为文本到视频的生成任务提供了一个统一的接口,集成了文本编码、去噪和视频编解码等多个组件
类定义
class WanPipeline(DiffusionPipeline, WanLoraLoaderMixin):
WanPipeline
是自定义的类,它继承自DiffusionPipeline
和WanLoraLoaderMixin
。DiffusionPipeline
是一个基础的扩散模型管道类,提供了诸如模型下载、保存、在特定设备上运行等通用方法。WanLoraLoaderMixin
可能是自定义的混入类,用于处理低秩自适应(LoRA)相关的加载逻辑。
功能和构造函数所需的参数
r"""Pipeline for text-to-video generation using Wan.This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methodsimplemented for all pipelines (downloading, saving, running on a particular device, etc.).Args:tokenizer ([`T5Tokenizer`]):Tokenizer from [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer),specifically the [google/umt5-xxl](https://huggingface.co/google/umt5-xxl) variant.text_encoder ([`T5EncoderModel`]):[T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), specificallythe [google/umt5-xxl](https://huggingface.co/google/umt5-xxl) variant.transformer ([`WanTransformer3DModel`]):Conditional Transformer to denoise the input latents.scheduler ([`UniPCMultistepScheduler`]):A scheduler to be used in combination with `transformer` to denoise the encoded image latents.vae ([`AutoencoderKLWan`]):Variational Auto-Encoder (VAE) Model to encode and decode videos to and from latent representations."""
- 功能概述:
WanPipeline
用于基于文本生成视频。由于继承自DiffusionPipeline
- 参数说明:
tokenizer
:采用的是来自 T5 的T5Tokenizer
,具体为 google/umt5 - xxl 变体。其作用是把输入的文本转换为模型能够处理的 token 序列。text_encoder
:使用的是 T5 的T5EncoderModel
,同样是 google/umt5 - xxl 变体。它的任务是对输入的文本进行编码,将文本转换为特征表示。transformer
:是WanTransformer3DModel
类型的条件变换器,其功能是对输入的潜在表示(latents)进行去噪处理。scheduler
:为UniPCMultistepScheduler
类型的调度器,它与transformer
配合使用,对编码后的图像潜在表示进行去噪。vae
:是AutoencoderKLWan
类型的变分自编码器(VAE),能够将视频编码为潜在表示,也可以将潜在表示解码为视频。