huggingface / huggingface/diffusers

fixed_large_log variance sampling returns NaNs

Ouverte
#14,569 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
34.5k
Forks
7.3k
Merge moyen
3 j 3 h
PR mergées (30 j)
91

Description

### 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

```python
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:

```text
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

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par DDPMScheduler.step() et DDPMParallelScheduler.step(), puis suivez l’utilisation de _get_variance() pour le mode fixed_large_log. Exécutez la reproduction CPU fournie et ajoutez une couverture de régression pour les deux schedulers ; le travail est terminé lorsque les sorties sont finies et correspondent à l’échantillonnage fixed_large avec le même générateur.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python, pytorch
Domaine
machine-learning, testing
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
76/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.