{"record":{"id":"92b8920bcbd3f13a","repo":"facebookresearch/detectron2","slug":"lrmultiplier-multiplier-must-be-an-instance-of","errorCode":null,"errorMessage":"_LRMultiplier(multiplier=) must be an instance of fvcore ParamScheduler. Got {multiplier} instead.","messagePattern":"_LRMultiplier\\(multiplier=\\) must be an instance of fvcore ParamScheduler\\. Got (.+?) instead\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"detectron2/solver/lr_scheduler.py","lineNumber":111,"sourceCode":"    # case we only need a total of one scheduler that defines the relative LR multiplier.\n\n    def __init__(\n        self,\n        optimizer: torch.optim.Optimizer,\n        multiplier: ParamScheduler,\n        max_iter: int,\n        last_iter: int = -1,\n    ):\n        \"\"\"\n        Args:\n            optimizer, last_iter: See ``torch.optim.lr_scheduler.LRScheduler``.\n                ``last_iter`` is the same as ``last_epoch``.\n            multiplier: a fvcore ParamScheduler that defines the multiplier on\n                every LR of the optimizer\n            max_iter: the total number of training iterations\n        \"\"\"\n        if not isinstance(multiplier, ParamScheduler):\n            raise ValueError(\n                \"_LRMultiplier(multiplier=) must be an instance of fvcore \"\n                f\"ParamScheduler. Got {multiplier} instead.\"\n            )\n        self._multiplier = multiplier\n        self._max_iter = max_iter\n        super().__init__(optimizer, last_epoch=last_iter)\n\n    def state_dict(self):\n        # fvcore schedulers are stateless. Only keep pytorch scheduler states\n        return {\"base_lrs\": self.base_lrs, \"last_epoch\": self.last_epoch}\n\n    def get_lr(self) -> List[float]:\n        multiplier = self._multiplier(self.last_epoch / self._max_iter)\n        return [base_lr * multiplier for base_lr in self.base_lrs]\n\n\n\"\"\"\nContent below is no longer needed!","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/facebookresearch/detectron2/blob/a2f4a8771ab77e8411c26b27f24f9489a28a2453/detectron2/solver/lr_scheduler.py#L93-L129","documentation":"_LRMultiplier expects its multiplier to be an fvcore ParamScheduler (e.g. WarmupParamScheduler wrapping a MultiStepParamScheduler). Passing a float, lambda, or torch scheduler triggers this check.","triggerScenarios":"Constructing LRMultiplier / _LRMultiplier directly with multiplier=0.1 or multiplier=some_torch_lambda instead of a ParamScheduler instance.","commonSituations":"Custom training loops replacing WarmupMultiStepLR with LRMultiplier but passing the old-style gamma float or a function.","solutions":["Wrap the schedule in fvcore ParamSchedulers, e.g. WarmupParamScheduler(MultiStepParamScheduler(...), ...), and pass that as multiplier","Or keep using WarmupMultiStepLR (deprecated but functional)"],"exampleFix":"# before\nfrom detectron2.solver import LRMultiplier\nsched = LRMultiplier(optimizer, multiplier=0.1, max_iter=iters)\n# after\nfrom fvcore.common.param_scheduler import MultiStepParamScheduler\nfrom detectron2.solver import LRMultiplier, WarmupParamScheduler\nm = MultiStepParamScheduler([0.1, 1.0], milestones=[1000], num_updates=iters)\nsched = LRMultiplier(optimizer, multiplier=WarmupParamScheduler(m, 0.001, 1000/iters, 'linear'), max_iter=iters)","handlingStrategy":"type-guard","validationCode":"from fvcore.common.param_scheduler import ParamScheduler\nassert isinstance(multiplier, ParamScheduler), 'multiplier must be an fvcore ParamScheduler'","typeGuard":"from fvcore.common.param_scheduler import ParamScheduler\ndef is_param_scheduler(x) -> bool:\n    return isinstance(x, ParamScheduler)","tryCatchPattern":null,"preventionTips":["Build schedules with fvcore ParamScheduler composables","Never pass floats/lambdas as multiplier"],"tags":["detectron2","lr-scheduler","fvcore","type-mismatch"],"backgroundTag":"invalid-constructor-argument-type","analyzedSha":"a2f4a8771ab77e8411c26b27f24f9489a28a2453","analyzedAt":"2026-08-27T12:08:21.260Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}