Lightning-AI/pytorch-lightning · error · RuntimeError

Expected a precision plugin, got {plugin}

Error message

Expected a precision plugin, got {plugin}

What it means

_plugin_to_compute_dtype() maps a Fabric Precision plugin to the torch dtype used for FLOP/throughput measurement. It raises RuntimeError when the passed plugin is not an instance of a lightning.pytorch.plugins.precision.Precision subclass.

Source

Thrown at src/lightning/fabric/utilities/throughput.py:672

        return int(_TPU_FLOPS[chip])


def _plugin_to_compute_dtype(plugin: "Precision") -> torch.dtype:
    # TODO: integrate this into the precision plugins
    from lightning.fabric.plugins import (
        BitsandbytesPrecision,
        DeepSpeedPrecision,
        DoublePrecision,
        FSDPPrecision,
        HalfPrecision,
        MixedPrecision,
        Precision,
        TransformerEnginePrecision,
        XLAPrecision,
    )

    if not isinstance(plugin, Precision):
        raise RuntimeError(f"Expected a precision plugin, got {plugin}")
    if isinstance(plugin, BitsandbytesPrecision):
        return plugin.dtype
    if isinstance(plugin, (HalfPrecision, MixedPrecision)):
        return plugin._desired_input_dtype
    if isinstance(plugin, DoublePrecision):
        return torch.double
    if isinstance(plugin, (XLAPrecision, DeepSpeedPrecision)):
        return plugin._desired_dtype
    if isinstance(plugin, TransformerEnginePrecision):
        return torch.int8
    if isinstance(plugin, FSDPPrecision):
        return plugin.mixed_precision_config.reduce_dtype or torch.float32
    if isinstance(plugin, Precision):
        return torch.float32
    raise NotImplementedError(plugin)


T = TypeVar("T", bound=float)

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Pass an actual Precision plugin instance, e.g. fabric.strategy.precision or MixedPrecision('bf16', device='cuda')
  2. If using DeepSpeed FLOPs profiling, retrieve the plugin from the strategy: ThroughputMonitor(..., precision_plugin=fabric.strategy.precision)
  3. Check you are importing from lightning.fabric.plugins.precision, not torch or another package

Example fix

# before
monitor = ThroughputMonitor(flops_deepspeed=profile, precision_plugin='bf16')

# after
from lightning.fabric.plugins import MixedPrecision
monitor = ThroughputMonitor(flops_deepspeed=profile, precision_plugin=MixedPrecision('bf16', device='cuda'))
Defensive patterns

Strategy: type-guard

Validate before calling

from lightning.fabric.plugins import Precision
plugin = fabric.strategy.precision
assert isinstance(plugin, Precision), f"not a precision plugin: {plugin!r}"

Type guard

from lightning.fabric.plugins import Precision
from typing import Any

def is_precision_plugin(p: Any) -> bool:
    return isinstance(p, Precision)

Prevention

When it happens

Trigger: Passing a raw torch dtype, a string like 'bf16', a Trainer precision config dict, or None as the precision_plugin argument of ThroughputMonitor; also passing a strategy or accelerator object instead of the precision plugin.

Common situations: Constructing ThroughputMonitor(flops_deepspeed=..., precision_plugin='bf16') instead of a real plugin instance; grabbing fabric.strategy.precision on a version where the attribute is unset or returns a wrapper; mixing old lightning (pl) imports with new lightning.fabric APIs.

Understand the failure class

Background: "Wrong argument type", "must be a string", "expected Array or Prism::Scope": TypeError and ArgumentError when a library receives a value of the wrong type — this error's family across 28 libraries.

Related errors


AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28). Data as JSON: /api/errors/a0d5c400f39a014e. Report an issue: GitHub.