microsoft/qlib · error · NotImplementedError

optimizer {} is not supported!

Error message

optimizer {} is not supported!

What it means

Raised by the TCN (Temporal Convolutional Network) model init in qlib/contrib/model/pytorch_tcn.py:135 when optimizer.lower() is neither 'adam' nor 'gd'. As with the other pytorch contrib models, 'adam' maps to torch.optim.Adam and 'gd' to torch.optim.SGD at self.lr; other tokens raise NotImplementedError right after the model-size log line, during construction.

Source

Thrown at qlib/contrib/model/pytorch_tcn.py:135

            np.random.seed(self.seed)
            torch.manual_seed(self.seed)

        self.tcn_model = TCNModel(
            num_input=self.d_feat,
            output_size=1,
            num_channels=[self.n_chans] * self.num_layers,
            kernel_size=self.kernel_size,
            dropout=self.dropout,
        )
        self.logger.info("model:\n{:}".format(self.tcn_model))
        self.logger.info("model size: {:.4f} MB".format(count_parameters(self.tcn_model)))

        if optimizer.lower() == "adam":
            self.train_optimizer = optim.Adam(self.tcn_model.parameters(), lr=self.lr)
        elif optimizer.lower() == "gd":
            self.train_optimizer = optim.SGD(self.tcn_model.parameters(), lr=self.lr)
        else:
            raise NotImplementedError("optimizer {} is not supported!".format(optimizer))

        self.fitted = False
        self.tcn_model.to(self.device)

    @property
    def use_gpu(self):
        return self.device != torch.device("cpu")

    def mse(self, pred, label):
        loss = (pred - label) ** 2
        return torch.mean(loss)

    def loss_fn(self, pred, label):
        mask = ~torch.isnan(label)

        if self.loss == "mse":
            return self.mse(pred[mask], label[mask])

View on GitHub (pinned to 79633dd950)

Solutions

  1. Set optimizer: 'adam' or 'gd' in TCN kwargs.
  2. Subclass the TCN model and replace self.train_optimizer for other optimizers.

Example fix

# before
kwargs:
  optimizer: sgd

# after
kwargs:
  optimizer: adam   # or 'gd'
Defensive patterns

Strategy: validation

Validate before calling

assert config["optimizer"].lower() in ("adam", "gd"), "TCN supports only 'adam' or 'gd'"

Type guard

def is_supported_optimizer(optimizer: str) -> bool:
    return optimizer.lower() in ("adam", "gd")

Try / catch

try:
    model = TCNModel(**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', 'rmsprop', etc. in TCN model kwargs; fails in __init__ before fit() is ever reached.

Common situations: 'sgd' vs qlib's 'gd' naming; optimizer strings pasted from PyTorch tutorials or other model sections.

Related errors


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