{"record":{"id":"e038d23d40056eaa","repo":"Lightning-AI/pytorch-lightning","slug":"model-must-be-a-lightningmodule-or-torch-dyn","errorCode":null,"errorMessage":"`model` must be a `LightningModule` or `torch._dynamo.OptimizedModule`, got `{type(model).__qualname__}`","messagePattern":"`model` must be a `LightningModule` or `torch\\._dynamo\\.OptimizedModule`, got `(.+?)`","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/utilities/compile.py","lineNumber":111,"sourceCode":"    ctx = original._compiler_ctx\n    if ctx is not None:\n        original.forward = ctx[\"original_forward\"]  # type: ignore[method-assign]\n        original.training_step = ctx[\"original_training_step\"]  # type: ignore[method-assign]\n        original.validation_step = ctx[\"original_validation_step\"]  # type: ignore[method-assign]\n        original.test_step = ctx[\"original_test_step\"]  # type: ignore[method-assign]\n        original.predict_step = ctx[\"original_predict_step\"]  # type: ignore[method-assign]\n        original._compiler_ctx = None\n\n    return original\n\n\ndef _maybe_unwrap_optimized(model: object) -> \"pl.LightningModule\":\n    if isinstance(model, OptimizedModule):\n        return from_compiled(model)\n    if isinstance(model, pl.LightningModule):\n        return model\n    _check_mixed_imports(model)\n    raise TypeError(\n        f\"`model` must be a `LightningModule` or `torch._dynamo.OptimizedModule`, got `{type(model).__qualname__}`\"\n    )\n\n\ndef _verify_strategy_supports_compile(model: \"pl.LightningModule\", strategy: Strategy) -> None:\n    if model._compiler_ctx is not None:\n        supported_strategies = (SingleDeviceStrategy, DDPStrategy, FSDPStrategy)\n        if not isinstance(strategy, supported_strategies) or isinstance(strategy, DeepSpeedStrategy):\n            supported_strategy_names = \", \".join(s.__name__ for s in supported_strategies)\n            raise RuntimeError(\n                f\"Using a compiled model is incompatible with the current strategy: `{type(strategy).__name__}`.\"\n                f\" Only {supported_strategy_names} support compilation. Either switch to one of the supported\"\n                \" strategies or avoid passing in compiled model.\"\n            )\n","sourceCodeStart":93,"sourceCodeEnd":126,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/utilities/compile.py#L93-L126","documentation":"Trainer entry points (fit/validate/test/predict) call _maybe_unwrap_optimized to normalize the model. If it is neither an OptimizedModule nor a LightningModule (after a mixed-imports check), TypeError is raised naming the offending type.","triggerScenarios":"trainer.fit(nn.Module()) or passing any non-LightningModule model; also a LightningModule subclassed from pytorch_lightning while the Trainer is from lightning.pytorch (mixed imports).","commonSituations":"Forgetting to subclass LightningModule; migrating from pytorch_lightning to the lightning package but leaving some imports old.","solutions":["Make your model subclass lightning.pytorch.LightningModule (or the pytorch_lightning one matching your Trainer import)","Unify all imports to a single namespace: use either `lightning.pytorch` or `pytorch_lightning`, never both"],"exampleFix":"# before\nimport torch.nn as nn\nfrom pytorch_lightning import LightningModule\nclass Model(LightningModule): ...\nfrom lightning.pytorch import Trainer\nTrainer().fit(Model())\n# after\nfrom lightning.pytorch import LightningModule, Trainer\nclass Model(LightningModule): ...\nTrainer().fit(Model())","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"def is_trainer_model(m) -> bool:\n    from torch._dynamo import OptimizedModule\n    import lightning.pytorch as pl\n    return isinstance(m, (OptimizedModule, pl.LightningModule))","tryCatchPattern":"try:\n    trainer.fit(model)\nexcept TypeError as e:\n    if \"must be a\" in str(e):\n        raise TypeError(f\"Wrap {type(model).__name__} in a LightningModule subclass\") from e\n    raise","preventionTips":["Subclass lightning.pytorch.LightningModule for all trained models","grep the codebase for pytorch_lightning to catch mixed imports before running"],"tags":["torch-compile","mixed-imports","trainer","type-mismatch"],"backgroundTag":"mixed-lightning-imports","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}