Lightning-AI/pytorch-lightning · error · MisconfigurationException

f"`reload_dataloaders_every_n_epochs` should be an int >= 0,

Error message

f"`reload_dataloaders_every_n_epochs` should be an int >= 0, got {reload_dataloaders_every_n_epochs}."

What it means

DataConnector validation at Trainer init: reload_dataloaders_every_n_epochs must be an int and >= 0. 0 means never reload; N means reload dataloaders every N epochs. Non-ints (floats, strings) and negatives are rejected.

Source

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

        check_val_every_n_epoch: Optional[int],
    ) -> None:
        self.trainer.datamodule = None

        if check_val_every_n_epoch is not None and not isinstance(check_val_every_n_epoch, int):
            raise MisconfigurationException(
                f"`check_val_every_n_epoch` should be an integer, found {check_val_every_n_epoch!r}."
            )

        if check_val_every_n_epoch is None and isinstance(val_check_interval, float):
            raise MisconfigurationException(
                "`val_check_interval` should be an integer or a time-based duration (str 'DD:HH:MM:SS', "
                "datetime.timedelta, or dict kwargs for timedelta) when `check_val_every_n_epoch=None`."
            )

        self.trainer.check_val_every_n_epoch = check_val_every_n_epoch

        if not isinstance(reload_dataloaders_every_n_epochs, int) or (reload_dataloaders_every_n_epochs < 0):
            raise MisconfigurationException(
                f"`reload_dataloaders_every_n_epochs` should be an int >= 0, got {reload_dataloaders_every_n_epochs}."
            )

        self.trainer.reload_dataloaders_every_n_epochs = reload_dataloaders_every_n_epochs

    def prepare_data(self) -> None:
        trainer = self.trainer

        # on multi-gpu jobs we only want to manipulate (download, etc) on node_rank=0, local_rank=0
        # or in the case where each node needs to do its own manipulation in which case just local_rank=0
        local_rank_zero = trainer.local_rank == 0
        global_rank_zero = trainer.local_rank == 0 and trainer.node_rank == 0

        datamodule = trainer.datamodule
        lightning_module = trainer.lightning_module
        # handle datamodule prepare data:
        if datamodule is not None and is_overridden("prepare_data", datamodule):
            prepare_data_per_node = datamodule.prepare_data_per_node

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Pass a non-negative int, e.g., reload_dataloaders_every_n_epochs=1 (reload every epoch) or 0 (never)
  2. Cast values from external configs: int(value)
  3. Validate sweep/config values before Trainer construction

Example fix

# before
trainer = Trainer(reload_dataloaders_every_n_epochs=1.0)
# after
trainer = Trainer(reload_dataloaders_every_n_epochs=1)
Defensive patterns

Strategy: type-guard

Validate before calling

reload = cfg["reload_dataloaders_every_n_epochs"]
if not isinstance(reload, int) or isinstance(reload, bool) or reload < 0:
    reload = max(0, int(reload))
trainer = Trainer(reload_dataloaders_every_n_epochs=reload)

Type guard

def is_valid_reload_n(v) -> bool:
    return isinstance(v, int) and not isinstance(v, bool) and v >= 0

Prevention

When it happens

Trigger: Trainer(reload_dataloaders_every_n_epochs=-1), =1.0, or a value from config/sweep arriving as float or str.

Common situations: Config files with quoted numbers; hyperparameter search tools yielding floats; users assuming -1 means 'always' or 'disabled'.

Related errors


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