{"record":{"id":"49491038e9aab417","repo":"Lightning-AI/pytorch-lightning","slug":"save-to-log-dir-false-only-makes-sense-when-subc","errorCode":null,"errorMessage":"`save_to_log_dir=False` only makes sense when subclassing SaveConfigCallback to implement `save_config` and it is desired to disable the standard behavior of saving to log_dir.","messagePattern":"`save_to_log_dir=False` only makes sense when subclassing SaveConfigCallback to implement `save_config` and it is desired to disable the standard behavior of saving to log_dir\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/cli.py","lineNumber":256,"sourceCode":"    def __init__(\n        self,\n        parser: LightningArgumentParser,\n        config: Namespace,\n        config_filename: str = \"config.yaml\",\n        overwrite: bool = False,\n        multifile: bool = False,\n        save_to_log_dir: bool = True,\n    ) -> None:\n        self.parser = parser\n        self.config = config\n        self.config_filename = config_filename\n        self.overwrite = overwrite\n        self.multifile = multifile\n        self.save_to_log_dir = save_to_log_dir\n        self.already_saved = False\n\n        if not save_to_log_dir and not is_overridden(\"save_config\", self, SaveConfigCallback):\n            raise ValueError(\n                \"`save_to_log_dir=False` only makes sense when subclassing SaveConfigCallback to implement \"\n                \"`save_config` and it is desired to disable the standard behavior of saving to log_dir.\"\n            )\n\n    @override\n    def setup(self, trainer: Trainer, pl_module: LightningModule, stage: str) -> None:\n        if self.already_saved:\n            return\n\n        if self.save_to_log_dir:\n            log_dir = trainer.log_dir  # this broadcasts the directory\n            assert log_dir is not None\n            config_path = os.path.join(log_dir, self.config_filename)\n            fs = get_filesystem(log_dir)\n\n            if not self.overwrite:\n                # check if the file exists on rank 0\n                file_exists = fs.isfile(config_path) if trainer.is_global_zero else False","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/cli.py#L238-L274","documentation":"SaveConfigCallback normally writes the parsed config to the log dir; save_to_log_dir=False exists only so subclasses that fully override save_config() can opt out. The constructor raises ValueError if save_to_log_dir=False is set on the base class (or a subclass that does not override save_config).","triggerScenarios":"LightningCLI(..., save_kwargs={'save_to_log_dir': False}) without a custom SaveConfigCallback subclass overriding save_config.","commonSituations":"Users wanting to silence config dumping for cleanliness by just flipping the flag, without implementing their own persistence.","solutions":["Subclass SaveConfigCallback, override save_config(self, trainer, pl_module, stage), and pass it via LightningCLI(save_config_callback=MySaveConfig)","Or disable saving entirely: LightningCLI(save_config_callback=None)","Keep save_to_log_dir=True if the standard behavior is acceptable"],"exampleFix":"# before\ncli = LightningCLI(MyModule, save_config_kwargs={\"save_to_log_dir\": False})  # ValueError\n# after\nclass MySaveConfig(SaveConfigCallback):\n    def save_config(self, trainer, pl_module, stage):\n        pass  # custom persistence (or nothing)\ncli = LightningCLI(MyModule, save_config_callback=MySaveConfig)\n# or: cli = LightningCLI(MyModule, save_config_callback=None)","handlingStrategy":"validation","validationCode":"from lightning.pytorch.cli import SaveConfigCallback\nfrom lightning.pytorch.utilities.model_helpers import is_overridden\n\ndef can_disable_log_save(cb_cls) -> bool:\n    return is_overridden('save_config', cb_cls('f', {}, False), SaveConfigCallback) if False else \\\n           'save_config' in cb_cls.__dict__  # subclass overrides save_config\n# simplest guard: only set the flag in subclasses that define save_config","typeGuard":"from lightning.pytorch.cli import SaveConfigCallback\n\ndef may_set_save_to_log_dir_false(cls) -> bool:\n    return isinstance(cls, type) and issubclass(cls, SaveConfigCallback) and 'save_config' in cls.__dict__","tryCatchPattern":null,"preventionTips":["Only flip save_to_log_dir inside a SaveConfigCallback subclass","Use save_config_callback=None when you want no config saved"],"tags":["lightning-cli","save-config","save-to-log-dir","misuse-guard"],"backgroundTag":"invalid-flag-usage","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}