
Diffusers EDMDPMSolverMultistepScheduler 完全指南EDM 配方下的 DPM-Solver 多步采样器【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusersEDMDPMSolverMultistepScheduler是 Diffusers 中以 EDMKarras 等人提出的扩散模型设计空间阐明配方实现的DPMSolverMultistepScheduler将 DPM-Solver / DPM-Solver 的高阶 ODE 求解算法与 EDM 的 sigma 调度与输入输出预处理策略结合用更少的采样步数获得高质量样本。阅读本文后你将掌握该调度器的全部构造参数与默认值、Karras / exponential 两种 sigma 调度原理、一阶到三阶多步更新公式、以及在文本到图像Stable Diffusion和单文件加载如 Stable Audio中的实际配置与调用方式。调度器定位为什么需要EDM 配方的 DPM-SolverDPM-Solver 与 DPM-SolverCheng Lu、Yuhao Zhou、Fan Bao、Jianfei Chen、Chongxuan Li、Jun Zhu 等人提出是针对扩散模型 ODE 的专用高阶快速求解器具有收敛阶数保证。实验表明DPM-Solver 仅用 20 步采样即可生成高质量样本甚至 10 步也能得到相当不错的生成结果。EDM 配方Elucidating the Design Space of Diffusion-Based Generative Models即 Karras 等人的论文则从信号处理角度重新设计了扩散模型的训练与采样流程以sigma噪声强度作为核心控制量配合数据缩放系数c_in、跳跃连接系数c_skip与输出缩放系数c_out对模型输入输出进行预处理。EDMDPMSolverMultistepScheduler正是两者的结合在采样时用 EDM 的 Karras 或 exponential sigma 调度生成离散时间步把模型输出通过 EDM 预处理公式还原为x0预测再交给 DPM-Solver 系列的一阶、二阶、三阶多步更新公式推进去噪过程。在 diffusers 的调度器谱系中它与EDMEulerScheduler共享了大量 EDM 预处理代码precondition_inputs、precondition_noise、precondition_outputs、_compute_karras_sigmas等方法均直接复用自scheduling_edm_euler.py但从更新公式上看它属于 DPM-Solver 家族源码见 scheduling_edm_dpmsolver_multistep.py。快速上手在 Stable Diffusion 流水线中使用调度器可以直接从 diffusers 导入并作为参数传入任意支持from_pretrained(..., scheduler...)的流水线。以下代码展示了如何在 Stable Diffusion 文本到图像流水线中替换默认调度器import torch from diffusers import StableDiffusionPipeline, EDMDPMSolverMultistepScheduler pipe StableDiffusionPipeline.from_pretrained( runwayml/stable-diffusion-v1-5, torch_dtypetorch.float16, ) # 用 EDM 配方的 DPM-Solver 替换默认调度器 pipe.scheduler EDMDPMSolverMultistepScheduler.from_config(pipe.scheduler.config) image pipe( prompta photo of an astronaut riding a horse on mars, num_inference_steps20, guidance_scale7.5, ).images[0] image.save(output.png)也可以直接用EDMDPMSolverMultistepScheduler的构造参数实例化所有配置项都通过register_to_config注册因此既支持from_config继承流水线原调度器配置也支持save_config/from_pretrained序列化保存与加载ConfigMixin提供的通用能力见 configuration_utils.py。在测试中这一往返流程save_config到临时目录再from_pretrained加载会被用来验证配置持久化的等价性见 test_scheduler_edm_dpmsolver_multistep.py。构造参数详解从默认值到取值范围所有参数均定义在__init__中并通过register_to_config注册为调度器配置默认值与论文设定保持一致源码见 scheduling_edm_dpmsolver_multistep.py。参数默认值说明sigma_min0.002sigma 调度中的最小噪声强度EDM 论文设定值合理范围约为[0, 10]sigma_max80.0sigma 调度中的最大噪声强度EDM 论文设定值合理范围约为[0.2, 80.0]sigma_data0.5数据分布的标准差EDM 论文设定值sigma_schedulekarrassigma 调度类型可选karras或exponential后者来自 stabilityai/cosxl 等模型num_train_timesteps1000训练扩散过程的步数决定训练侧噪声调度长度prediction_typeepsilon模型预测类型epsilon预测噪声、sample直接预测带噪样本、v_predictionImagen Video 论文第 2.4 节的 v 预测rho7.0Karras sigma 调度中的 rho 参数EDM 论文设定值solver_order2DPM-Solver 阶数可取1、2或3官方建议引导采样用2无条件采样用3thresholdingFalse是否使用动态阈值方法该方法不适合 Stable Diffusion 这类潜空间扩散模型dynamic_thresholding_ratio0.995动态阈值方法的百分位比率仅在thresholdingTrue时生效sample_max_value1.0动态阈值的裁剪上限仅在thresholdingTrue且algorithm_typedpmsolver时生效algorithm_typedpmsolver求解算法类型dpmsolver或sde-dpmsolver引导采样如 Stable Diffusion建议使用二者之一并配solver_order2solver_typemidpoint二阶求解器类型midpoint或heun对步数较少时的影响略明显官方建议midpointlower_order_finalTrue最后几步是否降阶求解仅对少于 15 步的推理有效可稳定 DPMSolver 在15步尤其10步时的采样euler_at_finalFalse最后一步是否改用 Euler 方法是数值稳定性与细节丰富度之间的权衡可稳定 SDE 变体在小步数下的采样但有时会造成模糊final_sigmas_typezero采样末端的最终 sigma 值zero将最终 sigma 置为 0sigma_min使用训练调度中的最后一个 sigma参数校验与自动回退构造函数并非全盘接收参数而是带有兼容性处理scheduling_edm_dpmsolver_multistep.py若传入algorithm_typedeis会自动回退注册为dpmsolver其他未实现值直接抛出NotImplementedError若传入solver_typelogrho、bh1、bh2会自动回退注册为midpoint其他未实现值抛出NotImplementedError若algorithm_type不在[dpmsolver, sde-dpmsolver]且final_sigmas_typezero会抛出ValueError提示改用sigma_min。核心机制一EDM 预处理与两种 sigma 调度sigma 调度生成set_timesteps根据推理步数生成离散时间步先用torch.linspace(0, 1, num_inference_steps)构造插值位置ramp再按sigma_schedule选择调度函数scheduling_edm_dpmsolver_multistep.pyKarras 调度默认sigmas (sigma_max^(1/rho) ramp * (sigma_min^(1/rho) - sigma_max^(1/rho))) ^ rho即对 sigma 的 1/rho 次方做线性插值再取 rho 次方将更多步数分配到低噪声区对应论文中的_compute_karras_sigmasExponential 调度sigmas linspace(log(sigma_min), log(sigma_max), n).exp().flip(0)在 log 空间线性插值后取指数并反转顺序实现接近等比例递减的噪声序列实现紧密参考 k-diffusion 库的采样代码。训练时__init__内同样用这两种函数生成 1000 步的初始 sigma 序列并追加一个 0 构成self.sigmasself.timesteps则由precondition_noise将 sigma 映射为c_noise 0.25 * log(sigma)作为送入 UNet 的时间条件编码输入。EDM 输入输出预处理EDM 配方的关键在于三个预处理函数与EDMEulerScheduler完全一致从源码注释可见直接复制自scheduling_edm_euler.pyprecondition_inputs(sample, sigma)按c_in 1 / sqrt(sigma^2 sigma_data^2)缩放输入样本precondition_outputs(sample, model_output, sigma)按跳跃连接c_skip sigma_data^2 / (sigma^2 sigma_data^2)与输出缩放c_out组合出x0预测其中epsilon预测时c_out sigma * sigma_data / sqrt(sigma^2 sigma_data^2)v_prediction时取负号sample预测类型则会直接抛出ValueErrorprecondition_noise(sigma)返回0.25 * log(sigma)作为噪声水平条件编码。在流水线推理中scale_model_input会在每一步前被调用它根据当前step_index取出对应 sigma对输入样本执行precondition_inputs缩放scheduling_edm_dpmsolver_multistep.py。init_noise_sigma属性返回sqrt(sigma_max^2 1)用于初始化潜变量的噪声标准差。核心机制二模型输出转换与多步更新公式从模型输出到 x0 预测step()的第一步是调用convert_model_output将当前 sigma 下的模型原始输出通过precondition_outputs转换为x0预测若启用thresholding再执行动态阈值裁剪。DPM-Solver 与 DPM-Solver 的区别在于积分对象前者对噪声预测模型的积分做离散化后者对数据x0预测模型的积分做离散化同时算法与模型类型是解耦的——噪声预测模型和 x0 预测模型均可搭配 DPM-Solver 或 DPM-Solver 使用源码中的 TIP 说明见 scheduling_edm_dpmsolver_multistep.py。由于输入在进入 UNet 前已按 EDM 配方预缩放_sigma_to_alpha_sigma_t直接设定alpha_t 1、sigma_t sigmalambda log(alpha) - log(sigma) -log(sigma)更新公式因此大幅简化。一阶更新等价于 DDIMdpm_solver_first_order_update实现一阶更新dpmsolver下为x_t (sigma_t/sigma_s) * sample - alpha_t * (exp(-h) - 1) * model_output其中h lambda_t - lambda_ssde-dpmsolver变体则额外叠加噪声项sigma_t * sqrt(1 - exp(-2h)) * noise将确定性 ODE 更新变为 SDE 更新scheduling_edm_dpmsolver_multistep.py。二阶与三阶更新二阶更新multistep_dpm_solver_second_order_update复用前两步的模型输出通过r0 h_0/h构造差分D1 (m0 - m1)/r0midpoint与heun两种solver_type的区别在于 D1 项的组合系数见 scheduling_edm_dpmsolver_multistep.py三阶更新multistep_dpm_solver_third_order_update进一步复用前三次输出构造D0、D1、D2三阶差分仅支持dpmsolver算法类型SDE 变体无三阶实现测试中也跳过该组合见 test_scheduler_edm_dpmsolver_multistep.py。降阶与末步策略step()中通过lower_order_nums计数器实现逐步提升阶数并针对小步数场景自动降阶scheduling_edm_dpmsolver_multistep.pylower_order_final当总步数 15时倒数第二步使用二阶、最后一步使用一阶以稳定小步数采样euler_at_final最后一步强制使用一阶Euler更新牺牲部分细节换取数值稳定性final_sigmas_typezero时最后一步同样降为一阶因为 sigma 归零处的更新需要特殊处理。SDE 变体sde-dpmsolver每一步都会用randn_tensor重新采样高斯噪声注入更新公式这也是其名称中 SDE 的来源。进阶用法单文件加载与 Stable Audio 流水线该调度器在仓库中有两处实际落地场景可以直接作为配置参考。单文件模型加载配置在single_file_utils.py的单文件调度器分发逻辑中scheduler_type edm_dpm_solver_multistep分支给出了一个完整、可直接照抄的配置single_file_utils.pyscheduler_config { algorithm_type: dpmsolver, dynamic_thresholding_ratio: 0.995, euler_at_final: False, final_sigmas_type: zero, lower_order_final: True, num_train_timesteps: 1000, prediction_type: epsilon, rho: 7.0, sample_max_value: 1.0, sigma_data: 0.5, sigma_max: 80.0, sigma_min: 0.002, solver_order: 2, solver_type: midpoint, thresholding: False, } scheduler EDMDPMSolverMultistepScheduler(**scheduler_config)也就是说使用from_single_file加载这类模型时调度器会自动按上述默认配置实例化无需手动指定。Stable Audio 流水线中的使用EDMDPMSolverMultistepScheduler也是 Stable Audio 流水线的默认调度器类型pipeline_stable_audio.py流水线构造参数scheduler的类型注解即为本调度器pipeline_stable_audio.py这说明它适用于 EDM 风格训练得到的连续时间扩散模型音频生成同样属于此类。测试验证与数值稳定性保证仓库的调度器测试套件SchedulerCommonTest的子类EDMDPMSolverMultistepSchedulerTest覆盖了本调度器的关键行为test_scheduler_edm_dpmsolver_multistep.py配置持久化往返save_config后from_pretrained重新加载逐step对比输出差异小于1e-5验证序列化无损步数覆盖推理步数遍历[1, 2, 3, 5, 10, 50, 100, 999, 1000]训练步数遍历[25, 50, 100, 999, 1000]验证极端步数下不崩溃全循环数值断言10 步无噪声全循环的样本均值与0.0001误差小于1e-3带噪声全循环的样本和、均值分别锚定8.1661与0.0106thresholding与v_prediction也有对应的数值锚点任何更新公式回归都会导致断言失败组合覆盖solver_order与solver_type的各类组合都会执行全循环并断言无 NaNsde-dpmsolver三阶组合按设计跳过。此外test_duplicated_timesteps验证set_timesteps生成的timesteps长度与num_inference_steps一致确保流水线循环不会越界。参数选择实践建议综合论文默认值与源码注释可以归纳出如下实用配置策略引导采样classifier-free guidancealgorithm_typedpmsolver或sde-dpmsolversolver_order2solver_typemidpoint无条件采样可尝试solver_order3获取更高阶精度10 步左右的高压缩采样保持lower_order_finalTrue必要时开启euler_at_final换取数值稳定性代价是可能的模糊潜空间模型如 Stable Diffusion保持thresholdingFalse动态阈值只适合像素空间模型EDM 原生模型沿用sigma_min0.002、sigma_max80.0、sigma_data0.5、rho7.0、final_sigmas_typezero的默认组合若模型基于 cosxl 这类 exponential 调度训练将sigma_schedule切换为exponential。最终采样循环与 diffusers 其他调度器完全一致先set_timesteps(num_inference_steps)建立 sigma 调度再在循环中依次调用scale_model_input可选按流水线实现与step(model_output, t, sample)step返回SchedulerOutput或元组形式的prev_samplescheduling_edm_dpmsolver_multistep.py。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考