Skip to content

No seed gets set in custom/advanced samplers when add_noise is disabled #2833

@blepping

Description

@blepping

the common sampler code has:

    if disable_noise:
        noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
    else:
        batch_inds = latent["batch_index"] if "batch_index" in latent else None
        noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)

prepare_noise is what sets the global RNG that various thing such as ancestral samplers use, so when add_noise is disabled this means no seed gets set before sampling and the RNG is an undefined state. in other words, if you turn off add_noise and use a sampler like euler_a it's impossible to reproduce generations.

it's easy to reproduce: just use an advanced or custom sampler, set a fixed seed, turn off add_noise and use euler_a. start generating and look at the preview. abort it at 50% or so and restart, you will get a completely new generation each time.

is there any reason not to just do torch.manual_seed(seed) in the disable_noise code path to ensure the RNG is in a defined state based on the seed the user set?

i made a simple work around ( https://github.com/blepping/ComfyUI-bleh#blehforceseedsampler ) but it would be nice if that wasn't necessary. edit: my workaround doesn't seem to work reliably

see below for a visual demonstration of the issue. ignore the "Noisy Latent Image" node, it's not connected to anything. the seed comes from a Seed Everywhere node near the top right (set to 0)

current behavior

image

with #2841

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions