Lightning-AI/pytorch-lightning · error · ValueError
`setup_optimizers` requires at least one optimizer as input.
Error message
`setup_optimizers` requires at least one optimizer as input.
What it means
Raised by Fabric's `_validate_setup_optimizers` when `fabric.setup_optimizers()` is called with an empty sequence of optimizers. Lightning Fabric requires at least one optimizer because the whole point of the method is to wrap optimizers with `_FabricOptimizer` and wire them into the strategy.
Source
Thrown at src/lightning/fabric/fabric.py:1232
" Create and set up the model first through `model = fabric.setup_module(model)`. Then create the"
" optimizer and set it up: `optimizer = fabric.setup_optimizers(optimizer)`."
)
def _validate_setup_module(self, module: nn.Module) -> None:
self._validate_launched()
if isinstance(module, _FabricModule):
raise ValueError("A model should be passed only once to the `setup_module` method.")
def _validate_setup_optimizers(self, optimizers: Sequence[Optimizer]) -> None:
self._validate_launched()
if isinstance(self._strategy, (DeepSpeedStrategy, XLAStrategy)):
raise RuntimeError(
f"The `{type(self._strategy).__name__}` requires the model and optimizer(s) to be set up jointly"
" through `.setup(model, optimizer, ...)`."
)
if not optimizers:
raise ValueError("`setup_optimizers` requires at least one optimizer as input.")
if any(isinstance(opt, _FabricOptimizer) for opt in optimizers):
raise ValueError("An optimizer should be passed only once to the `setup_optimizers` method.")
if any(_has_meta_device_parameters_or_buffers(optimizer) for optimizer in optimizers):
raise RuntimeError(
"The optimizer has references to the model's meta-device parameters. Materializing them is"
" is currently not supported. Create the optimizer after setting up the model, then call"
" `fabric.setup_optimizers(optimizer)`."
)
def _validate_setup_dataloaders(self, dataloaders: Sequence[DataLoader]) -> None:
self._validate_launched()
if not dataloaders:
raise ValueError("`setup_dataloaders` requires at least one dataloader as input.")
if any(isinstance(dl, _FabricDataLoader) for dl in dataloaders):
raise ValueError("A dataloader should be passed only once to the `setup_dataloaders` method.")View on GitHub (pinned to 9fed5c27d2)
Solutions
- Pass at least one optimizer: `optimizer = torch.optim.Adam(model.parameters(), lr=1e-3); fabric.setup_optimizers(optimizer)`
- If optimizers are built dynamically, assert the list is non-empty before calling setup_optimizers
- If you meant to set up only the model, use `fabric.setup(model)` instead
Example fix
// before fabric.setup_optimizers(*optimizers) # optimizers == [] // after assert optimizers, 'at least one optimizer required' fabric.setup_optimizers(*optimizers)
Defensive patterns
Strategy: validation
Validate before calling
assert optimizers and all(not isinstance(o, _FabricOptimizer) for o in optimizers), 'need >=1 raw optimizer'
Prevention
- Build optimizers with an assert on non-emptiness before setup
- Keep optimizer creation unconditional in training scripts
When it happens
Trigger: Calling `fabric.setup_optimizers()` with no arguments, or passing an empty list/tuple e.g. `fabric.setup_optimizers([])`, or programmatically building an optimizer list that ends up empty (e.g. no params matched a filter).
Common situations: Scripts that conditionally create optimizers and pass a possibly-empty list; porting a Trainer-based script to Fabric where optimizer creation was conditional; refactoring that accidentally drops the optimizer from the call.
Related errors
- An optimizer should be passed only once to the `setup_optimi
- `setup_dataloaders` requires at least one dataloader as inpu
- `self.log_dict({dictionary})` was called, but nested diction
- `self.log({name}, {value})` was called, but nested dictionar
- Device should be CUDA, got {device} instead.
AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28).
Data as JSON: /api/errors/c8504d18c0249f16.
Report an issue: GitHub.