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

  1. Drop dataloaders= and implement predict_dataloader() in the datamodule
  2. 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

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


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