Update report_v3.md (#575)

update according to english version [seems there are some typos in the English version]
This commit is contained in:
Yanjia0 2024-07-08 12:03:26 +08:00 committed by GitHub
parent 189354557a
commit 5ca9c3284d

View file

@ -6,7 +6,7 @@
- [简单有效的模型调节](#简单有效的模型调节)
- [评估](#评估)
在 Open-Sora 1.2 版本中,我们在 >20M 数据上训练了 一个1.1B 的模型,支持 0s~15s、144p 到 720p、各种宽高比的视频生成。我们的配置如下所列。继 1.1 版本之后Open-Sora 1.2 还可以进行图像到视频的生成和视频扩展。
在 Open-Sora 1.2 版本中,我们在 >30M 数据上训练了 一个1.1B 的模型,支持 0s~16s、144p 到 720p、各种宽高比的视频生成。我们的配置如下所列。继 1.1 版本之后Open-Sora 1.2 还可以进行图像到视频的生成和视频扩展。
| | 图像 | 2秒 | 4秒 | 8秒 | 16秒 |
| ---- | ----- | --- | --- | --- | --- |
@ -29,13 +29,12 @@
## 视频压缩网络
对于 Open-Sora 1.0 & 1.1,我们使用了 stable-ai 的 83M 2D VAE它仅在空间维度上压缩将视频压缩 8x8 倍。为了减少时间维度,我们每三帧提取一帧。然而,这种方法导致生成的视频流畅度较低,因为生成的 fps 被牺牲了。因此,在这个版本中,我们引入了像 OpenAI 的 Sora 一样的视频压缩网络。
对于 Open-Sora 1.0 & 1.1,我们使用了 stable-ai 的 83M 2D VAE它仅在空间维度上压缩将视频压缩 8x8 倍。为了减少时间维度,我们每三帧提取一帧。然而,这种方法导致生成的视频流畅度较低,因为牺牲了生成的帧率fps。因此,在这个版本中,我们引入了像 OpenAI 的 Sora 一样的视频压缩网络。该网络在时域上将视频大小压缩至四分之一,因此,我们不必再额外抽帧,而可以使用原有帧率生成模型。
考虑到训练 3D VAE 的计算成本很高,我们希望重新利用在 2D VAE 中学到的知识。我们注意到,经过 2D VAE 压缩后,时间维度上相邻的特征仍然高度相关。因此,我们提出了一个简单的视频压缩网络,首先将视频在空间维度上压缩 8x8 倍,然后将视频在时间维度上压缩 4 倍。网络如下所示:
![video_compression_network](/assets/readme/report_3d_vae.png)
我们用[SDXL 的 VAE](https://huggingface.co/stabilityai/sdxl-vae)初始化 2D VAE ,它比我们以前使用的更好。对于 3D VAE我们采用[Magvit-v2](https://magvit.cs.cmu.edu/v2/)中的 VAE 结构,它包含 300M 个参数。加上 83M 的 2D VAE视频压缩网络的总参数为 384M。我们设定batch size 为 1 对 3D VAE 进行了 1.2M 步的训练。训练数据是来自 pixels 和 pixabay 的视频,训练视频大小主要是 17 帧256x256 分辨率。3D VAE 中使用causal convolotions使图像重建更加准确。
我们的训练包括三个阶段:
@ -44,9 +43,9 @@
2. 对于接下来的 260k 步我们消除identity loss并仅学习 3D VAE。
3. 对于最后 540k 步,由于我们发现仅重建 2D VAE 的特征无法带来进一步的改进因此我们移除了loss并训练整个 VAE 来重建原始视频。此阶段在 24 个 GPU 上进行训练。
对于训练的前半部分,我们采用 20% 的图像和 80% 的视频。我们发现长度不同于 17 帧的视频会出现模糊。因此,我们在 34 帧内使用一个随机数,以使我们的 VAE 对不同长度的视频更具鲁棒性。我们的 [训练](/scripts/train_vae.py)和[推理](/scripts/inference_vae.py)代码可在 Open-Sora 1.2 版本中找到。
对于训练的前半部分,我们采用 20% 的图像和 80% 的视频。按照[Magvit-v2](https://magvit.cs.cmu.edu/v2/),我们使用 17 帧训练视频,同时对图像的前 16 帧进行零填充。然而,我们发现这种设置会导致长度不同于 17 帧的视频变得模糊。因此,在第 3 阶段我们使用不超过34帧长度的任意帧长度视频进行混合视频长度训练,以使我们的 VAE 对不同视频长度更具鲁棒性也就是说如果我们希望训练含有n帧的视频我们就把原视频中`34-n`帧用0进行填充。我们的 [训练](/scripts/train_vae.py)和[推理](/scripts/inference_vae.py)代码可在 Open-Sora 1.2 版本中找到。
当使用 VAE 进行扩散模型时,我们的堆叠 VAE 所需的内存较少,因为我们的 VAE 的输入已经经过压缩。我们还将输入视频拆分为几个 17 帧剪辑,以提高推理效率。我们的 VAE 的性能与[Open-Sora-Plan](https://github.com/PKU-YuanGroup/Open-Sora-Plan/blob/main/docs/Report-v1.1.0.md)中的另一个开源 3D VAE 相当。
当使用 VAE 进行扩散模型时,我们的堆叠 VAE 所需的内存较少,因为我们的 VAE 的输入已经经过压缩。我们还将输入视频拆分为几个 17 帧剪辑,以提高推理效率。我们的 VAE 与[Open-Sora-Plan](https://github.com/PKU-YuanGroup/Open-Sora-Plan/blob/main/docs/Report-v1.1.0.md)中的另一个开源 3D VAE 性能相当。
| 模型 | 结构相似性↑ | 峰值信噪比↑ |
| ------------------ | ----- | ------ |
@ -74,11 +73,16 @@ Open-Sora 1.2 从[PixArt-Σ 2K](https://github.com/PixArt-alpha/PixArt-sigma)
7. 时间注意力模块:我们添加时间注意力模块,其中没有初始化投影层。我们在图像上进行 3k 步训练。
8. 仅针对具有掩码策略的视频的时间块:我们仅在视频上训练时间注意力块,步长为 38k。
经过上述调整后,我们就可以开始在视频上训练模型了。上述调整保留了原始模型生成高质量图像的能力。
经过上述调整后,我们就可以开始在视频上训练模型了。上述调整保留了原始模型生成高质量图像的能力,并未后续的视频生成提供了许多助力:
- 通过整流我们可以加速训练将视频的采样步数从100步减少到30步大大减少了推理的等待时间。
- 使用 qk-norm训练更加稳定并且可以使用积极的优化器。
- 采用新的VAE时间维度压缩了4倍使得训练更加高效。
- 该模型具有多分辨率图像生成能力,可以生成不同分辨率的视频。
## 更多数据和更好的多阶段训练
由于计算预算有限,我们精心安排了训练数据的质量从低到高,并将训练分为三个阶段。我们的训练涉及 12x8 GPU总训练时间约为 2 周。
由于计算预算有限,我们精心安排了训练数据的质量从低到高,并将训练分为三个阶段。我们的训练涉及 12x8 GPU总训练时间约为 2 周 约70k步
### 第一阶段
@ -99,7 +103,14 @@ Open-Sora 1.2 从[PixArt-Σ 2K](https://github.com/PixArt-alpha/PixArt-sigma)
- [Vript](https://github.com/mutonix/Vript/tree/main):一个密集注释的数据集。
- 还有一些其他数据集。
此阶段我们主要在 480p 和 720p 上进行训练。训练配置位于[stage3.py](/configs/opensora-v1-2/train/stage3.py)中。我们对模型进行 15k 步训练,大约为 2 个 epoch。
MiraData 和 Vript 有来自 GPT 的字幕,而我们使用[PLLaVA](https://github.com/magic-research/PLLaVA)为其余字幕添加字幕。与只能进行单帧/图像字幕的 LLaVA 相比PLLaVA 是专门为视频字幕设计和训练的。[加速版PLLaVA](/tools/caption/README.md#pllava-captioning)已在我们的`tools/`中发布。在实践中,我们使用预训练的 PLLaVA 13B 模型,并从每个视频中选择 4 帧生成字幕,空间池化形状为 2*2。
下面显示了此阶段使用的视频数据的一些统计数据。我们提供了持续时间和分辨率的基本统计数据,以及美学分数和光流分数分布。我们还从视频字幕中提取了对象和动作的标签并计算了它们的频率。
![stats](/assets/readme/report-03_video_stats.png)
![object_count](/assets/readme/report-03_objects_count.png)
![object_count](/assets/readme/report-03_actions_count.png)
此阶段我们主要在 720p 和 1080p 上进行训练以提高模型在高清视频上的表现力。在训练中我们使用的掩码率为25%。训练配置位于[stage3.py](/configs/opensora-v1-2/train/stage3.py)中。我们对模型进行 15k 步训练,大约为 2 个 epoch。
## 简单有效的模型调节
@ -113,15 +124,9 @@ Open-Sora 1.2 从[PixArt-Σ 2K](https://github.com/PixArt-alpha/PixArt-sigma)
在推理过程中,我们还可以使用分数来调节模型。对于摄像机运动,我们仅标记了 13k 个具有高置信度的剪辑,并且摄像机运动检测模块已在我们的工具中发布。
[美学评分示例待定]
[动作得分示例待定]
[摄像机运动检测模块有待确定]
## 评估
前,我们仅通过人工评估来监控训练过程,因为 DDPM 训练损失与生成的视频质量没有很好的相关性。但是,对于校正流,我们发现训练损失与生成的视频质量有很好的相关性,如 SD3 中所述。因此,我们跟踪了 100 张图像和 1k 个视频的校正流评估损失。
之前,我们仅通过人工评估来监控训练过程,因为 DDPM 训练损失与生成的视频质量没有很好的相关性。但是,对于校正流,如 SD3 中所述,我们发现训练损失与生成的视频质量有很好的相关性。因此,我们跟踪了 100 张图像和 1k 个视频的校正流评估损失。
我们从 pixabay 中抽样了 1k 个视频作为验证数据集。我们计算了不同分辨率144p、240p、360p、480p、720p下图像和不同长度的视频2s、4s、8s、16s的评估损失。对于每个设置我们等距采样 10 个时间步长。然后对所有损失取平均值。
@ -131,3 +136,24 @@ Open-Sora 1.2 从[PixArt-Σ 2K](https://github.com/PixArt-alpha/PixArt-sigma)
此外,我们还会在训练过程中跟踪[VBench](https://vchitect.github.io/VBench-project/)得分。VBench 是用于短视频生成的自动视频评估基准。我们用 240p 2s 视频计算 vbench 得分。这两个指标验证了我们的模型在训练过程中持续改进。
![VBench](/assets/readme/report_vbench_score.png)
所有评估代码均发布在`eval`文件夹中。查看[评估指南](/eval/README.md)了解更多详细信息。
|模型 | 总得分 | 质量得分 | 语义分数 |
| -------------- | ----------- | ------------- | -------------- |
| Open-Sora V1.0 | 75.91% | 78.81% | 64.28% |
| Open-Sora V1.2 | 79.23% | 80.71% | 73.30% |
## 序列并行
我们使用序列并行来支持长序列训练和推理。我们的实现基于Ulysses工作流程如下所示。启用序列并行后我们只需要将 `all-to-all` 通信应用于STDiT中的空间模块spatial block因为在序列维度上只有对空间信息的计算是相互依赖的。
![SP](/assets/readme/sequence_parallelism.jpeg)
目前,由于训练数据分辨率较小,我们尚未使用序列并行进行训练,我们计划在下一个版本中使用。至于推理,我们可以使用序列并行,以防您的 GPU 内存不足。下表显示,序列并行可以实现加速:
| 分辨率 | 时长 | GPU数量 | 是否启用序列并行 |用时(秒) | 加速效果/GPU |
| ---------- | ------- | -------------- | --------- | ------------ | --------------- |
| 720p | 16秒 | 1 | 否 | 547.97 | - |
| 720p | 16s秒 | 2 | 是 | 244.38 | 12% |