Open-Sora 高压缩自编码器(Video DC-AE)实战指南:10× 推理加速与 5.2× 训练吞吐提升
2026/9/10 13:46:42 网站建设 项目流程

Open-Sora 高压缩自编码器(Video DC-AE)实战指南:10× 推理加速与 5.2× 训练吞吐提升

【免费下载链接】Open-SoraOpen-Sora: Democratizing Efficient Video Production for All项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora

Open-Sora v2 通过引入高压缩视频自编码器 Video DC-AE(4×32×32下采样),大幅削减视频扩散模型的 token 数量与注意力计算开销,实现训练吞吐约 5.2×、推理速度约 10× 的提升。本文基于仓库 docs/hcae.md 展开,结合 configs/diffusion/inference/high_compression.py、configs/diffusion/train/high_compression.py 与 opensora/models/dc_ae/models/dc_ae.py 等源码,完整讲解模型下载、推理与训练的具体命令、配置参数含义、以及 DC-AE 的核心实现原理与权衡,帮助你基于该模型自行复现与继续探索。

一、背景:为什么需要高压缩自编码器

视频生成模型训练成本高昂,其根源在于两大因素:token 数量庞大注意力计算占绝对主导地位。扩散模型(如 DiT / FLUX 类架构)的复杂度随序列长度(token 数)呈二次增长,帧数越多、分辨率越高,注意力矩阵规模增长越快。

传统 VAE 方案(如 HunyuanVideo 的 VAE,下采样比通常为8×8×8或更低)会在 latent 空间保留较多 token,导致训练成本居高不下。为了进一步压缩训练与推理开销,Open-Sora v2 探索了高压缩自编码器 Video DC-AE:将下采样比提高到4×32×32(时间维度 4×、空间 H/W 各 32×),即dc-ae-f32t4c128模型。

下采样比提升的直接收益是 latent token 数量急剧减少。即便把 patch size 进一步降到1(原先需要较大的 patch 来压低 token 数),整体的 token 数量仍然远低于传统方案。根据 docs/hcae.md 的对比:

  • 训练吞吐提升约 5.2×
  • 推理速度提升约 10×

二、权衡与挑战:大通道数下的收敛问题

高压缩并非没有代价。更极端的压缩意味着 latent 通道数显著增大(本模型为128 通道),而大通道数会拖慢收敛速度。文档中给出的观察数据:

  • 采用 128 通道 Video DC-AE 适配的生成模型,训练 25K iterations 后 loss 仅降到0.5的水平;
  • 相比之下,初始化模型(原始低压缩方案)可以达到0.1的 loss 水平。

因此,快速视频生成模型在重建/生成质量上低于原始模型,但它仍然能够捕捉时空关系(spatial-temporal relationships),具备可用的生成能力。作者将其以开源形式发布给研究社区,供进一步探索与改进。这意味着本模型更适合对推理/训练成本敏感、或用于快速原型与二次研究的场景,而不是无条件替换原有高质量模型。

三、模型下载

模型权重由hpcai-tech/Open-Sora-v2-Video-DC-AE发布,可通过huggingface-cli下载到本地ckpts目录:

pip install "huggingface_hub[cli]" huggingface-cli download hpcai-tech/Open-Sora-v2-Video-DC-AE --local-dir ./ckpts

下载完成后,ckpts目录下应至少包含两个权重文件:

权重文件用途
Open_Sora_v2_Video_DC_AE.safetensors快速视频生成模型(DiT)权重
F32T4C128_AE.safetensorsDC-AE 自编码器权重

这两个路径正是 configs/diffusion/inference/high_compression.py 与 configs/diffusion/train/high_compression.py 中model.from_pretrainedae.from_pretrained所引用的位置,需与配置保持一致。

四、推理:单卡运行快速视频生成模型

使用 scripts/diffusion/inference.py 配合推理配置 configs/diffusion/inference/high_compression.py 即可生成视频:

torchrun --nproc_per_node 1 --standalone scripts/diffusion/inference.py configs/diffusion/inference/high_compression.py --prompt "The story of a robot's life in a cyberpunk setting."

命令要点:

  • --nproc_per_node 1 --standalone:单机单卡即可完成推理,因为推理配置中显式关闭了并行插件(见下文);
  • --prompt:直接以命令行方式传入文本提示词,推理脚本会将其写入临时 CSV 作为数据集(见 scripts/diffusion/inference.py 中create_tmp_csv的逻辑);
  • 输出视频默认写入配置的save_dir目录。

4.1 推理配置逐项解析

推理配置 configs/diffusion/inference/high_compression.py 结构如下:

_base_ = ["t2i2v_768px.py"] # no need for parallelism plugin = None plugin_config = None plugin_ae = None plugin_config_ae = None # model settings patch_size = 1 model = dict( from_pretrained="./ckpts/Open_Sora_v2_Video_DC_AE.safetensors", in_channels=128, cond_embed=True, patch_size=1, ) # AE settings ae = dict( _delete_=True, type="dc_ae", from_scratch=True, model_name="dc-ae-f32t4c128", from_pretrained="./ckpts/F32T4C128_AE.safetensors", use_spatial_tiling=True, use_temporal_tiling=True, spatial_tile_size=256, temporal_tile_size=32, tile_overlap_factor=0.25, ) ae_spatial_compression = 32 sampling_option = dict( num_frames=128, )

关键配置含义如下:

配置项说明
_base_["t2i2v_768px.py"]继承 768px 文生图/图生视频基础配置(见 configs/diffusion/inference/plugins/t2i2v.py),本文件在其上覆盖模型与 AE 定义
plugin/plugin_configNone关闭生成模型侧的并行插件。因为 token 数已大幅减少,单卡即可推理,无需张量/序列并行
plugin_ae/plugin_config_aeNone同时关闭 AE 侧的并行
patch_size1latent patch 大小设为 1,充分利用高压缩带来的 token 红利
model.in_channels128DiT 的输入通道数,与 DC-AE 的 latent 通道数 128 严格对应
model.from_pretrained./ckpts/Open_Sora_v2_Video_DC_AE.safetensors快速生成模型权重
model.cond_embedTrue启用条件嵌入层,用于传入 i2v/v2v 信息(t2v 时该层置零,见 plugins/t2i2v.py 注释)
ae.type"dc_ae"注册于 opensora/models/dc_ae/ae_model_zoo.py 的模块构建函数
ae.model_name"dc-ae-f32t4c128"模型 zoo 中注册的型号,对应f32(空间 32×)、t4(时间 4×)、c128(128 通道),见 ae_model_zoo.py
ae.from_scratchTrue从零构建网络结构,不通过 HuggingFace Hub 加载预训练结构权重
ae.from_pretrained./ckpts/F32T4C128_AE.safetensors再从本地 safetensors 恢复 DC-AE 权重(load_checkpoint,见 ae_model_zoo.py)
ae.use_spatial_tiling/use_temporal_tilingTrue空间/时间维度分块(tiling)推理,避免显存爆炸
ae.spatial_tile_size256空间分块尺寸(像素)
ae.temporal_tile_size32时间分块尺寸(帧数)
ae.tile_overlap_factor0.25相邻 tile 重叠比例,用于消除拼接接缝
ae_spatial_compression32空间压缩比,供训练/推理流程计算 latent 尺寸
sampling_option.num_frames128生成 128 帧视频

4.2 分块(Tiling)机制的源码级说明

高分辨率/长时序下,DC-AE 的编解码显存开销很大,因此配置默认开启use_spatial_tilinguse_temporal_tiling。在 opensora/models/dc_ae/models/dc_ae.py 中,encode入口按如下优先级分派:

def encode(self, x: torch.Tensor) -> torch.Tensor: if self.use_temporal_tiling and x.shape[2] > self.temporal_tile_size: return self.temporal_tiled_encode(x) elif self.use_spatial_tiling and (x.shape[-1] > self.spatial_tile_size or x.shape[-2] > self.spatial_tile_size): return self.spatial_tiled_encode(x) else: return self._encode(x)
  • 时间分块:沿帧轴以temporal_tile_size * (1 - tile_overlap_factor)为步长切块,逐块编码后在 latent 空间用blend_t做线性渐变融合(见 dc_ae.py);
  • 空间分块:在 H/W 维度以spatial_tile_size * (1 - tile_overlap_factor)为步长切块,重叠区域按blend_v/blend_h融合(见 dc_ae.py);
  • tile_overlap_factor = 0.25意味着每块边缘 25% 的区域参与加权过渡,从而抑制 tile 边界处的接缝伪影。

解码侧(decode,见 dc_ae.py)遵循完全对称的分块与融合逻辑。另外注意,tile 尺寸必须能被压缩比整除:spatial_tile_size // spatial_compression_ratiotemporal_tile_size // time_compression_ratio在构造DCAE时会被断言(见 dc_ae.py)。

五、训练:8 卡训练你自己的快速生成模型

5.1 数据准备

训练前需要准备符合格式的视频-文本数据集。文档要求先阅读 docs/train.md 中的Prepare dataset章节:数据集须为csvparquet文件,至少包含以下列:

path,text,num_frames,height,width,aspect_ratio,resolution,fps

文档以 45k Pexels 数据集为例(下载后置于datasets/pexels_45k),其中pexels_45k_necessary.csv已包含训练所需的全部信息;若只有原始pexels_45k.csv,可先用 scripts/cnv/meta.py 处理生成:

# 并行处理 python scripts/cnv/meta.py --input datasets/pexels_45k.csv --output datasets/pexels_45k_nec.csv --num_workers 64

5.2 启动训练

torchrun --nproc_per_node 8 scripts/diffusion/train.py configs/diffusion/train/high_compression.py --dataset.data-path datasets/pexels_45k_necessary.csv

要点:

  • 与推理(单卡)不同,训练默认采用8 卡(--nproc_per_node 8
  • --dataset.data-path用于命令行覆盖配置中的数据集路径(mmengine 配置体系支持命令行覆盖字典字段,详见 docs/train.md);
  • 训练脚本入口为 scripts/diffusion/train.py。

5.3 训练配置逐项解析

训练配置 configs/diffusion/train/high_compression.py 的关键字段:

_base_ = ["image.py"] bucket_config = { "_delete_": True, "768px": { 1: (1.0, 20), 16: (1.0, 8), 20: (1.0, 8), ... 128: (1.0, 2), # 30s }, } condition_config = dict( t2v=1, i2v_head=7, ) grad_ckpt_settings = (100, 100) patch_size = 1 model = dict( from_pretrained=None, grad_ckpt_settings=grad_ckpt_settings, in_channels=128, cond_embed=True, patch_size=patch_size, ) ae = dict( _delete_=True, type="dc_ae", model_name="dc-ae-f32t4c128", from_pretrained="./ckpts/F32T4C128_AE.safetensors", from_scratch=True, scaling_factor=0.493, use_spatial_tiling=True, use_temporal_tiling=True, spatial_tile_size=256, temporal_tile_size=32, tile_overlap_factor=0.25, ) is_causal_vae = False ae_spatial_compression = 32 ckpt_every = 250 lr = 3e-5 optim = dict(lr=lr)

与推理配置相比,训练配置的关键差异:

配置项说明
_base_["image.py"]继承 configs/diffusion/train/image.py 的 FLUX DiT 基础结构(hidden_size=3072、depth=19、38 个 single block 等)
bucket_config_delete_=True后重定义抛弃基础配置中的多分辨率 bucket,只保留 768px 一档;键为帧数,值为(采样概率, batch size)元组,例如128: (1.0, 2)表示 128 帧视频以 100% 概率采样、batch size 2
condition_configt2v=1, i2v_head=7同时训练文生视频(t2v)与图生视频(i2v)条件
grad_ckpt_settings(100, 100)梯度检查点开关阈值(在满足条件的位置启用 activation checkpointing 以省显存)
model.in_channels128与 DC-AE latent 通道数一致
model.from_pretrainedNone从零训练生成模型(finetune 时改为权重路径)
ae.scaling_factor0.493latent 的缩放系数:编码时除以该值、解码时乘回(见 dc_ae.py 与 decode_single),用于稳定扩散训练
is_causal_vaeFalse本方案非因果 VAE(区别于 image.py 中的 HunyuanVideo 因果 VAE),时序依赖由 DC-AE 的 3D 卷积结构自身处理
ckpt_every250每 250 步保存一次 checkpoint(高压缩方案训练更快,因此保存更频繁)
lr3e-5学习率,通过optim = dict(lr=lr)同步到优化器

训练过程中可观察到的现象:由于 128 通道 latent 带来的收敛困难,loss 曲线会比低压缩模型下降得更慢(文档给出的参考:25K 步后约 0.5 对 0.1),需要更多迭代或调整学习率/损失权重来逼近目标质量。

六、DC-AE 模型结构与注册机制

6.1 模型注册与构建

DC-AE 通过注册表接入 Open-Sora 的模块体系。构建入口为 opensora/models/dc_ae/ae_model_zoo.py 中的DC_AE工厂函数,它:

  1. from_scratch决定是从结构构建还是从 HuggingFace 拉取预训练结构;
  2. 若提供from_pretrained本地路径,则调用load_checkpoint恢复权重;
  3. 将 tiling 相关参数(use_spatial_tilinguse_temporal_tilingspatial_tile_sizetemporal_tile_sizetile_overlap_factor)挂到模型实例上,供编解码分派使用;
  4. 若提供scaling_factor则覆盖默认值。

dc-ae-f32t4c128是 ae_model_zoo.py 中唯一注册的 DC-AE 型号。

6.2 网络结构细节(源码级)

dc_ae_f32工厂函数(见 opensora/models/dc_ae/models/dc_ae.py)定义了该型号的完整结构参数:

结构参数编码器 Encoder解码器 Decoder
压缩比时间 4×(time_compression_ratio=4)、空间 32×(spatial_compression_ratio=32对称上采样
width_list[128, 256, 512, 512, 1024, 1024][128, 256, 512, 512, 1024, 1024]
depth_list[2, 2, 2, 3, 3, 3][3, 3, 3, 3, 3, 3]
block_type前 3 阶段ResBlock,后 3 阶段EViTS5_GLU同左
下/上采样方式Conv(带temporal_downsample=[False,False,False,True,True,False]InterpolateConv(带temporal_upsample=[False,False,False,True,True,False]
norm / actrms3d/ 默认rms3d/silu,输出rms3d+relu
latent_channels128128

解读:

  • 时间压缩在第 4、5 阶段完成temporal_downsample在前三个 stage 为False,第 4、5 个 stage 为True,共 2 次时间 2× 下采样,合计 4×;空间维度则由 5 个 stage 的 2× 下采样累计为 32×;
  • 混合 block 设计:浅层使用ResBlock保持细节,深层使用EViTS5_GLU(EfficientViT 风格的 GLU MBConv,带 5×5 局部卷积)提升效率与感受野(见 dc_ae.py 的EViTS5_GLU分支);
  • 编解码器均为纯 3D 结构is_video=Truerms3d归一化),空间采样使用 Conv/InterpolateConv 的 3D 变体,从而直接在时空联合维度上压缩。

6.3 数据流与 latent 尺寸计算

forward(见 dc_ae.py)完成encode → decode的完整重建链路;get_latent_size(见 dc_ae.py)给出 latent 尺寸换算公式:

latent_T = (T - 1) // 4 + 1 latent_H = (H - 1) // 32 + 1 latent_W = (W - 1) // 32 + 1

例如 768px、128 帧的输入(约 64×64 空间 latent、33 帧时间 latent),对比 8× 压缩方案,token 数仅为后者的约 1/64,这正是训练与推理加速的直接来源。

七、进阶:从零训练 Video DC-AE 自编码器

仓库同时提供了 DC-AE 自身的训练配置,可用于从零训练/微调自编码器,或作为理解损失函数与对抗训练的参考。

基础重建训练配置 configs/vae/train/video_dc_ae.py 关键项:

  • datasetvideo_text类型,resize_crop预处理,fps_max=24data_path="datasets/pexels_45k_necessary.csv"
  • bucket_config"256px_ar1:1": {32: (1.0, 1)},即 256px、32 帧、batch size 1;
  • 优化器:HybridAdamlr=5e-5betas=(0.9, 0.98)adamw_mode=True
  • mixed_strategy = "mixed_video_image"mixed_image_ratio = 0.2:训练 batch 中约 1/5 为图像、4/5 为视频,稳定空间维重建;
  • dtype = "bf16"plugin = "zero2"(ZeRO-2 并行,见plugin_config);
  • 损失配置vae_loss_configperceptual_loss_weight=0.5kl_loss_weight=0(KL 权重为 0,说明该模型为确定性 AE,不使用 KL 正则项)。

对抗训练变体 configs/vae/train/video_dc_ae_disc.py 增加 3D 判别器:

discriminator = dict( type="N_Layer_discriminator_3D", from_pretrained=None, input_nc=3, n_layers=5, conv_cls="conv3d", ) gen_loss_config = dict( gen_start=0, disc_weight=0.05, ) disc_loss_config = dict( disc_start=0, disc_loss_type="hinge", ) optim_discriminator = dict( cls="HybridAdam", lr=1e-4, eps=1e-8, weight_decay=0.0, adamw_mode=True, betas=(0.9, 0.98), ) grad_checkpoint = True model = dict( disc_off_grad_ckpt=True, # 开启 grad_checkpoint 时必须为 True )
  • 判别器为 5 层 3D 卷积(N_Layer_discriminator_3D),在视频帧的时空维度上做对抗判别;
  • 生成器损失在训练开始即启用对抗项(gen_start=0),对抗权重disc_weight=0.05
  • 判别器使用 Hinge 损失(disc_loss_type="hinge");
  • 生成器与判别器使用独立优化器(optimvsoptim_discriminator),判别器学习率1e-4高于生成器5e-5
  • 开启grad_checkpoint = True时,必须同步设置model.disc_off_grad_ckpt = True,将判别器相关计算排除在 activation checkpointing 之外。

八、FAQ 与注意事项

  1. 为什么推理配置要关闭并行插件?因为高压缩方案将 token 数压缩至原来的约 1/64,单卡即可承载,plugin=None避免不必要的并行通信开销(见 configs/diffusion/inference/high_compression.py)。
  2. 生成质量比原始模型差吗?文档明确说明快速模型质量低于原始模型(25K 步 loss 0.5 vs 0.1),但能保留时空关系,适合成本敏感场景与研究用途。
  3. tile 参数需要调整吗?若推理更大分辨率/更长视频,需保证spatial_tile_size能被 32 整除、temporal_tile_size能被 4 整除(见 dc_ae.py 的断言),并可按需增大tile_overlap_factor以进一步减轻接缝。
  4. 权重放哪里?推理/训练配置默认从./ckpts/读取Open_Sora_v2_Video_DC_AE.safetensorsF32T4C128_AE.safetensors,务必保持目录结构与配置一致。

九、参考资料

  • 技术报告:Open-Sora v2 论文(详见 docs/hcae.md 中引用的 arXiv 链接)
  • 中文报告:docs/zh_CN/report_v4.md(v2 相关技术细节)
  • 训练完整流程:docs/train.md
  • 模型结构实现:opensora/models/dc_ae/models/dc_ae.py
  • 模型注册与加载:opensora/models/dc_ae/ae_model_zoo.py
  • 推理脚本:scripts/diffusion/inference.py、训练脚本:scripts/diffusion/train.py

【免费下载链接】Open-SoraOpen-Sora: Democratizing Efficient Video Production for All项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询