invoke-ai/InvokeAI · error · ValueError

cfg_scale values must be finite.

Error message

cfg_scale values must be finite.

What it means

The Krea2 denoise invocation is a pydantic model with a field_validator on cfg_scale that rejects any non-finite value (NaN or ±Infinity), whether cfg_scale is a single float or a list of per-step floats. Non-finite guidance scales would poison the denoising math, so validation fails at model construction time with 'cfg_scale values must be finite.'

Source

Thrown at invokeai/app/invocations/krea2_denoise.py:106

    # CFG uses the standard formulation (uncond + cfg_scale*(cond-uncond)); cfg_scale <= 1 disables it.
    # Krea-2-Turbo is distilled and runs with CFG disabled (cfg_scale=1.0).
    cfg_scale: float | list[float] = InputField(default=1.0, description=FieldDescriptions.cfg_scale, title="CFG Scale")
    width: int = InputField(default=1024, gt=0, multiple_of=16, description="Width of the generated image.")
    height: int = InputField(default=1024, gt=0, multiple_of=16, description="Height of the generated image.")
    steps: int = InputField(default=8, gt=0, description=FieldDescriptions.steps)
    seed: int = InputField(default=0, description="Randomness seed for reproducibility.")
    shift: Optional[float] = InputField(
        default=None,
        description="Override the resolution-aware timestep shift (mu). Leave unset to use the model default "
        "(mu=1.15 for the distilled Turbo checkpoint).",
    )

    @field_validator("cfg_scale")
    @classmethod
    def validate_cfg_scale_is_finite(cls, value: float | list[float]) -> float | list[float]:
        values = value if isinstance(value, list) else [value]
        if not all(math.isfinite(item) for item in values):
            raise ValueError("cfg_scale values must be finite.")
        return value

    @field_validator("shift")
    @classmethod
    def validate_shift_is_finite(cls, value: float | None) -> float | None:
        if value is not None and not math.isfinite(value):
            raise ValueError("shift must be finite.")
        return value

    @torch.no_grad()
    def invoke(self, context: InvocationContext) -> LatentsOutput:
        latents = self._run_diffusion(context)
        latents = latents.detach().to("cpu")
        name = context.tensors.save(tensor=latents)
        return LatentsOutput.build(latents_name=name, latents=latents, seed=None)

    def _prep_inpaint_mask(self, context: InvocationContext, latents: torch.Tensor) -> torch.Tensor | None:
        if self.denoise_mask is None:

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Set cfg_scale to a finite positive float (or list of finite floats), e.g. 1.0–10.0.
  2. Fix the upstream computation producing NaN/inf before it reaches cfg_scale.
  3. Parse JSON with parse_constant rejecting NaN/Infinity so bad payloads fail early with a clearer message.

Example fix

// before
cfg_scale=float("inf")  # or [1.0, float("nan")]
// after
cfg_scale=7.5  # or [1.0, 7.5, 3.0]
Defensive patterns

Strategy: validation

Validate before calling

import math
def cfg_scale_ok(v) -> bool:
    vals = v if isinstance(v, list) else [v]
    return all(isinstance(x, float) and math.isfinite(x) for x in vals)

Type guard

def is_finite_number(x: object) -> bool:
    return isinstance(x, (int, float)) and math.isfinite(x)

Try / catch

try:
    node = Krea2DenoiseInvocation(**params)
except ValueError as e:
    if "cfg_scale values must be finite" in str(e):
        params["cfg_scale"] = 7.5
        node = Krea2DenoiseInvocation(**params)

Prevention

When it happens

Trigger: Constructing or deserializing a Krea2 denoise invocation (via graph submission or the API) with cfg_scale=nan, cfg_scale=float('inf'), or a list containing any NaN/inf element.

Common situations: Programmatic graph generation computing cfg_scale from upstream math that produced NaN; JSON payloads with 'NaN'/'Infinity' literals (Python's json accepts these by default); config interpolation bugs.

Related errors


AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29). Data as JSON: /api/errors/5fabaf4d55401bf7. Report an issue: GitHub.