Lightning-AI/pytorch-lightning · error · TypeError

f"An invalid dataloader was passed to `Trainer.{trainer_fn.v

Error message

f"An invalid dataloader was passed to `Trainer.{trainer_fn.value}({prefix}dataloaders=...)`." f" Found {dataloader}."

What it means

TypeError from _check_dataloaders_every_n_epochs-adjacent _check_dataloader_iterable during setup_data: iter(dataloader) raised TypeError (object has no __iter__) and the dataloader does not come from an overridden method on the module/datamodule, so Lightning cannot give method-specific advice. The passed object is simply not iterable — not a DataLoader-like or dataset.

Source

Thrown at src/lightning/pytorch/trainer/connectors/data_connector.py:400

        return self.model


def _check_dataloader_iterable(
    dataloader: object,
    source: _DataLoaderSource,
    trainer_fn: TrainerFn,
) -> None:
    if isinstance(dataloader, DataLoader):
        # Fast path: `torch.utils.data.DataLoader` is always iterable, calling iter() would be expensive
        return

    try:
        iter(dataloader)  # type: ignore[call-overload]
    except TypeError:
        # A prefix in the message to disambiguate between the train- and (optional) val dataloader that .fit() accepts
        prefix = "train_" if trainer_fn == TrainerFn.FITTING else ""
        if not source.is_module():
            raise TypeError(
                f"An invalid dataloader was passed to `Trainer.{trainer_fn.value}({prefix}dataloaders=...)`."
                f" Found {dataloader}."
            )
        if not is_overridden(source.name, source.instance):
            raise TypeError(
                f"An invalid dataloader was passed to `Trainer.{trainer_fn.value}({prefix}dataloaders=...)`."
                f" Found {dataloader}."
                f" Either pass the dataloader to the `.{trainer_fn.value}()` method OR implement"
                f" `def {source.name}(self):` in your LightningModule/LightningDataModule."
            )
        raise TypeError(
            f"An invalid dataloader was returned from `{type(source.instance).__name__}.{source.name}()`."
            f" Found {dataloader}."
        )


def _worker_check(trainer: "pl.Trainer", dataloader: object, name: str) -> None:
    if not isinstance(dataloader, DataLoader):

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Wrap in a DataLoader: from torch.utils.data import DataLoader; DataLoader(ds, batch_size=32)
  2. For HF datasets: trainer.fit(model, train_dataloaders=ds.to_iterable_dataset()) or construct a DataLoader over it
  3. Return the dataloader from train_dataloader()/val_dataloader() on the LightningModule/DataModule instead of passing a non-iterable object

Example fix

# before
from datasets import load_dataset
ds = load_dataset("mnist", split="train")
trainer.fit(model, train_dataloaders=ds)  # not iterable
# after
trainer.fit(model, train_dataloaders=DataLoader(ds, batch_size=32))
# or
trainer.fit(model, train_dataloaders=ds.to_iterable_dataset())
Defensive patterns

Strategy: type-guard

Validate before calling

from torch.utils.data import DataLoader
if not hasattr(dataloaders, "__iter__"):
    dataloaders = DataLoader(dataloaders, batch_size=32)
trainer.fit(model, train_dataloaders=dataloaders)

Type guard

def is_iterable_dataloader(dl) -> bool:
    try:
        iter(dl)
        return True
    except TypeError:
        return False

Try / catch

try:
    trainer.fit(model, train_dataloaders=ds)
except TypeError as e:
    if "invalid dataloader" in str(e):
        trainer.fit(model, train_dataloaders=DataLoader(ds, batch_size=32))
    else:
        raise

Prevention

When it happens

Trigger: Passing a HuggingFace datasets.Dataset (not IterableDataset), a numpy array, a torch Tensor, or a plain object to trainer.fit(model, train_dataloaders=ds); also datasets without __iter__/__len__ protocols.

Common situations: Assuming HF datasets or tensors are accepted directly; passing a Dataset class instead of an instantiated DataLoader; wrapping data objects that only support indexing.

Related errors


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