🧠 第六章 自然语言处理
📄 一句话概括

按「0.8 加 2.6 乘 (边长/512)² 乘 batch 乘精度系数」估算显存:512 配 batch 1 是 3.4 GB, batch 4 就 11.2 GB;1024 配 batch 1 已经 11.2 GB。8 GB 卡上只有三档能跑。

📝 本节和前面几节的关系

上一节把词变成向量,这一节讲配套的算力账。 这部分书里放在 SD 的配置环节,但道理对所有扩散模型通用。

一、三个参数是乘在一起的

影响显存的主要是三个:边长、batch、数值精度。 边长翻倍,显存乘 4——因为注意力和特征图的规模都按面积涨。 batch 翻倍,显存乘 2——多一份数据同时算。 精度从 fp16 换 fp32,显存乘 1.8 左右——不是严格的 2,因为还有一部分中间量固定开销。 三者相乘,所以「1024 加 batch 2」比「512 加 batch 1」贵 8 倍,不是 2 倍。

二、8 GB 卡上能跑什么

Demo 按公式算了 9 档 fp16 组合,只有三档没超 8 GB:512×1(3.4)、512×2(6.0)、768×1(6.7)。 512×4 是 11.2,768×2 是 12.5,1024×1 也是 11.2——全超。 fp32 更惨:512×1 就是 5.5,512×2 是 10.2,只剩一档能跑。 这张表能直接回答一个常见问题:「我这台机器能不能跑 SD」。答案是看边长和 batch,不看模型名字。

三、耗时是按步数线性涨的

20 步、512、batch 1 估算是 1.8 秒;batch 4 是 7.2 秒;1024 是 7.2 秒。 步数和耗时严格成正比——每一步的计算量一样。所以「步数减半,时间减半」。 但步数不能随便减。20 到 30 步是常用区间,低于 15 步画面会糊,高于 40 步基本没变化,只是白等。 这个「够了就行」的区间每个模型不一样,只能自己试。 试的方法固定:固定种子,步数从 10 加到 50,看哪一档之后画面不再变。

四、这张表是算的,不是测的

必须说清:沙箱里没有 GPU,上面的显存和耗时都是用公开经验系数算出来的,不是实测。 公式里的 0.8 和 2.6 是拟合系数,量级对,具体到某张卡会有出入。 不同框架、不同优化器、开不开 xformers,都能差一两个 GB。 真实训练还要叠优化器状态和梯度,显存比这张表高得多——表里说的是推理量级。 所以这张表的正确用法是「估个量级、判断行不行」,不是「照着买卡」。买卡前得实测。

五、动手 Demo:显存与耗时的估算表:三个参数怎么互相放大

按一条经验公式估显存(基础开销加边长平方乘 batch 乘精度系数), 对边长 512/768/1024 和 batch 1/2/4 的九种 fp16 组合各算一次,标出超 8 GB 的档位; 再算四种 fp32 组合;耗时按步数线性估。

mem = 0.8 + 2.6 * (res / 512.0) ** 2 * b * 1.0    # fp16
sec = 20 * 0.09 * (res / 512.0) ** 2 * b          # 20 步

u'超限' if mem > 8.0 else u'可以'

实跑输出:

--------------------------------------------------------------------
Stable Diffusion 配置:显存与耗时的估算(不是实测)
--------------------------------------------------------------------
  估算公式                 显存 ≈ 0.8 + 2.6 × (边长/512)² × batch × 精度系数
  精度系数                 fp16 取 1.0,fp32 取 1.8
  单步耗时                 0.09 秒 × (边长/512)² × batch(中端卡量级)
  可用显存                 8 GB

  这张表是按公开经验系数算出来的估算,沙箱里没有 GPU,下面的数是算出来的、不是测出来的。
  边长   batch   精度   估算显存 GB   20 步耗时 秒   8 GB 判定
  -----------------------------------------------------------
   512       1   fp16   3.4                    1.8   可以
   512       2   fp16   6.0                    3.6   可以
   512       4   fp16   11.2                   7.2   超限
   768       1   fp16   6.7                    4.0   可以
   768       2   fp16   12.5                   8.1   超限
   768       4   fp16   24.2                  16.2   超限
  1024       1   fp16   11.2                   7.2   超限
  1024       2   fp16   21.6                  14.4   超限
  1024       4   fp16   42.4                  28.8   超限

  边长   batch   精度   估算显存 GB   8 GB 判定
  --------------------------------------------
   512       1   fp32   5.5           可以
   512       2   fp32   10.2          超限
   768       1   fp32   11.3          超限
   768       2   fp32   21.9          超限

  三个参数是乘在一起的,不是各管各的:边长翻倍,显存乘 4;精度从 fp16 换 fp32,再乘 1.8。所以 1024 加 batch 2 在 8 GB 卡上根本没戏。
  真实训练还要叠优化器状态和梯度,显存比这更高。推理省一些,但也不能按这张表直接买卡。

三档「可以」全在 512 和 768 这两列。512×1 的 3.4 GB 是最省的,也是大多数教程的默认配置。 512×4 和 1024×1 都是 11.2 GB,完全相同。 这不是巧合:batch 乘 4 和边长平方乘 4 在公式里是等价的。 fp32 那张小表更直观:512×2 就 10.2 GB 了。 所以实际部署几乎全用 fp16,fp32 只在调试数值问题时临时开。 再看耗时那一列:512×1 二十步 1.8 秒,1024×1 二十步 7.2 秒——正好 4 倍,和显存的倍数一致。

30 秒实验

  1. 把可用显存从 8 GB 改成 12 GB,看「超限」的档位少几个。
  2. 把步数从 20 改成 30,看耗时那一列怎么变。
  3. 想一想:为什么精度从 fp16 换 fp32,显存不是正好翻倍?

常见误区

  1. 「显存不够就换大卡」——先降 batch、降边长更省钱。
  2. 「步数越多画质越好」——超过 40 步基本没变化。
  3. 「这张表能照着买卡」——公式是拟合的,真实训练还要叠优化器和梯度。
自测三问(点开对答案) 1. 边长翻倍,显存为什么涨 4 倍而不是 2 倍? —— 注意力和特征图的规模按面积涨,面积是边长的平方。 2. 为什么实际部署几乎都用 fp16? —— fp32 显存大约是 fp16 的 1.8 倍,8 GB 卡上很快就不够用。 3. 这张表能拿来买卡吗? —— 不能。系数是拟合的,真实训练还要叠优化器状态和梯度。

算力账算清了。下一节动手:把图片整理成模型能吃的样子。

相关笔记