{"record":{"id":"4d066ddd741a9951","repo":"Lightning-AI/pytorch-lightning","slug":"f-check-val-every-n-epoch-should-be-an-integer","errorCode":null,"errorMessage":"f\"`check_val_every_n_epoch` should be an integer, found {check_val_every_n_epoch!r}.\"","messagePattern":"f\"`check_val_every_n_epoch` should be an integer, found (.+?)\\.\"","errorType":"validation","errorClass":"MisconfigurationException","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/trainer/connectors/data_connector.py","lineNumber":61,"sourceCode":"\nwarning_cache = WarningCache()\n\n\nclass _DataConnector:\n    def __init__(self, trainer: \"pl.Trainer\"):\n        self.trainer = trainer\n        self._datahook_selector: Optional[_DataHookSelector] = None\n\n    def on_trainer_init(\n        self,\n        val_check_interval: Optional[Union[int, float, str, timedelta, dict]],\n        reload_dataloaders_every_n_epochs: int,\n        check_val_every_n_epoch: Optional[int],\n    ) -> None:\n        self.trainer.datamodule = None\n\n        if check_val_every_n_epoch is not None and not isinstance(check_val_every_n_epoch, int):\n            raise MisconfigurationException(\n                f\"`check_val_every_n_epoch` should be an integer, found {check_val_every_n_epoch!r}.\"\n            )\n\n        if check_val_every_n_epoch is None and isinstance(val_check_interval, float):\n            raise MisconfigurationException(\n                \"`val_check_interval` should be an integer or a time-based duration (str 'DD:HH:MM:SS', \"\n                \"datetime.timedelta, or dict kwargs for timedelta) when `check_val_every_n_epoch=None`.\"\n            )\n\n        self.trainer.check_val_every_n_epoch = check_val_every_n_epoch\n\n        if not isinstance(reload_dataloaders_every_n_epochs, int) or (reload_dataloaders_every_n_epochs < 0):\n            raise MisconfigurationException(\n                f\"`reload_dataloaders_every_n_epochs` should be an int >= 0, got {reload_dataloaders_every_n_epochs}.\"\n            )\n\n        self.trainer.reload_dataloaders_every_n_epochs = reload_dataloaders_every_n_epochs\n","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/trainer/connectors/data_connector.py#L43-L79","documentation":"MisconfigurationException from DataConnector.on_trainer_init: check_val_every_n_epoch must be an int (or None). Floats such as 1.0 and strings are rejected with strict isinstance check, even if the value is numerically integral.","triggerScenarios":"Trainer(check_val_every_n_epoch=1.0), or passing a config-parsed value (YAML/JSON/argparse) that arrives as float/str; np.int64 also fails the plain isinstance int check in some numpy versions.","commonSituations":"Hyperparameter sweeps (optuna/wandb) supplying floats; YAML configs where the value is quoted; numpy scalars from computed schedules.","solutions":["Convert to int before constructing: Trainer(check_val_every_n_epoch=int(value))","Set the value to None to validate every epoch (default 1.0-equivalent behavior uses interval checks)","Fix the config file/YAML so the value is an unquoted integer"],"exampleFix":"# before\ntrainer = Trainer(check_val_every_n_epoch=1.0)\n# after\ntrainer = Trainer(check_val_every_n_epoch=1)","handlingStrategy":"type-guard","validationCode":"if check_val_every_n_epoch is not None:\n    check_val_every_n_epoch = int(check_val_every_n_epoch)\ntrainer = Trainer(check_val_every_n_epoch=check_val_every_n_epoch)","typeGuard":"def is_valid_check_val_every_n_epoch(v) -> bool:\n    return v is None or (isinstance(v, int) and not isinstance(v, bool))","tryCatchPattern":null,"preventionTips":["Coerce config/sweep values with int() before Trainer construction","Keep YAML numeric fields unquoted","Validate all interval args in a config dataclass"],"tags":["lightning","trainer-init","validation-interval","type-error","config"],"backgroundTag":"trainer-config-type-validation","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}