{"record":{"id":"ebc46fe294c0fa3b","repo":"Lightning-AI/pytorch-lightning","slug":"a-model-should-be-passed-only-once-to-the-setup-m","errorCode":null,"errorMessage":"A model should be passed only once to the `setup_module` method.","messagePattern":"A model should be passed only once to the `setup_module` method\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/lightning/fabric/fabric.py","lineNumber":1221,"sourceCode":"            raise ValueError(\"A model should be passed only once to the `setup` method.\")\n\n        if any(isinstance(opt, _FabricOptimizer) for opt in optimizers):\n            raise ValueError(\"An optimizer should be passed only once to the `setup` method.\")\n\n        if isinstance(self._strategy, FSDPStrategy) and any(\n            _has_meta_device_parameters_or_buffers(optimizer) for optimizer in optimizers\n        ):\n            raise RuntimeError(\n                \"The optimizer has references to the model's meta-device parameters. Materializing them is\"\n                \" is currently not supported unless you to set up the model and optimizer(s) separately.\"\n                \" Create and set up the model first through `model = fabric.setup_module(model)`. Then create the\"\n                \" optimizer and set it up: `optimizer = fabric.setup_optimizers(optimizer)`.\"\n            )\n\n    def _validate_setup_module(self, module: nn.Module) -> None:\n        self._validate_launched()\n        if isinstance(module, _FabricModule):\n            raise ValueError(\"A model should be passed only once to the `setup_module` method.\")\n\n    def _validate_setup_optimizers(self, optimizers: Sequence[Optimizer]) -> None:\n        self._validate_launched()\n        if isinstance(self._strategy, (DeepSpeedStrategy, XLAStrategy)):\n            raise RuntimeError(\n                f\"The `{type(self._strategy).__name__}` requires the model and optimizer(s) to be set up jointly\"\n                \" through `.setup(model, optimizer, ...)`.\"\n            )\n\n        if not optimizers:\n            raise ValueError(\"`setup_optimizers` requires at least one optimizer as input.\")\n\n        if any(isinstance(opt, _FabricOptimizer) for opt in optimizers):\n            raise ValueError(\"An optimizer should be passed only once to the `setup_optimizers` method.\")\n\n        if any(_has_meta_device_parameters_or_buffers(optimizer) for optimizer in optimizers):\n            raise RuntimeError(\n                \"The optimizer has references to the model's meta-device parameters. Materializing them is\"","sourceCodeStart":1203,"sourceCodeEnd":1239,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/fabric/fabric.py#L1203-L1239","documentation":"setup_module() is the model-only variant of setup(); passing a module that is already a _FabricModule means it was already wrapped, and re-wrapping would corrupt strategy state. _validate_setup_module raises ValueError on the isinstance check.","triggerScenarios":"Calling fabric.setup_module(model) twice, or calling setup_module on the output of fabric.setup(model, optimizer) (which also returns a _FabricModule).","commonSituations":"Mixing setup() and setup_module() in one script; checkpoint-resume code that re-runs the module setup path.","solutions":["Call setup_module exactly once and reuse its return value","If the module came from setup(model, optimizer), do not set it up again — only set up remaining pieces"],"exampleFix":"# before\nmodel = fabric.setup_module(model)\nmodel = fabric.setup_module(model)  # re-wrap\n# after\nmodel = fabric.setup_module(model)  # once","handlingStrategy":"type-guard","validationCode":"from lightning.fabric.wrappers import _FabricModule\nassert not isinstance(model, _FabricModule), 'module already set up'","typeGuard":"from lightning.fabric.wrappers import _FabricModule\ndef module_needs_setup(m):\n    return not isinstance(m, _FabricModule)","tryCatchPattern":null,"preventionTips":["Don't mix setup() and setup_module() on the same module; reuse the wrapped object everywhere"],"tags":["lightning","fabric","setup-module","double-setup"],"backgroundTag":"double-initialization","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}