采样参数与算力权衡

核心 约 20 分钟 算力权衡显存分辨率fp16分块放大实践
前置知识点(建议先学)
学习状态:

一句话定义

出图的时间与显存由「分辨率 × 步数 × 主干前向次数 × 精度」四个变量主导,其中注意力的平方复杂度使分辨率是指数级因子——把参数翻译成算力账,才能在质量与速度间做理性交换。

为什么重要

同一张图,「跑 40 秒」与「跑 8 分钟」的迭代体验决定生产力;OOM(显存溢出)则是新手劝退第一名。本知识点把 kp-022 的管线换成会计视角:哪些钱(算力)必须花、哪些是冤枉钱、花钱买质量的汇率何时最划算。它也是读硬件推荐帖时「为什么有人 8G 能跑、有人 24G 爆显存」的解释框架。

前置知识

kp-022(管线六环节,账目挂在各环节上);kp-009(步数与前向次数的关系)。

核心概念

原理与机制

账目一:分辨率是指数因子。潜码边长翻倍 → 面积 ×4 → 注意力序列长度 ×4 → 注意力计算 ×16、激活显存 ×4。512²→1024² 对 SD 系意味着潜码 64→128,「勉强能跑」与「随意能跑」的分水岭就在这里。这也是两段式放大存在的理由:与其一步生成 2048²(潜码 256²,注意力开销 ×16 于 128²),不如 1024² 出图后用 img2img(s≈0.3~0.5)放大精修——总耗时常常更低且构图更稳。

账目二:步数是线性因子。时间随 steps 线性增长,而质量增益在 20~30 步后趋平(kp-009);「40 步 vs 60 步」几乎总是纯浪费时间。二阶采样器每步两次前向(Heun 类),总前向次数 = steps × 每步前向数——DPM++ 2M 单次前向是它成为性价比之王的原因之一。

账目三:精度减半。fp16 把权重与激活的显存与带宽减半;主干 fp16 无感,VAE 解码偶发溢出需单独 fp32(kp-022 案例)。批处理(batch)显存近似线性翻倍,迭代调试期用 batch=1 + 多种子循环更省。

账目四:显存去哪儿了。大头是激活值(随分辨率与批大小),其次是权重(SDXL 主干 fp16 约 5GB 级)、缓存与碎片。OOM 的工程解法依次:降分辨率/批 → 开注意力分块(如 xformers/PyTorch SDP 类优化)→ tiled VAE 解码 → 量化/卸载模型。优化顺序有讲究:先动「平方因子」(分辨率)收益最大,再动线性因子。

公式与推导

近似账(忽略常数项):单次前向耗时 ∝ c₁·A + c₂·L²,A 为潜码面积(卷积项),L 为注意力序列长度(L ∝ A,故高分辨率下注意力主导,总趋势 ~A²);总时间 T ≈ steps·k·(c₁A + c₂A²) + 解码。代入对比:1024² 相对 512²,A×4 → 卷积项 ×4、注意力项 ×16。这就是「分辨率翻倍、时间不止翻倍」的定量解释。

图示

杠杆时间影响显存影响质量代价
降分辨率平方级 ↓平方级 ↓低频结构受限(kp-003)
减步数 40→25~40% ↓缓存 ↓趋平区无感(kp-009)
fp16~2× 快~50% ↓VAE 需单独处理
分块/tiled略增绕开显存墙重叠区拼接需羽化

直观类比

像装修预算:分辨率是「房子面积」(单价固定、面积平方级花钱),步数是「工序遍数」(多一遍多一遍钱,但三遍后看不出差别),精度是「用国标还是普通电线」(便宜一半、住着没区别),分块是「分房间装修」绕开一次性付全款。

实例或案例

常见误区

自测题

  1. 为什么 1024² 比 512² 慢的不止 4 倍?

答案要点:潜码面积 ×4,注意力序列 ×4 而计算量 ×16,注意力项主导时总趋势接近平方于面积。

  1. 两段式放大为什么常常比直接大图更快更稳?

答案要点:主图在小潜码上生成(平方因子小),放大段是小重绘幅度的 img2img,总前向成本低于大潜码一步到位。

  1. OOM 时的优化顺序应如何排列?为什么?

答案要点:先降分辨率(平方因子)→ 减步数/批(线性)→ fp16/分块 → 量化卸载;先动收益最大的因子。

与其他知识点的关系

kp-022 把账挂在管线环节上;kp-009 决定「步数的钱怎么花」;kp-012 是两段式放大的机制;kp-021 的缓存机制是工作流层面的省算力手段。

延伸阅读

Karras 等《Elucidating…》(NeurIPS 2022)对「网络前向 vs 采样策略」成本分离的系统分析;SDXL 论文附录的分辨率条件实验。

相关知识点