Skip to content

Optimizations

一些优化可以通过命令行参数启用:

命令行参数 解释
--opt-sdp-attention 在某些系统上可能比使用xFormers更快,但需要更多的VRAM。(非确定性)
--opt-sdp-no-mem-attention 在某些系统上可能比使用xFormers更快,但需要更多的VRAM。(确定性,比--opt-sdp-attention稍慢,使用更多的VRAM)
--xformers 使用xFormers库。极大地改善了内存消耗和速度。仅适用于Nvidia GPU。(从0.0.19开始确定性)(从1.4.0开始,webui使用0.0.20)
--force-enable-xformers 无论程序认为您是否可以运行它,都会启用xFormers。不要报告您运行此命令时遇到的错误。
--opt-split-attention 交叉注意力层优化,显著减少了几乎没有成本的内存使用(有些人报告说使用它可以改善性能)。黑魔法。
对于torch.cuda,默认启用,包括NVidia和AMD卡。
--disable-opt-split-attention 禁用上述优化。
--opt-sub-quad-attention 子二次注意力,一种内存高效的交叉注意力层优化,可以显著减少所需的内存,有时会略微降低性能。如果使用xFormers无法正常工作的硬件/软件配置导致性能不佳或生成失败,建议使用此选项。在macOS上,这还将允许生成更大的图像。
--opt-split-attention-v1 使用上述优化的旧版本,不会占用太多VRAM,但会限制您可以生成的图片的最大尺寸。
--medvram 使稳定扩散模型消耗更少的VRAM,将其分为三个部分 - cond(用于将文本转换为数值表示),first_stage(用于将图片转换为潜在空间并返回),unet(用于实际去噪潜在空间),并使其始终只有一个在VRAM中,将其他部分发送到CPU RAM。降低了性能,但只有一点点 - 除非启用了实时预览。
--lowvram 对上述优化的更彻底的优化,将unet分成多个模块,只保留一个模块在VRAM中。对性能造成毁灭性的影响。
*do-not-batch-cond-uncond 仅适用于1.6.0之前:在采样过程中防止对正负提示进行批处理,从而实际上可以以0.5批量大小运行,节省了大量内存。降低了性能。不是一个命令行选项,而是通过使用--medvram--lowvram隐式启用的优化。在1.6.0中,此优化不会由任何命令行标志启用,并且默认情况下启用。可以在设置中禁用,Optimizations类别中的Batch cond/uncond选项。
--always-batch-cond-uncond 仅适用于1.6.0之前:禁用上述优化。只有与--medvram--lowvram一起使用才有意义。在1.6.0中,此命令行标志无效。
--opt-channelslast 将稳定扩散的torch内存类型更改为channels last。效果没有进行详细研究。
--upcast-sampling 对于通常强制使用--no-half运行的Nvidia和AMD卡,应该提高生成速度

截至版本1.3.0,可以在设置中选择Cross attention optimization。xFormers仍然需要通过COMMANDLINE_ARGS启用。 change-cross-attention-optimization

额外提示(Windows): - https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/3889 禁用硬件GPU调度。 - 禁用浏览器硬件加速 - 进入Nvidia控制面板,3D参数,将电源配置更改为“最大性能”

优化器和标志对内存和性能的影响

这是使用特定硬件和配置的示例测试,您的结果可能会有所不同
使用nVidia RTX3060和CUDA 11.7进行测试

交叉注意力 批量大小为1/2/4/8/16时的峰值内存 初始迭代次数 峰值迭代次数 备注
4.1 / 6.2 / OOM / OOM / OOM 4.2 4.6 速度慢,很快出现内存不足
v1 2.8 / 2.8 / 2.8 / 3.1 / 4.1 4.1 4.7 速度慢,内存使用最低,不需要有时有问题的xFormers
InvokeAI 3.1 / 4.2 / 6.3 / 6.6 / 7.0 5.5 6.6 几乎与默认优化器相同
Doggetx 3.1 / 4.2 / 6.3 / 6.6 / 7.1 5.4 6.6 默认
Doggetx 2.2 / 2.7 / 3.8 / 5.9 / 6.2 4.1 6.3 使用medvram预设可以在不大幅降低性能的情况下节省内存
Doggetx 0.9 / 1.1 / 2.2 / 4.3 / 6.4 1.0 6.3 使用lowvram预设由于不断交换而非常慢
xFormers 2.8 / 2.8 / 2.8 / 3.1 / 4.1 6.5 7.5 速度最快,内存最低
xFormers 2.9 / 2.9 / 2.9 / 3.6 / 4.1 6.4 7.6 使用cuda_alloc_confopt-channelslast

备注: - 批量大小为1时的性能约为峰值性能的70%
- 峰值性能通常在批量大小为8左右
在此之后,如果您有额外的VRAM,性能会增长几个百分点,然后由于GC开始运行而开始下降
- 使用lowvram预设时,批量大小小于8时性能非常低,而此时的内存节省并不大

其他可能的优化: - 在webui-user.bat中添加set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.9,max_split_size_mb:512
对性能没有影响,稍微增加了初始内存占用,但减少了长时间运行中的内存碎片化
- opt-channelslast
试错法:似乎在较大的批量大小下性能稍微提高,在较小的批量大小下速度较慢,但差异在误差范围内