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
启用。
额外提示(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_conf 和opt-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
试错法:似乎在较大的批量大小下性能稍微提高,在较小的批量大小下速度较慢,但差异在误差范围内