DiT 与 H3:用图看懂

配合《神经网络架构动画》使用 · H3 的数字都来自知识库,画面和玩具例子是示意(页尾有清单)

先记住一句话

H3 ≈ VAE(把视频压小、最后再还原)+ DiT(每一步判断「该往哪个方向去噪」)+ 采样器(按这个方向迈一小步)。

DiT = 扩散模型 + Transformer 骨架。它和 Qwen、GPT 是同一副骨架,只是用法不同。

1 · H3 生成一段视频的全过程

从一团随机噪声出发,DiT 和采样器配合着转圈:DiT 看一眼当前画面,说出「该往哪个方向去噪」;采样器沿这个方向迈一小步,再把画面送回 DiT。转够圈数,VAE 把结果还原成视频。

左边「潜空间里的画面」是示意。真实的潜空间是 VAE 压缩后的一堆数字,人眼看不出画面,画成图只是为了让你看到噪声一步步变少。

这张图为了好懂省掉了几样东西(都已对照官方仓库的配置和 README 核实):

2 · 扩散:从雪花屏到画面

扩散模型生成画面,就是把一团雪花噪点一步步擦干净。H3 用的方法叫 rectified flow:把「噪声」和「画面」之间想成一条直线,任何一步的画面都是两者按比例混合。拖动滑块看看:

当前画面
DiT 此刻猜的最终画面(示意)
每一步还剩多少噪声
当前画面 = (1 − σ) × 最终画面 + σ × 噪声  σ = 噪声占比,从 1 一步步降到 0

3 · 采样器:沿着方向一步步走

把每一张可能的画面想成地图上的一个点。下面是二维的玩具地图,真实的地图有几百万维,但道理一样:

真实路线是弯的。步子小,就能贴着弯道走;步子大,就会冲出弯道。拖动「步数」看看:

rectified flow 训练时希望路线尽量直,直线的话一步就能走到。但学出来的路线总有弯,所以原版要走 49 步。这也说明不能直接把步数改成 8:不重新训练,大步就会冲出弯道。

4 · 同一副骨架,两种用法

DiT 里的 T 就是 Transformer。它和 Qwen、GPT 用的是同一副骨架:一层层叠起来的「注意力 + 前馈」。区别在于每一步让它干什么:

为什么用 Transformer:给扩散模型换大脑

扩散模型里每一步都要跑一遍、负责判断方向的部分叫主干网络,相当于它的大脑。早期的主干多是 U-Net,后来发现换成 Transformer 更容易靠扩大规模变强,DiT 就是这样来的。

5 · 切块和注意力:视频怎么变成 token

Transformer 只认一排 token。文本切成字词;视频切成时空小块:时间上取几帧、画面上取一小格,合成一块,就是一个 token。

下面用你本地 DiT实战/tiny_dit.py 的真实设置:16 帧、每帧 32×32 像素,每块取 2 帧 × 4×4 像素,切出 8 组 × 8 × 8 = 512 个 token。把鼠标移到任意一块上(手机上点一下):

每个 token 都要和所有 token 算一次注意力分数,计算量随 token 数的平方增长。512 个 token,一层就要算 26 万多个分数。

H3 的真实切法:VAE 先把画面在长、宽上各压 16 倍,时间上压 4 倍,再按 1×2×2 切块,所以每个 token 管 4 帧 × 32×32 像素。按官方 VAE 的分块规则推算,5 秒 768p 有 37,296 个视频 token,加上音频和文本约 3.8 万个,一层要算约 14.6 亿个注意力分数(推算值)。所以注意力常是加速的重点。

稀疏注意力只让每块看一部分块。图里简化成「只看附近的块」;FastH3 自带的 VSA 会自己挑出重要的块。视频越长,token 越多,平方项越大,省得越多。你的方案里记录的是:5 秒视频快 1.13 倍,15 秒快 1.93 倍。

6 · AdaLN:按去噪进度给每一层拧旋钮

第 2 节说过:噪声多时要定大轮廓,快结束时只修细节。可 DiT 每一步都是同一个网络、同一套参数,它怎么知道现在该干哪种活?

答案是 AdaLN(自适应层归一化):把「现在走到哪一步」换算成每一层的缩放和偏移,相当于给每一层拧旋钮。拖动进度看看:

这一块在 H3 里非常大:33.14B 参数里有 13.03B 是 AdaLN 投影层。普通文本模型一般没有这一块,因为它不需要知道「去噪进度」。H3 的 AdaLN 还按模态分开,视频、音频各有一套旋钮。

关键在于:旋钮的位置只看「走到第几步」,跟画面内容无关。官方 README 说,这些输出可以提前算好存起来,纯推理部署时这 13B 参数不用加载。它每步的计算量本来就很小,所以省的主要是显存。H3-Next 方案里的 AdaLN folding 也是这个思路,估算把模型从 33B 降到约 20B。

7 · 加速招数打在图上哪一处

回到第 1 节的总图。每种加速方法都是在图上某一处少算一点。点下面的按钮:

每一招都要过质量关卡:你的方案定的是 PSNR ≥ 28 dB(越高越接近原版),再加人眼看片,尤其是口型。H3-Next 还要求 300 个提示词的盲测 GSB ≥ 0.9。几招叠在一起的效果通常不是简单相乘,组合必须实测。

先量,再砍

你在 5090 上用 FastH3 Trim 生成 5 秒 480p 带音频的视频,时间是这样分的:

就算把去噪优化到 0 秒,最多也只能快 13.4 ÷ 4.3 ≈ 3.1 倍。所以到了这一步,剩下那 4.3 秒也得拆开量、一起砍。

数字来源:知识库(H3 的层数、宽度、参数量、shift = 12、各种加速比、5090 实测);HuggingFace 上 MiniMaxAI/MiniMax-H3 的配置文件和 README(Qwen3-VL-32B 第 50 层、VAE f16t4、1×2×2 切块、视频和音频两套调度、CFG 蒸馏、AdaLN 可预计算),diffusers 与 SGLang 的调度器说明(49 / 50 次的差别);本地 DiT实战/tiny_dit.py(第 5 节的 16 帧 32×32、2×4×4 切块)。

示意的部分:潜空间画面、「猜的最终画面」有多糊、第 3 节的二维流场和偏离百分比、稀疏注意力「只看附近」、AdaLN 旋钮的角度、第 7 节剪掉的是哪几层。

想动手:DiT实战/tiny_dit.py 用的就是这页的零件(3D 切块、adaLN、rectified flow、Euler 采样器),能在笔记本上从零训练一个玩具视频 DiT。