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

  1. Set optimizer: 'adam' or 'gd'.
  2. 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

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


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/71dd603a1ef9b970. Report an issue: GitHub.