Lightning-AI/pytorch-lightning · error · NotImplementedError
The `configure_serialization` method needs to be overridden.
Error message
The `configure_serialization` method needs to be overridden.
What it means
ServableModuleValidator requires configure_serialization to be overridden so it knows how to deserialize inputs and serialize outputs for the serving endpoint. Without it, is_overridden fails in on_train_start and a NotImplementedError is raised before the server process starts.
Source
Thrown at src/lightning/pytorch/serve/servable_module_validator.py:90
self.exit_on_failure = exit_on_failure
self.resp: Optional[requests.Response] = None
@override
@rank_zero_only
def on_train_start(self, trainer: "pl.Trainer", servable_module: "pl.LightningModule") -> None:
if isinstance(trainer.strategy, _NOT_SUPPORTED_STRATEGIES):
raise Exception(
f"The current strategy {trainer.strategy.__class__.__qualname__} used "
"by the trainer isn't supported for sanity serving yet."
)
if not isinstance(servable_module, ServableModule):
raise TypeError(f"The provided model should be subclass of {ServableModule.__qualname__}.")
if not is_overridden("configure_payload", servable_module, ServableModule):
raise NotImplementedError("The `configure_payload` method needs to be overridden.")
if not is_overridden("configure_serialization", servable_module, ServableModule):
raise NotImplementedError("The `configure_serialization` method needs to be overridden.")
if not is_overridden("serve_step", servable_module, ServableModule):
raise NotImplementedError("The `serve_step` method needs to be overridden.")
# Note: The Trainer needs to be detached from the pl_module before starting the process.
# This would fail during the deepcopy with DDP.
servable_module.trainer = None
process = Process(target=self._start_server, args=(servable_module, self.host, self.port, self.optimization))
process.start()
servable_module.trainer = trainer
ready = False
t0 = time.time()
while not ready:
with contextlib.suppress(requests.exceptions.ConnectionError):
resp = requests.get(f"http://{self.host}:{self.port}/ping")
ready = resp.status_code == 200View on GitHub (pinned to 9fed5c27d2)
Solutions
- Implement configure_serialization returning a tuple of input deserializer dict and output serializer dict, e.g. (lambda x: torch.tensor(x), lambda t: t.tolist())
- Verify the method is defined directly on your class (is_overridden checks against ServableModule)
- Remove ServableModuleValidator from callbacks if you don't intend to validate serving
Example fix
// before
class MyModel(ServableModule):
def configure_payload(self): ...
def serve_step(self, **kwargs): ...
// after
class MyModel(ServableModule):
def configure_serialization(self):
return ({"x": lambda x: torch.tensor(x)}, {"output": lambda t: t.tolist()})
def configure_payload(self): ...
def serve_step(self, **kwargs): ... Defensive patterns
Strategy: validation
Validate before calling
from lightning.pytorch.utilities import is_overridden
from lightning.pytorch.serve import ServableModule
assert is_overridden("configure_serialization", model, ServableModule), \
"configure_serialization must be overridden" Type guard
def has_serialization(m) -> bool:
return is_overridden("configure_serialization", m, ServableModule) Prevention
- Return a (input_deserializers, output_serializers) pair whose keys match payload and serve_step outputs
- Unit-test configure_serialization output types locally
When it happens
Trigger: Model subclasses ServableModule but leaves configure_serialization at its default (not overridden); ServableModuleValidator callback runs on_train_start.
Common situations: Migrating a LightningModule to the serving API and forgetting the (de)serializers, or returning None / not returning the (input_deserializers, output_serializers) pair.
Related errors
- The `configure_payload` method needs to be overridden.
- The `serve_step` method needs to be overridden.
- Unsupported {cls}
- hparams must be dictionary
- The server didn't start within {self.timeout} seconds.
AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28).
Data as JSON: /api/errors/a39eb3d97374e451.
Report an issue: GitHub.