装之前先算账:这台机器实测读 2.19 GB/秒、写 1.39 GB/秒, 加载 SDXL 底模 6.5 GB 只要 3.0 秒。 但显存是另一回事: 512 分辨率 batch 1 要 8.0 GB,1024 分辨率 batch 4 要 30.5 GB——是前者的十六倍。
上一节讲清了 LoRA 为什么能用 3% 的参数做微调。这一节装工具,但在装之前先把这台机器的底摸清。
一、SD-Trainer 到底装的是什么
它不是一个模型,是一套训练脚本加一个网页界面。
底层还是 PyTorch 加 diffusers,界面只是把一堆命令行参数变成了输入框。
所谓「安装」,实际是三件事:装 Python 依赖(torch、diffusers、transformers、accelerate)、
拉仓库、起一个本地网页。
📋 实操清单(要在本机做,沙箱里没显卡也没有 SD):
第一步,装 Python 3.10(别用 3.12 以上,很多训练依赖还没跟上)。安装时勾「Add to PATH」。
第二步,装 Git,然后 git clone 训练器的仓库。路径里别有空格和中文——这是最常见的装不上原因。
第三步,在这个目录里 pip install -r requirements.txt。
torch 有 2 GB 多,慢是正常的,报错才是问题。
第四步,跑仓库自带的 install.ps1(Windows),再跑 gui.ps1。
看到浏览器弹出 127.0.0.1:7860 就说明装好了。
这一步没法在沙箱复现,但装完要算的账全能真算——下面三张表就是这台机器的实测值。
二、第一笔账:磁盘与加载时间
先量这台机器的真实读写速度,再拿底模体积去除:
| 要加载的东西 | 体积 | 读取耗时 | 盘装得下 |
|---|---|---|---|
| SD1.5 底模 | 4.0 GB | 1.8 秒 | 够 |
| SDXL 底模 | 6.5 GB | 3.0 秒 | 够 |
| 加优化器状态 | 13.0 GB | 5.9 秒 | 够 |
| 3 秒只是理论下限。 真实启动还要解 safetensors、转 dtype、加载 VAE 和文本编码器, | |||
| 实际常常十几秒到一分钟。这一项在纯 CPU 跑图时特别疼,因为它决定你每次启动等多久。 | |||
| 磁盘那一列别忽略:全量微调加上优化器状态要 13 GB,再加几份权重备份,很快就是几十 GB。 | |||
| LoRA 之所以流行,一半原因就是它把这一列压到了几百 MB。 |
三、第二笔账:显存
训练时显存被三块吃掉:底模、优化器状态、激活值。LoRA 只训小矩阵,所以第二块几乎是 0; 但第一块和第三块一分不少。 激活值跟分辨率平方成正比、跟 batch 线性成正比。 以 SDXL 底模 6.5 GB、512 下 batch 1 的激活约 1.5 GB 为锚点外推:
| 分辨率 | batch 1 | batch 2 | batch 4 |
|---|---|---|---|
| 512 | 8.0 GB | 9.5 GB | 12.5 GB |
| 768 | 9.9 GB | 13.2 GB | 20.0 GB |
| 1024 | 12.5 GB | 18.5 GB | 30.5 GB |
| 注意右下角:1024 的 batch 4 要 30.5 GB。它是 512 的 batch 1 的十六倍——因为面积四倍、 | |||
| batch 又四倍。这就是消费级显卡大多停在 512 到 768 的原因。 | |||
| 要说明:这一列是锚点外推,不是实测。 | |||
| 量级对,绝对值会随模型结构和注意力实现浮动。真实训练前,拿一张图跑一步看实际占用, | |||
| 比任何公式都准。 |
四、三条退路,和装完的第一件事
显存不够有三条退路:降分辨率、降 batch、开梯度累积加混合精度。
降分辨率最有效但最伤质量(512 训练出来的画风,出 1024 的图会细节发散)。
降 batch 最安全,只是慢,而且 batch 太小会让训练不稳。
梯度累积是「假装 batch 大」:显存里只放 1 张,梯度攒够 4 步再更新一次。
等效 batch 变大了,代价是时间翻四倍。
混合精度(bf16) 能把激活值和权重都压到一半,现代显卡上基本无损。这一条应该默认开。
装完的第一件事不是开训,是跑一步看占用:nvidia-smi 盯着显存,
训练器里把 max_train_steps 改成 1 跑一遍。花一分钟,省掉后面几次跑到一半 OOM 的折腾。
五、动手 Demo:装环境前先算账:底模读 3 秒,1024 两 batch 要 18.5 GB
先实测这台机器的磁盘读写速度(写四块 64 MB 再读回来),据此算各体积底模的加载时间; 再以「SDXL 底模 6.5 GB、512 下 batch 1 激活 1.5 GB」为锚点, 按面积和 batch 外推三档分辨率乘三档 batch 的显存占用。
blob = b"x" * (64 << 20) # 64 MB 一块,写四块
t0 = time.perf_counter()
with open(fp, "wb") as f:
for _ in range(4):
f.write(blob)
wr = 256.0 / (time.perf_counter() - t0) / 1e3 # GB/秒
base, k = 6.5, 1.5 # 底模 + 512 下 batch 1 的激活
for res in (512, 768, 1024):
for bs in (1, 2, 4):
act = k * bs * (res / 512.0) ** 2
print(res, bs, base + act)
实跑输出:
--------------------------------------------------------------------
装环境前先算账:底模读 3 秒,1024 两 batch 要 18.5 GB
--------------------------------------------------------------------
实测写入速度 1.39 GB/秒
实测读取速度 2.19 GB/秒
内存 15.9 GB
系统盘剩余 285 GB
要加载的东西 体积 读取耗时 盘装得下
-------------------------------------------
SD1.5 底模 4.0 GB 1.8 秒 够
SDXL 底模 6.5 GB 3.0 秒 够
加优化器状态 13.0 GB 5.9 秒 够
加载时间 = 体积 ÷ 实测读取速度。**这一项在 CPU 上跑图时比显卡更疼**——它决定每次启动等多久。
训练时还要再算一笔:显存。底模、优化器状态、激活值三块相加,其中激活值跟分辨率平方成正比:
分辨率 batch 1 batch 2 batch 4
-----------------------------------
512 8.0 9.5 12.5
768 9.9 13.2 20.0
1024 12.5 18.5 30.5
单位 GB,按 SDXL 底模 6.5 GB 加激活值估(512 下 batch 1 的激活按 1.5 GB 取)。
**显存随分辨率平方涨、随 batch 线性涨**:
1024 的 batch 4 是 512 的 batch 1 的十六倍,要三十多 GB。
这就是消费级显卡大多停在 512 到 768 的原因。
显存不够有三条退路:**降分辨率、降 batch、开梯度累积和混合精度。**
最后一条能把激活值和底模都压到一半。
说明:激活值那一列是用「512 下 batch 1 约 1.5 GB」这个锚点,按面积和 batch 外推的。
**量级对,绝对值会随模型结构浮动。**
真实训练前,先拿一张图跑一步看显存占用,比任何公式都准。
头两行是实测:写 1.39 GB/秒、读 2.19 GB/秒。读比写快是正常的(SSD 的读带宽本来就高)。 有了这个数,加载时间就是除法:6.5 GB ÷ 2.19 约 3 秒。 但别把这个数当成启动时间——解包和 dtype 转换还没算进去。 显存那张表:512 的 batch 1 是 8.0,1024 的 batch 4 是 30.5。 跨度四倍分辨率乘四倍 batch,等于十六倍激活值。 注意 768 的 batch 4 是 20.0,已经超过 16 GB 的消费卡了。 所以「768 跑 LoRA」在 16 GB 卡上只能 batch 2 以内。 诚实说明:激活值那一列是外推的,不是实测。 真正的占用还跟 xformers、flash attention、梯度检查点这些开关有关, 开梯度检查点能把激活值再压一半以上。这里算的是「不开优化时的量级」。
30 秒实验
- 把底模从 6.5 GB 换成 SD1.5 的 4.0 GB,重算整张显存表。 每格都减 2.5——说明小底模的收益是固定值,不是比例。
- 把 batch 一路加到 8、16,看 768 那行涨到多少。 线性涨,直到撞上显存上限——它不会自己变慢,只会 OOM。
- 把实测读取速度换成机械硬盘的 0.15 GB/秒,再算加载时间。 6.5 GB 要 43 秒——这就是「模型放机械盘」的真实代价。
常见误区
- 「LoRA 训练 8 GB 显存就够」。512 下勉强,768 和 1024 都不够。先按表算一遍再决定分辨率。
- 「显存不够就加内存」。内存换不了显存,系统只会把数据换页到内存,速度掉十倍以上。
- 「装完直接开训」。先跑一步看占用。省这一分钟,往往要多花一小时。
自测三问(点开对答案)
1. 训练时显存被哪三块占了? —— 底模、优化器状态(全量微调才有)、激活值。 LoRA 只把第二块压到几乎为 0,第一块和第三块一分不少。 2. 为什么激活值随分辨率平方涨? —— 因为特征图的面积随边长平方增长,每一层都要存一份。边长翻倍,激活值四倍。 3. 显存不够的三条退路是什么? —— 降分辨率(最有效但伤质量)、降 batch(最安全但慢)、梯度累积加混合精度(省显存但时间翻倍)。环境装好了,接下来是最费时间的一步:把训练用的图整理干净。 这一步的活儿 90% 是体力,但漏一项就白训。
- ☐ (本节完,下一节 7.1.3 准备与整理训练数据集)