首页 / 资讯中心 / 文章详情

视频生成模型架构趋同:DiT单流与多流技术路线解析

视频生成模型架构趋同:DiT单流与多流技术路线解析 ★ FEATURED ARTICLE
1. 视频生成模型的架构趋同现象如果你最近半年一直在跟进视频生成这个方向应该会有一种很强烈的感觉新模型一个接一个发但翻到技术报告那一页架构图长得越来越像。Sora 放出来之后国内外的视频生成工作几乎在同一时间收敛到了同一套骨架——DiTDiffusion Transformer。这件事在圈内已经不算什么秘密但真正把为什么是 DiTDiT 到底改了什么单流 DiT 和多流 DiT 差在哪讲清楚的材料并不多。我打算结合自己复现和调试视频生成模型的经验把这条技术脉络从头捋一遍顺带把实操里踩过的坑一并交代清楚。先说结论DiT 不是一个凭空冒出来的新东西它是把扩散模型的去噪主干从 U-Net 换成了 Transformer并且把时间步、类别、文本条件这些信息统一用条件注入的方式喂进去。听起来简单但正是这个替换让视频生成第一次有了堆参数就能变强的清晰路径。U-Net 时代大家拼的是结构设计DiT 时代拼的是数据、算力和 token 组织方式。这个转变对做视频的人来说意味着技术栈要整体迁移。这篇文章适合三类人看一是想搞懂 Sora 类模型底层到底怎么搭的算法同学二是准备自己动手训一个视频生成模型、需要选架构的工程同学三是被各种DiT单流多流术语绕晕、想理清概念的产品和研究者。我会尽量少堆公式多用类比和实操细节让不同基础的人都能拿到能用的东西。2. 从 U-Net 到 DiT扩散模型主干的换代逻辑2.1 扩散模型为什么长期被 U-Net 统治要理解 DiT 的价值得先明白 U-Net 在扩散模型里为什么能统治那么多年。扩散模型的核心任务是从纯噪声里一步步把图像还原出来这个过程叫去噪。去噪网络需要同时具备两种能力一是看到全局语义知道这张图大概是什么二是看到局部细节把边缘、纹理补回来。U-Net 的编码器-解码器结构加上跳跃连接天然就适合干这件事——编码器逐层下采样抓全局解码器逐层上采样补细节跳跃连接把浅层的高频信息直接送到对应层级。在图像生成时代这套结构配合注意力机制在低分辨率层插入 self-attention已经足够好用。Stable Diffusion 系列就是典型代表它的 U-Net 主干在 512×512 分辨率下跑得又快又稳。问题出在视频上。视频比图像多了时间维度帧与帧之间要保持时序一致运动要连贯这要求模型在时间维度上也有很强的建模能力。U-Net 处理视频通常的做法是把 2D 卷积换成 3D 卷积或者在时间维度上单独加一层注意力但这样做参数量涨得快扩展性差而且随着分辨率、帧数、时长的增加U-Net 的结构会变得越来越臃肿调起来非常痛苦。2.2 Transformer 的暴力美学为什么更适合规模化Transformer 的强项是它几乎不依赖人工设计的归纳偏置。它把输入切成一个个 token然后靠 self-attention 让每个 token 和所有其他 token 交互。这种全连接式的建模方式在数据量足够大时能学到比卷积更灵活的关系。更关键的是Transformer 的扩展规律scaling law已经被语言模型验证得非常充分——参数量、数据量、算力按比例放大性能就稳定提升。U-Net 没有这么干净的扩展曲线你很难说清楚把 U-Net 加深一倍到底能涨多少点。所以当 OpenAI 在 Sora 的技术报告里明确说用了 Transformer 作为扩散主干时整个行业的方向就定了。大家意识到与其继续在 U-Net 上做结构微创新不如直接换成 Transformer把精力放在数据管线和 token 组织上。这就是 DiT 路线的核心吸引力——它把视频生成从结构工程变成了系统工程。2.3 DiT 的核心改动三件事DiT 相对 U-Net 的改动可以归纳成三件事理解了这三件事后面所有变体都好懂了。第一件是把空间特征切成 patch token。图像或视频帧被划分成固定大小的 patch比如 2×2 或 4×4每个 patch 经过线性投影变成一个 token这和 ViT 的做法一致。视频的话patch 还要在时间维度上扩展变成 3D patch比如 2×2×2 的时空块。第二件是用条件注入替代交叉注意力。U-Net 里文本条件通常通过 cross-attention 注入DiT 则把时间步、类别标签、文本嵌入统一处理成条件向量通过自适应层归一化adaLN或者拼接的方式注入到每个 Transformer block 里。adaLN 的做法是让条件向量预测每个 block 的缩放和偏移参数这样条件信息能影响整个网络的每一层。第三件是去掉下采样和上采样。DiT 主干是纯 Transformer没有 U-Net 那种分辨率金字塔所有 token 在同一个分辨率上交互。这简化了结构但也带来了计算量问题——token 数量随分辨率平方增长所以后续工作都在想办法降低 token 数或者做分层处理。3. 单流 DiT 与多流 DiT两条技术路线的取舍3.1 多流 DiT 的设计思路多流 DiT 的代表是早期的一些视频生成工作它的思路是分工协作。具体来说模型里有两套并行的注意力流一套专门处理空间信息同一帧内的 patch 之间交互一套专门处理时间信息同一空间位置在不同帧之间交互。两套流交替堆叠或者在某些层做融合。这样做的好处是计算量可控——空间注意力只在单帧内算时间注意力只在同一位置跨帧算避免了全时空注意力的平方爆炸。但多流设计有个明显缺点空间和时间被割裂了模型很难学到某个物体在运动过程中形状变化这种时空耦合的复杂模式。而且两套流的层数、融合方式都是超参数调起来很费劲。我试过在一个多流架构上做消融光是空间流和时间流的层数配比就跑了十几组实验最后发现收益并不明显。3.2 单流 DiT 为什么成为主流单流 DiT 把空间和时间 token 拼在一起统一做一次注意力。也就是说一个视频被切成时空 patch 后所有 patch token 排成一个长序列self-attention 在这个长序列上一次性算完。这样每个 token 既能和同帧的其他 token 交互也能和不同帧的对应 token 交互时空建模是统一的。代价是计算量。假设视频是 16 帧、每帧 64×64 分辨率、patch 大小 2×2那么每帧有 1024 个 token总共 16384 个 token。全注意力的复杂度是 token 数的平方也就是约 2.7 亿次交互这个量级在训练时还能靠梯度检查点和并行策略扛住但推理时就很吃力。所以单流 DiT 的工程重点全在怎么把长序列注意力算得又快又省上。Sora 之后的主流工作基本都选了单流路线原因很直接单流结构简单、扩展性好只要算力跟得上性能上限更高。多流那套分工设计在数据量小的时候有优势但到了大规模训练阶段统一建模的收益更大。3.3 两条路线的对比维度多流 DiT单流 DiT时空建模空间、时间分离耦合弱统一建模耦合强计算复杂度较低可控高随 token 数平方增长结构复杂度高超参数多低结构统一扩展性一般好易规模化适合场景数据量中等、算力有限大规模训练、追求上限代表工作早期视频扩散模型Sora 及后续主流模型这张表是我自己整理的经验总结实际选型时还要看你的数据规模和算力预算。如果你只有几十张卡多流可能更现实如果有几百上千张卡直接上单流别犹豫。4. 视频 DiT 的实操搭建要点4.1 数据准备视频 token 化的关键参数视频 DiT 的第一步是把原始视频变成 token 序列这一步的参数选择直接决定后续训练的成败。核心参数有三个帧采样率、空间分辨率、patch 大小。帧采样率决定时间维度的粒度。常见做法是从原始视频里按固定间隔抽帧比如每秒抽 4 帧或 8 帧。抽得太密token 数暴涨抽得太疏运动信息丢失。我的经验是对于 5 到 10 秒的短视频抽 16 到 32 帧比较合适既能表达运动又不至于让序列太长。空间分辨率通常是 256×256 或 512×512。分辨率越高细节越好但 token 数按平方增长。512×512 配 2×2 patch每帧就是 65536 个 token16 帧就是上百万 token这个量级必须用序列并行才能训。patch 大小是个权衡。2×2 patch 保留细节但 token 多4×4 patch token 少但细节损失大。视频任务里我一般用 2×2 空间 patch 配 1 帧时间 patch也就是每个 patch 只覆盖单帧时间维度的建模完全交给注意力。也有工作用 2×2×2 的时空 patch把时间也压缩进 patch这样 token 数能降一半但运动细节会糊。提示patch 大小一旦定了后面换架构就要重新训所以前期一定要想清楚。我见过有人训到一半想改 patch 大小结果整个 checkpoint 作废。4.2 条件注入的实现细节条件注入是 DiT 区别于普通 ViT 的关键。视频 DiT 通常要注入三类条件时间步、文本、可选的其他控制信号。时间步的注入用 adaLN 最常见。具体做法是把时间步 t 通过正弦位置编码变成一个向量再经过两层 MLP输出 6 个参数每个 Transformer block 的 attention 和 FFN 各需要 scale 和 shift加上最后的 gate。这 6 个参数分别作用在 LayerNorm 之后公式大致是norm(x) * (1 scale) shift。这样时间步信息就渗透到了每一层。文本条件的注入有两种主流做法。一种是把文本嵌入和 patch token 拼在一起让 self-attention 自己学交互另一种是保留 cross-attention在部分层插入文本到视觉的注意力。前者结构更统一后者对文本的利用更直接。我实测下来在视频任务里拼接方式更稳因为视频 token 本来就多cross-attention 会额外增加计算量。还有一个容易被忽略的点条件注入的初始化。adaLN 的 scale 和 shift 如果初始化不好训练初期会非常不稳定。常见做法是把输出 scale 和 shift 的 MLP 最后一层零初始化这样训练开始时条件注入相当于恒等映射网络先学基础去噪再慢慢学条件控制。这个技巧能显著降低早期 loss 震荡。4.3 训练配置与显存优化视频 DiT 的训练是显存杀手。以 512×512、16 帧、2×2 patch 为例单条样本的 token 数约 100 万batch size 开到 8 就需要几百 GB 显存。所以必须上优化手段。第一是梯度检查点。把 Transformer block 的前向计算分段保存反向时重算能省 60% 到 70% 的激活显存代价是训练速度慢 20% 到 30%。这个几乎是必开的。第二是混合精度。用 bf16 做前向和反向主权重保持 fp32。bf16 的动态范围比 fp16 大不容易溢出视频任务里更稳。第三是序列并行。把长序列切成几段分到不同卡上注意力计算时通过通信交换 KV。这个实现复杂但能把单卡显存需求降一个数量级。如果序列长度超过 50 万 token序列并行基本是唯一选择。第四是FSDP 或 ZeRO。把模型参数、梯度、优化器状态分片到多卡进一步降低单卡占用。我一般用 FSDP 配序列并行在 64 卡上能训 512×512、32 帧的配置。学习率方面视频 DiT 比图像 DiT 更敏感。我用的配置是峰值学习率 1e-4warmup 5000 步cosine 衰减到 1e-5。batch size 尽量大至少 256小了梯度噪声大视频任务尤其明显。5. 常见问题与排查技巧实录5.1 训练不收敛或 loss 震荡这是视频 DiT 最常见的问题。表现是 loss 前期下降后突然飙升或者一直在高位震荡。排查顺序我一般是这样先看条件注入的初始化。如果 adaLN 的 scale 和 shift 没有零初始化训练初期条件信号会淹没去噪信号loss 直接炸。检查方法是把条件注入的输出手动置零看 loss 是否平稳。再看学习率。视频 DiT 对学习率比图像敏感得多1e-4 在图像上没事在视频上可能就炸。可以先从 5e-5 试起稳定后再往上加。然后看数据。视频数据里如果有大量静止画面或者极端运动分布会很不均匀。建议做数据过滤把运动幅度过小或过大的样本剔掉或者做运动幅度分层采样。最后看梯度裁剪。视频 DiT 的梯度范数波动大全局梯度裁剪阈值设 1.0 比较稳太小会拖慢收敛太大等于没裁。5.2 生成视频时序不一致表现是帧与帧之间物体闪烁、形状跳变。根因通常是时间维度的建模不够。排查方向一是时间位置编码。如果时间维度的位置编码没加或者加错了模型分不清帧的顺序。检查 patch 嵌入时是否把帧索引也编码进去了。二是时间 patch 大小。如果时间 patch 太大比如 4 帧一个 patch运动细节会被压掉。可以试试把时间 patch 降到 1 或 2。三是注意力掩码。如果用了因果掩码或者分块掩码可能限制了跨帧交互。视频去噪通常不需要因果性全注意力更合适。5.3 推理速度慢视频 DiT 推理慢是结构性的但有几个优化点。一是减少采样步数用 DDIM 或 DPM-Solver 把步数从 1000 降到 50 甚至 20。二是KV 缓存如果做自回归式生成缓存历史帧的 KV 能省重复计算。三是量化把权重和激活量化到 int8速度能提 2 到 3 倍画质损失可控。问题可能原因排查方法解决方向loss 震荡条件注入初始化不当置零条件输出看 loss零初始化 adaLN 输出层不收敛学习率过大降学习率重跑从 5e-5 起调时序闪烁时间建模不足检查时间位置编码减小时间 patch改全注意力推理慢采样步数多统计单步耗时换快速采样器量化显存爆序列太长看 token 数梯度检查点序列并行5.4 几个容易忽略的坑第一个坑是位置编码的插值。训练时用 256×256推理时想上 512×512位置编码需要插值。如果插值方式不对生成质量会断崖式下降。建议用 2D 正弦编码或者 RoPE插值更平滑。第二个坑是文本编码器的冻结。很多人直接拿预训练文本编码器冻住用但视频任务的文本描述分布和图像不一样冻住可能限制性能。我的做法是先冻住训一段时间再解冻联合微调效果比全程冻住好。第三个坑是数据的时间对齐。视频和文本的对应关系比图像模糊得多一段视频可能对应多个描述。如果标注质量差模型会学到错误的对应。建议做文本增强或者用多描述训练。6. 从 DiT 出发的扩展方向DiT 这套骨架搭好之后往上加东西其实很灵活。我试过几个方向简单说说。一是加控制条件。在文本之外可以注入深度图、光流、姿态等条件做法和文本注入一样拼到 token 序列里或者走 cross-attention。这样能实现更精细的控制比如指定相机运动轨迹。二是做长视频。单流 DiT 的序列长度是瓶颈长视频要么分段生成再拼接要么用层次化结构先出关键帧再插帧。分段拼接的问题是接缝处不连贯需要在训练时加入重叠帧的监督。三是蒸馏加速。把多步采样蒸馏成少步甚至一步是视频生成落地的关键。常见做法是一致性蒸馏或者对抗蒸馏能把 50 步压到 4 步速度提升十倍以上画质损失在可接受范围。四是多分辨率训练。先在低分辨率上训再逐步升分辨率能省不少算力。但要注意位置编码的适配以及低分辨率学到的运动模式在高分辨率下是否还成立。我个人在实际操作中的体会是DiT 这套架构最大的价值不是它本身多精妙而是它把视频生成的技术栈标准化了。以前每个团队一套结构现在大家用同一套骨架比拼的就变成了数据质量、算力规模和工程优化。这对整个领域是好事因为重复造轮子的少了真正难的问题——数据、算力、评估——才会被认真对待。如果你正准备入局视频生成我的建议是别在架构上纠结太久选单流 DiT把精力砸在数据管线和训练稳定性上收益会大得多。
阅读完成 · 觉得有帮助?
咨询建站