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
- Drop dataloaders= and implement val_dataloader() in the datamodule
- 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
- Pick one data source convention and apply it to fit/validate/test/predict uniformly
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
- "You cannot pass `train_dataloader` or `val_dataloaders` to
- You cannot pass both `trainer.test(dataloaders=..., datamodu
- You cannot pass both `trainer.predict(dataloaders=..., datam
- f"`Trainer(barebones=True, log_every_n_steps={log_every_n_st
- f"`Trainer(barebones=True, enable_model_summary={enable_mode
AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28).
Data as JSON: /api/errors/71560a1c41518e29.
Report an issue: GitHub.