本文档介绍了 Stable Diffusion Web UI 如何管理不同类型的模型,包括模型检查点和 VAE。它涵盖了支持高效模型切换的加载、卸载和缓存机制,以及模型运行期间用于减少内存使用的优化技术。
有关图像生成过程本身的信息,请参阅 图像生成管线。有关扩展如何与模型交互的详细信息,请参阅 扩展系统。
Stable Diffusion Web UI 中的模型管理系统提供了一种组织、加载和缓存不同模型检查点的方法。这允许用户在保持合理内存使用的情况下在不同模型之间切换。
来源: modules/sd_models.py25-30 modules/sd_models.py676-718 modules/sd_models.py786-875
每个模型检查点都由 CheckpointInfo 类表示,该类包含有关模型文件的元数据,包括
来源: modules/sd_models.py56-128
系统支持几种模型类型,在加载时会自动检测
| 模型类型 | 类常量 | 检测方法 |
|---|---|---|
| SD1 | ModelType.SD1 | 如果未检测到其他类型,则为默认值 |
| SD2 | ModelType.SD2 | 检查 model.cond_stage_model.model |
| SDXL | ModelType.SDXL | 检查 model.conditioner |
| SSD | ModelType.SSD | 具有特定 Transformer 模式的 SDXL 变体 |
| SD3 | ModelType.SD3 | 检查模型中的 x_embedder |
来源: modules/sd_models.py30-35 modules/sd_models.py379-402
模型加载过程是系统的核心部分,负责从磁盘加载权重、将它们应用到模型结构并优化内存使用。
来源: modules/sd_models.py786-935 modules/sd_models.py410-539
加载模型权重的过程由 load_model_weights() 处理,该函数
来源: modules/sd_models.py410-539
模型管理系统实现了一个缓存机制,以避免在模型切换时从磁盘重新加载模型。
模型缓存的关键特性
OrderedDict 来维护最近使用的模型列表| 缓存组件 | 描述 | 由...控制 |
|---|---|---|
checkpoints_loaded | 缓存模型权重 | sd_checkpoint_cache 设置 |
| VAE 缓存 | 缓存 VAE 权重 | sd_vae_checkpoint_cache 设置 |
来源: modules/sd_models.py24-27 modules/sd_models.py876-935 modules/sd_vae.py20
VAE(变分自编码器)组件是 Stable Diffusion 模型的一个可分离部分,负责在像素空间和潜在空间之间进行编码和解码。Web UI 允许使用不同的 VAE 与不同的模型。
来源: modules/sd_vae.py11-20 modules/sd_vae.py132-185 modules/sd_vae.py194-234
加载模型时,系统通过 resolve_vae 函数确定使用哪个 VAE,该函数遵循以下优先级顺序
--vae-path)sd_vae_overrides_per_model_preferences)此过程返回一个 VaeResolution,包含 VAE 文件和分辨率来源。
VAE 加载由 load_vae 函数处理,该函数
系统还提供了在不重新加载整个模型的情况下重新加载 VAE 的功能,这对于在运行时更改 VAE 要快得多。
Web UI 实现了多种技术来减少模型加载和生成过程中的内存使用。
来源: modules/sd_models.py364-516 modules/sd_disable_initialization.py30-233 modules/sd_models.py1011-1034
最重要的优化之一是使用“元设备”初始化,它将参数分配推迟到实际加载权重之后
InitializeOnMeta 上下文管理器在模型创建期间将参数放在元设备上LoadStateDictOnMeta 将参数直接从状态字典移动到目标设备这项技术对于 SDXL 等大型模型尤其重要,因为常规初始化会需要大量的额外内存。
来源: modules/sd_disable_initialization.py115-143 modules/sd_disable_initialization.py145-232
系统提供了几个用于控制模型精度的选项
| 选项 | 描述 | 由...控制 |
|---|---|---|
| 半精度 | 将模型存储为 FP16 | 默认行为,除非使用 --no-half |
| 无半精度 VAE | 保持 VAE 为全精度 | --no-half-vae |
| FP8 存储 | 超低精度权重 | fp8_storage 设置 |
| 向下转换 alpha | 半精度噪声调度 | use_downcasted_alpha_bar 设置 |
来源: modules/sd_models.py464-516 modules/sd_models.py644-668
其他内存优化技术包括
来源:modules/sd_models.py1011-1034 modules/sd_models.py738-752
模型可以拥有用户定义的元数据,这些元数据会影响其行为,包括首选的 VAE 设置。此元数据独立于模型文件存储,并且可以通过 UI 进行编辑。
来源:modules/ui_extra_networks_checkpoints_user_metadata.py7-66 modules/sd_vae.py146-157
模型是根据定义模型架构的配置文件加载的。该系统支持根据模型状态字典自动检测相应的配置。
| 配置步骤 | 目的 |
|---|---|
find_checkpoint_config | 检测合适的配置文件 |
repair_config | 调整配置值以兼容 |
set_model_type | 确定模型类型(SD1/SD2/SDXL/等) |
来源:modules/sd_models.py379-402 modules/sd_models.py599-626
切换模型时,系统会尝试优化该过程
此方法在频繁切换模型时最大限度地减少了加载时间和内存碎片。
来源:modules/sd_models.py876-935 modules/sd_models.py939-1002
对于 VRAM 有限的系统,有多种可用策略
| 策略 | 实现 | 优点 |
|---|---|---|
| 模型缓存 | sd_checkpoint_cache 设置 | 更快的模型切换 |
| 低 VRAM 模式 | 自动检测或手动设置 | 在较低 VRAM 的 GPU 上运行 |
| CPU 卸载 | 将未使用的组件移至 CPU | 降低峰值 VRAM 使用量 |
| 精度控制 | 各种设置 | 用内存换取精度 |
这些策略可以组合使用,以优化不同硬件配置上的性能。
来源:modules/sd_models.py738-752 modules/sd_models.py464-516
Stable Diffusion Web UI 中的模型管理系统为处理不同类型的模型和 VAE 提供了全面的框架。它实施了许多优化措施,以最大限度地减少内存使用量并最大限度地提高不同硬件配置下的性能。该系统通过智能缓存和内存管理技术,在灵活性(允许混合搭配模型和 VAE)与性能之间取得平衡。
主要功能包括
这些功能使用户界面能够在各种硬件上有效运行,从高端 GPU 到更受限制的环境。