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

DiT架构深度解析:从Sora到视频生成的Transformer革命

DiT架构深度解析:从Sora到视频生成的Transformer革命 ★ FEATURED ARTICLE
前几天整理硬盘翻出我去年跑视频生成实验的一堆日志。看着那一排排loss曲线和显存监控截图突然有点感慨从Sora那个东京街头漫步的demo刷屏到现在也就一年多时间视频生成模型这个圈子已经变天好几轮了。最明显的变化就是大家的技术方案出奇地一致——不管开源还是闭源短视频还是长视频背后几乎都在用同一个架构剧本DiT也就是Diffusion Transformer。今天这篇漫话我就把这一年来拆解DiT的笔记、跑实验踩过的坑、跟同行讨论时攒下的心得一次性说清楚。这篇文章适合谁如果你正在研究视频生成模型的原理或者想自己动手训练一个视频生成模型又或者你只是好奇Sora凭什么能生成那么连贯的运动这篇文章都能给你一个清晰的脉络。我会从架构演变讲起把DiT的核心机制拆开揉碎再分享一套可以直接上手的训练和部署实操方案最后聊聊我在实际工程中遇到的那些坑。1. 架构拐点为什么Sora之后视频生成集体转向DiT1.1 Sora之前视频生成模型的老底盘是什么在Sora出来之前视频生成模型的默认架构是U-Net。这东西最早是医学图像分割用的后来被扩散模型捡起来当去噪网络一用就是好几年。它的核心设计是编码器-解码器对称结构中间有一堆skip connection把编码器每一层的特征直接接到解码器对应层。这样做的直观好处是低分辨率的全局信息和逐像素的细节信息能同时到达网络每一层训练起来非常稳哪怕数据集规模一般也不容易跑飞。但U-Net的问题随着视频任务的到来开始暴露。它是卷积网络感受野受限于卷积核大小和层数对一个像素来说远处的像素、十几帧之前的运动趋势都属于远方卷积想把这些长距离依赖建模起来只能靠堆深度、堆通道代价是计算量直线上升。我记得很清楚当时跑一个360p、几十帧的短视频生成光去噪网络的U-Net就能把一台A100吃到90%以上显存生成的视频里物体一旦快速旋转或遮挡画面边缘就开始发糊。这不是调参能解决的问题这是结构性的天花板卷积网络天生不擅长在时空维度上做全局建模。1.2 Sora选择DiT时到底在赌什么回头去看Sora的技术报告里面信息密度其实很低没给完整模型卡只说把视频压缩成patch视觉token然后用Transformer架构做扩散去噪。但结合DiT论文Scalable Diffusion Models with Transformer的公开结果Sora这一步棋的逻辑其实非常清楚。DiT这篇论文当初就验证过一个关键点在同样的训练预算下DiT的图像生成质量FID指标明显优于U-Net而且DiT的scaling曲线很漂亮模型参数量越大、训练计算量越多效果提升越稳定。反观U-Net模型规模涨到一定程度后收益快速饱和你再堆参数都是浪费。这个对比放在大模型时代含义很深语言大模型能一路从BERT卷到GPT-4靠的就是Transformer的scaling law。视频生成如果继续抱着U-Net不放每次更大更强都意味着重新设计卷积拓扑收益还不稳定根本没法享受到大模型的规模红利。DiT把视频生成拉回了Transformer赛道视频被patch化之后就是一条token序列位置编码管时空结构attention管长距离关系整个架构跟语言模型几乎长得一样。于是大模型领域沉淀下来的那一整套东西——分布式并行训练、混合精度策略、推理加速工具、甚至各种微调技巧——都可以平移过来用。Sora押注DiT本质上是赌Transformer的scaling红利能延续到视频生成这件事。从今天的结果看它确实赌对了。1.3 大家都在抄DiT但又不完全一样Sora发布之后的时间线很有意思。先是开源社区疯了一样复现Open-Sora、Latte、VideoDiT这些项目接二连三冒出来随后各家闭源视频模型的技术报告也陆续公开。你把这些报告放一起看叙述结构惊人地一致视频tokenizer把视频压缩成patchDiT backbone做去噪再上采样回像素空间。可以说DiT已经成了视频生成模型的标准答案。但细看会发现大家抢的是同一片地基盖的房子却各有各的招。主要差异集中在三个地方第一是patch化策略有人用3D VAE把视频压成时空patch有人直接用2D VAE逐帧处理再加时间attention第二是条件注入方式文本如何跟视觉token融合是拼接、交叉attention还是全注意力混合第三就是后面要重点说的单流和双流结构之争。这些差异听起来不大实际跑出来的效果天差地别也是很多团队真正拉开差距的地方。2. DiT内部机制拆解扩散模型和Transformer是怎么合成的2.1 扩散模型的基本盘先加噪再学去噪要理解DiT得先温习一下扩散模型是怎么工作的。扩散模型的前向过程很简单对一张干净图像不断叠加高斯噪声直到它变成一团纯噪声。反向过程就是让模型学着一步步把噪声去掉还原出图像。模型本质上在预测噪声本身也就是在每一步去噪时判断当前状态里哪些成分是噪声、哪些是信号。这是一个非常有特点的训练范式它不需要复杂的监督标签只需要一些噪声样本和对应的干净样本做自监督学习就能训练一个强大的生成模型。视频扩散模型只是把二维图像换成了三维时空数据去噪网络需要在空间和时间两个维度上做预测。这里的难点在于视频的时间维度和空间维度是高度耦合的一个物体的运动轨迹横跨几十帧去噪网络如果看不到这种全局关联很容易生成一帧一个样的幻灯片。DiT解决这个问题的思路很简单用注意力机制去建模所有token之间的关系不管是空间上相邻的像素还是时间上相隔几十帧的内容。2.2 Transformer在扩散模型里到底扮演什么角色在DiT之前扩散模型的去噪网络基本是U-Net也就是纯卷积结构。DiT做的事是把U-Net替换成Transformer。具体来说输入图像或视频先通过一个小卷积层把每个patch映射成token然后这些token带着位置编码进入一堆Transformer block最后通过线性层把输出映射回像素或者patch空间。那Transformer到底比U-Net强在哪我用一个粗浅的类比U-Net像一个在小区里逐户拜访的社区网格员想了解整个社区的动态得靠一栋楼一栋楼跑信息传递链条长、时效差Transformer则像小区门口的信息中心每个住户有事直接到大屏前留言所有人都能立刻看到所有人的消息信息是全息的。视频生成最需要的就是这种全息视角——某个物体这一秒在画面左下角下一秒跑到右上角Transformer只需要一次attention计算就能建立两者的联系U-Net却要跨越好几层卷积才能把信息传到位。还有一个容易被忽视的优势DiT的推理计算模式高度规则化全是矩阵乘法和attention没有U-Net那一堆下采样、上采样的非规则数据流。这对GPU计算非常友好也方便用TensorRT这些工具做算子融合和推理加速。我实测下来同样batch大小和分辨率DiT在GPU上的吞吐比同规模U-Net要高不少这也是它能扩展到超长视频的一个硬条件。2.3 单流DiT和双流DiT一场关于文本融合的路线之争把DiT推向大众视野的一个重要讨论就是单流和双流的区分。双流DiT的思路是这样的文本和视频各走各的Transformer分支文本token在一个分支里做self-attention视频token在另一个分支里做self-attention两个分支只在特定模块里通过cross-attention交换信息。这么做的好处是文本语义和视觉特征各自保持独立的表征空间模型不容易把两种模态的信息糊在一起。单流DiT则走得更激进把文本token和视频token直接拼接到同一条序列里一起喂进Transformer做联合attention。Sora采用的正是这种方案。它的核心逻辑是在早期层就让文本和视觉在同一个表征空间里充分交互文本不再是一个外挂的条件输入而是视频生成过程的有机组成部分。从最终效果看单流DiT在文本控制力和运动连贯性上往往表现更好因为条件信息能更早、更深地影响视觉生成过程。我自己的感受是单流DiT在训练上更难伺候序列长度直接膨胀了attention的计算量也跟着变大。但它的上限更高对复杂指令的理解更细腻。现在行业里新出的视频模型特别是追求高指令遵循能力的方案越来越多地倒向单流结构这个趋势还在持续。3. 自己动手跑一个DiT视频模型从训练到部署的实战记录3.1 环境准备和数据先行理论说再多不如自己跑一次。如果你也想复现一个短视频DiT模型我从环境到数据给你捋一遍我的实际配置。硬件方面我建议至少准备一张24GB显存的卡比如RTX 4090或A10G作为入门。想跑稍微像样一点的分辨率和时长四卡或八卡集群是常态。软件栈我推荐PyTorch 2.x加FlashAttention这个组合对DiT的attention计算优化非常关键不用FlashAttention序列一长基本寸步难行。数据是视频生成模型训练中最容易被低估的环节。DiT虽然是Transformer结构很吃数据规模和多样性但数据预处理的好坏对最终效果的影响甚至超过模型结构本身。我的建议是起步阶段不要追求高清长视频先统一成短片段、固定分辨率比如256x256或320p时长3到5秒重点保证数据多样性——场景、物体、运动类型、镜头语言都要覆盖。我踩过的坑是第一版训练集里静态场景太多模型练出来之后生成任何指令都倾向静止不动运动生成能力完全没起来。后来调了数据配比把动态样本比例提到一半以上运动连贯性才有明显改观。3.2 训练参数到底怎么定训练DiT时最关键的几个参数我直接给一组可复现的基线配置。首先学习率我习惯用1e-4级别配合AdamW优化器warmup步数在总步数的5%到10%之间。别小看warmupDiT这种深层Transformer模型刚开始训练时梯度很不稳定没有warmup很容易出现loss飙到NaN的情况。Batch size方面在显存允许的情况下尽量往大了开If each sample是64帧的256分辨率视频batch size开到8到16是常见配置因为大batch能让attention的统计特性更稳定。混合精度训练是必须的这个不用犹豫。我用的是bfloat16加梯度累积先累积到等效batch再更新一次参数稳定性比纯FP16好很多。有一个容易被忽略的参数是条件注入的方式对于文本条件我建议在模型内部使用AdaLN自适应层归一化机制来调制特征这也是DiT原始论文验证过的有效做法。它的作用相当于让文本信号在每一层都能控制特征的缩放和偏移相当于全局遥控器比只在开头注入一次文本要强得多。另外有必要提一下训练过程中的损失曲线判断。DiT的loss是预测噪声的MSE这个数值本身不能说明生成效果好坏关键是看它是否平滑下降。我见过不少新手盯着loss从0.8降到0.02觉得一定成功了结果生成出来全是糊的原因是loss降过头了模型开始把噪声和信号的边界模糊处理。比较靠谱的判断方法是每隔一段步数就保存checkpoint挑几个固定prompt做生成测试肉眼评估画面质量和运动连贯性这才是真正有效的过程监控方式。3.3 部署和推理加速的几个要点训练好的DiT模型在真正要用起来的时候会遇到比训练更多的工程问题。首先是推理速度DiT每帧生成都需要几十步去噪采样再加上attention的矩阵运算如果不做优化一个几秒的短视频可能需要几分钟甚至更久。我常用的推理加速三板斧是采样器换成DPM-Solver或者DDIM把去噪步数从50步减少到10到20步模型导出时用TensorRT或者ONNX加CUDA图优化能上FlashAttention的地方全部打开。这三步走完推理速度通常能提升3到5倍。模型部署时还有个隐性成本决定项显存和序列长度的换算。这个我得详细算一下因为你随便跑一个720p的几秒视频显存就可能会爆。假设你的DiT模型有10亿参数以FP16格式加载光参数就需要2GB显存。推理时中间激活值activation更夸张8帧720p画面patch化之后序列长度很容易到上万attention计算在长序列上呈平方复杂度增长中间激活常常是参数的几倍。我的经验是720p十秒级视频生成24GB显存是底线想要流畅跑长视频48GB或者80GB的卡更稳妥否则只能通过切块生成、流式推理等方式控制每次计算的序列长度。4. 常见问题与排查实录4.1 显存爆炸是怎么回事显存爆掉是我做DiT实验时遇到最多的状况。原因通常有三个方向我一个个排查的经验可以参考。第一个是序列长度太长特别是把文本token和视频token拼接进单流DiT之后序列长度暴涨attention的时间复杂度是平方关系稍不注意就超出显存。网上说的微调DiT显存爆炸十有八九是这个问题。第二个是batch size设得过大你可以做一道简单估算一个样本的中间激活如果是X GBbatch size是B那这一轮的前向反向就要吃掉约3BX前向、反向、梯度各占一份。第三个是混合精度没生效某些算子在FP16下精度不稳定PyTorch会自动回退到FP32显存瞬间翻倍。排查显存问题时我的做法是先开一个profiler逐层看每层tensor的shape和memory usage先定位到底是哪里撑爆的。如果是序列长度导致的问题我会优先降低空间分辨率、缩短视频时长尽量保持时序完整性如果非要在高分辨率上硬扛就改用分块attention让模型分块处理长序列而不是一次性全局注意力。4.2 训练不收敛loss一直波动的处理思路DiT训练的收敛问题我分成两种场景。第一种是loss完全不动或者剧烈震荡这种现象大概率出在学习率过高或者warmup不够上。我曾经在调参时把学习率从1e-4提到5e-4结果loss直接开始上下跳回滚之后才稳定下来。第二种是loss表面在降生成效果却一塌糊涂这种往往是数据预处理出问题了比如视频帧没对齐、时间维度过长导致运动信息稀疏或者文本描述跟视频内容根本不匹配。还有一个排查频率很高的点是大模型微调场景下的收敛问题。现在很多人是在某个预训练的DiT基座上做微调这时候千万要控制学习率一般比从头训练再降一个数量级比如5e-5到1e-5。我见过不少翻车案例用1e-4去微调预训练权重几个step之后生成的画面直接变成炫彩噪声。另外微调时尽量冻结浅层特征只放开深层生成层这样既能保持基座模型的原有能力又能适应新任务收敛也快得多。4.3 推理速度慢到无法接受的优化路径如果训练没问题但推理慢我通常按下面这张排查优先级来逐项确认。排查项检查方式常见根因解决方案采样步数看采样器循环次数默认50步太多换成DPM-Solver降到10到20步attention实现看有没有打开FlashAttention标准attention未优化改用FlashAttention长序列收益显著模型编译看是否用CUDA Graph或TensorRT动态图开销大导出静态图算子融合batch调度看推理batch是否过小GPU利用率低多prompt并行推理提升吞吐显存交换看是否有显存-内存交换序列超长被逼交换降分辨率分块生成避免长序列其中收益最明显的基本就是换成DPM-Solver采样器一改下来生成速度直接翻倍。有些项目甚至支持把去噪步数压到4到5步配合蒸馏技术速度还能再上一个台阶。4.4 本地部署和免费API的选型参考很多读者问过我怎么把这类视频生成模型部署到本地或者想找免费的API先体验一下。这个问题我得结合目前的行业实践说清楚。本地部署方面Ollama这类工具主要支持语言模型对DiT视频模型的直接支持还不成熟。想把DiT真正跑起来自己动手部署依然是最主流的路径用vLLM这一类的推理框架做模型加载和服务化配合专门的视频推理管线可以做成一个内部可用的AIGC服务。免费API方面不少大模型平台开放了生成接口的试用额度但视频生成接口的免费额度通常限制很多时长、分辨率、次数都有约束。我个人的观点是视频生成模型目前还处于快速迭代期技术更迭非常快如果你没有特殊的数据隐私要求前期先用现成的平台API跑通流程是最划算的。一旦你的业务有明确的私有化、离线化需求再投入成本去做本地部署那个时候技术栈也会成熟很多。这里面还有一个关键考量视频生成模型的GPU负载远高于文本模型本地化部署的硬件成本需要认真评估不要为了私有化而私有化。5. 实践感悟我眼里的DiT和它的下一步5.1 工程上我最深的三点体会这一年多反复拆解、复现、调优DiT有几条体会我愿意写出来给后来者参考。第一DiT的架构入门门槛确实不高因为Transformer大家太熟了PyTorch里几十行就能搭一个可跑的DiT块但真正的竞争力全在数据工程和训练配方上。同样的模型骨架Open-Sora的实践已经证明了数据清洗和配比做得好效果能拉开好几个身位。第二不要盲目追求模型规模和生成长度我见过太多团队一上来就想搞几十秒的高清视频结果数据量和显卡都撑不住最后生成质量一塌糊涂。从短视频、低分辨率起步把每一步的质量打磨好再逐步拉长和放大是更稳妥的路线。第三要习惯跟AIGC模型的不可控共处。视频生成跟文本大模型不同文本可以靠RLHF做很细的对齐视频生成目前还很难做到对每一个指令、每一个镜头都精准执行。这种不可控性既是挑战也是未来几年技术突破的关键空间。5.2 一个值得尝试的小技巧和后续方向最后分享一个我最近在用的训练小技巧在DiT训练中加入渐进式分辨率调整。传统做法是直接固定目标分辨率从头训到底我试过的做法是先用小分辨率比如128p训练到loss基本稳定然后逐步把分辨率往上抬到256p、320p。这样做的直观好处是模型先学大致的全局结构和运动骨架再学细节纹理训练过程又稳又快最终效果往往比一步到位更好。我当时做对比实验同样的算力预算下渐进式方案生成的视频在细节清晰度和稳定性上都胜出。至于下一步更长远的东西我在持续关注两个方向。一个是DiT结合蒸馏技术把多步去噪压缩成一步生成这是推理成本能不能降到商用门槛的关键另一个是视频tokenizer的进步现在的3D VAE还原能力还保证不了长视频的高保真压缩这块不突破DiT的上限也会被卡住。我自己接下来的实验重心也会放在这两块上有新结论了再跟大家细聊。
阅读完成 · 觉得有帮助?
咨询建站