microsoft/qlib · error · NotImplementedError

optimizer {} is not supported!

Error message

optimizer {} is not supported!

What it means

DNNModelPytorch maps only two optimizer names to torch optimizers: 'adam' -> optim.Adam(lr, weight_decay) and 'gd' -> optim.SGD(lr, weight_decay). Any other string raises NotImplementedError('optimizer {} is not supported!') in __init__ after the network is created. A scheduler ('default' ReduceLROnPlateau, with a torch-version-sensitive verbose argument) is then attached to the chosen optimizer.

Source

Thrown at qlib/contrib/model/pytorch_nn.py:147

        self._scorer = mean_squared_error if loss == "mse" else roc_auc_score

        if init_model is None:
            self.dnn_model = init_instance_by_config({"class": pt_model_uri, "kwargs": pt_model_kwargs})

            if self.data_parall:
                self.dnn_model = DataParallel(self.dnn_model).to(self.device)
        else:
            self.dnn_model = init_model

        self.logger.info("model:\n{:}".format(self.dnn_model))
        self.logger.info("model size: {:.4f} MB".format(count_parameters(self.dnn_model)))

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

        if scheduler == "default":
            # In torch version 2.7.0, the verbose parameter has been removed. Reference Link:
            # https://github.com/pytorch/pytorch/pull/147301/files#diff-036a7470d5307f13c9a6a51c3a65dd014f00ca02f476c545488cd856bea9bcf2L1313
            if version.parse(str(torch.__version__).split("+", maxsplit=1)[0]) <= version.parse("2.6.0"):
                # Reduce learning rate when loss has stopped decrease
                self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(  # pylint: disable=E1123
                    self.train_optimizer,
                    mode="min",
                    factor=0.5,
                    patience=10,
                    verbose=True,
                    threshold=0.0001,
                    threshold_mode="rel",
                    cooldown=0,
                    min_lr=0.00001,
                    eps=1e-08,
                )

View on GitHub (pinned to 79633dd950)

Solutions

  1. Set optimizer='adam' or optimizer='gd' (weight_decay is honored for both via the weight_decay kwarg).
  2. For other optimizers, subclass DNNModelPytorch and override __init__ to install your own self.train_optimizer over self.dnn_model.parameters().
  3. Check YAML/kwargs for typos; matching is exact after lowercasing.

Example fix

# before
model = DNNModelPytorch(optimizer="sgd", ...)  # NotImplementedError

# after
model = DNNModelPytorch(optimizer="adam", weight_decay=1e-4, ...)
# plain SGD with decay:
model = DNNModelPytorch(optimizer="gd", weight_decay=1e-4, ...)
Defensive patterns

Strategy: validation

Validate before calling

assert optimizer.lower() in {"adam", "gd"}, "DNNModelPytorch supports only 'adam' and 'gd'"
model = DNNModelPytorch(optimizer=optimizer, ...)

Type guard

def is_supported_optimizer(name: str) -> bool:
    return isinstance(name, str) and name.lower() in {"adam", "gd"}

Try / catch

try:
    model = DNNModelPytorch(optimizer=opt, ...)
except NotImplementedError as e:
    raise ValueError(f"{e} — use 'adam' or 'gd' (both honor weight_decay)") from e

Prevention

When it happens

Trigger: DNNModelPytorch(optimizer=opt) with opt.lower() not in {'adam','gd'} — 'sgd', 'adamw', 'rmsprop', 'lbfgs', or a typo. Raised at construction, before fit().

Common situations: Users expecting the PyTorch class name to work ('SGD'); migrating configs from other contrib models; wanting AdamW for decoupled weight decay.

Related errors


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