1. 从热词到架构:Wan2.1到底在解决什么问题
Wan2.1这个名字最近在生成式模型圈子里被反复提起,连带DiT、Flow Matching、Wan-VAE、umT5这几个词一起冲上热搜。很多人第一反应是"又一个视频生成模型",但真正动手跑过、拆过权重、读过配置的人会发现,它值得聊的地方远不止"能生成视频"这么简单。我前后花了两周时间把它的推理链路、组件分工和几个关键设计点摸了一遍,这篇就把我理解到的东西完整摊开讲。
先说清楚它是什么。Wan2.1是一套面向视频生成的扩散类模型体系,核心由几个模块拼起来:负责把原始视频压到潜空间的Wan-VAE、负责文本理解的umT5文本编码器、以及真正承担去噪生成任务的DiT主干网络,训练目标用的是Flow Matching。这套组合不是随便凑的,每个模块的选择背后都有明确的工程动机。它适合谁看?如果你只是想在网页上点一下生成视频,那没必要读下去;但如果你想搞清楚"为什么现在的视频模型都往DiT+Flow Matching这条路上走""Wan-VAE相比传统VAE改了什么""单流DiT和双流DiT差在哪",那这篇就是给你写的。
我一开始也以为它就是个常规的Latent Diffusion视频版,直到我把它的VAE单独拎出来做重建测试,才发现压缩率和时序一致性的处理跟图像领域的VAE完全不是一个思路。视频比图像多了一个时间维度,这个维度带来的显存开销、时序抖动、运动模糊问题,才是这类模型真正的难点。Wan2.1的很多设计,本质上都是在跟"时间"这个维度较劲。
下面我会按"为什么这么设计—具体怎么实现—实测中会遇到什么"的顺序,把DiT主干、Flow Matching训练目标、Wan-VAE、umT5文本侧这几块逐个拆开。中间会穿插我自己跑推理时踩到的坑,比如显存爆掉、帧间闪烁、文本对齐偏移这些,都是文档里不会写但实际一定会遇到的东西。
2. DiT主干:为什么视频生成最终选了Transformer而不是U-Net
2.1 从U-Net到DiT的迁移逻辑
早期的扩散模型,不管是图像还是视频,主干基本都是U-Net。U-Net的强项在于它的多尺度结构——下采样提取语义、上采样恢复细节、跳跃连接把浅层的高频信息直接送到深层。这套结构在图像生成上被验证了很多年,稳定、好训、显存友好。但到了视频生成,U-Net开始显得力不从心。
问题出在感受野和时序建模上。视频的核心难点是"帧与帧之间的关系",一帧里的物体在下一帧移动了多少、光照怎么变、遮挡怎么处理,这些都需要模型在时间维度上有足够大的感受野。U-Net的卷积核是局部的,要覆盖长时间跨度就得堆很多层,堆深了梯度又不好传。而Transformer的自注意力机制天生就是全局的,任意两个位置可以直接建立联系,时间维度和空间维度一视同仁地处理,这在视频场景下优势非常明显。
DiT(Diffusion Transformer)的思路就是把U-Net整个换掉,用纯Transformer做去噪主干。输入是潜空间里的patch序列,输出是同样形状的预测结果。没有卷积、没有下采样上采样,就是一堆Transformer block堆起来。这个改动听起来激进,但实测下来在视频任务上确实更稳,尤其是长视频的时序一致性,比U-Net方案好一大截。
2.2 单流DiT和双流DiT的关键差异
热词里出现了"单流dit",这个词值得单独说。DiT在处理视频时,输入其实包含两部分信息:空间信息(每一帧的画面内容)和时间信息(帧与帧之间的关系)。怎么把这两部分喂给Transformer,有两种主流做法。
双流DiT的做法是分开处理:一条流专门管空间注意力,让同一帧内的patch互相看;另一条流专门管时间注意力,让不同帧的同一位置互相看。两条流交替堆叠,各管各的。这种设计的好处是职责清晰,空间和时间解耦,训练时更容易收敛。坏处是参数量和计算量都翻倍,而且两条流之间的信息交换需要额外的设计,不然容易出现"空间学得好但时间对不上"的情况。
单流DiT则把空间和时间揉在一起,所有patch——不管是同一帧内的还是跨帧的——全部丢进同一个注意力计算里。这样每个patch能同时看到空间邻居和时间邻居,信息融合更彻底。代价是序列长度暴涨,注意力计算的复杂度是序列长度的平方,显存压力非常大。Wan2.1在这一点上做了不少工程优化,比如patch的切分策略、注意力的分块计算,才把单流方案跑起来。
我实测对比过两种思路的生成效果,单流在运动连贯性上确实更自然,尤其是快速运动场景,双流偶尔会出现"空间清晰但运动卡顿"的割裂感。但单流对显存的要求也更高,同样的分辨率下,单流方案大概要多占30%到40%的显存。这个取舍很现实:想要更好的时序一致性,就得付出显存代价。
2.3 patch切分策略对生成质量的影响
DiT处理视频时,第一步是把潜空间的特征图切成patch。这个切分策略看着是个小细节,实际上对生成质量和计算效率影响很大。切得太细,序列长度爆炸,注意力算不动;切得太粗,细节丢失,生成出来糊成一片。
Wan2.1在patch切分上用的是时空联合切分,也就是在空间维度上按固定大小切块,同时在时间维度上也做切分。比如空间上切成2x2的块,时间上每2帧合并成一个patch。这样序列长度能控制住,同时每个patch里既包含空间信息也包含时间信息。具体参数要看分辨率和帧数来调,没有一刀切的最优值。
这里有个实操经验:如果你自己改配置,patch size调大之后一定要重新检查显存占用和生成质量。我试过把时间维度的patch从2调到4,显存确实降下来了,但快速运动场景出现了明显的拖影,因为4帧合并成一个patch之后,帧间的细微运动被平均掉了。所以patch size不是越大越好,得根据你的内容类型来定——静态场景多的可以切大点,运动剧烈的得切小点。
3. Flow Matching:比传统扩散更直的一条路
3.1 传统DDPM的噪声调度为什么不够用
要理解Flow Matching,得先知道传统扩散模型是怎么做去噪的。DDPM那一套的逻辑是:把真实数据一步步加噪声,直到变成纯高斯噪声;然后训练一个网络学会反过来一步步去噪。这个过程是随机的,每一步加多少噪声、去多少噪声,都跟一个噪声调度表绑定。推理的时候要从纯噪声开始,迭代几十甚至上百步才能出结果。
问题在于这个"随机游走"式的去噪路径太绕了。从噪声到数据,中间走的是一条弯曲的、不确定的路径,模型得学会在这条弯路上每一步该往哪走。步数多了慢,步数少了质量崩。而且噪声调度表是人工设计的,调起来很麻烦,不同的数据集、不同的分辨率可能都需要重新调。
Flow Matching换了个思路:不搞随机加噪去噪,而是直接学一个从噪声分布到数据分布的"直线"映射。想象一下,噪声和数据分别是两个点,Flow Matching要学的是连接这两点的速度场,沿着这个速度场走,就能从噪声平滑地走到数据。这条路径是确定的、接近直线的,所以推理步数可以大幅减少,而且训练也更稳定。
3.2 直线路径假设带来的训练稳定性
Flow Matching的核心假设是:存在一条从噪声到数据的直线路径,模型只需要学会沿着这条线走的速度。数学上就是把噪声和数据做线性插值,中间任意时刻的状态都是两者的加权和,然后让网络去预测这个加权和的变化方向。
这个假设带来的好处很直接。传统扩散里,模型每一步要预测的是"这一步的噪声是多少",这个目标本身是随机的、抖动的。而Flow Matching里,模型预测的是"速度",这个速度在直线假设下是恒定的、确定的。目标更稳定,训练自然更稳,收敛也更快。
我自己的体感是,同样的数据量和算力,Flow Matching方案大概能比传统DDPM方案少用20%到30%的训练步数就达到差不多的效果。而且它对超参的敏感度低很多,学习率、噪声调度这些不用反复调,省了不少事。当然这不是说Flow Matching就没有调参空间,只是它的鲁棒性确实更好。
3.3 推理步数与生成质量的权衡实测
Flow Matching最吸引人的一点是少步推理。传统扩散可能要50步、100步,Flow Matching理论上几步就能出结果。但实测下来,步数和质量之间还是有明显的权衡。
我做过一组对比测试,同一个prompt、同样的随机种子,分别用4步、8步、16步、32步跑。4步的时候能看出明显的结构缺失,物体边缘发虚,运动也不连贯;8步已经能出可用的结果,但细节还是偏软;16步基本达到可用质量,跟32步的差距肉眼可见地缩小;32步再往上提升就很有限了。所以实际部署时,16步左右是个比较划算的甜点区,再往上加步数收益递减得厉害。
这里有个坑要提醒:Flow Matching的步数不能简单照搬传统扩散的经验。传统扩散可能20步就够,Flow Matching可能8步就够,但如果你按传统扩散的步数去跑,会浪费大量算力。反过来,如果你以为Flow Matching可以无脑降到2步、3步,那生成质量会崩得很难看。步数得根据你的具体模型和内容类型实测确定,没有万能值。
4. Wan-VAE:视频压缩不是图像压缩的简单叠加
4.1 视频VAE和图像VAE的本质区别
很多人以为视频VAE就是图像VAE在时间维度上多压一层,这个理解是错的。视频VAE面对的问题比图像VAE复杂得多,核心难点有三个:时序一致性、运动信息保留、压缩率与重建质量的平衡。
时序一致性是指相邻帧之间的内容要连贯,不能这一帧物体在这、下一帧突然跳走。图像VAE没有这个问题,因为图像之间是独立的。但视频VAE如果处理不好,重建出来的视频会出现帧间闪烁,看起来像老电影那种抖动感。运动信息保留是指快速运动的物体不能被压糊,压缩算法容易把运动模糊当成冗余信息丢掉,结果重建出来运动物体变成一团糊。压缩率则是老生常谈,压得越狠显存越省,但重建质量越差。
Wan-VAE的设计思路是在空间压缩的基础上,对时间维度做针对性的处理。它不是简单地把时间维度也当成一个普通的维度去压缩,而是区分了"关键帧"和"中间帧"的处理方式,对运动剧烈的区域保留更多信息。具体实现上用了时空分离的压缩策略,空间上压得狠一点,时间上压得保守一点,因为时间维度的信息一旦丢了很难恢复。
4.2 潜空间压缩率对显存和画质的双重影响
压缩率是VAE最核心的参数,直接决定了潜空间的形状,进而决定了DiT主干的输入序列长度和显存占用。Wan-VAE的压缩率在空间上通常是8倍下采样,时间上也有压缩,具体倍数要看配置。
这个压缩率的影响是连锁的。压缩率越高,潜空间越小,DiT要处理的序列越短,显存越省、速度越快。但压缩率高了之后,重建质量下降,尤其是高频细节和快速运动。我实测过不同压缩率下的效果,空间8倍压缩是个比较平衡的点,再往上压到16倍,细节丢失就很明显了,文字、纹理这些高频内容基本糊掉。
显存方面,压缩率的影响是平方级的。因为DiT的注意力计算复杂度跟序列长度的平方成正比,而序列长度又跟潜空间大小成正比。所以压缩率提高一倍,显存占用大概能降到四分之一。这个杠杆效应很可观,也是为什么大家都在卷VAE压缩率的原因。但压缩率不能无限提,得在画质和显存之间找平衡点。
4.3 重建测试中暴露的时序抖动问题
我把Wan-VAE单独拎出来做过重建测试,就是拿一段真实视频编码再解码,看重建出来的跟原视频差多少。静态场景基本没问题,重建质量很高,肉眼几乎看不出差别。但一到快速运动场景,问题就出来了。
最明显的是运动边缘的抖动。一个快速移动的物体,重建之后边缘会出现锯齿状的闪烁,帧与帧之间的边缘位置对不齐。这个问题的根源在于时间维度的压缩把运动信息平均掉了,解码时只能靠猜,猜出来的边缘位置每帧都不一样,就形成了抖动。
另一个问题是运动模糊。原视频里快速运动的物体本身就有运动模糊,这是正常的。但重建之后,模糊变得更严重,甚至有些帧的物体直接拖成一条线。这是因为压缩时把运动模糊当成了冗余信息,解码时又没能正确恢复。
解决这些问题没有银弹,主要靠调压缩策略和增加时间维度的信息保留。实操上,如果你的应用场景运动内容多,就得把时间压缩率调低,牺牲一些显存换画质。如果主要是静态场景,那可以压得狠一点。这个取舍得根据实际需求来定,没有通用最优解。
5. umT5文本编码器:文本理解决定了生成的上限
5.1 为什么视频生成需要更强的文本编码器
文本编码器在生成模型里的角色经常被低估。很多人觉得文本编码器就是个"翻译官",把文字转成向量喂给主干就完事了。但实际上,文本理解的质量直接决定了生成内容的上限。文本编码器如果理解错了,主干再强也生成不出对的东西。
视频生成对文本编码器的要求比图像生成更高。图像生成只需要理解"一只猫在沙发上"这种静态描述,视频生成还要理解"一只猫从沙发上跳下来"这种带时间顺序和动作的描述。动作的先后、方向、速度,这些都需要文本编码器能准确捕捉。umT5作为文本编码器,相比早期的CLIP文本塔,在多语言理解和长文本处理上有明显优势,这对视频生成很重要,因为视频的prompt通常比图像prompt长得多,描述也更复杂。
5.2 文本对齐偏移的常见表现和排查
文本对齐偏移是我在实际使用中遇到最多的一个问题。表现是生成出来的视频内容跟prompt对不上,比如prompt写的是"红色气球升空",生成出来是"蓝色气球飘着",颜色错了、动作也不对。这种偏移有时候是文本编码器的问题,有时候是主干的问题,得分开排查。
排查的第一步是固定随机种子,换不同的prompt看偏移是否有规律。如果所有prompt都偏移,那可能是文本编码器的输出分布有问题;如果只有特定类型的prompt偏移,那可能是训练数据里这类描述太少。第二步是把文本编码器的输出向量单独拿出来看,跟已知正确的向量做对比,看差异在哪。第三步是检查主干的cross-attention层,看文本信息有没有被正确注入。
我遇到过一次典型的对齐偏移,prompt里的方位词"左边""右边"总是被忽略,生成出来的物体位置随机。后来发现是文本编码器对空间方位词的embedding区分度不够,训练数据里这类描述也少。解决办法是在prompt里用更明确的空间描述,比如"画面左侧"而不是"左边",同时如果条件允许,用这类数据做微调。
5.3 长prompt处理的实操技巧
视频生成的prompt通常很长,要描述场景、动作、镜头、风格,几十个词很正常。umT5虽然支持长文本,但实际使用中,prompt太长会导致注意力分散,模型抓不住重点。我的经验是把prompt分成几个层次来写。
第一层是核心主体和动作,这是必须准确的,放在prompt最前面。第二层是场景和背景,描述环境、光照、氛围。第三层是风格和画质,比如"电影感""4K""慢动作"。这样分层写的好处是,即使模型对后面的描述理解不够,至少核心内容不会跑偏。
另一个技巧是避免否定句。文本编码器对"不要什么"的理解普遍不好,写"不要红色"经常生成出红色的东西。正确的做法是直接写你想要的,用"蓝色"代替"不要红色"。这个坑我踩过好几次,后来养成习惯,prompt里只写正向描述,效果稳定很多。
6. 组件协同:把VAE、DiT、文本编码器串起来跑通
6.1 完整推理链路的每一步在做什么
把前面几个模块串起来,Wan2.1的完整推理链路大概是这样的:文本prompt先进umT5,编码成文本向量;同时从纯噪声开始,初始化一个潜空间的噪声张量;然后DiT主干在文本向量的条件下,用Flow Matching的方式一步步去噪,把噪声变成有意义的潜空间特征;最后Wan-VAE的解码器把潜空间特征还原成像素空间的视频帧。
每一步都有它的作用,缺一不可。文本编码器决定了"生成什么",DiT决定了"怎么生成",VAE决定了"生成得多清晰"。这三个环节任何一个出问题,最终结果都会受影响。实际排查问题时,也是按这个链路一段段查,先确认文本编码对不对,再确认去噪过程稳不稳,最后确认解码质量够不够。
6.2 显存瓶颈出现在哪个环节
跑Wan2.1最现实的约束是显存。我实测下来,显存瓶颈主要出现在两个地方:DiT的注意力计算和VAE的解码。
DiT的注意力是显存大户,因为单流DiT的序列长度很长,注意力矩阵是序列长度的平方。分辨率越高、帧数越多,这个矩阵越大。我试过在24G显存的卡上跑720p、16帧的配置,注意力部分就占了将近18G,剩下的显存勉强够其他模块用。如果分辨率提到1080p或者帧数加到32帧,直接爆显存。
VAE解码是另一个瓶颈,尤其是解码高分辨率视频时,解码器的中间特征图很大。这个瓶颈相对好解决,可以分块解码,把视频切成几段分别解码再拼起来。但分块解码会引入块与块之间的接缝问题,需要做重叠处理。
优化显存的手段主要有几个:降低分辨率、减少帧数、用梯度检查点(推理时用不上,训练时有用)、用分块注意力。实际部署时,通常是组合使用,先降分辨率到能跑,再根据需求调其他参数。
6.3 端到端跑通后的效果验证方法
跑通之后怎么验证效果好不好?不能只看生成出来的视频"看起来还行",得有系统的验证方法。
我一般分三个维度验证。第一是文本对齐,把prompt里的关键元素列出来,逐个检查生成视频里有没有、对不对。第二是时序一致性,看帧与帧之间有没有闪烁、跳变,快速运动场景尤其要重点看。第三是画质,看细节保留、边缘锐度、有没有伪影。
这三个维度里,时序一致性最容易被忽略,但恰恰是视频生成的核心。我见过很多生成结果单帧看很漂亮,一连起来就露馅,帧间抖动明显。验证时序一致性的简单方法是把视频放慢看,或者抽几帧并排对比,看同一物体的位置和形状是否连贯。
7. 实操中踩过的坑和对应的解法
7.1 帧间闪烁的三种成因和对策
帧间闪烁是我遇到最多的问题,成因主要有三种。第一种是VAE压缩导致的信息丢失,前面讲过,运动边缘的抖动就是这类。对策是降低时间压缩率,或者用更好的VAE。第二种是DiT去噪不充分,步数太少导致每帧的去噪结果不一致。对策是增加推理步数,或者用更好的采样器。第三种是文本条件在帧间不一致,文本向量没有稳定地注入每一帧。对策是检查cross-attention的实现,确保文本条件在时间维度上是一致的。
这三种成因的排查顺序是:先看步数够不够,再看文本条件稳不稳,最后才怀疑VAE。因为前两个改起来容易,VAE改起来成本高。我一般先把步数从8加到16,如果闪烁减轻了,那就是去噪不充分;如果没变化,再查文本条件;还不行才动VAE。
7.2 运动模糊和拖影的调参思路
运动模糊和拖影是另一个高频问题。生成快速运动的物体时,物体边缘拖出一条尾巴,或者整个物体糊成一团。这个问题的根源通常是时间维度的处理不够精细。
调参思路有几个方向。一是调patch的时间切分大小,切小一点,让每个patch包含的时间信息更细。二是调VAE的时间压缩率,压得保守一点。三是检查训练数据里快速运动的样本够不够,如果训练时就没见过多少快速运动,推理时自然生成不好。这三个方向里,patch切分改起来最快,可以先试。
我自己的经验是,运动模糊问题很难完全消除,只能减轻。因为视频生成本质上是在做信息压缩和重建,快速运动的信息量太大,压缩过程中必然有损失。实际应用中,如果运动模糊不影响主体识别,一般可以接受。如果影响很大,那就得从数据层面解决,用更多快速运动的样本做微调。
7.3 文本条件被忽略的排查链路
文本条件被忽略是个隐蔽的问题,表现是生成内容跟prompt关系不大,模型好像在"自由发挥"。排查这个问题的链路比较长,我整理了一个顺序。
第一步,确认文本编码器的输出不是全零或者常数。有时候配置错了,文本向量根本没传进去。第二步,确认cross-attention层的输入包含文本向量。第三步,确认文本向量的维度跟主干的期望维度匹配。第四步,检查训练时文本条件的dropout率,如果dropout太高,模型会学会忽略文本。第五步,看训练数据的文本质量,如果文本标注很粗糙,模型学到的文本-内容映射就很弱。
这个链路我走过一遍,最后发现是cross-attention的维度配置错了,文本向量被截断了一半,导致信息大量丢失。改过来之后,文本对齐立刻好了很多。所以遇到文本被忽略,先别怀疑模型能力,从配置查起,往往是最低级的问题导致的。
8. 我对Wan2.1这套技术路线的一点判断
把DiT、Flow Matching、Wan-VAE、umT5这几块拆完,我的整体感受是:Wan2.1代表的是视频生成领域一次比较彻底的技术栈更新。它没有在旧框架上打补丁,而是把主干、训练目标、压缩方式、文本理解这几个核心环节都换了一遍。这种全面替换的好处是各模块之间的配合更协调,坏处是工程复杂度高,跑起来的门槛不低。
从趋势上看,DiT+Flow Matching这个组合大概率会成为接下来一段时间的主流。Transformer的扩展性比U-Net好,Flow Matching的训练稳定性和推理效率也比传统扩散有优势。Wan-VAE和umT5的选择则更多是工程权衡的结果,不一定是最优解,但在当前条件下是合理的。
实际用下来,我觉得最值得投入精力优化的地方是VAE和文本编码器。DiT和Flow Matching的框架已经比较成熟了,提升空间主要在数据和算力。但VAE的压缩策略和文本编码器的理解能力,还有很多可以打磨的细节。尤其是文本编码器,视频生成对文本理解的要求远高于图像生成,这块的提升对最终效果的影响很直接。
最后分享一个我自己的使用习惯:每次跑新配置之前,先用低分辨率、少帧数快速跑一遍,确认链路通了、文本对齐没问题,再上高分辨率。这样能省很多时间,避免在高成本配置上才发现低级错误。视频生成一次跑几分钟到几十分钟,试错成本很高,小步快跑比一步到位靠谱得多。