Lightning-AI/pytorch-lightning · error · RuntimeError

Please call `iter(combined_loader)` first.

Error message

Please call `iter(combined_loader)` first.

What it means

CombinedLoader.__len__ requires an active iterator because length depends on the combination mode's iterator state. Calling len() before iter(combined_loader) raises RuntimeError.

Source

Thrown at src/lightning/pytorch/utilities/combined_loader.py:358

        assert self._iterator is not None
        out = next(self._iterator)
        if isinstance(self._iterator, _Sequential):
            return out
        out, batch_idx, dataloader_idx = out
        return tree_unflatten(out, self._spec), batch_idx, dataloader_idx

    @override
    def __iter__(self) -> Self:
        cls = _SUPPORTED_MODES[self._mode]["iterator"]
        iterator = cls(self.flattened, self._limits)
        iter(iterator)
        self._iterator = iterator
        return self

    def __len__(self) -> int:
        """Compute the number of batches."""
        if self._iterator is None:
            raise RuntimeError("Please call `iter(combined_loader)` first.")
        return len(self._iterator)

    def reset(self) -> None:
        """Reset the state and shutdown any workers."""
        if self._iterator is not None:
            self._iterator.reset()
            self._iterator = None
        for iterable in self.flattened:
            _shutdown_workers_and_reset_iterator(iterable)

    def _dataset_length(self) -> int:
        """Compute the total length of the datasets according to the current mode."""
        datasets = [getattr(dl, "dataset", None) for dl in self.flattened]
        lengths = [length for ds in datasets if (length := sized_len(ds)) is not None]
        if not lengths:
            raise NotImplementedError("All datasets are iterable-style datasets.")
        fn = _SUPPORTED_MODES[self._mode]["fn"]
        return fn(lengths)

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Call it = iter(cl) first, then len(cl) works
  2. Or loop over the loader once (for-loop implicitly calls iter) before checking length

Example fix

# before
cl = CombinedLoader([dl1, dl2])
n = len(cl)  # RuntimeError
# after
it = iter(cl)
n = len(cl)
Defensive patterns

Strategy: validation

Validate before calling

assert cl._iterator is not None, "call iter(cl) before len(cl)"

Try / catch

try:
    n = len(cl)
except RuntimeError:
    _ = iter(cl)
    n = len(cl)

Prevention

When it happens

Trigger: cl = CombinedLoader(...); len(cl) without ever calling iter(cl) or looping over it.

Common situations: Inspecting loader length right after construction; calling len() in setup() before iteration begins.

Related errors


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