Describe the finding
DDPMScheduler.step() and DDPMParallelScheduler.step() treat fixed_large_log like an ordinary variance and take its square root. _get_variance() returns log(current_beta_t) for this mode, though, so the square root is applied to a negative value and the sample becomes NaN.
The intended scale is exp(0.5 * log_variance), which is equivalent to the sqrt(variance) used by fixed_large.
I have a small fix ready for both scheduler implementations, along with CPU regression tests comparing fixed_large_log against the equivalent fixed_large sampling result. Happy to open the PR if this approach sounds right : )
Reproduction
import torch
from diffusers import DDPMScheduler, DDPMParallelScheduler
for scheduler_class in (DDPMScheduler, DDPMParallelScheduler):
scheduler = scheduler_class(variance_type="fixed_large_log")
sample = torch.zeros((1, 2, 2, 2))
model_output = torch.zeros_like(sample)
output = scheduler.step(
model_output,
500,
sample,
generator=torch.Generator().manual_seed(0),
).prev_sample
print(scheduler_class.__name__, torch.isnan(output).sum().item())
Current output:
DDPMScheduler 8
DDPMParallelScheduler 8
Expected: both outputs are finite and match fixed_large when using the same generator.
System info
- Diffusers version:
0.40.0.dev0 (main at 58eb52c)
- Python:
3.12.13
- PyTorch:
2.13.0+cu130
- Platform: Linux
- GPU used by reproduction: No
- Distributed setup: No
@yiyixuxu
Describe the finding
DDPMScheduler.step()andDDPMParallelScheduler.step()treatfixed_large_loglike an ordinary variance and take its square root._get_variance()returnslog(current_beta_t)for this mode, though, so the square root is applied to a negative value and the sample becomesNaN.The intended scale is
exp(0.5 * log_variance), which is equivalent to thesqrt(variance)used byfixed_large.I have a small fix ready for both scheduler implementations, along with CPU regression tests comparing
fixed_large_logagainst the equivalentfixed_largesampling result. Happy to open the PR if this approach sounds right : )Reproduction
Current output:
Expected: both outputs are finite and match
fixed_largewhen using the same generator.System info
0.40.0.dev0(mainat58eb52c)3.12.132.13.0+cu130@yiyixuxu