Hotshot-XL 是一个建立在 Stable Diffusion XL(SDXL)之上的视频生成微调方案。它并不是重新训练一个完整的视频扩散模型,而是在已有的 SDXL 图像生成能力基础上,扩展出时间维度上的建模模块,让模型可以一次生成多帧连续画面。通过冻结大部分原始权重、只训练新增的时间层,开发者可以用相对较低的成本将 SDXL 适配到短视频生成任务。

一、Hotshot-XL如何扩展SDXL的时空建模能力
原始 SDXL 的 UNet 主要由二维卷积、空间自注意力和交叉注意力层堆叠而成,每一层的输入和输出都是单张图像的潜空间特征。对于一个包含 N 帧的视频片段,最简单的方式是将每一帧单独送入 UNet,但这样不同帧之间没有任何信息交互,生成的画面在物体轮廓、光影和纹理上都会出现较大差异。Hotshot-XL 的做法是在每个空间注意力和交叉注意力层之后,增加一个时间注意力层,同时在部分残差块中插入一维时间卷积。这样模型在处理视频序列时,会把 N 帧特征拼接起来,在时间轴上进行注意力计算,从而让每一帧的特征都融合了前后帧的信息。
为了感知帧的顺序,Hotshot-XL 还引入了可学习的时间位置编码。时间位置编码和空间位置编码类似,不过它是施加在时间维度上的向量,可以告诉模型当前特征是来自第几帧。训练时,这些新增的时间模块会随机初始化,而原始 SDXL 的空间权重则保持冻结。这样做有两个好处:一是参数量小,时间层通常只占整个 UNet 的百分之几,显存占用增加不明显;二是能够避免小规模视频数据破坏 SDXL 已经学到的图像先验。实际测试中,这种冻结空间主干、只训练时间模块的策略,可以让模型在很少的视频数据上快速收敛,同时保留 SDXL 对文本提示的敏感度和画面质量。
下面的代码展示了如何通过 Diffusers 加载一个已经微调好的 Hotshot-XL 模型并生成视频帧。
from diffusers import HotshotXLPipeline
import torch
pipe = HotshotXLPipeline.from_pretrained("hotshotco/Hotshot-XL")
pipe = pipe.to("cuda")
prompt = "a cat running in a field, motion blur"
frames = pipe(
prompt,
num_frames=8,
height=512,
width=512,
num_inference_steps=30,
guidance_scale=7.5
).frames
# frames 是一个列表,每个元素是一帧 PIL 图像
for i, frame in enumerate(frames):
frame.save(f"frame_{i:02d}.png")
在模型结构层面,时间注意力层并不是简单复制空间注意力,它通常使用独立的查询、键、值投影矩阵,并且只对时间维度做注意力计算,空间维度保持原样。时间卷积则使用较小的卷积核,例如 3x1x1 或 3x3x3 的深度可分离卷积,目的是在时间轴上混合相邻帧的特征。这种设计让模型可以灵活处理不同长度的视频序列,同时保持空间细节不被破坏。
二、视频数据准备与微调训练流程
微调 Hotshot-XL 需要准备短视频片段,一般建议每条视频包含 8 到 32 帧,帧率在 8fps 到 16fps 之间。视频内容最好主体明确、运动幅度适中,避免频繁的镜头切换和剧烈抖动,否则模型很难学习到稳定的时序一致性。对于每个视频片段,需要提取出所有帧并保存为图像文件,同时为整个片段配一段文本描述。公开数据集如 WebVid-10M 或 Something-Something V2 可以直接使用,但它们通常分辨率较低或动作过于单一,更实际的做法是从自有素材中筛选出几百到几千条高质量视频,再结合 BLIP 等 captioning 模型生成文本标注。
数据目录通常按照视频 ID 分文件夹存放帧图像,元数据记录在一个 JSONL 文件中。每行包含视频标识、文本提示、帧数量和起始帧索引等信息。训练时,数据加载器会随机采样连续帧片段,并统一缩放到 512x512 或 768x768 分辨率。为了减少 IO 压力,可以提前将所有帧编码成潜空间张量并缓存到磁盘,但这样会占用较多存储空间。对于大多数实验来说,直接实时读取图像并用预训练 VAE 编码是更灵活的选择。
下面是一个简化的数据配置和元数据示例。
{
"video_id": "video_001",
"caption": "a person walking on a city street, camera follows from behind",
"num_frames": 16,
"fps": 8,
"resolution": [512, 512]
}
训练脚本可以基于 SDXL 的官方微调脚本修改。核心思路是加载 SDXL 的 UNet 后,冻结所有原始参数,只对名称中包含 temporal 或 time 的模块设置 requires_grad 为 True。优化器使用 AdamW,学习率一般在 1e-4 到 5e-4 之间,同时配合 warmup 和余弦退火。批次大小通常设置为 1 或 2,梯度累积步数设置在 4 到 8,这样可以在显存有限的单卡或多卡上完成训练。损失函数仍然使用扩散模型标准的噪声预测均方误差,只是噪声会同时加到所有帧的潜空间特征上,模型需要在时间维度上同时去噪。
下面这段代码展示了如何只启用时间层进行训练。
for name, param in unet.named_parameters():
if "temporal" in name or "time" in name:
param.requires_grad = True
else:
param.requires_grad = False
optimizer = torch.optim.AdamW(
filter(lambda p: p.requires_grad, unet.parameters()),
lr=1e-4,
weight_decay=1e-2
)
实际训练时还需要注意,VAE 和文本编码器通常完全冻结,不参与梯度更新。这样可以进一步降低显存占用,并且让文本理解能力保持稳定。如果使用多卡训练,可以结合 DeepSpeed 或 FSDP 进行分布式训练,但需要确保时间层在前向传播时能够正确跨帧通信,避免把视频帧错误地拆到不同设备上。
三、推理加速与生成质量调优
推理阶段,Hotshot-XL 可以使用 DDIM、DPM++ 等采样器,步数设置在 25 到 50 步之间即可获得稳定结果。如果显存不足,可以开启注意力切片、VAE 切片或 CPU offload 来降低峰值显存。帧间闪烁是视频生成中最常见的质量问题,除了训练时保证数据质量之外,推理时也有一些技巧可以缓解。例如,在采样过程中为所有帧使用相同的初始噪声,或者对每帧的潜特征做轻微的时间平滑,都可以减少相邻帧之间的高频抖动。此外,使用较长的提示词并明确描述运动类型,如 slow motion、camera pan 或 object rotation,有助于模型生成更受控的动态效果。
生成得到的多帧图像可以通过 imageio 或 ffmpeg 合成为 MP4 视频。下面是一个使用 imageio 的简单示例。
import imageio
import numpy as np
video_path = "output.mp4"
fps = 8
writer = imageio.get_writer(video_path, fps=fps)
for frame in frames:
writer.append_data(np.array(frame))
writer.close()
如果对生成视频的流畅度不满意,还可以使用 RIFE 或 FILM 等插帧模型将 8fps 提高到 24fps 或 30fps。但插帧只能补充中间运动,无法修复语义层面的断裂。因此,对于要求较高的应用,建议在训练数据阶段就增加更多具有连续运动和稳定镜头的视频,并在推理时通过固定随机种子和降低 CFG scale 来稳定输出。CFG scale 过高容易放大噪声,导致帧间细节突变,通常保持在 6.5 到 8.5 之间比较合适。
另一个实用的优化方向是使用 xformers 或 FlashAttention 来加速时间注意力层的计算。由于时间注意力层会在多帧序列上进行注意力运算,序列长度从单帧的 token 数量变成了帧数乘以空间 token 数,计算量明显增加。启用内存高效的注意力实现可以将推理时间缩短 30% 到 50%,同时不影响生成质量。在训练时也可以使用混合精度训练,进一步降低显存占用。
四、微调实战中的避坑要点
很多人在开始微调时容易忽略数据配比的问题。如果训练视频中大部分是静止场景或缓慢运动,模型生成的视频也会偏向静态,无法产生预期的动作。因此,在构建数据集时应该有意识地平衡不同运动类型,例如人物行走、物体旋转、镜头平移等,并在文本描述中准确体现这些运动。数据加载过程中还要注意随机采样帧片段时不要跨越不同视频的边界,避免将两个无关场景拼在一起导致模型学到错误的时序关系。
另一个常见误区是过度训练新增时间层。虽然时间模块参数量不大,但如果在小数据集上训练过久,模型会记住训练视频的特定运动模式,对新提示词的泛化能力下降。建议在训练过程中定期使用固定的一组提示词生成样本,观察帧间一致性和文本相关性,一旦发现输出开始过拟合训练数据,就提前停止训练或降低学习率。
关于分辨率,Hotshot-XL 在 512x512 和 768x768 下表现较好,如果直接生成 1024x1024 的高分辨率视频,显存需求和训练难度都会显著上升。对于高分辨率需求,可以先以较低分辨率生成视频,再使用超分辨率模型逐帧放大,或者使用 SDXL 的 refiner 对关键帧进行增强。这样可以在不增加时间层训练成本的情况下获得更清晰的画面。
最后,Hotshot-XL 目前主要面向短视频生成任务,生成时长受限于训练时的帧数范围。如果需要生成更长的视频,可以采用滑动窗口的方式分片段生成再拼接,或者训练更长序列的时间位置编码。但拼接片段之间容易出现语义断裂,需要额外的时间插值或提示词控制来平滑过渡。总的来说,Hotshot-XL 为 SDXL 向视频任务迁移提供了一条低成本的路径,开发者可以根据自己的场景灵活调整数据和训练策略。
Hotshot-XLSDXL视频生成微调修改时间:2026-08-22 04:03:55