Skip to content

Commit 6592bff

Browse files
authored
seeds_2: add phi_2 variant and sampler node (#11309)
* Add phi_2 solver type to seeds_2 * Add sampler node of seeds_2
1 parent 971cefe commit 6592bff

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

comfy/k_diffusion/sampling.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,10 +1557,13 @@ def default_er_sde_noise_scaler(x):
15571557

15581558

15591559
@torch.no_grad()
1560-
def sample_seeds_2(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, r=0.5):
1560+
def sample_seeds_2(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, r=0.5, solver_type="phi_1"):
15611561
"""SEEDS-2 - Stochastic Explicit Exponential Derivative-free Solvers (VP Data Prediction) stage 2.
15621562
arXiv: https://arxiv.org/abs/2305.14267 (NeurIPS 2023)
15631563
"""
1564+
if solver_type not in {"phi_1", "phi_2"}:
1565+
raise ValueError("solver_type must be 'phi_1' or 'phi_2'")
1566+
15641567
extra_args = {} if extra_args is None else extra_args
15651568
seed = extra_args.get("seed", None)
15661569
noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler
@@ -1600,8 +1603,14 @@ def sample_seeds_2(model, x, sigmas, extra_args=None, callback=None, disable=Non
16001603
denoised_2 = model(x_2, sigma_s_1 * s_in, **extra_args)
16011604

16021605
# Step 2
1603-
denoised_d = torch.lerp(denoised, denoised_2, fac)
1604-
x = sigmas[i + 1] / sigmas[i] * (-h * eta).exp() * x - alpha_t * ei_h_phi_1(-h_eta) * denoised_d
1606+
if solver_type == "phi_1":
1607+
denoised_d = torch.lerp(denoised, denoised_2, fac)
1608+
x = sigmas[i + 1] / sigmas[i] * (-h * eta).exp() * x - alpha_t * ei_h_phi_1(-h_eta) * denoised_d
1609+
elif solver_type == "phi_2":
1610+
b2 = ei_h_phi_2(-h_eta) / r
1611+
b1 = ei_h_phi_1(-h_eta) - b2
1612+
x = sigmas[i + 1] / sigmas[i] * (-h * eta).exp() * x - alpha_t * (b1 * denoised + b2 * denoised_2)
1613+
16051614
if inject_noise:
16061615
segment_factor = (r - 1) * h * eta
16071616
sde_noise = sde_noise * segment_factor.exp()

comfy_extras/nodes_custom_sampler.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,31 @@ def execute(cls, model, eta, sde_start_percent, sde_end_percent, s_noise, predic
659659
get_sampler = execute
660660

661661

662+
class SamplerSEEDS2(io.ComfyNode):
663+
@classmethod
664+
def define_schema(cls):
665+
return io.Schema(
666+
node_id="SamplerSEEDS2",
667+
category="sampling/custom_sampling/samplers",
668+
inputs=[
669+
io.Combo.Input("solver_type", options=["phi_1", "phi_2"]),
670+
io.Float.Input("eta", default=1.0, min=0.0, max=100.0, step=0.01, round=False, tooltip="Stochastic strength"),
671+
io.Float.Input("s_noise", default=1.0, min=0.0, max=100.0, step=0.01, round=False, tooltip="SDE noise multiplier"),
672+
io.Float.Input("r", default=0.5, min=0.01, max=1.0, step=0.01, round=False, tooltip="Relative step size for the intermediate stage (c2 node)"),
673+
],
674+
outputs=[io.Sampler.Output()]
675+
)
676+
677+
@classmethod
678+
def execute(cls, solver_type, eta, s_noise, r) -> io.NodeOutput:
679+
sampler_name = "seeds_2"
680+
sampler = comfy.samplers.ksampler(
681+
sampler_name,
682+
{"eta": eta, "s_noise": s_noise, "r": r, "solver_type": solver_type},
683+
)
684+
return io.NodeOutput(sampler)
685+
686+
662687
class Noise_EmptyNoise:
663688
def __init__(self):
664689
self.seed = 0
@@ -996,6 +1021,7 @@ async def get_node_list(self) -> list[type[io.ComfyNode]]:
9961021
SamplerDPMAdaptative,
9971022
SamplerER_SDE,
9981023
SamplerSASolver,
1024+
SamplerSEEDS2,
9991025
SplitSigmas,
10001026
SplitSigmasDenoise,
10011027
FlipSigmas,

0 commit comments

Comments
 (0)