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 == 200

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. 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())
  2. Verify the method is defined directly on your class (is_overridden checks against ServableModule)
  3. 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

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


AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28). Data as JSON: /api/errors/a39eb3d97374e451. Report an issue: GitHub.