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
- Set optimizer='adam' or optimizer='gd' (weight_decay is honored for both via the weight_decay kwarg).
- For other optimizers, subclass DNNModelPytorch and override __init__ to install your own self.train_optimizer over self.dnn_model.parameters().
- 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
- 'gd' + weight_decay gives you L2-SGD; 'adamw' is not available without subclassing.
- Validate optimizer strings in your config loader before model construction.
- Note the attached ReduceLROnPlateau scheduler operates on the chosen optimizer.
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
- optimizer {} is not supported!
- optimizer {} is not supported!
- optimizer {} is not supported!
- optimizer {} is not supported!
- loss {} is not supported!
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/1ec9a4ff1eaf4eb4.
Report an issue: GitHub.