专业书籍精读 · Generative AI System Design Interview · 第 11 章
Generative AI System Design Interview · Ch 11 · Ali Aminian, Hao Sheng & Alex Xu · 2024
你大概已经见过 AI 画图:打一句话,几秒钟出一张。这一章问的是下一步——打一句话,出一段会动的视频。听起来只是「多画几张」,但整章都在说明一件事:这中间隔着的不是数量差别,而是一个全新的难题。
把「一只橘猫跳上沙发」这句话喂给画图模型一百二十次,得到一百二十张图,按顺序播放——你会看到一段抽搐的画面:猫忽胖忽瘦,沙发花纹每一帧都在变,跳到一半猫甚至换了一只。每张单看都不错,连起来没法看。
因为画图模型没有记性。它每次都从一团随机噪点重新画一遍,不知道上一张画了什么。而视频的本质恰恰是「有记性的照片」:观众能容忍画质差一点,但一眼就能看出「这不是同一只猫」。人眼对时间上的不连贯,比对画质挑剔得多。
把「时间」直接做进模型里,而不是事后补救。两个直觉:
第一,让模型横着看一眼。除了让画面里的每一块互相参考(这管构图),还要让同一个位置在前后帧的样子互相参考(这管运动)。猫耳朵在这一帧长什么样,下一帧得先看一眼再落笔。
第二,先打草稿,再补,再放大。像做动画片:先画几张关键动作的分镜,再补中间的过渡帧,最后统一放大上色。最难的那步只在最小、最粗糙的草稿纸上做一次,后面两步便宜得多。
所以今天的产品长得都差不多:你打一句话,等几十秒甚至几分钟(不是几秒),拿回一段四到八秒的定长片段;想要更长,就把末尾几帧当新开头接着往下写。代价也很实在:越往后接越容易跑偏——接到第三四段时,开头那只橘猫可能已经悄悄变了颜色。
画一张图比的是「像不像」,生成一段视频比的是「下一帧还认不认得出上一帧」。解法是把时间放进模型、让同一个位置跨帧互相参考;而暴涨的算力只能靠「先草稿、再补帧、再放大」这种分步骤的办法摊薄。
想进到具体机制、记号和示意图? → 切到精读版
文生视频不是「文生图 ×N」。本章的核心命题是:时间一致性(temporal consistency)必须作为一等公民写进模型结构,而不是事后修补;可一旦写进去,算力就沿「帧数 × 分辨率」两个方向同时爆炸。于是整章只有两条工程主线——怎么把时间建进去,和怎么把算力摊薄。今天所有视频生成系统的架构,几乎都是这两条线互相妥协的产物。
本章是《Generative AI System Design Interview》Part II 十道真题的收官一题,也是全书算力最重的一道。它直接站在第 8 章(高分辨率图像合成 · 潜空间扩散)与第 9 章(文生图 · 交叉注意力与无分类器引导)的肩膀上——那两章解决的「一帧怎么画好、怎么让它听话」在这里被当成已知条件,本章只加一件新事:时间。对应现实里 Sora、Veo、Runway 这类产品,以及任何「提交任务、排队出片」的生成型后端。
先把规模摆出来。一段 5 秒、24 fps 的片子是 120 帧。若照第 9 章那套逐帧生成,按单张图在一块 A100 上几秒的量级算,一百二十帧就是几分钟起步——而且换来的是一段没法看的画面:每一帧都从独立的随机噪声重新解一遍,内容在语义上毫无约束地漂移。
不解决会怎样?两件坏事同时成立。其一,质量上限被钉死:人眼对时间不连贯远比对单帧画质敏感——一帧里多一根手指可能没人注意,但沙发花纹每帧都在变,小孩都看得出来。其二,成本上限被钉死:视频的像素数是 帧数 × 高 × 宽,同一个模型搬到视频上算力按乘积涨,没人付得起。本章要解决的本质问题因此是:在一个爆炸的算力预算里买到时间一致性。
一个必须先划清的区分:插帧只能把已经一致的运动补得更顺,它的前提假设是相邻两帧本来就是同一个场景的两个瞬间。而逐帧独立生成的失败不是「不够顺」,是语义漂移——第 40 帧的猫和第 41 帧的猫压根不是同一只猫,插出来的中间帧只会是两只猫的糊状混合。判据很朴素:插帧是一种平滑,救得了抖动,救不了「换了个东西」。
结论因此很硬:时间必须进入生成过程本身,而不是接在它后面。
主流做法叫充气(inflation):拿一个训练好的文生图模型(第 8、9 章那套潜空间 U-Net 或 DiT),保留全部空间层不动,在每个块里插入新的时间层——沿着「同一空间位置、不同帧」这条轴做卷积或注意力。好处很直接:画质与提示词服从度原样继承,新增参数只学「怎么动」这一件事,所需的文本-视频配对数据因此少得多——这恰好补上视频数据远比图文稀缺的短板。
为什么不干脆做全 3D 注意力?成本。设一段视频在潜空间里是 T 帧、每帧 S 个 token:整段拍平做一次全注意力,要算 (T·S)² 对关系;拆成「帧内空间注意力 + 跨帧时间注意力」则是 T·S² + S·T² 对。代入一个现实量级——T=21、S=1024——前者约 4.6 亿 对,后者约 2250 万 对,差 20 倍。这 20 倍,就是今天绝大多数视频模型采用分解式结构的全部理由。
代价必须讲诚实:分解意味着一个 token 没法在一步里同时看到「别的位置 + 别的时刻」,长程时空关联只能靠多层堆叠间接建立。所以分解式模型最容易在「大幅运镜」「物体快速横穿画面」这类需要同时挪位置又挪时刻的场景上露馅——这正是后来「把时空一起切成 patch、直接做全注意力」那条路线(Sora 是代表)的动机。
第 8 章已经把去噪搬进潜空间——画面先被自编码器在空间上压缩若干倍,去噪在压缩图上做完再解码。视频要再压一个维度:时间。典型做法是因果 3D 自编码器:空间压 8×8、时间压 4×,合起来把视频压到原来的 1/256 量级(通道数另算)。没有这一步,级联和长上下文都无从谈起。
一个能记住的细节:智谱 CogVideoX 的官方仓库把可生成帧数写死成 8N+1(5B 版)或 16N+1(1.5 版,默认 81 帧)。那个 +1 不是凑数——它来自首帧被单独编码、其余帧按固定倍率成组压缩的因果设计:首帧必须能独立还原,「给一张图、续成一段视频」这种最常见的用法才成立。接口上一个看起来莫名其妙的约束,背后是自编码器的结构。
这是整章最该带走的工程结构。与其在目标分辨率、目标帧率上跑完整个去噪,不如拆成一条接力:
为什么划算:算力大致正比于 帧数 × 边长²。把最贵的完整去噪放在帧数与边长都最小的画布上做一次,后两级虽然面积大,但模型可以做得浅、步数可以少。Google 的 Imagen Video(2022)就是一个基础模型串起一连串交替的时间 / 空间超分模型;今天 Vertex AI 把「放大到 1080p / 4K」做成与生成分离的独立能力,正是同一结构在产品层的投影。
代价同样明确:级联是一条误差会累积的流水线——基础模型给错的运动,后面两级只会把它放大得更清楚;而且多套模型要各自训练、各自部署、各自监控,端到端调优几乎不可能。
上面这套的产物通常只有几秒。要更长,书里给的主路是自回归续写:拿已生成片段的末尾若干帧当条件,生成下一段。Stability AI 的官方仓库把这个量级写得很直白:Stable Video Diffusion 基础版「trained to generate 14 frames」,XT 版「finetuned for 25 frame generation」——十几到二十几帧,按常用帧率也就两三秒,更长的全是接出来的。
接的代价是漂移(drift):每段都以上一段的输出为输入,误差沿链累积,颜色、光照、人物身份缓慢跑偏;而且续写天然串行,加卡也并行不掉。缓解手段是每段都重新注入全局条件(提示词嵌入、首帧、参考图),让每段锚回同一个源头,而不是锚回上一段。
这一章的灵魂是「在算力和一致性之间怎么买」——三条路线,没有一条免费。
表 1 · 三条生成路线怎么选
| 路线 | 机制 | 什么场景选它 | 代价 |
|---|---|---|---|
| 逐帧图像模型 + 插帧 | 每帧独立去噪,事后补帧把运动抹顺 | 有原视频逐帧引导的风格转绘,或近乎静止的画面 | 纯文生视频下基本不可用——插帧救抖动,救不了语义漂移 |
| 原生时空模型 一次成段 | 时空 token 一起去噪,可做全注意力 | 大幅运镜、快速运动、需要长程一致的镜头 | 上下文长度 ∝ 帧数 × 面积,注意力成本按平方涨;训练与推理都最贵 |
| 级联 (基础 + 时间超分 + 空间超分) | 低分低帧定骨架,再逐级补帧、放大 | 有限预算里要拿到高分辨率成片——工业界主流 | 误差逐级累积;多套模型各自训练部署;端到端调优困难 |
表 2 · 想要更长的片子
| 策略 | 机制 | 代价 |
|---|---|---|
| 直接拉长上下文 | 一次性对更多帧去噪 | 注意力成本按帧数平方涨,显存先撑不住;训练数据里长片本就稀缺 |
| 自回归续写 | 末尾几帧作条件,生成下一段 | 漂移累积;串行不可并行,延迟随长度线性涨 |
| 层次化: 先关键帧再填充 | 先稀疏生成全程关键帧,再在段内补帧 | 全局一致性最好,但关键帧之间的大跨度运动最难对齐,容易出现「瞬移」 |
选型可以压成一句:如果你的场景是「几秒钟、可预览、可重生成」,级联 + 定长片段几乎总是对的;只有当「一镜到底、机位大幅移动」本身是核心卖点时,才值得去付全时空注意力那笔账。这和文生图的选型逻辑完全不同——那里的主要变量是画质与服从度,这里的主要变量是一致性能撑多久。
产品形态几乎被算力决定了。视频生成基本都是异步任务——提交、排队、轮询、取件。这和文生图(同步等几秒)是两种后端:你需要任务队列、可抢占的 GPU 调度、可恢复的作业状态,以及「先出低分辨率预览、用户确认后再出成片」的两段式交付,因为一次重生成的代价是按 GPU 分钟计的。
成本是设计约束,不是事后账单。对外按秒计价已是常态;训练侧,开源项目 Open-Sora 把 11B 模型的训练成本公开标成 $200K——这个数字的意义不在于便宜,而在于它把「能不能训」变成了一道能算清的预算题。
安全与合规比图像更紧。提示词侧过滤 + 输出侧检测 + 来源标注(水印 / C2PA)三件套缺一不可:动起来的伪造在可信度上远超静态图,肖像与版权风险因此不在一个量级。
生成完只是开始。成片还要转码成多码率、走 CDN 分发——这部分和普通点播系统没有区别,却常被设计题漏掉。
16N + 1 where N <= 10 (default 81)」,对应「5 seconds or 10 seconds」「16 frames / second」「1360 * 768」,而 5B 版是 8N+1、「6 seconds」、「720 * 480」。接口上的 +1,泄露的是自编码器的时间压缩结构。THUDM · CogVideo 官方仓库(2024)· github.com/THUDM/CogVideo① 问题:文生视频不是文生图 ×N。人眼对时间不连贯的敏感度远高于对单帧画质,而算力按 帧数 × 边长² 涨——一致性与成本同时被钉死。
② 核心命题:时间一致性必须写进模型结构,不能事后修补;插帧只是平滑,救不了语义漂移。
③ 主力机制一:把文生图模型「充气」成 3D——保留空间层,插入时间层;画质与服从度原样继承,新参数只学「怎么动」,顺带绕开视频数据稀缺。
④ 为什么分解:全 3D 注意力是 (T·S)²,分解成空间 + 时间是 T·S² + S·T²;T=21、S=1024 时差约 20 倍。代价是长程时空关联只能靠堆层间接建立。
⑤ 主力机制二:潜空间要在时间上也压(典型空间 8×8、时间 4×);CogVideoX 接口上的 8N+1 / 16N+1 就是这个压缩结构的外露。
⑥ 主力机制三:级联——低分低帧定骨架,再时间超分、空间超分。难的一步只在最小画布上做一次;代价是误差逐级放大、多套模型各自运维。
⑦ 长视频:自回归续写是主路,代价是漂移与串行;缓解办法是每段都重新注入全局条件,而不只锚回上一段。
⑧ 落地:异步任务 + 队列 + 抢占式 GPU 调度 + 「低分预览 → 成片」两段式交付;成本按 GPU 秒计,安全靠输入过滤 + 输出检测 + 水印三件套。
⑨ 评估:FVD 对时间伪影不敏感、CLIP 分完全不看时间——自动指标只能当筛子,最终裁判仍是人评。