本文是DataWhale开源项目Sora原理与技术实战的第三次打卡任务,简单了解视频生成模型训练所需时间和设备,利用现成开源项目进行尝试。
一.【模型前置工作】
以表格的形式呈现如下数据集信息:
数据集名称 | 数据集描述 | 数据集规模 | 采用技术 | 链接 |
VideoInstruct-100K | 高质量视频对话数据集,包括视频摘要、基于描述的问答和创意/生成性问题解答 | 100,000个视频-对话对 | 人工辅助和半自动注释 | 魔搭社区 |
panda-70m | 包含70M高质量视频字幕对的大规模数据集,包括数据加载、视频分割和字幕模型 | 70,000,000个视频-字幕对 | 数据加载、视频分割、字幕模型 | 魔搭社区 |
Youku-mPLUG | 从优酷网抓取的海量优质短视频内容数据集,包含约36TB视频和文本数据 | 约36TB,包含千万级视频和文本数据 | 从优酷网站抓取 | 魔搭社区 |
MSR-VTT | 开放域视频字幕大规模数据集,由Amazon Mechanical Turk人工标注 | 10,000个视频,每个有20个英文描述句子 | Amazon Mechanical Turk人工标注 | 魔搭社区 |
Shot2Story | 视频文本基准和用于多镜头视频理解的可扩展代码,包含20k视频的详细长摘要和80k视频镜头的镜头字幕 | 20k视频的详细长摘要,80k视频镜头的镜头字幕 | - | 魔搭社区 |
InternVid | 以视频为中心的大规模多模态数据集,包含超过700万个视频,持续近76万小时,产生2.34亿个视频剪辑,附4.1B个单词的详细描述 | 超过700万个视频,持续近76万小时,产生2.34亿个视频剪辑,附4.1B个单词的详细描述 | - | 魔搭社区 |
webvid-10M | 从素材网站抓取的大型文本视频数据集 | 1000万个视频文本对 | 从素材网站抓取 | 魔搭社区 |
二.【lite-sora复现】
1.环境设置
克隆Lite_Sora项目到本地
git clone https://github.com/modelscope/lite-sora
在项目文件夹内执行:
cd lite-sora
conda env create -f environment.yml
在魔塔社区执行以上步骤时,有一定几率出错,暂不清楚原因,在本地则不会
Collecting package metadata (current_repodata.json): failed
UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/main <http://mirrors.aliyun.com/anaconda/pkgs/main>
The channel is not accessible or is invalid.
You will need to adjust your conda configuration to proceed.
Use `conda config --show channels` to view your configuration's current state,
and use `conda config --show-sources` to view config file locations.
下载对应模型文件到文件夹中
注意:在魔塔社区执行以上步骤时可使用下述命令
cd /mnt/workspace/lite-sora/models/text_encoder
wget https://hf-mirror.com/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/text_encoder_2/model.safetensors
cd /mnt/workspace/lite-sora/models/denoising_model
wget https://hf-mirror.com/ECNU-CILab/lite-sora-v1-pixabay100/resolve/main/denoising_model/model.safetensors
cd /mnt/workspace/lite-sora/models/vae
wget https://hf-mirror.com/stabilityai/stable-video-diffusion-img2vid-xt/resolve/main/vae/diffusion_pytorch_model.fp16.safetensors
2.再训练
下载视频数据集
git clone https://github.com/ECNU-CILAB/Pixabay100
在litesora路径内执行训练,注意lightning库
from litesora.data import TextVideoDataset # 从litesora.data导入TextVideoDataset类
from litesora.models import SDXLTextEncoder2 # 从litesora.models导入SDXLTextEncoder2类
from litesora.trainers.v1 import LightningVideoDiT # 从litesora.trainers.v1导入LightningVideoDiT类
import lightning as pl # 导入lightning库并简写为pl
import torch # 导入torch库
if __name__ == '__main__':
# 初始化数据集和数据加载器
dataset = TextVideoDataset("data/pixabay100", "data/pixabay100/metadata.json",
num_frames=64, height=64, width=64) # 创建TextVideoDataset实例
train_loader = torch.utils.data.DataLoader(dataset, shuffle=True, batch_size=1, num_workers=8) # 创建训练数据加载器
# 初始化模型
model = LightningVideoDiT(learning_rate=1e-5) # 创建LightningVideoDiT实例,设置学习率
model.text_encoder.load_state_dict_from_diffusers("models/text_encoder/model.safetensors") # 从diffusers加载文本编码器的预训练权重
# 训练设置
trainer = pl.Trainer(max_epochs=100000, accelerator="gpu", devices="auto", callbacks=[
pl.pytorch.callbacks.ModelCheckpoint(save_top_k=-1) # 配置训练过程中的模型保存策略
])
trainer.fit(model=model, train_dataloaders=train_loader) # 开始训练模型
tensorboard --logdir .
可用于查看训练过程的损失。
3.推理
from litesora.models import SDXLTextEncoder2, VideoDiT # 从litesora.models导入SDXLTextEncoder2和VideoDiT模型
from litesora.pipelines import PixelVideoDiTPipeline # 从litesora.pipelines导入PixelVideoDiTPipeline管道
from litesora.data import save_video # 从litesora.data导入save_video函数用于保存视频
import torch # 导入torch库
# 初始化模型
text_encoder = SDXLTextEncoder2.from_diffusers("models/text_encoder/model.safetensors") # 从diffusers加载文本编码器模型
denoising_model = VideoDiT.from_pretrained("models/denoising_model/model.safetensors") # 从预训练模型加载去噪视频模型
# 初始化管道
pipe = PixelVideoDiTPipeline(torch_dtype=torch.float16, device="cuda") # 创建PixelVideoDiTPipeline实例,并设置为使用float16精度在CUDA上运行
pipe.fetch_models(text_encoder, denoising_model) # 将加载的模型传递给管道
# 生成视频
prompt = "woman, flowers, plants, field, garden" # 定义生成视频的文本提示
video = pipe(prompt=prompt, num_inference_steps=100) # 使用管道生成视频,设置推理步骤数量为100
# 保存视频
# 将生成的视频保存为MP4文件,原始分辨率为64*64,此处将其放大到512*512
save_video(video, "output.mp4", upscale=8)
from litesora.models import SDVAEEncoder, SVDVAEDecoder # 从litesora.models导入SDVAEEncoder和SVDVAEDecoder模型
from litesora.data import load_video, tensor2video, concat_video, save_video # 导入处理视频的函数
import torch # 导入torch库
from tqdm import tqdm # 导入tqdm库用于显示进度条
# 加载视频帧
frames = load_video("data/pixabay100/videos/168572 (Original).mp4",
num_frames=1024, height=1024, width=1024, random_crop=False) # 加载指定路径视频文件的帧
frames = frames.to(dtype=torch.float16, device="cpu") # 将视频帧转换为float16类型,并放在CPU上
# 初始化模型
encoder = SDVAEEncoder.from_diffusers("models/vae/model.safetensors").to(dtype=torch.float16, device="cuda") # 从diffusers加载并初始化SDVAEEncoder模型,并设置为float16精度在CUDA上运行
decoder = SVDVAEDecoder.from_diffusers("models/vae/model.safetensors").to(dtype=torch.float16, device="cuda") # 从diffusers加载并初始化SVDVAEDecoder模型,并设置为float16精度在CUDA上运行
with torch.no_grad(): # 不计算梯度以节省内存和计算资源
print(frames.shape) # 打印加载的视频帧的形状
latents = encoder.encode_video(frames, progress_bar=tqdm) # 使用编码器编码视频帧,并显示进度条
print(latents.shape) # 打印编码后的潜在向量的形状
decoded_frames = decoder.decode_video(latents, progress_bar=tqdm) # 使用解码器解码潜在向量回视频帧,并显示进度条
video = tensor2video(concat_video([frames, decoded_frames])) # 将原始视频帧和解码后的视频帧拼接,并转换为视频格式
save_video(video, "video.mp4", fps=24) # 保存视频文件到指定路径,设置帧率为24fps
三.【结果评价】
项目团队在Pixabay100数据集上进行了模型训练,旨在验证训练流程的有效性。该模型以64*64像素分辨率进行训练和输出,尽管取得了高训练精度,但由于数据集规模有限,模型表现出过拟合现象,缺乏泛化能力。
如:
"woman, flowers, plants, field, garden"
而其他如简单的单个单词prompts,没有有意义画面。
"ocean"
"forest"
"city"
"mountain"
【引用】
Sora原理与技术实战 - 飞书云文档 (feishu.cn)
https://github.com/datawhalechina/sora-tutorial/blob/main/docs/chapter3/chapter3_1/chapter3_1.md
modelscope/lite-sora: An initiative to replicate Sora (github.com)