microsoft/qlib · error · NotImplementedError
optimizer {} is not supported!
Error message
optimizer {} is not supported! What it means
Raised by TabNet model init in qlib/contrib/model/pytorch_tabnet.py:106 when optimizer.lower() is neither 'adam' nor 'gd'. The constructor builds two optimizers (pretrain_optimizer over model+decoder params, train_optimizer over model params) from the same token; 'adam' -> Adam, 'gd' -> SGD. Anything else raises NotImplementedError during construction.
Source
Thrown at qlib/contrib/model/pytorch_tabnet.py:106
self.tabnet_model = TabNet(inp_dim=self.d_feat, out_dim=self.out_dim, vbs=vbs, relax=relax).to(self.device)
self.tabnet_decoder = TabNet_Decoder(self.out_dim, self.d_feat, n_shared, n_ind, vbs, n_steps).to(self.device)
self.logger.info("model:\n{:}\n{:}".format(self.tabnet_model, self.tabnet_decoder))
self.logger.info("model size: {:.4f} MB".format(count_parameters([self.tabnet_model, self.tabnet_decoder])))
if optimizer.lower() == "adam":
self.pretrain_optimizer = optim.Adam(
list(self.tabnet_model.parameters()) + list(self.tabnet_decoder.parameters()), lr=self.lr
)
self.train_optimizer = optim.Adam(self.tabnet_model.parameters(), lr=self.lr)
elif optimizer.lower() == "gd":
self.pretrain_optimizer = optim.SGD(
list(self.tabnet_model.parameters()) + list(self.tabnet_decoder.parameters()), lr=self.lr
)
self.train_optimizer = optim.SGD(self.tabnet_model.parameters(), lr=self.lr)
else:
raise NotImplementedError("optimizer {} is not supported!".format(optimizer))
@property
def use_gpu(self):
return self.device != torch.device("cpu")
def pretrain_fn(self, dataset=DatasetH, pretrain_file="./pretrain/best.model"):
get_or_create_path(pretrain_file)
[df_train, df_valid] = dataset.prepare(
["pretrain", "pretrain_validation"],
col_set=["feature", "label"],
data_key=DataHandlerLP.DK_L,
)
df_train.fillna(df_train.mean(), inplace=True)
df_valid.fillna(df_valid.mean(), inplace=True)
x_train = df_train["feature"]View on GitHub (pinned to 79633dd950)
Solutions
- Set optimizer: 'adam' or 'gd'.
- Subclass the TabNet model to install a different optimizer pair if genuinely needed.
Example fix
# before kwargs: optimizer: sgd # after kwargs: optimizer: gd # or 'adam'
Defensive patterns
Strategy: validation
Validate before calling
assert config["optimizer"].lower() in ("adam", "gd"), "TabNet supports only 'adam' or 'gd'" Type guard
def is_supported_optimizer(optimizer: str) -> bool:
return optimizer.lower() in ("adam", "gd") Try / catch
try:
model = TabNetModel(**kwargs)
except NotImplementedError as e:
if "optimizer" in str(e):
raise ValueError("Use optimizer='adam' or 'gd'") from e
raise Prevention
- Use the shared 'adam'/'gd' whitelist for all qlib pytorch models.
- Unit-test config parsing so invalid optimizer tokens fail before model construction.
When it happens
Trigger: Passing optimizer='sgd', 'adamw', etc. in TabNet model kwargs; the error appears immediately at model instantiation, before pretrain_fn or fit.
Common situations: 'sgd' habit (qlib's token is 'gd'); configs migrated from other pytorch contrib models in the same repo that were hand-edited.
Related errors
- optimizer {} is not supported!
- optimizer {} is not supported!
- optimizer {} is not supported!
- optimizer {} is not supported!
- optimizer {} is not supported!
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/71dd603a1ef9b970.
Report an issue: GitHub.