Flux and LTX pipelines do not forward the generator to stochastic scheduler steps

Abierto Apto para principiantes
#15,163 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
70/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
python, pytorch

Línea de trabajo

Lee las clases FluxPipeline y LTXPipeline para encontrar dónde se llama a scheduler.step() sin el generator. Reenvía el generator de la pipeline a esa llamada, reflejando el PR #13678. Ejecuta el script de reproducción del issue: con stochastic_sampling=True, la diferencia máxima debería ser 0.000000.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug
Describe the bug

With FlowMatchEulerDiscreteScheduler(stochastic_sampling=True), FluxPipeline and LTXPipeline produce different outputs with the same supplied generator seed when unrelated global RNG state changes.

The pipelines use the supplied generator for initial latents but omit it from scheduler.step(). Subsequent noise therefore uses the global RNG.

PR #13678 fixed generator handling inside the scheduler; the pipeline callers still need to forward it.

I’d be happy to submit a PR to fix the issue.

Reproduction

This CPU example uses small real Flux components and precomputed prompt embeddings. Both calls use generator seed 17; only the global RNG state changes.

import torch
from diffusers import (
    AutoencoderKL, FlowMatchEulerDiscreteScheduler,
    FluxPipeline, FluxTransformer2DModel,
)

torch.set_num_threads(1)
torch.manual_seed(0)

transformer = FluxTransformer2DModel(
    patch_size=1, in_channels=4, num_layers=1, num_single_layers=1,
    attention_head_dim=16, num_attention_heads=2, joint_attention_dim=32,
    pooled_projection_dim=32, axes_dims_rope=[4, 4, 8],
).eval()

vae = AutoencoderKL(
    sample_size=32, in_channels=3, out_channels=3, block_out_channels=(4,),
    layers_per_block=1, latent_channels=1, norm_num_groups=1,
    use_quant_conv=False, use_post_quant_conv=False,
    shift_factor=0.0609, scaling_factor=1.5035,
).eval()

pipe = FluxPipeline(
    transformer=transformer, vae=vae,
    scheduler=FlowMatchEulerDiscreteScheduler(),
    text_encoder=None, tokenizer=None,
    text_encoder_2=None, tokenizer_2=None,
)
pipe.set_progress_bar_config(disable=True)

prompt_embeds = torch.randn(1, 16, 32)
pooled_prompt_embeds = torch.randn(1, 32)

for stochastic in (False, True):
    pipe.scheduler = FlowMatchEulerDiscreteScheduler(
        stochastic_sampling=stochastic
    )
    outputs = []
    for global_seed in (13, 99):
        torch.manual_seed(global_seed)
        outputs.append(pipe(
            prompt_embeds=prompt_embeds,
            pooled_prompt_embeds=pooled_prompt_embeds,
            height=8, width=8, guidance_scale=1.0,
            num_inference_steps=4,
            generator=torch.Generator().manual_seed(17),
            output_type="latent",
        ).images)

    difference = (outputs[0] - outputs[1]).abs().max().item()
    print(f"stochastic_sampling={stochastic}: max difference = {difference:.6f}")

The two runs should produce identical outputs with the same supplied generator seed, but in this example, they differ by up to 2.285045 when only the global RNG state changes.

Logs
stochastic_sampling=False: max difference = 0.000000
stochastic_sampling=True: max difference = 2.285045
System Info
  • Diffusers: 0.42.1; also reproduced on main revision 86ef420b17363c28e36ebad6b58555e9aa8feda2
  • Python: 3.12.14
  • PyTorch: 2.14.1
  • Transformers: 5.20.2
  • Platform: macOS arm64, CPU float32
Who can help?

No response

Lenguaje dominante
Python
Estrellas
34.8k
Forks
7.4k
Merge medio
2 d 12 h
PR fusionados (30 d)
58

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de huggingface/diffusers

Todos los issues de huggingface/diffusers

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.