优化
可以通过命令行参数启用一些优化:
命令行参数 | 解释 |
---|---|
--opt-sdp-attention |
可能比在某些系统上使用xFormers更快,但需要更多的VRAM。(非确定性) |
--opt-sdp-no-mem-attention |
可能比在某些系统上使用xFormers更快,但需要更多的VRAM。(确定性,略低于--opt-sdp-attention ,并使用更多的VRAM) |
--xformers |
使用xFormers库。内存消耗和速度有了很大的改善。仅限Nvidia GPU。(非确定性) |
--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 |
通过将其分为三部分,使Stable Diffusion 模型消耗更少的VRAM-cond(用于将文本转换为数字表示)、first_stage(用于将图片转换为潜在空间和背面)和unet(用于潜在空间的实际去噪),并使其始终只有一个在VRAM中,将其他图像发送到CPU RAM。降低性能,但仅降低一点-除非启用了实时预览。 |
--lowvram |
对上述内容进行了更彻底的优化,将unet拆分为许多模块,并且只有一个模块保存在VRAM中。性能是毁灭性的。 |
*do-not-batch-cond-uncond |
防止在采样期间批处理正向和负提示,这基本上允许您以0.5批大小运行,节省大量内存。降低性能。不是命令行选项,而是使用--medvram 或--lowvram 隐式启用的优化。 |
--always-batch-cond-uncond |
禁用上述优化。只有与--medvram 或--lowvram |
--opt-channelslast |
更改torch内存类型,以Stable Diffusion 到通道。效果没有仔细研究。 |
--upcast-sampling |
对于Nvidia和AMD卡来说,通常被迫运行--no-half ,应该可以提高生成速度。 |
从1.3.0版本开始,可以在设置下选择Cross attention optimization
。xFormers仍然需要通过COMMANDLINE_ARGS
启用。
额外提示(Windows):
- https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/3889 禁用硬件GPU调度。
- 禁用浏览器硬件加速
- 进入nvidia控制面板,3d参数,并将电源配置文件更改为“最大性能”
优化器和标志的内存和性能影响
这是一个使用特定硬件和配置的示例测试,您的里程可能会有所不同
使用nVidia RTX3060和CUDA 11.7进行测试
Cross-attention | Peak Memory at Batch size 1/2/4/8/16 | Initial It/s | Peak It/s | Note |
---|---|---|---|---|
None | 4.1 / 6.2 / OOM / OOM / OOM | 4.2 | 4.6 | 缓慢而早的 out-of-memory |
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 | default |
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_conf 和opt-channelslast |
备注:
- 批量大小1的性能约为峰值性能的70%
- 峰值性能通常在批次大小8左右
之后,如果你有额外的VRAM,在它开始下降之前,它会增长百分之几 lowvram
预设的性能在批量大小8以下非常低,到那时内存节省就没那么大了
其他可能的优化:
- adding
set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.9,max_split_size_mb:512
inwebui-user.bat
没有性能影响,增加了初始内存占用空间,但减少了长期运行中的内存碎片 opt-channelslast
命中和失误:似乎随着批次规模的增加而轻微的性能增加,而随着较小的批次规模而缓慢,但差异在误差范围内