Lightning-AI/pytorch-lightning · error · MisconfigurationException

"You cannot pass both `trainer.validate(dataloaders=..., dat

Error message

"You cannot pass both `trainer.validate(dataloaders=..., datamodule=...)`"

What it means

trainer.validate() was called with both dataloaders and datamodule keyword arguments. Only one data source may be specified; passing both raises MisconfigurationException. A datamodule passed positionally as dataloaders is auto-detected and reassigned, so that path is fine.

Source

Thrown at src/lightning/pytorch/trainer/trainer.py:732

        model: Optional["pl.LightningModule"] = None,
        dataloaders: Optional[Union[EVAL_DATALOADERS, LightningDataModule]] = None,
        ckpt_path: Optional[_PATH] = None,
        verbose: bool = True,
        datamodule: Optional[LightningDataModule] = None,
        weights_only: Optional[bool] = None,
    ) -> Optional[Union[_PREDICT_OUTPUT, _EVALUATE_OUTPUT]]:
        # --------------------
        # SETUP HOOK
        # --------------------
        log.debug(f"{self.__class__.__name__}: trainer validate stage")

        # if a datamodule comes in as the second arg, then fix it for the user
        if isinstance(dataloaders, LightningDataModule):
            datamodule = dataloaders
            dataloaders = None
        # If you supply a datamodule you can't supply val_dataloaders
        if dataloaders is not None and datamodule:
            raise MisconfigurationException("You cannot pass both `trainer.validate(dataloaders=..., datamodule=...)`")

        if model is None:
            model = self.lightning_module
            model_provided = False
        else:
            model_provided = True

        self.validate_loop.verbose = verbose

        # links data to the trainer
        self._data_connector.attach_data(model, val_dataloaders=dataloaders, datamodule=datamodule)

        assert self.state.fn is not None
        if _is_registry(ckpt_path) and module_available("litmodels"):
            download_model_from_registry(ckpt_path, self)
        ckpt_path = self._checkpoint_connector._select_ckpt_path(
            self.state.fn, ckpt_path, model_provided=model_provided, model_connected=self.lightning_module is not None
        )

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Drop dataloaders= and implement val_dataloader() in the datamodule
  2. Or drop datamodule= and pass dataloaders only

Example fix

# before
trainer.validate(model, dataloaders=val_loader, datamodule=dm)
# after
trainer.validate(model, datamodule=dm)
Defensive patterns

Strategy: validation

Validate before calling

if dataloaders is not None and datamodule is not None:
    raise ValueError("pass either dataloaders or datamodule to validate(), not both")
trainer.validate(model, dataloaders=dataloaders, datamodule=datamodule)

Type guard

def validate_args_ok(dls, dm) -> bool:
    return not (dls is not None and dm is not None)

Prevention

When it happens

Trigger: trainer.validate(model, dataloaders=val_loader, datamodule=dm); also trainer.validate(model, dm, dataloaders=val_loader).

Common situations: Refactoring evaluation code from dataloaders to datamodules while leaving the old argument in place.

Related errors


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