{"record":{"id":"cc7b85a3ec35f9a6","repo":"Lightning-AI/pytorch-lightning","slug":"you-have-overridden-hook-name-in-both-lightni","errorCode":null,"errorMessage":"You have overridden `{hook_name}` in both `LightningModule` and `LightningDataModule`. It will use the implementation from `LightningDataModule` instance.","messagePattern":"You have overridden `(.+?)` in both `LightningModule` and `LightningDataModule`\\. It will use the implementation from `LightningDataModule` instance\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/lightning/pytorch/trainer/connectors/data_connector.py","lineNumber":371,"sourceCode":"    model: \"pl.LightningModule\"\n    datamodule: Optional[\"pl.LightningDataModule\"]\n    _valid_hooks: tuple[str, ...] = field(\n        default=(\"on_before_batch_transfer\", \"transfer_batch_to_device\", \"on_after_batch_transfer\")\n    )\n\n    def get_instance(self, hook_name: str) -> Union[\"pl.LightningModule\", \"pl.LightningDataModule\"]:\n        if hook_name not in self._valid_hooks:\n            raise ValueError(\n                f\"`{hook_name}` is not a shared hook within `LightningModule` and `LightningDataModule`.\"\n                f\" Valid hooks are {self._valid_hooks}.\"\n            )\n\n        if self.datamodule is None:\n            return self.model\n\n        if is_overridden(hook_name, self.datamodule):\n            if is_overridden(hook_name, self.model):\n                warning_cache.warn(\n                    f\"You have overridden `{hook_name}` in both `LightningModule` and `LightningDataModule`.\"\n                    \" It will use the implementation from `LightningDataModule` instance.\"\n                )\n            return self.datamodule\n\n        if is_overridden(hook_name, self.model):\n            warning_cache.warn(\n                f\"You have overridden `{hook_name}` in `LightningModule` but have passed in a\"\n                \" `LightningDataModule`. It will use the implementation from `LightningModule` instance.\"\n            )\n        return self.model\n\n\ndef _check_dataloader_iterable(\n    dataloader: object,\n    source: _DataLoaderSource,\n    trainer_fn: TrainerFn,\n) -> None:","sourceCodeStart":353,"sourceCodeEnd":389,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/trainer/connectors/data_connector.py#L353-L389","documentation":"DataConnector.get_instance resolves which object provides a data hook. If both the LightningModule and the LightningDataModule override the same hook (e.g. train_dataloader), a warning is emitted and the DataModule's implementation wins.","triggerScenarios":"Passing datamodule=dm to the Trainer while the LightningModule also defines train_dataloader/val_dataloader, with dm defining the same hook.","commonSituations":"Refactoring a single-file script into module+datamodule and forgetting to delete the old dataloader methods in the model.","solutions":["Delete the duplicated hook from one of the two classes (usually the LightningModule)","If intentional, silence by accepting DataModule precedence; document it","Keep dataloader logic exclusively in the DataModule for shared data pipelines"],"exampleFix":"# before\nclass M(LightningModule):\n    def train_dataloader(self): return make_loader()\ntrainer = Trainer(); trainer.fit(M(), datamodule=dm)  # dm also defines train_dataloader\n# after\nclass M(LightningModule):\n    pass  # dataloader only in dm\ntrainer.fit(M(), datamodule=dm)","handlingStrategy":"validation","validationCode":"from lightning.pytorch.utilities.model_helpers import is_overridden\nfor h in ('train_dataloader','val_dataloader','test_dataloader'):\n    if is_overridden(h, dm) and is_overridden(h, model):\n        print(f'both override {h}; datamodule wins')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Define dataloader hooks in exactly one of model/datamodule","Lint your LightningModule for leftover dataloader methods after adding a DataModule"],"tags":["datamodule","hook-conflict","data-loading","lightning"],"backgroundTag":"duplicate-hook-override","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}