Skip to content

TangentialClassifierFreeGuidance.is_conditional reads an attribute that does not exist #14794

Description

@ojassharma7

Describe the bug

TangentialClassifierFreeGuidance.is_conditional reads self._num_outputs_prepared, which is not defined on the class, on BaseGuidance, or anywhere else in the package. Accessing it raises AttributeError, and so does is_unconditional, since BaseGuidance defines that as not self.is_conditional.

BaseGuidance.__init__ sets self._count_prepared, and prepare_inputs increments it. Every other guider reads that attribute. This one appears to be the only exception:

adaptive_projected_guidance.py        return self._count_prepared == 1
adaptive_projected_guidance_mix.py    return self._count_prepared == 1
auto_guidance.py                      return self._count_prepared == 1
classifier_free_guidance.py           return self._count_prepared == 1
classifier_free_zero_star_guidance.py return self._count_prepared == 1
frequency_decoupled_guidance.py       return self._count_prepared == 1
magnitude_aware_guidance.py           return self._count_prepared == 1
perturbed_attention_guidance.py       return self._count_prepared == 1 or self._count_prepared == 3
skip_layer_guidance.py                return self._count_prepared == 1 or self._count_prepared == 3
smoothed_energy_guidance.py           return self._count_prepared == 1 or self._count_prepared == 3
tangential_classifier_free_guidance.py  return self._num_outputs_prepared == 1   <-- undefined

grep -rn "_num_outputs_prepared" src/ returns that single line and no assignment.

The reported error is misleading, which is what makes this awkward to diagnose. Python surfaces a failure inside a property as the property itself being missing, so the message names is_conditional rather than the attribute that is actually absent.

The property is reachable rather than dead code. BaseGuidance.is_unconditional routes through it, and modular_pipelines/stable_diffusion_xl/denoise.py reads components.guider.is_conditional in the guess-mode branch.

Reproduction

No GPU, model download or authentication required.

from diffusers.guiders import ClassifierFreeGuidance, TangentialClassifierFreeGuidance

print(ClassifierFreeGuidance(guidance_scale=7.5).is_conditional)          # False

t = TangentialClassifierFreeGuidance(guidance_scale=7.5)
print(hasattr(t, "_count_prepared"))          # True
print(hasattr(t, "_num_outputs_prepared"))    # False
t.is_conditional                              # AttributeError
t.is_unconditional                            # AttributeError

Logs

AttributeError: 'TangentialClassifierFreeGuidance' object has no attribute 'is_conditional'

Prior attempts

Two pull requests fixed this correctly and are now closed, in both cases by their own authors rather than by a maintainer or a review decision:

I mention this because it seems more useful than filing a third identical patch unprompted. Given that guiders are marked experimental, is this worth fixing, or is the module parked for now? If you would like it fixed I am happy to open a PR changing the attribute to _count_prepared, with a test that covers is_conditional and is_unconditional for every guider so the next one cannot drift the same way.

System Info

  • diffusers 0.41.0.dev0, main at ae2e4c7
  • torch 2.14.0, Python 3.11, macOS (Apple Silicon)
  • Reproduced on CPU, no accelerator involved

Who can help?

@DN6 @asomoza

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions