Sora 最新动态
Sora 最近发布了一条 Blog ,里面介绍了最新的进展,团队声称已经从创意社区获得了很多宝贵的反馈建议,并且与视觉艺术家、设计师、创意总监和电影制作人等合作,将内测的一些创意视频公布了出来,大家可以欣赏一下。
但是仍然是只能看,不能用!
Open-Sora
Sora 是等不到了,但是难不住我们开源社区的同志,这不是,开源项目 Open-Sora 横空出世,Open-Sora 实现了先进文生视频技术,并且将源代码、预训练模型、数据处理过程、安装和推理说明、训练过程
都进行了详细的介绍,可谓是功德无量。 2024.03.18
发布了 Open-Sora 1.0
,支持 2s
的 512x512
分辨率的文生视频,目前该项目仍然是早期阶段
,还在积极的开发过程中。Open-Sora 为扩散模型提供了高速训练框架,在 64 帧 512x512 视频上训练时,可以实现 55% 的训练速度加速,并且该框架支持训练 1 分钟 1080p 视频
。
按照现在技术这么快的发展速度,我觉得如果 Sora 再继续狗着不开放,那应该最后免不了被 Open-Sora 挤掉,成为束之高阁得历史展品。下面是 Open-Sora 生成得夜景马路得短视频,我们先睹为快。
项目整体目录结构
rust
Open-Sora
├── README.md
├── docs
│ ├── acceleration.md -> Acceleration & Speed benchmark
│ ├── command.md -> Commands for training & inference
│ ├── datasets.md -> Datasets used in this project
│ ├── structure.md -> This file
│ └── report_v1.md -> Report for Open-Sora v1
├── scripts
│ ├── train.py -> diffusion training script
│ └── inference.py -> Report for Open-Sora v1
├── configs -> Configs for training & inference
├── opensora
│ ├── __init__.py
│ ├── registry.py -> Registry helper
│ ├── acceleration -> Acceleration related code
│ ├── dataset -> Dataset related code
│ ├── models
│ │ ├── layers -> Common layers
│ │ ├── vae -> VAE as image encoder
│ │ ├── text_encoder -> Text encoder
│ │ │ ├── classes.py -> Class id encoder (inference only)
│ │ │ ├── clip.py -> CLIP encoder
│ │ │ └── t5.py -> T5 encoder
│ │ ├── dit
│ │ ├── latte
│ │ ├── pixart
│ │ └── stdit -> Our STDiT related code
│ ├── schedulers -> Diffusion schedulers
│ │ ├── iddpm -> IDDPM for training and inference
│ │ └── dpms -> DPM-Solver for fast inference
│ └── utils
└── tools -> Tools for data processing and more
训练和推理的配置目录如下:
rust
Open-Sora
└── configs -> Configs for training & inference
├── opensora -> STDiT related configs
│ ├── inference
│ │ ├── 16x256x256.py -> Sample videos 16 frames 256x256
│ │ ├── 16x512x512.py -> Sample videos 16 frames 512x512
│ │ └── 64x512x512.py -> Sample videos 64 frames 512x512
│ └── train
│ ├── 16x256x256.py -> Train on videos 16 frames 256x256
│ ├── 16x256x256.py -> Train on videos 16 frames 256x256
│ └── 64x512x512.py -> Train on videos 64 frames 512x512
├── dit -> DiT related configs
│ ├── inference
│ │ ├── 1x256x256-class.py -> Sample images with ckpts from DiT
│ │ ├── 1x256x256.py -> Sample images with clip condition
│ │ └── 16x256x256.py -> Sample videos
│ └── train
│ ├── 1x256x256.py -> Train on images with clip condition
│ └── 16x256x256.py -> Train on videos
├── latte -> Latte related configs
└── pixart -> PixArt related configs
模型
本项目还不忘 diss 了 openai 的"闭源"精神,为了让 AI 更加开放,Open-Sora 致力于打造 Sora 的开源版本,并在报告中详细描述了首次尝试训练基于 Transformer 的视频扩散模型,主要内容如下:
- 使用 Stability-AI 的
2D VAE
。 - 视频训练涉及大量的
token
,考虑到24 帧
的1 分钟
视频共有1440 帧
。 通过VAE
的 4 倍下采样和patch 大小
的 2 倍下采样 ,一共约有有1440x1024≈1.5M token
。 计算150 万
个 token 的全注意力会导致巨大的计算成本,因此改用spatial-temporal attention
来降低 Latte (Latent Diffusion Transformer for Video Generation)的成本。 - 下图是经过测试的四种模型,出于效率考虑选择 STDiT(Sequential),具体的报告可以看这里。
- 本项目基于有效训练的高质量文生图模型框架
PixArt-α
为底座,它具有T5 条件
的DiT 结构
。用PixArt-α
初始化模型,并将插入的时间注意力
的投影层初始化为零。这种初始化保留了模型在开始时生成图像的能力,与同样使用空间-时间注意力机制的 Latte 模型
相比,STDiT
可以更好的利用已经预训练好的图像 DiT 的权重,从而在视频数据上继续训练。插入的 attention 使参数数量从580M
增加到724M
。具体来说整个架构包括一个预训练好的 VAE
,一个文本编码器
和一个利用空间-时间注意力机制的 STDiT
(Spatial Temporal Diffusion Transformer) 模型。其中 STDiT 每层的结构如下图所示。它采用串行的方式在二维的空间注意力模块上叠加一维的时间注意力模块,用于建模时序关系。在时间注意力模块之后,交叉注意力模块用于对齐文本的语意。与全注意力机制相比,这样的结构大大降低了训练和推理开销。
- 借鉴 PixArt-α 和 Stable Video Diffusion 的成功经验,主要分为三个阶段,
第一阶段
是进行图像预训练,初始化一个图像生成模型。第二阶段
是在已经构建的大规模视频数据集上进行视频预训练,学习运动表征。第三阶段
是在一个小规模的高质量视频数据集上进行微调。本项目采用渐进式训练策略:在366K
预训练数据集上训练16x256x256
分辨率,然后在20K
数据集上训练16x256x256 、16x512x512 和 64x512x512
三种分辨率。 使用scaled position embedding
,能够该策略大大降低了计算成本。 - 尝试在 DiT 中使用 3D 补丁嵌入器,目前在
16 帧
训练中每3 帧
采样一次,在64 帧
训练中每2 帧
采样一次。 - 本项目开放出来
3
个预训练模型,分辨有512×512
和256×256
,其中标识HQ
表示使用的是高质量数据。但是需要注意的是,这些模型是在有限的预算下进行训练的。 质量和文本对齐相对较差。 该模型表现不佳,尤其是在生成人的样子,并且无法遵循详细的指令。开发人员仍然在努力提高质量和文本对齐方式。
Resolution | Data | iterations | Batch Size | GPU days (H800) | URL |
---|---|---|---|---|---|
16×512×512 | 20K HQ | 20k | 2×64 | 35 | 🔗 |
16×256×256 | 20K HQ | 24k | 8×64 | 45 | 🔗 |
16×256×256 | 366K | 80k | 8×64 | 117 | 🔗 |
数据
高质量的数据是高质量模型的关键。本项目使用的数据集如下,不仅提供了代码,还提供了处理视频数据的思路。
数据集准备
训练数据应以 CSV 文件形式提供,格式如下:
bash
/absolute/path/to/image1.jpg,标题 1,帧数
/absolute/path/to/image2.jpg,标题2,帧数
本项目中用到的数据集有 HD-VG-130M、Inter4k、Pexels.com,后续还会视情况考虑使用以下数据集。
Name | Size | Description |
---|---|---|
Panda-70M | 70M videos | High quality video-text pairs |
WebVid-10M | 10M videos | Low quality |
InternVid-10M-FLT | 10M videos | |
EGO4D | 3670 hours | |
OpenDV-YouTube | 1700 hours | |
VidProM | 6.69M videos |
将视频分割成片段
来自互联网的原始视频对于训练来说还是太长了, 因此本项目给出脚本检测原始视频中的场景,并根据场景将它们分割成短片,可以安装下面的包来并运行 scene_detect.py 来进行高效处理,需要注意的是运行代码的时候要指定自己的数据集路径。
pip install sceneDetect moviepy opencv-python
生成视频字幕
人工为视频添加描述既昂贵又耗时,所以本项目采用强大的 image captioning
模型来生成视频字幕。虽然 GPT-4V
表现更好,但其 20s/sample
的速度太慢了,而是改为了用 LLaVA
实现 3s/sample
的速度,并且生成质量相当。LLaVA
是 MMMU 中第二好的开源模型,可以接受任何分辨率。
如果使用GPT-4V 模型,可以运行以下命令为使用 GPT-4V 的视频生成字幕,每个 3 帧的视频成本约为 0.01 美元,输出结果是带有路径和标题描述的 CSV 文件。
lua
python -m tools.caption.caption_gpt4 FOLDER_WITH_VIDEOS output.csv --key $OPENAI_API_KEY
如果使用 LLaVA 模型,要先按照官方说明安装 LLaVA ,本项目使用的是 liuhaotian/llava-v1.6-34b 模型来制作视频描述,然后运行以下命令可以获得带有路径和标题的 CSV 文件。
ini
CUDA_VISIBLE_DEVICES=0,1 python -m tools.caption.caption_llava samples output.csv
其他
至于安装部署说明、训练指令说明、推理指令说明等内容请详见 github 项目介绍。