{"record":{"id":"ceac844ad2d3d645","repo":"microsoft/qlib","slug":"optimizer-is-not-supported-ceac84","errorCode":null,"errorMessage":"optimizer {} is not supported!","messagePattern":"optimizer (.+?) is not supported!","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_transformer.py","lineNumber":75,"sourceCode":"        self.optimizer = optimizer.lower()\r\n        self.loss = loss\r\n        self.n_jobs = n_jobs\r\n        self.device = torch.device(\"cuda:%d\" % GPU if torch.cuda.is_available() and GPU >= 0 else \"cpu\")\r\n        self.seed = seed\r\n        self.logger = get_module_logger(\"TransformerModel\")\r\n        self.logger.info(\"Naive Transformer:\" \"\\nbatch_size : {}\" \"\\ndevice : {}\".format(self.batch_size, self.device))\r\n\r\n        if self.seed is not None:\r\n            np.random.seed(self.seed)\r\n            torch.manual_seed(self.seed)\r\n\r\n        self.model = Transformer(d_feat, d_model, nhead, num_layers, dropout, self.device)\r\n        if optimizer.lower() == \"adam\":\r\n            self.train_optimizer = optim.Adam(self.model.parameters(), lr=self.lr, weight_decay=self.reg)\r\n        elif optimizer.lower() == \"gd\":\r\n            self.train_optimizer = optim.SGD(self.model.parameters(), lr=self.lr, weight_decay=self.reg)\r\n        else:\r\n            raise NotImplementedError(\"optimizer {} is not supported!\".format(optimizer))\r\n\r\n        self.fitted = False\r\n        self.model.to(self.device)\r\n\r\n    @property\r\n    def use_gpu(self):\r\n        return self.device != torch.device(\"cpu\")\r\n\r\n    def mse(self, pred, label):\r\n        loss = (pred.float() - label.float()) ** 2\r\n        return torch.mean(loss)\r\n\r\n    def loss_fn(self, pred, label):\r\n        mask = ~torch.isnan(label)\r\n\r\n        if self.loss == \"mse\":\r\n            return self.mse(pred[mask], label[mask])\r\n\r","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_transformer.py#L57-L93","documentation":"Thrown in TransformerModel's fit setup while creating the training optimizer. The `optimizer` hyperparameter is compared case-insensitively to 'adam' and 'gd'; both branches add weight_decay=self.reg. Any other value raises NotImplementedError before any epoch runs.","triggerScenarios":"TransformerModel(..., optimizer='sgd'|'adamw'|'rmsprop') followed by fit(); the dispatch falls through to the raise.","commonSituations":"Benchmark yaml configs using 'sgd'; users expecting AdamW support; typos; configs copied from models with wider optimizer support.","solutions":["Set optimizer='adam' or optimizer='gd' (with optional reg for weight decay).","Replace 'sgd' with 'gd' — this model's spelling of plain SGD.","Subclass TransformerModel and override the fit preamble to instantiate another torch.optim optimizer on self.model.parameters() if needed."],"exampleFix":"# before\nmodel = TransformerModel(..., optimizer=\"adamw\", reg=1e-4)\n\n# after\nmodel = TransformerModel(..., optimizer=\"adam\", reg=1e-4)","handlingStrategy":"validation","validationCode":"optimizer = model_kwargs.get(\"optimizer\", \"adam\")\nassert optimizer.lower() in (\"adam\", \"gd\"), f\"TransformerModel optimizer must be 'adam' or 'gd', got {optimizer!r}\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset, evals_result)\nexcept NotImplementedError as e:\n    if \"optimizer\" in str(e):\n        model_kwargs[\"optimizer\"] = \"adam\"\n        model = TransformerModel(**model_kwargs)\n        model.fit(dataset, evals_result)\n    else:\n        raise","preventionTips":["Use 'adam'/'gd' only in qlib model configs; map 'sgd'→'gd' when porting.","Centralize optimizer allowlists per model class in config validation."],"tags":["qlib","pytorch","transformer","optimizer","hyperparameter"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}