Lightning-AI/pytorch-lightning · error · MisconfigurationException
You cannot pass both `trainer.predict(dataloaders=..., datam
Error message
You cannot pass both `trainer.predict(dataloaders=..., datamodule=...)`
What it means
trainer.predict() received both dataloaders and datamodule arguments. Only one data source is allowed per call; passing both raises MisconfigurationException. A LightningDataModule passed positionally in the dataloaders slot is auto-detected and does not trigger this.
Source
Thrown at src/lightning/pytorch/trainer/trainer.py:979
dataloaders: Optional[Union[EVAL_DATALOADERS, LightningDataModule]] = None,
datamodule: Optional[LightningDataModule] = None,
return_predictions: Optional[bool] = None,
ckpt_path: Optional[_PATH] = None,
weights_only: Optional[bool] = None,
) -> Optional[_PREDICT_OUTPUT]:
# --------------------
# SETUP HOOK
# --------------------
log.debug(f"{self.__class__.__name__}: trainer predict stage")
self.predict_loop.return_predictions = return_predictions
# if a datamodule comes in as the second arg, then fix it for the user
if isinstance(dataloaders, LightningDataModule):
datamodule = dataloaders
dataloaders = None
if dataloaders is not None and datamodule:
raise MisconfigurationException("You cannot pass both `trainer.predict(dataloaders=..., datamodule=...)`")
if model is None:
model = self.lightning_module
model_provided = False
else:
model_provided = True
# links data to the trainer
self._data_connector.attach_data(model, predict_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
)
results = self._run(model, ckpt_path=ckpt_path, weights_only=weights_only)
View on GitHub (pinned to 9fed5c27d2)
Solutions
- Drop dataloaders= and implement predict_dataloader() in the datamodule
- Or drop datamodule= and pass dataloaders only
Example fix
# before trainer.predict(model, dataloaders=pred_loader, datamodule=dm) # after trainer.predict(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 predict(), not both")
trainer.predict(model, dataloaders=dataloaders, datamodule=datamodule) Type guard
def predict_args_ok(dls, dm) -> bool:
return not (dls is not None and dm is not None) Prevention
- Give the datamodule a predict_dataloader() so predict() needs no explicit loader
When it happens
Trigger: trainer.predict(model, dataloaders=pred_loader, datamodule=dm); also trainer.predict(model, dm, dataloaders=pred_loader).
Common situations: Inference pipelines migrating to datamodules while keeping explicit predict dataloaders in the call.
Related errors
- "You cannot pass `train_dataloader` or `val_dataloaders` to
- "You cannot pass both `trainer.validate(dataloaders=..., dat
- You cannot pass both `trainer.test(dataloaders=..., datamodu
- 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/4d966068fd23f591.
Report an issue: GitHub.