Lightning-AI/pytorch-lightning · error · ValueError

You cannot set both `activation_checkpointing` and `activati

Error message

You cannot set both `activation_checkpointing` and `activation_checkpointing_policy`. Use the latter.

What it means

FSDPStrategy exposes two ways to select which layers get activation checkpointing: the legacy activation_checkpointing (module class or list of classes) and the newer activation_checkpointing_policy (a policy dict). Passing both is rejected to avoid conflicting specifications; the policy kwarg is the recommended one.

Source

Thrown at src/lightning/fabric/strategies/fsdp.py:708

        return self._process_group_backend or _get_default_process_group_backend_for_device(self.root_device)

    def _set_world_ranks(self) -> None:
        if self.cluster_environment is not None:
            self.cluster_environment.set_global_rank(self.node_rank * self.num_processes + self.local_rank)
            self.cluster_environment.set_world_size(self.num_nodes * self.num_processes)
        # `LightningEnvironment.set_global_rank` will do this too, but we cannot rely on that implementation detail
        # additionally, for some implementations, the setter is a no-op, so it's safer to access the getter
        rank_zero_only.rank = utils_rank_zero_only.rank = self.global_rank


def _activation_checkpointing_kwargs(
    activation_checkpointing: Optional[Union[type[Module], list[type[Module]]]],
    activation_checkpointing_policy: Optional["_POLICY"],
) -> dict:
    if activation_checkpointing is None and activation_checkpointing_policy is None:
        return {}
    if activation_checkpointing is not None and activation_checkpointing_policy is not None:
        raise ValueError(
            "You cannot set both `activation_checkpointing` and `activation_checkpointing_policy`. Use the latter."
        )
    if activation_checkpointing is not None:
        if isinstance(activation_checkpointing, list):
            classes = tuple(activation_checkpointing)
        else:
            classes = (activation_checkpointing,)
        rank_zero_deprecation(
            f"`FSDPStrategy(activation_checkpointing={activation_checkpointing})` is deprecated, use "
            f"`FSDPStrategy(activation_checkpointing_policy={set(classes)})` instead."
        )
        return {"check_fn": lambda submodule: isinstance(submodule, classes)}
    if isinstance(activation_checkpointing_policy, set):
        return _auto_wrap_policy_kwargs(activation_checkpointing_policy, {})
    return {"auto_wrap_policy": activation_checkpointing_policy}


def _auto_wrap_policy_kwargs(policy: Optional["_POLICY"], kwargs: dict) -> dict:

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Remove activation_checkpointing and express the same selection via activation_checkpointing_policy
  2. Translate class lists to policy form: {TransformerBlock: ...} or use checkpoint policies like every_other_transformer_layer_policy

Example fix

# before
FSDPStrategy(
    activation_checkpointing=[TransformerBlock],
    activation_checkpointing_policy={TransformerBlock: None},
)
# after
FSDPStrategy(
    activation_checkpointing_policy={TransformerBlock: None},
)
Defensive patterns

Strategy: validation

Validate before calling

assert not (activation_checkpointing and activation_checkpointing_policy), 'pass only activation_checkpointing_policy'

Prevention

When it happens

Trigger: FSDPStrategy(activation_checkpointing=[TransformerBlock], activation_checkpointing_policy={TransformerBlock: ...}) — both kwargs non-None in the same constructor call.

Common situations: Copy-pasting config from an old example (activation_checkpointing) into a newer script that already sets a policy; merging YAML configs where both keys survive; upgrading Lightning and keeping the legacy kwarg while adding the new one.

Related errors


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