DiT架构解析:为何它能成为视频生成的公共底座 2024年2月那个晚上OpenAI把Sora的演示视频丢出来之后很多做视频生成的朋友第一反应都是“这活儿没法干了”。一只纸船在玻璃杯里漂、长颈鹿在空无一人的美术馆里探头这些60秒的连续镜头直接把行业拉进了一个新维度。但比起那批反复循环的演示片段真正让从业者睡不着觉的是Sora技术报告里一个不起眼的名词DiT。我后来跟同事复盘得出的结论很朴素——Sora并没有发明一种全新的视频生成理论它只是拿一个2022年底就公开的架构把规模、数据和算力推到了别人没到过的位置。这个架构就是DiTDiffusion Transformer。而这一轮视频模型竞赛里大家抄的几乎都是同一个剧本把扩散模型里面的U-Net拿掉换上Transformer然后拼命加大参数、加多数据、调长上下文。这篇漫话就聊聊DiT到底解决过什么问题为什么它成了几乎所有视频模型的公共底座以及要靠这个方向做产品、做研究该从哪些地方下手。1. 为什么DiT成了视频生成的新“公共底盘”1.1 扩散模型本来没有Transformer什么事先回到扩散模型最朴素的白话你给模型看一堆图片然后往图片上逐步加噪声加到你完全认不出原图再教它反着走从一堆纯噪声里一步步把清晰画面“擦”出来。这个“擦”的过程就是一次次去噪预测。传统上执行这个过程的主干网络是U-Net一个编码器—解码器结构的卷积网络靠下采样建出多尺度特征、再上采样还原细节。U-Net在图像扩散时代非常能打Stable Diffusion早期几乎都长这个样。它擅长局部纹理建模但也有一个绕不开的短板结构固定、通道数上不去的性价比不高想继续靠堆参数变强收益很快触顶。换句话说U-Net像一台调校得很顺的老发动机扭矩曲线不错但马力上限摆在那里。真正让我对这个短板有体感的是一次扩训练分辨率的经历。当时想把一个U-Net扩散模型从512上调到1024发现改动哪都在冒烟中间层的特征图尺寸、残差连接的比例、甚至attention块的位置都要重推。反观Transformer家族只要你把位置编码和patch化处理好序列变长就是换个数据集、调一下max length的事这从工程角度看完全是两种物种。1.2 把U-Net换成Transformer图的是什么DiT的论文题目就叫《Scalable Diffusion Models with Transformers》两位作者是William Peebles和谢赛宁2022年底投稿后来拿了ICCV 2023的最佳论文奖。题目里最值钱的是“Scalable”——可扩展。他们把主干从U-Net换成Transformer之后得到一条很关键的曲线当你把DiT的参数量从S档放大到XXL档并且把训练FLOPs一并提上去FID这条指标会一路变好在同样的计算预算下大DiT也稳定碾压同等规模的U-Net。Transformer之所以能有这个性质是因为它的信息处理方式不是靠卷积核滑动窗口而是让每一个token都能直接看到其他所有token注意力矩阵的长度等于序列长度。扩大到视频场景好处被进一步放大U-Net对时序的处理往往要靠额外的3D卷积或者临时编码模块来回折腾而Transformer天然把时间轴也当成序列的一部分于是“空间patch”加“时间帧”可以统一写成一种时空token这正好是Sora选取的做法。很多人问为什么非要用Transformer替代U-Net有个类比我一直觉得挺合适U-Net像一支分工明确的工厂流水线下采样、上采样、瓶颈层各管一摊改一条线就得动好几个工位Transformer则像一个全栈工程师你给它一副token清单它用统一的注意力机制处理所有关系。对于视频这种“空间关系时间关系”一起出现的数据后者组织起来天然更顺手。1.3 一个架构通吃图片和视频行业马上松散不下去了DiT最有杀伤力的特性是通用性图像可以用2D patch视频就加一个时间轴变成3D patch序列长度变长、但网络结构可以几乎不动。这套设计意味着做图像生成的团队和做视频生成的团队底层是可以共享一套训练框架的。视频任务远比图像难——要处理同一内容跨帧的一致性、运动连续性、光影变化数据量需求也大好几倍。但如果连底层模型架构都互不通用每家公司就得从头点一遍科技树这是最费钱的。DiT给出的答案是我先不负责具体任务我只把视频也翻译成token序列然后交给一个统一的大Transformer去学习和生成。你可以把DiT理解成一个“统一度量衡”之后大家比的就是数据、算力和工程而不是各玩各的架构。这套“通吃”能力带来的行业变化我感觉得特别明显。DiT出来之前图像团队和视频团队聊技术栈几乎是鸡同鸭讲一边在说U-Net怎么调另一边在说光流和帧插值。DiT起来之后两边忽然能用同一套关于“token、注意力、位置编码”的话语体系交流了人才流动也顺畅很多。对一个技术社区来说公共底盘一旦形成迭代速度会快得惊人。2. 拆开DiT视频是怎么变成一串token然后被生成的2.1 时空patch化一段视频在模型眼里长什么样要理解DiT怎么处理视频最直观的比喻是拼图。传统方法处理视频要一帧一帧来帧与帧之间靠额外机制去对齐。DiT不走这个偏门它把视频看成一个大方块数据用固定的窗口把方块切成小立方体。比如一个2秒的视频每帧1080p模型先缩到训练分辨率然后按patch size2x2x2这种三维窗口切成很小的立方体每个立方体展平之后过一个线性投影变成一个向量也就是embedding。这些向量带上各自的位置信息就组成了进入Transformer的token序列。从模型视角看一段视频就是“一长串嵌着时间和空间位置标签的token”和你在语言模型里处理一串文字没有本质区别。这里有个关键参数patch size。DiT论文里报告过在ImageNet 256x256上patch size取2的效果优于4和8。道理也不难猜patch越小token个数越多模型能看到的空间细节越细代价是序列变长算力跟着涨。视频场景里选择还要叠加时间维度patch size的选择要综合考虑分辨率、帧数和显存预算。实际操作上视频DiT通常不会把原始像素直接丢进去而是先用一个编码器把画面塞进一个紧凑的latent空间再在latent空间里做patch化。这也是为什么能力强的视频模型几乎都有一个专门的视频VAE——先负责“压缩”再交给DiT“表演”。不少同学刚接触这个概念时会把patch化和语言模型里的tokenization搞混。两者本质上是一个意思把连续信号切成离散单元再嵌入成向量。区别在于文本token是词或子词天然有明确的边界视频token是从连续像素里切出来的立方体本身没有语义边界全靠模型自己去学。这导致视频token的“含义”没有文本那么凝固也正因如此DiT对位置编码的依赖要比LLM重得多。没有好的时空位置编码模型很容易把注意力全部分布到同类patch上画面乱成一锅粥。2.2 DiT block里怎么混入“时间步”和“文本条件”如果说patch化解决了“视频怎么进入Transformer”那还有两个信息必须混进去这是去噪的第几步扩散时间步t以及我想要的画面内容是什么文本prompt、类别等。DiT论文比较了三种条件注入机制adaLN自适应层归一化、cross-attention交叉注意力、in-context conditioning把条件直接拼进token序列。结论是adaLN-Zero效果最好它将时间步和类别条件通过MLP算出来变成一组scale和shift参数对每个DiT block的层归一化输出做一次仿射变换同时把残差分支初始化为零。这么做的好处是训练初期模型输出就是纯恒等映射稳定性好收敛也更快。但在视频生成场景下文本条件要复杂得多。单靠adaLN携带全局向量很难把一整段文字细枝末节都注入到位。所以到了Sora以及后续视频模型里条件注入早就不再是单一机制而是“adaLN交叉注意力原生token拼接”混合着用。OpenAI技术报告里专门谈到“单流”和“双流”两种做法双流是文本token和视频token先各走各的Transformer分支再找一个阶段合并单流是把两类token拼接成同一条序列统一处理。后者共享计算资源减少了一倍的注意力开销但代价是模型要自己学会分辨“这是文字”和“这是画面”需要更强的先验。说人话就是单流更省算力但更难练双流练起来更稳但费钱。现在很多团队在这两种路线之间反复横跳本质上就是在这笔账上做权衡。2.3 从“预测噪声”到“预测v”再聊聊训练目标扩散模型的训练目标这些年也在进化。最早的实现是直接预测噪声noise prediction后来又流行起预测v即让模型估计“当前图像与干净图像的差异方向”以及预测x0直接预测原始干净样本。DiT论文用的时候以噪声预测为主但新一代视频DiT普遍混合了v-prediction和时间步采样策略这直接影响生成质量尤其是运动细节。理解这个演进不需要记住太多公式抓住一条主线就够模型学的不是“画成什么样”而是“每一步怎么从更乱的状态退回到更干净的状态”而不同的预测目标相当于给这个“退回过程”指定了不同的路标系统。回到实操里你会发现大部分视频DiT的训练稳定性和采样步数选择都跟这个细节强相关。拿v-prediction举例它在高噪声区域比直接预测x0更稳因为此时输入信号几乎全是噪声硬猜x0等于让模型做极限推理测v相当于让它先找到方向感再逐步推算走多远。视频模型的运动连贯性很大程度上就从这种“方向感”里来。做视频DiT项目时如果你发现生成的画面静止时清晰、一动起来就发虚排除掉VAE的问题之后先怀疑训练目标和时间步采样策略是不是不匹配。这是我踩过真金白银的坑特别值得记下来。3. 各大视频模型为什么都在“抄DiT这个剧本”3.1 从Sora之后公开技术栈几乎一页纸就能理清Sora自己就是DiT的直接扩展它在时序上做时空patch化用DiT做主干报告里的架构描述几乎可以翻译成“我们给DiT加了超长上下文、3D token和混合条件注入”。问题的关键不是Sora用了DiT而是Sora证明了这个路线在暴力堆算力的情况下可以突破分钟级长生成。这个信号比任何论文都管用。于是后续你能看到的头部视频生成模型技术路线收敛得惊人Runway的Gen-3系列明确用了DiTLuma的Dream Machine背后是DiT类模型Pika 2.0、快手可灵、字节即梦、以及智谱清影背后的CogVideoX基本都在Diffusion Transformer的框架下做文章。区别主要在于视频表征VAE设计、条件注入方式、并行策略和长视频注意力优化。为了更直观我用一张速查表整理一下公开资料里各家视频模型与DiT的关联。需要说明的是这些信息一部分来自论文和技术报告一部分来自官方公开演讲信息颗粒度不同仅供梳理思路别当合同引用。模型底层架构方向公开资料要点Sora (OpenAI)DiT扩展时空patch、单流/双流训练、混合条件注入Runway Gen-3DiT官方技术博客明确基于DiT专注高保真运动控制Luma Dream MachineDiT类自研视频VAE Transformer主干Pika 2.0DiT类强调多模态上下文沿用扩散Transformer快手可灵DiT类面向长时间视频的Transformer生成框架字节即梦 (Seedance)DiT类大规模DiT 自研视频编码器智谱CogVideoXDiT3D Causal VAE DiT开源权重可下载这张表的潜台词是你几乎找不到一家还在纯U-Net路线上做视频生成的头部玩家。这跟三年前“图像模型必用U-Net、各有各的结构创新”的局面差别非常大行业共识之强在AI历史上都算少见。3.2 为什么没有人回头去战U-Net了可能有人会问这个剧本真的是唯一答案吗我觉得不是唯一但它是当下综合性价比最高的。原因有三层。第一Transformer的强扩展性是已经被大模型验证过的语言模型的scaling规律直接迁移到视觉上DiT论文里那张FID随参数量下降的曲线摆在那里第二工程生态已经全面倾斜。分布式训练框架、优化器、推理加速库全都针对Transformer做了深度优化继续优化U-Net意味着要自己养一套并行方案第三人才和经验可以横跨文本与视觉复用。今天负责视频DiT训练的人很多是从LLM团队借调来的他们对序列并行、激活重算、混合精度这些技术已经熟得不能再熟。这三点叠起来足以让绝大多数团队选择“同一个剧本”。这里想特别展开一下工程生态这事。你可能觉得“架构选择”是纯学术问题但工程师会告诉你一套成熟的分布式训练栈比模型结构本身更能决定项目死活。我用PyTorch训练过U-Net和DiT体感差异特别明显DiT的算子、模块划分、梯度同步策略几乎可以从开源LLM训练框架里直接搬U-Net的那些多尺度特征和中转张量反而在张量并行场景下让通信开销变得很难看。说白了生态已经把Transformer的复用价值打到了极致这不是“坚持特色创新”就能抵消的成本。3.3 抄剧本也不代表没差别你们比的到底是什么既然架构都在趋同差异化跑到哪去了这是这段时间我反复跟同行聊的问题。目前来看拉开差距的其实是四块视频编码器的质量比如可灵和即梦的VAE能保留多少高频细节直接决定画面锐度时序和运动建模时间注意力的窗口开多大、是否做分层稀疏注意力决定长视频不崩数据配方视频从哪里来、怎么清洗、配比如何决定审美和风格以及工程效率同样的预算下谁能把有效上下文拉到更长、采样做得更快。换句话说DiT给所有参赛者发了同一支笔但不同的答卷质量依然天差地别。举一个具体例子同样一句话“一只猫在雨中的城市街道上慢跑”两个都用DiT的模型可能给出完全不同的结果。一个画面锐利但猫的四肢轨迹偶尔穿模另一个整体风格偏柔和但运动非常连贯。这种差异极少来自DiT主干本身更多来自视频VAE对雨丝和毛发的重建能力、数据里猫跑动样本的数量、以及时间注意力对连续性的约束方式。做产品的人如果理解不到这一层很容易被“架构都一样”的结论误导忽视数据与表征这两个真正的护城河。4. 想上手DiT做视频生成需要抓住的参数和实操要点4.1 模型骨架和超参数怎么选从看懂到跑通如果你现在想自己复现或微调一个视频DiT最基础的骨架就三块Video VAE负责把视频压缩到latent空间、DiT主干负责去噪和条件建模、文本编码器把prompt变成token。我在摸索阶段最推荐的路径是先跑通DiT的图像版把patch、adaLN-Zero和缩放规律吃透再切到视频。理由是视频DiT里80%的调试经验在图像DiT里已经有了直接上视频排查问题会顾此失彼。实操里几个参数优先级最高patch size决定token数和细节上限。建议图片阶段从2起步视频阶段按设备从2x2x2或2x2x1试起。patch越小细节越好但序列越长显存压力线性上涨。latent空间通道数VAE一般把视频压缩到4到16个通道通道数越多重建质量越好但去噪计算越贵。很多画面发灰问题根源在这里而不在DiT。最大训练分辨率/帧数这个直接限制序列长度也是注意力计算的大头。新手别一上来就冲1080Px24帧先在256x256x16帧上验证稳定再逐步加码。学习率和优化器AdamW基本标配学习率要根据batch size和DiT规模做线性缩放别照抄别人媒体文章里不匹配的数值要跟自己的batch size配套。这个参数清单看起来不长但每一项都牵一发动全身。我自己见过最典型的新手失误就是把patch size从2改到4来省显存结果画面细节掉了一个档次又回头折腾VAE。改参数之前最好先定位瓶颈到底在哪再动手。4.2 显存和FLOPs的账注意力长度是显存杀手很多人第一次接触视频DiT就被显存吓到。原因很简单注意力复杂度是O(n^2)。一个256x256x16帧的视频经过VAE压缩后latent尺寸可能是32x32x16假设patch size取2时间维token数也会被压缩折算序列长度经常上万。这个长度在自注意力里会生成上亿规模的注意力矩阵显存直接告急。业内主流解法包括把视频切成多个时间块做注意力窗口Temporal Attention Window、使用稀疏注意力和FlashAttention系列算子、开激活重算来换显存、以及用序列并行把长序列分摊到多个GPU。选GPU时也别只看显存带宽和互联速度往往才是长序列训练的实际瓶颈。你可以快速估算一个batch的显存占用先算出token数N注意力矩阵就是N乘N乘batch里并行头的数量再乘每个元素的字节数。我遇到过一个案例模型规模没多大但token数从四千涨到八千显存直接翻了三倍。这就是注意力平方项在发威。动手训练前先把本质流程想明白确实能省很多时间。为了让你对这个过程有骨架认识我贴一段理解性的伪代码别看它短视频DiT单步训练的核心逻辑都在里面。# 伪代码视频DiT单步训练主干逻辑 for batch in loader: video batch[video] # (B, C, T, H, W) prompt batch[prompt] # (B,) latents video_vae.encode(video) # 压缩到 (B, c, t, h, w) t sample_timestep(batch_size) # 基于训练策略采样时间步 noise randn_like(latents) noisy latents * sqrt(alpha[t]) noise * sqrt(1 - alpha[t]) tokens patchify(noisy) # 时空patch化加位置编码 cond text_encoder(prompt) # 中间混合adaLN cross-attention注入条件主干DiT Block反复堆叠 pred dit(tokens, t, cond) target get_target(latents, noise, t, prediction_typev) loss mse_loss(pred, target) optimizer.zero_grad() loss.backward() optimizer.step()当然这只是主干真实工程里还包括EMA、混合精度、梯度裁剪、并行策略、数据预取这些但训练的本质就是反复做“加噪—反向去噪—算差值—更新权重”。把这个循环刻在脑子里后面看任何视频DiT项目都会快很多。4.3 训练和采样阶段最常踩的坑我整理了五个自己观察或亲历过的坑每个都能劝退一批初学者。直接照搬图像DiT的学习率。视频DiT序列更长、梯度噪声更大往往需要更小的学习率或更长预热。图像阶段work的1e-4到视频上直接可能让loss起飞。忽略时间位置编码的重要性。视频里时间维的位置编码如果没学好模型会分不清前后帧生成结果一会出现“鬼影”或倒放。排查时优先看时间位置编码的初始化方式。VAE练得不够好却归咎于DiT。视频画面模糊、闪烁很多时候是视频VAE重建上限不够DiT模型很冤枉。先单独测VAE的重建误差再谈DiT优化。采样步数用太少。视频DiT默认30步有些场景需要50步或更多步数太少会出现运动不连贯或过度平滑。推理时不能只追速度得在步数和画质间找平衡。长视频直接单序列硬推理。超过预算的序列长度要么爆显存要么注意力崩坏。多数产品会分成多段续拍再靠时序条件拼接。单序列硬扛是最常见的失败姿势。这几个坑的共同点在于它们都不是“模型结构不对”而是“训练和推理习惯还停留在图像模型时代的惯性”。做视频DiT最需要转变的是对序列长度和时间维度的敏感度这个心态转过来后面就顺了。5. 常见问题与误区排查5.1 视频模型为什么既像Sora又不像Sora很多读者会问如果都用DiT为什么各家生成风格差这么多前面已经提过差异来源这里再补一个视角DiT管的是“去噪主干”但prompt理解深度、视频表征、训练数据这三大因素基本决定了最终风格的走向。所以“架构趋同”和“成品各异”并不矛盾就像同一颗发动机底盘、调校、悬挂不同开起来完全是两种车。有些朋友可能还会困惑既然Sora把DiT带到公众视野为什么总有人强调“DiT不是Sora提出的”这个问题在学术和工程圈其实都有共识DiT是公开论文成果Sora是它的知名应用。搞清楚这个先后关系对你判断哪些技术是真正壁垒、哪些是公开基础非常重要。如果连这个根都认错很容易被各种营销话术带着走。我用一个表格把常见的误区和实际情况整理出来方便速查常见说法实际情况视频模型都抄Sora更准确说都继承了DiT这个共同起点Sora本身也是DiT扩展DiT就是视频模型DiT是通用扩散主干图像、视频、3D都能用用DiT就能生成高质量视频数据、VAE、算力、工程缺一不可架构只是入场券单流一定比双流好两种设计各有取舍单流更紧凑但训练要求更高视频模型靠的是神秘新架构真正拉开差距的是视频表征、数据配方和工程效率5.2 初学DiT时间该花在哪如果让我只给你一条路线建议我的顺序是这样的先把扩散模型的基本原理搞熟知道什么是对噪声、对v然后把ViT和注意力机制弄明白知道序列长度怎么影响计算再看一遍DiT论文和复现代码重点看adaLN-Zero和patch化最后才进入视频任务先跑小规模的类DiT代码在单卡上把训练、采样闭环跑通。这条路我能想到的最省时间的路径替你省下的主要是反复试错成本。有人会问能不能直接跳到最后一步跑通一个开源视频DiT就当会了我见过不少这么做的人结果遇到loss震荡、画面崩坏时完全无从下手。原因就是前面的原理模块没有打通一报错就只能去论坛里发帖等回复。反过来那些花了两周把原理吃透的人遇到问题能直接定位到是条件注入、位置编码还是数据预处理效率差好几倍。5.3 从学习到落地你现在能用的框架和验证路径现在生态已经比Sora刚发布时友好得多。Diffusers库里对DiT模型的支持越来越全想快速跑一个官方DiT checkpoint做图像生成审视一下效果一两个小时足够。视频方向有CogVideoX这类开源权重可以微调出可运行的小模型。如果你主要是为了理解DiT用PyTorch搭一个mini版DiT跑MNIST或小分辨率图像会比只看论文收获大得多。遇到问题先看注意力矩阵先在VAE上做消融大部分疑难杂症都能定位。还有一个特别容易被忽略的验证手段可视化位置编码。很多视频DiT起动后生成乱码你把位置编码的热力图画出来一眼就能看出时间维和空间维是否学到了合理的相对顺序。这个手段成本极低但能省下大量排查时间。做视觉生成方向的工程师千万别把自己困在“只读loss曲线”的思维里把中间产物打开看永远是最快的诊断方式。我个人在实操里最深的体会是Sora之后这场视频模型大战最值得复盘的不是哪家视频多惊艳而是整个行业几乎同频地选择了一个公开多年的架构作为公共底座。DiT能走到这个位置靠的并不是某个神乎其神的技巧而是它把“可扩展性”和“通用性”这两件事做到了极致。如果你正在考虑入局视频生成我的建议是先别急着追各种花哨的产品功能老老实实把DiT这套机制吃透——这条路不轻松但最稳。最后再分享一个小技巧真正理解DiT的最好方法不是反复读论文而是亲手把patch化的代码写一遍、把注意力长度变化时显存的账算一遍这个过程比任何视频教程都管用。把底层算力账和结构账都摸清了你再回头看各家视频模型的竞争就不会被任何营销话术忽悠了。