面试与作品:把这本书变成你的东西¶
推理岗的面试里,图像与视频生成正在从"加分项"变成"第二战场":面试官想知道你能不能把 LLM 推理的功夫迁移到一个没有 KV Cache、靠几十次前向出结果、注意力序列十万 token 的模型上。这一章把前面 19 章收成三样东西:一张"能力 ↔ 章节 ↔ 考法"的对照表,十道高频问题的答题骨架和关键数字,以及几个在一张消费级卡(甚至 CPU)上就能做出来、能写进简历的作品。
面试考什么¶
生成模型推理的问题几乎都可以归到四类,每类都有"必须带数字"的要求:
| 考察点 | 典型问法 | 面试官想听到 | 本书对应 |
|---|---|---|---|
| 账算得清 | "FLUX 出一张 1024² 要多久、显存多少?""视频为什么慢?" | 用参数量、token 数、步数、CFG 推出 FLOP 和时间,和实测对得上 | 算账、显存、视频瓶颈 |
| 手段知其所以然 | "缓存为什么能跳?""量化为什么和 LLM 不一样?""为什么视频要序列并行?" | 每个手段的前提、能省多少、代价是什么、能不能叠加 | 少步、缓存、量化、并行 |
| 服务设计 | "设计一个文生图 API""多 LoRA 怎么做" | 延迟 vs 吞吐的取舍、分池、流水、预览取消、权重切换 | 调度、多 LoRA / ControlNet、部署 |
| 验证与评测 | "怎么证明你的优化无损?""怎么压测?" | 预热、同步、分位数,开环 / 闭环,PSNR 与 FID 的边界 | 评测与压测 |
和 LLM 推理面试的区别:这里没有"TTFT / TPOT"这种全行业统一的指标,所以自己定义清楚指标再回答本身就是加分项;另一方面几乎每个问题都能接一句"LLM 里对应的是什么"(CFG 像 batch 2 的 prefill、特征缓存像投机解码、序列并行像张量并行但切的是 token),这条对照线面试官很爱听。
十道高频问题的答题骨架¶
每道题给骨架和关键数字,细节在对应章节。数字都是本书各章算出来或引用的量级,答题时说"量级"而不是精确值。
1. 扩散模型推理和 LLM 推理最根本的区别是什么? 没有自回归、没有 KV Cache:一次生成 = 同一个网络跑 \(N\) 步 × CFG 倍数,每步都是满算力的"prefill";LLM 的 decode 是带宽瓶颈,扩散的去噪是算力瓶颈。推论:batch 不省时间(已经算力饱和)、调度不追求大 batch、量化省显存但不省时间(除非有低精度 Tensor Core 的算力)。见扩散与流匹配:推理视角、算账。
2. SDXL / FLUX 出一张 1024² 的图各要多少算力和时间? 每次前向:SD 1.5 约 1.2 TFLOP、SDXL 约 12、SD3 约 20、FLUX 约 90 TFLOP;乘步数和 CFG(FLUX 28 步无 CFG ≈ 2.5 PFLOP,SDXL 30 步 × 2 ≈ 0.7 PFLOP);除以有效算力(H100 bf16 按 MFU 40%~50% 算 400~500 TFLOP/s)得 FLUX 约 5~6 秒、SDXL 约 1.5~2 秒;再加 VAE 解码零点几秒。见算账。
3. FLUX 怎么塞进 16 GB / 24 GB? 账:去噪网络 bf16 24 GB + T5 9.5 GB;FP8 各减半(17 GB,24 GB 卡能进);NF4 再减半(9 GB,16 GB 卡能跑)。策略的代价:模型级卸载每次生成多搬几秒;逐层卸载 28 步要把权重走 28 遍 PCIe,比计算慢好几倍;文本编码器先算完就可以卸掉。见显存与 offload。
4. 少步生成(蒸馏)是怎么把 50 步变成 4 步的?代价是什么? 一致性 / 对抗 / 分布匹配蒸馏让学生网络一步跨过老师几步的轨迹;4~8 步出图、常常不要 CFG(再省一半);代价是多样性和可控性下降、对 LoRA / ControlNet 的兼容性变差、不能随意换调度器。见少步生成。
5. 特征缓存(TeaCache / FBCache)为什么能加速,什么时候会糊? 相邻步输出的相对变化在中间段只有百分之几;用探针(时间步调制后的输入或第一个块的残差)累积变化量,超过阈值才真算,否则复用上一步的残差;1.5~2.5 倍、不改权重;阈值 0.1~0.2 肉眼难辨、0.3 以上开始糊;前几步和最后几步不能跳,batch 里的请求不同步时跳不了。见特征缓存。
6. 扩散模型的量化和 LLM 的量化有什么不一样? LLM 的 decode 是带宽瓶颈,权重量化直接变快;扩散是算力瓶颈,权重量化只省显存,要变快必须激活也量化、用 FP8 / INT4 Tensor Core(W8A8、SVDQuant 的 W4A4);激活的离群值随时间步变化,要按步校准(时间步感知的平滑);敏感层(时间步嵌入、AdaLN、注意力的 softmax 前后)要保留高精度。见量化。
7. 多卡并行为什么不用 LLM 的张量并行? 一步只有几十毫秒到一秒,权重小(几 GB 到 30 GB)、激活是 token 序列,所以切 token 比切权重划算:CFG 并行(两张卡各算一边)、序列并行(Ulysses 切头 / Ring 切序列)、PipeFusion(按 patch 流水并复用上一步的特征);通信量和 LLM 的 TP 在同一量级,但没有逐 token 的同步,所以扩展性更好;单图不该多卡,视频必须。见多卡并行。
8. 视频生成为什么那么慢,怎么优化? 一条 5 秒 720p 的视频经 3D VAE 压缩后仍是十万量级的 token,3D 全注意力占一步的七八成,14B 模型一次前向约 6900 TFLOP,单卡 H100 二十多分钟。手段分三层:kernel(SageAttention 2.5 倍、几乎免费)、稀疏(时空局部性让一两成的块覆盖八九成质量,块级 kernel 兑现 3~4 倍)、缓存与少步;叠加后单卡到几分钟、8 卡理想账一分钟量级、公开数字 1.5~3 分钟。见视频瓶颈。
9. 设计一个文生图服务,和 LLM 服务有什么不同? 请求形状异构(分辨率、步数、插件)但耗时可预测(步数 × 单步成本);按预计耗时分池、先到先服务而不是攒 batch;文本编码 / 去噪 / VAE 三阶段流水,各自满载;预览 + 取消省算力;LoRA 几十 MB 全部常驻、ControlNet 几 GB 按需搬或分实例;过载时降分辨率 / 步数或拒绝。见生成服务的调度、多 LoRA / ControlNet。
10. 怎么证明你的优化是无损的? 固定提示词和种子:逐图 PSNR / LPIPS(40 dB 是"同一张图")找出最差的几张人工看;整体 FID / CLIP score 固定样本数比相对值;计时要预热、同步、报分位数;服务要开环压测找膝点。见评测与压测。
两道系统设计题¶
把一条 14B 视频模型的生成从 25 分钟压到 2 分钟¶
参考骨架(先算账,再按层叠加,最后说代价):
- 账:5 秒 720p,约 10 万 token,50 步 × CFG 2 = 100 次前向,每次约 6900 TFLOP;注意力七成、线性层两成、VAE 几十秒。单卡 H100 二十多分钟。
- 第一层,不改输出:FA3 / SageAttention(2~2.5×);FP8 + 编译(线性层 1.4×);CUDA Graph 去掉小算子开销。
- 第二层,轻微有损:块稀疏注意力(3~4×);TeaCache 跳步(1.5~2×);CFG 蒸馏去掉一半前向。
- 第三层,加卡:8 卡 Ulysses + CFG 并行,通信在 NVLink 上几个百分点的开销。
- 叠加与代价:理想账到一分钟量级,公开系统 1.5~3 分钟;每一项的前提——稀疏要校准、缓存要阈值、FP8 要 Hopper、并行要 NVLink——和质量验证方法(固定种子的 VBench 子项 + 人工)。
设计一个支持多 LoRA 的在线文生图服务,P99 < 8 秒¶
骨架:
- 指标与形状:定义支持的分辨率档位和步数上限,按档位算单步成本和预计耗时;P99 < 8 秒意味着每个请求的服务时间必须 ≤ 4~5 秒(留排队余量)→ 少步版或缓存 + FP8。
- 调度:按预计耗时分池(短任务池 / 长任务池),池内先到先服务,队列按预计完成时间准入,超过阈值降级或拒绝。
- 流水:文本编码可以大 batch 并缓存;去噪每卡一个请求;VAE 解码和下一个请求的去噪重叠;预览每 N 步出一张低清图并允许取消。
- LoRA:几十 MB 全部常驻显存,请求到来时按旁路计算(不融合,避免切换成本和编译图失效);热门组合可以预融合成独立权重走编译路线。
- 弹性与验证:按队列等待时间扩缩;开环压测找膝点;上线前跑部署一章的检查清单。
作品:一张卡就能做出来的四个方向¶
推理岗看的是"真的做过、有数字、能讲清取舍"。下面四个方向都能在一张 16 GB 的消费级卡上完成,前两个的大部分实验本书的代码已经在 CPU 上搭好了骨架。
1. 单卡文生图推理优化报告(★ 推荐,两到三周)¶
在 SDXL 或 FLUX 上做一条优化链:bf16 基线 → FP8 / NF4 → torch.compile + CUDA Graph → 注意力 kernel 替换 → TeaCache / FBCache → 少步版;每一步按评测与压测的方法记录延迟(预热、分位数、分阶段)、显存峰值和质量(固定 100 条提示词的 PSNR / LPIPS / FID)。
交付物:一张"手段 × 速度 × 显存 × 质量"的表、每一步的 profiler 截图和解释、一篇技术博客。能说清"FP8 在我这张卡上只省显存不提速,因为……",比"快了 3 倍"更能体现理解。
2. 最小生成服务 + 压测报告(两周)¶
在调度和多 LoRA两章的模拟器基础上做成真的:三阶段流水(文本编码批处理、去噪、VAE 解码)、按预计耗时分池的队列、预览与取消、多 LoRA 热切换、过载降级;用开环负载压测,画出到达率–P99 曲线和膝点。
交付物:代码仓库、压测曲线、一份按本书模板写的性能报告、一次"故意把队列打爆"的事故复盘。
3. 视频模型的注意力账本与稀疏验证(两周,可以没有 GPU)¶
写一个工具:给定模型配置、分辨率、帧数、步数,输出 token 数、FLOP 分解(注意力 / 线性 / VAE)、显存估计、单卡与多卡的预计时间(视频瓶颈的账本做成命令行);再用小配置的 3D 注意力实测注意力图的时空衰减,验证"保留一两成的块覆盖八九成"在你的模型上成不成立;有卡的话接上 SageAttention / 块稀疏 kernel 实测。
交付物:工具 + 一篇"视频生成到底慢在哪"的分析文章,附一张账本和实测的对照。
4. 给推理框架提一个被合并的 PR(持续)¶
diffusers、xDiT、SGLang Diffusion、ComfyUI 的 issue 列表里长期有适合入门的事:某个模型缺少一种缓存方法、offload 和某个量化格式不兼容、文档里的性能数字过时。选一个能用本书方法验证的——提 PR 时附上预热、分位数、质量指标齐全的基准,这本身就是作品。
交付物:PR 链接和你的基准报告;被合并后简历上写"为 X 贡献了 Y,带来 Z 倍提速 / 修复了 W 场景"。
手撕题¶
面试里常让手写的几段,本书都有可直接改写的参考实现:
| 题目 | 要点 | 参考 |
|---|---|---|
| 写一个 DDIM / Euler 的一步更新 | 从 \(\epsilon\) 或 \(v\) 预测出 \(x_0\),再按下一个噪声水平重组;流匹配就是一步欧拉 | 采样器与调度器 |
| CFG 的 batch 实现 | 条件和无条件拼成 batch 2 跑一次前向,再按 guidance scale 外推;说出为什么能拼(同形状)和什么时候不该拼(显存) | 扩散与流匹配 |
| TeaCache 的跳步判断 | 探针相对变化的累加,超过阈值才真算并清零,否则复用上一步残差;首尾几步强制计算 | 特征缓存 |
| VAE 分块解码 | 带重叠的分块、重叠区线性混合、按块显存峰值估算 | VAE 与潜空间 |
| 按预计耗时分池的调度器 | 请求 → 预计服务时间 → 池;池内 FIFO,准入看预计完成时间;取消要释放 | 生成服务的调度 |
| Ulysses 的一次 all-to-all | 序列切分 ↔ 头切分的转换,写出两次 all-to-all 的形状 | 多卡并行 |
简历上怎么写¶
一句话一个数字一个取舍:
- "在单张 16 GB 卡上把 FLUX.1 1024² 的生成从 OOM 做到 9 秒(NF4 + 编译 + FBCache),PSNR 中位数 36 dB,FID +0.8";
- "实现三阶段流水 + 分池调度的文生图服务,开环压测下容量利用率 80% 时 P99 6.5 秒,比单队列方案低 40%";
- "为 X 框架贡献了 Y 模型的 Z 缓存支持(已合并),HunyuanVideo 单卡提速 1.7 倍"。
数字要能复现、取舍要能讲:面试官追问"PSNR 36 dB 是怎么测的"时,评测与压测那一章的内容就是答案。
小结¶
- 四类考察点:算账、手段的前提与代价、服务设计、验证与评测;每一类都要带数字,并随手接上"LLM 里对应的是什么"。
- 十道高频题的骨架和量级:前向 FLOP(1.2 / 12 / 20 / 90 TFLOP)、FLUX 的显存阶梯(24 → 12 → 6 GB)、缓存 1.5~2.5×、视频单卡二十多分钟到 8 卡一两分钟。
- 两道系统设计题按"算账 → 分层叠加 → 代价与验证"答。
- 四个一张卡能做的作品:优化报告、最小服务 + 压测、视频账本与稀疏验证、框架 PR;简历一句话 = 一个数字 + 一个取舍。
发现错误或有更好的写法?在 GitHub 上编辑此页提交问题