CogVideoX
CogVideoX:具有专家Transformer的文本到视频扩散模型,来自清华大学和智谱AI。
论文的摘要是
我们介绍 CogVideoX,这是一个用于根据文本提示生成视频的大规模扩散Transformer模型。为了有效地对视频数据进行建模,我们提出利用3D变分自动编码器(VAE)来压缩视频的时空维度。为了提高文本-视频对齐,我们提出了一种专家Transformer,它使用专家自适应LayerNorm来促进两种模态的深度融合。通过采用渐进式训练技术,CogVideoX擅长生成具有显著运动的连贯、长时程视频。此外,我们还开发了一个有效的文本-视频数据处理管道,包括各种数据预处理策略和视频字幕方法。它显著有助于提高CogVideoX的性能,改善生成质量和语义对齐。结果表明,CogVideoX在多个机器指标和人工评估中均展现出最先进的性能。CogVideoX-2B的模型权重可在https://github.com/THUDM/CogVideo上公开获取。
此管道由zRzRzRzRzRzRzR贡献。原始代码库可以在此处找到。原始权重可以在hf.co/THUDM下找到。
推理
使用torch.compile
来减少推理延迟。
首先,加载管道
import torch
from diffusers import CogVideoXPipeline
from diffusers.utils import export_to_video
pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-2b").to("cuda")
prompt = (
"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."
)
video = pipe(prompt=prompt, guidance_scale=6, num_inference_steps=50).frames[0]
export_to_video(video, "output.mp4", fps=8)
然后将管道 transformer
和 vae
组件的内存布局更改为 torch.channels-last
pipeline.transformer.to(memory_format=torch.channels_last) pipeline.vae.to(memory_format=torch.channels_last)
最后,编译组件并运行推理
pipeline.transformer = torch.compile(pipeline.transformer)
pipeline.vae.decode = torch.compile(pipeline.vae.decode)
# CogVideoX works very well with long and well-described prompts
prompt = "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."
video = pipeline(prompt=prompt, guidance_scale=6, num_inference_steps=50).frames[0]
在 80GB A100 机器上的 [基准测试](TODO: link) 结果为
Without torch.compile(): Average inference time: TODO seconds.
With torch.compile(): Average inference time: TODO seconds.
CogVideoXPipeline
class diffusers.CogVideoXPipeline
< source >( tokenizer: T5Tokenizer text_encoder: T5EncoderModel vae: AutoencoderKLCogVideoX transformer: CogVideoXTransformer3DModel scheduler: Union )
参数
- vae (AutoencoderKL) — 用于将视频编码和解码为潜在表示的变分自动编码器 (VAE) 模型。
- text_encoder (
T5EncoderModel
) — 冻结的文本编码器。CogVideoX 使用 T5;具体来说是 t5-v1_1-xxl 变体。 - tokenizer (
T5Tokenizer
) — 类 T5Tokenizer 的标记器。 - transformer (CogVideoXTransformer3DModel) — 用于对编码后的视频潜在特征进行降噪的文本条件
CogVideoXTransformer3DModel
。 - scheduler (SchedulerMixin) — 与
transformer
结合使用以对编码后的视频潜在特征进行降噪的调度器。
使用 CogVideoX 进行文本到视频生成的管道。
此模型继承自 DiffusionPipeline。查看超类文档以了解库为所有管道实现的通用方法(例如下载或保存、在特定设备上运行等)。
__call__
< source >( 提示: Union = None 负面提示: Union = None 高度: int = 480 宽度: int = 720 帧数: int = 48 FPS: int = 8 推理步骤数: int = 50 时间步长: Optional = None 引导尺度: float = 6 使用动态CFG: bool = False 每个提示的视频数量: int = 1 ETA: float = 0.0 生成器: Union = None 潜在变量: Optional = None 提示嵌入: Optional = None 负面提示嵌入: Optional = None 输出类型: str = 'pil' 返回字典: bool = True 步长结束回调: Union = None 步长结束张量输入: List = ['latents'] 最大序列长度: int = 226 ) → CogVideoXPipelineOutput 或 tuple
参数
- 提示 (
str
或List[str]
, 可选) — 用于引导图像生成的提示或提示列表。如果没有定义,则必须传递prompt_embeds
。 代替。 - 负面提示 (
str
或List[str]
, 可选) — 用于引导图像生成的负面提示或提示列表。如果没有定义,则必须传递negative_prompt_embeds
代替。 当不使用引导时忽略(即,如果guidance_scale
小于1
)。 - 高度 (
int
, 可选, 默认值为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的高度(以像素为单位)。默认情况下设置为 1024,以获得最佳效果。 - 宽度 (
int
, 可选, 默认值为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的宽度(以像素为单位)。默认情况下设置为 1024,以获得最佳效果。 - 帧数 (
int
, 默认值为48
) — 要生成的帧数。必须能被 self.vae_scale_factor_temporal 整除。生成的视频将包含 1 个额外的帧,因为 CogVideoX 受 (num_seconds * fps + 1) 帧的条件约束,其中 num_seconds 为 6,fps 为 4。但是,由于视频可以以任何 fps 保存,因此需要满足的唯一条件是上面提到的可除性。 - 推理步骤数 (
int
, 可选, 默认值为 50) — 降噪步骤数。更多的降噪步骤通常会导致更高的图像质量,但代价是推理速度更慢。 - 时间步长 (
List[int]
, 可选) — 用于降噪过程的自定义时间步长,适用于在set_timesteps
方法中支持timesteps
参数的调度器。如果没有定义,将使用传递num_inference_steps
时的默认行为。必须按降序排列。 - guidance_scale (
float
, 可选, 默认为 7.0) — 如 Classifier-Free Diffusion Guidance 中定义的指导尺度。guidance_scale
定义为 Imagen 论文 中方程 2 的w
。通过将guidance_scale > 1
来启用指导尺度。更高的指导尺度鼓励生成与文本prompt
密切相关的图像,通常以降低图像质量为代价。 - num_videos_per_prompt (
int
, 可选, 默认为 1) — 每个提示要生成的视频数量。 - generator (
torch.Generator
或List[torch.Generator]
, 可选) — 一个或多个 torch 生成器,用于使生成确定性。 - latents (
torch.FloatTensor
, 可选) — 预生成的噪声潜变量,从高斯分布中采样,用作图像生成的输入。可用于调整相同生成的图像,但使用不同的提示。如果未提供,则将通过使用提供的随机generator
采样来生成潜变量张量。 - prompt_embeds (
torch.FloatTensor
, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从prompt
输入参数生成文本嵌入。 - negative_prompt_embeds (
torch.FloatTensor
, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从negative_prompt
输入参数生成 negative_prompt_embeds。 - output_type (
str
, 可选, 默认为"pil"
) — 生成的图像的输出格式。在 PIL 之间选择:PIL.Image.Image
或np.array
。 - return_dict (
bool
, 可选, 默认为True
) — 是否返回~pipelines.stable_diffusion_xl.StableDiffusionXLPipelineOutput
而不是简单的元组。 - callback_on_step_end (
Callable
, 可选) — 在推理期间每个降噪步骤结束时调用的函数。该函数使用以下参数调用:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)
。callback_kwargs
将包含一个所有张量的列表,如callback_on_step_end_tensor_inputs
所指定。 - callback_on_step_end_tensor_inputs (
List
, 可选) —callback_on_step_end
函数的张量输入列表。列表中指定的张量将作为callback_kwargs
参数传递。你只能包含管道类._callback_tensor_inputs
属性中列出的变量。 - max_sequence_length (
int
, 默认为226
) — 编码提示中的最大序列长度。必须与self.transformer.config.max_text_seq_length
一致,否则可能会导致结果不佳。
返回值
CogVideoXPipelineOutput 或 tuple
如果 return_dict
为 True,则返回 CogVideoXPipelineOutput,否则返回 tuple
。返回元组时,第一个元素是包含生成的图像的列表。
调用管道进行生成时调用的函数。
示例
>>> import torch
>>> from diffusers import CogVideoXPipeline
>>> from diffusers.utils import export_to_video
>>> pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-2b", torch_dtype=torch.float16).to("cuda")
>>> prompt = (
... "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."
... )
>>> video = pipe(prompt=prompt, guidance_scale=6, num_inference_steps=50).frames[0]
>>> export_to_video(video, "output.mp4", fps=8)
encode_prompt
< 源代码 >( prompt: Union negative_prompt: Union = None do_classifier_free_guidance: bool = True num_videos_per_prompt: int = 1 prompt_embeds: Optional = None negative_prompt_embeds: Optional = None max_sequence_length: int = 226 device: Optional = None dtype: Optional = None )
参数
- prompt (
str
或List[str]
, 可选) — 要编码的提示 - negative_prompt (
str
或List[str]
, 可选) — 不用于引导图像生成的提示。如果未定义,则必须传递negative_prompt_embeds
。当不使用引导时被忽略(即,如果guidance_scale
小于1
,则被忽略)。 - do_classifier_free_guidance (
bool
, 可选, 默认为True
) — 是否使用分类器自由引导。 - num_videos_per_prompt (
int
, 可选, 默认为 1) — 每个提示应该生成的视频数量。 将生成的嵌入放置到的 torch 设备 - prompt_embeds (
torch.Tensor
, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示权重。如果未提供,将根据prompt
输入参数生成文本嵌入。 - negative_prompt_embeds (
torch.Tensor
, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如 提示权重。如果未提供,将根据negative_prompt
输入参数生成 negative_prompt_embeds。 device — (torch.device
, 可选): torch 设备 dtype — (torch.dtype
, 可选): torch 数据类型
将提示编码为文本编码器隐藏状态。
CogVideoXPipelineOutput
类 diffusers.pipelines.cogvideo.pipeline_cogvideox.CogVideoXPipelineOutput
< 源代码 >( 帧: 张量 )
CogVideo 管道的输出类。