{"record":{"id":"d23e2902949d29fa","repo":"Lightning-AI/pytorch-lightning","slug":"the-serve-step-method-needs-to-be-overridden","errorCode":null,"errorMessage":"The `serve_step` method needs to be overridden.","messagePattern":"The `serve_step` method needs to be overridden\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/serve/servable_module_validator.py","lineNumber":92,"sourceCode":"\n    @override\n    @rank_zero_only\n    def on_train_start(self, trainer: \"pl.Trainer\", servable_module: \"pl.LightningModule\") -> None:\n        if isinstance(trainer.strategy, _NOT_SUPPORTED_STRATEGIES):\n            raise Exception(\n                f\"The current strategy {trainer.strategy.__class__.__qualname__} used \"\n                \"by the trainer isn't supported for sanity serving yet.\"\n            )\n\n        if not isinstance(servable_module, ServableModule):\n            raise TypeError(f\"The provided model should be subclass of {ServableModule.__qualname__}.\")\n\n        if not is_overridden(\"configure_payload\", servable_module, ServableModule):\n            raise NotImplementedError(\"The `configure_payload` method needs to be overridden.\")\n        if not is_overridden(\"configure_serialization\", servable_module, ServableModule):\n            raise NotImplementedError(\"The `configure_serialization` method needs to be overridden.\")\n        if not is_overridden(\"serve_step\", servable_module, ServableModule):\n            raise NotImplementedError(\"The `serve_step` method needs to be overridden.\")\n\n        # Note: The Trainer needs to be detached from the pl_module before starting the process.\n        # This would fail during the deepcopy with DDP.\n        servable_module.trainer = None\n\n        process = Process(target=self._start_server, args=(servable_module, self.host, self.port, self.optimization))\n        process.start()\n\n        servable_module.trainer = trainer\n\n        ready = False\n        t0 = time.time()\n        while not ready:\n            with contextlib.suppress(requests.exceptions.ConnectionError):\n                resp = requests.get(f\"http://{self.host}:{self.port}/ping\")\n                ready = resp.status_code == 200\n            if time.time() - t0 > self.timeout:\n                process.kill()","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/serve/servable_module_validator.py#L74-L110","documentation":"The serve_step method is the core inference hook of ServableModule; the validator refuses to launch the test server if it is not overridden. is_overridden('serve_step', ...) fails in on_train_start and raises NotImplementedError.","triggerScenarios":"Model inherits ServableModule without defining serve_step, or defines a differently named method (e.g. predict_step) expecting it to be picked up.","commonSituations":"Assuming predict_step or validation_step doubles as the serving entry point; renaming methods during refactor so the override check no longer matches.","solutions":["Add serve_step(self, **kwargs) to your LightningModule that performs inference and returns a dict","If you already have predict_step logic, delegate: def serve_step(self, **kwargs): return self.predict_step(**kwargs)","Ensure the return value is a dict (keys must match output serializer names)"],"exampleFix":"// before\nclass MyModel(ServableModule):\n    def predict_step(self, batch): ...\n// after\nclass MyModel(ServableModule):\n    def serve_step(self, **kwargs):\n        x = kwargs[\"x\"]\n        return {\"output\": self(x)}","handlingStrategy":"validation","validationCode":"from lightning.pytorch.utilities import is_overridden\nfrom lightning.pytorch.serve import ServableModule\n\nassert is_overridden(\"serve_step\", model, ServableModule), \"serve_step must be overridden\"","typeGuard":"def has_serve_step(m) -> bool:\n    return is_overridden(\"serve_step\", m, ServableModule)","tryCatchPattern":null,"preventionTips":["Name the method exactly serve_step(self, **kwargs)","Return a dict keyed by output names"],"tags":["lightning","serving","inference","not-implemented"],"backgroundTag":"abstract-method-not-implemented","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}