{"record":{"id":"4d966068fd23f591","repo":"Lightning-AI/pytorch-lightning","slug":"you-cannot-pass-both-trainer-predict-dataloaders","errorCode":null,"errorMessage":"You cannot pass both `trainer.predict(dataloaders=..., datamodule=...)`","messagePattern":"You cannot pass both `trainer\\.predict\\(dataloaders=\\.\\.\\., datamodule=\\.\\.\\.\\)`","errorType":"validation","errorClass":"MisconfigurationException","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/trainer/trainer.py","lineNumber":979,"sourceCode":"        dataloaders: Optional[Union[EVAL_DATALOADERS, LightningDataModule]] = None,\n        datamodule: Optional[LightningDataModule] = None,\n        return_predictions: Optional[bool] = None,\n        ckpt_path: Optional[_PATH] = None,\n        weights_only: Optional[bool] = None,\n    ) -> Optional[_PREDICT_OUTPUT]:\n        # --------------------\n        # SETUP HOOK\n        # --------------------\n        log.debug(f\"{self.__class__.__name__}: trainer predict stage\")\n\n        self.predict_loop.return_predictions = return_predictions\n\n        # if a datamodule comes in as the second arg, then fix it for the user\n        if isinstance(dataloaders, LightningDataModule):\n            datamodule = dataloaders\n            dataloaders = None\n        if dataloaders is not None and datamodule:\n            raise MisconfigurationException(\"You cannot pass both `trainer.predict(dataloaders=..., datamodule=...)`\")\n\n        if model is None:\n            model = self.lightning_module\n            model_provided = False\n        else:\n            model_provided = True\n\n        # links data to the trainer\n        self._data_connector.attach_data(model, predict_dataloaders=dataloaders, datamodule=datamodule)\n\n        assert self.state.fn is not None\n        if _is_registry(ckpt_path) and module_available(\"litmodels\"):\n            download_model_from_registry(ckpt_path, self)\n        ckpt_path = self._checkpoint_connector._select_ckpt_path(\n            self.state.fn, ckpt_path, model_provided=model_provided, model_connected=self.lightning_module is not None\n        )\n        results = self._run(model, ckpt_path=ckpt_path, weights_only=weights_only)\n","sourceCodeStart":961,"sourceCodeEnd":997,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/trainer/trainer.py#L961-L997","documentation":"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.","triggerScenarios":"trainer.predict(model, dataloaders=pred_loader, datamodule=dm); also trainer.predict(model, dm, dataloaders=pred_loader).","commonSituations":"Inference pipelines migrating to datamodules while keeping explicit predict dataloaders in the call.","solutions":["Drop dataloaders= and implement predict_dataloader() in the datamodule","Or drop datamodule= and pass dataloaders only"],"exampleFix":"# before\ntrainer.predict(model, dataloaders=pred_loader, datamodule=dm)\n# after\ntrainer.predict(model, datamodule=dm)","handlingStrategy":"validation","validationCode":"if dataloaders is not None and datamodule is not None:\n    raise ValueError(\"pass either dataloaders or datamodule to predict(), not both\")\ntrainer.predict(model, dataloaders=dataloaders, datamodule=datamodule)","typeGuard":"def predict_args_ok(dls, dm) -> bool:\n    return not (dls is not None and dm is not None)","tryCatchPattern":null,"preventionTips":["Give the datamodule a predict_dataloader() so predict() needs no explicit loader"],"tags":["trainer","predict","datamodule","dataloader","misconfiguration","pytorch-lightning"],"backgroundTag":"conflicting-data-source-arguments","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}