本文档介绍了 ComfyUI 中的扩散采样系统,该系统协调去噪过程,将噪声转化为连贯的图像。采样系统包含两个主要组件:**调度器 (schedulers)**,用于确定噪声调度(随时间变化的 sigma 值);以及**采样器 (samplers)**,用于实现实际的去噪算法。
有关采样过程中条件设置和引导机制的信息,请参阅 条件设置和引导。有关采样过程中使用的底层 UNet 和注意力机制的详细信息,请参阅 UNet 和注意力。
ComfyUI 的采样系统构建在 k-diffusion 库之上,并提供程序化和基于节点的接口来控制去噪过程。
采样流程架构
来源:comfy/samplers.py1-50 comfy/k_diffusion/sampling.py1-30 comfy_extras/nodes_custom_sampler.py1-50 comfy/sample.py1-53
调度器决定了去噪过程中使用的噪声水平(sigma 值)的序列。每个调度器都实现了不同的数学方法来对这些噪声水平进行间隔。
| 调度器 | 功能 | 描述 |
|---|---|---|
| 简单 | simple_scheduler() | Sigma 空间中的线性间隔 |
| DDIM | ddim_scheduler() | 去噪扩散隐式模型间隔 |
| 普通用户 | normal_scheduler() | Timestep 空间中的线性间隔 |
| Beta | beta_scheduler() | 基于 Beta 分布的间隔 |
| Karras | get_sigmas_karras() | Karras 等人的噪声调度 |
| 指数级 | get_sigmas_exponential() | 指数间隔 |
simple_scheduler() 函数在 sigma 空间中实现基本的线性间隔
Karras 调度器实现了“揭示扩散模型生成设计的空间”中的噪声调度
rho(默认为 7.0)的幂律分布(sigma_max^(1/rho) + t * (sigma_min^(1/rho) - sigma_max^(1/rho)))^rho来源:comfy/samplers.py401-492 comfy/k_diffusion/sampling.py18-54 comfy_extras/nodes_custom_sampler.py11-173
采样器实现了迭代去噪算法,它们使用 sigma 调度来逐步去除潜在表示中的噪声。
| 类别 | 采样器 | 特性 |
|---|---|---|
| 欧拉方法 | euler、euler_ancestral | 简单的低阶方法 |
| 海恩方法 | heun、heunpp2 | 二阶方法,精度更高 |
| DPM 方法 | dpm_2、dpm_2_ancestral、dpm_fast、dpm_adaptive | DPM-Solver 系列 |
| DPM++ 方法 | dpmpp_2s_ancestral、dpmpp_sde、dpmpp_2m、dpmpp_3m_sde | 改进的 DPM-Solver 变体 |
| 专业 | ddpm、lcm、uni_pc | 特定任务的采样器 |
所有 k-diffusion 采样器都遵循在 KSAMPLER 类中实现的通用模式
sample_euler() 函数演示了基本模式
来源:comfy/k_diffusion/sampling.py145-169 comfy/samplers.py721-775 comfy_extras/nodes_custom_sampler.py302-481
采样系统通过处理条件设置、CFG 引导和模型执行的主要采样函数来集成调度器和采样器。
sampling_function() 是核心协调点,它
calc_cond_batch() 来评估条件和无条件预测cfg_function() 将预测与引导比例相结合该函数签名显示了关键参数
calc_cond_batch() 函数实现了条件评估的高效批处理
来源:comfy/samplers.py367-384 comfy/samplers.py201-346 comfy/samplers.py777-813
ComfyUI 通过调度器节点和采样器节点提供了一个全面的基于节点的接口,用于自定义采样工作流程。
| 节点类 | 目的 | 关键参数 |
|---|---|---|
BasicScheduler | 使用内置调度器 | scheduler、steps、denoise |
KarrasScheduler | Karras 噪声调度 | sigma_max、sigma_min、rho |
ExponentialScheduler | 指数间隔 | sigma_max、sigma_min |
BetaSamplingScheduler | Beta 分布 | alpha、beta |
SDTurboScheduler | SD-Turbo 特有 | steps、denoise |
| 节点类 | 目的 | 关键参数 |
|---|---|---|
KSamplerSelect | 从内置采样器中选择 | sampler_name |
SamplerDPMPP_3M_SDE | DPM++ 3M SDE,带选项 | eta、s_noise、noise_device |
SamplerDPMPP_2M_SDE | DPM++ 2M SDE,带求解器类型 | solver_type、eta、s_noise |
SamplerEulerAncestral | Euler Ancestral,带控制 | eta、s_noise |
SamplerDPMAdaptative | 自适应 DPM 求解器 | order、rtol、atol、h_init |
SamplerCustom 节点提供对采样过程的完全控制
节点处理
add_noise 参数创建随机或空的噪声来源:comfy_extras/nodes_custom_sampler.py501-553 comfy_extras/nodes_custom_sampler.py11-300 comfy_extras/nodes_custom_sampler.py302-481
UniPC (Unified Predictor-Corrector) 采样器实现了一个复杂的、具有预测-校正步骤的多步方法。它在单独的模块中实现,并提供
图像修复支持:KSamplerX0Inpaint 类通过以下方式处理图像修复:
CFG++ 变体:一些采样器包含 CFG++ (Classifier-Free Guidance++) 实现,该实现修改了传统的 CFG 公式以获得更好的结果。
祖先采样:祖先变体通过 get_ancestral_step() 函数添加受控噪声注入,以保持正确的噪声水平。
来源:comfy/extra_samplers/uni_pc.py352-830 comfy/samplers.py386-400 comfy_extras/nodes_advanced_samplers.py8-103