菜单

模型管理

相关源文件

本文档介绍了 Stable Diffusion Web UI 如何管理不同类型的模型,包括模型检查点和 VAE。它涵盖了支持高效模型切换的加载、卸载和缓存机制,以及模型运行期间用于减少内存使用的优化技术。

有关图像生成过程本身的信息,请参阅 图像生成管线。有关扩展如何与模型交互的详细信息,请参阅 扩展系统

1. 检查点系统架构

Stable Diffusion Web UI 中的模型管理系统提供了一种组织、加载和缓存不同模型检查点的方法。这允许用户在保持合理内存使用的情况下在不同模型之间切换。

来源: modules/sd_models.py25-30 modules/sd_models.py676-718 modules/sd_models.py786-875

1.1 检查点信息结构

每个模型检查点都由 CheckpointInfo 类表示,该类包含有关模型文件的元数据,包括

  • 文件名和路径信息
  • 模型哈希和 SHA256 用于标识
  • 模型类型 (SD1, SD2, SDXL, SSD, SD3)
  • 从 safetensors 文件提取的元数据

来源: modules/sd_models.py56-128

1.2 模型类型和检测

系统支持几种模型类型,在加载时会自动检测

模型类型类常量检测方法
SD1ModelType.SD1如果未检测到其他类型,则为默认值
SD2ModelType.SD2检查 model.cond_stage_model.model
SDXLModelType.SDXL检查 model.conditioner
SSDModelType.SSD具有特定 Transformer 模式的 SDXL 变体
SD3ModelType.SD3检查模型中的 x_embedder

来源: modules/sd_models.py30-35 modules/sd_models.py379-402

2. 模型加载过程

模型加载过程是系统的核心部分,负责从磁盘加载权重、将它们应用到模型结构并优化内存使用。

来源: modules/sd_models.py786-935 modules/sd_models.py410-539

2.1 加载模型权重

加载模型权重的过程由 load_model_weights() 处理,该函数

  1. 将状态字典应用于模型结构
  2. 将模型转换为适当的精度(半精度/全精度)
  3. 处理 UNet 设置等特殊情况
  4. 应用优化(channels_last、fp8 存储)

来源: modules/sd_models.py410-539

2.2 模型缓存

模型管理系统实现了一个缓存机制,以避免在模型切换时从磁盘重新加载模型。

模型缓存的关键特性

  • 使用 OrderedDict 来维护最近使用的模型列表
  • 可通过选项配置缓存大小
  • LRU(最近最少使用)的淘汰策略
  • 模型权重和 VAE 的单独缓存
缓存组件描述由...控制
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

3. VAE 管理

VAE(变分自编码器)组件是 Stable Diffusion 模型的一个可分离部分,负责在像素空间和潜在空间之间进行编码和解码。Web UI 允许使用不同的 VAE 与不同的模型。

来源: modules/sd_vae.py11-20 modules/sd_vae.py132-185 modules/sd_vae.py194-234

3.1 VAE 分辨率处理

加载模型时,系统通过 resolve_vae 函数确定使用哪个 VAE,该函数遵循以下优先级顺序

  1. 通过命令行参数指定的 VAE(--vae-path
  2. 全局设置中指定的 VAE(如果启用了 sd_vae_overrides_per_model_preferences
  3. 模型元数据中指定的 VAE
  4. 与模型同名的 VAE
  5. 默认 VAE 设置(来自设置)

此过程返回一个 VaeResolution,包含 VAE 文件和分辨率来源。

来源: modules/sd_vae.py118-185

3.2 VAE 加载和切换

VAE 加载由 load_vae 函数处理,该函数

  1. 存储原始模型的 VAE(如果需要)
  2. 加载新的 VAE 权重
  3. 处理缓存以加快切换速度
  4. 更新模型的 VAE 引用

系统还提供了在不重新加载整个模型的情况下重新加载 VAE 的功能,这对于在运行时更改 VAE 要快得多。

来源: modules/sd_vae.py194-283

4. 内存优化技术

Web UI 实现了多种技术来减少模型加载和生成过程中的内存使用。

来源: modules/sd_models.py364-516 modules/sd_disable_initialization.py30-233 modules/sd_models.py1011-1034

4.1 延迟初始化

最重要的优化之一是使用“元设备”初始化,它将参数分配推迟到实际加载权重之后

  1. InitializeOnMeta 上下文管理器在模型创建期间将参数放在元设备上
  2. LoadStateDictOnMeta 将参数直接从状态字典移动到目标设备
  3. 这避免了加载过程中在内存中复制模型权重

这项技术对于 SDXL 等大型模型尤其重要,因为常规初始化会需要大量的额外内存。

来源: modules/sd_disable_initialization.py115-143 modules/sd_disable_initialization.py145-232

4.2 精度控制

系统提供了几个用于控制模型精度的选项

选项描述由...控制
半精度将模型存储为 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

4.3 高级内存节省

其他内存优化技术包括

  • Token Merging (ToMe) - 通过合并相似的 token 来减少注意力复杂度
  • 低 VRAM 模式 - 在不需要时将模型组件移至 CPU
  • 特定设备的优化(channels_last 内存格式、张量位置)

来源:modules/sd_models.py1011-1034 modules/sd_models.py738-752

5.1 模型的用户元数据

模型可以拥有用户定义的元数据,这些元数据会影响其行为,包括首选的 VAE 设置。此元数据独立于模型文件存储,并且可以通过 UI 进行编辑。

来源:modules/ui_extra_networks_checkpoints_user_metadata.py7-66 modules/sd_vae.py146-157

5.2 自定义模型配置

模型是根据定义模型架构的配置文件加载的。该系统支持根据模型状态字典自动检测相应的配置。

配置步骤目的
find_checkpoint_config检测合适的配置文件
repair_config调整配置值以兼容
set_model_type确定模型类型(SD1/SD2/SDXL/等)

来源:modules/sd_models.py379-402 modules/sd_models.py599-626

6. 实际使用

6.1 模型切换

切换模型时,系统会尝试优化该过程

  1. 检查请求的模型是否已加载
  2. 如果模型在缓存中但未激活,则将其移动到设备
  3. 如果模型不在缓存中:a. 如果缓存限制允许,则作为附加模型加载 b. 如果缓存已满,则重用现有的模型结构

此方法在频繁切换模型时最大限度地减少了加载时间和内存碎片。

来源:modules/sd_models.py876-935 modules/sd_models.py939-1002

6.2 处理资源限制

对于 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)与性能之间取得平衡。

主要功能包括

  • 高效的模型检查点加载和缓存
  • 灵活的 VAE 分辨率和切换
  • 高级内存优化技术
  • 支持多种模型类型和架构

这些功能使用户界面能够在各种硬件上有效运行,从高端 GPU 到更受限制的环境。