microsoft/qlib · error · NotImplementedError
optimizer {} is not supported!
Error message
optimizer {} is not supported! What it means
IGMTFModel accepts only two optimizers, case-insensitively: 'adam' (optim.Adam) and 'gd' (optim.SGD). Any other optimizer string raises NotImplementedError at the end of __init__, so the object fails during construction, not during fit.
Source
Thrown at qlib/contrib/model/pytorch_igmtf.py:134
np.random.seed(self.seed)
torch.manual_seed(self.seed)
self.igmtf_model = IGMTFModel(
d_feat=self.d_feat,
hidden_size=self.hidden_size,
num_layers=self.num_layers,
dropout=self.dropout,
base_model=self.base_model,
)
self.logger.info("model:\n{:}".format(self.igmtf_model))
self.logger.info("model size: {:.4f} MB".format(count_parameters(self.igmtf_model)))
if optimizer.lower() == "adam":
self.train_optimizer = optim.Adam(self.igmtf_model.parameters(), lr=self.lr)
elif optimizer.lower() == "gd":
self.train_optimizer = optim.SGD(self.igmtf_model.parameters(), lr=self.lr)
else:
raise NotImplementedError("optimizer {} is not supported!".format(optimizer))
self.fitted = False
self.igmtf_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
- Use optimizer='adam' or optimizer='gd' (other capitalizations like 'Adam' are accepted because of .lower())
- If you need a different optimizer, subclass IGMTFModel and add a branch creating it from torch.optim
Example fix
# before IGMTFModel(optimizer="adamw") # after IGMTFModel(optimizer="adam")
Defensive patterns
Strategy: validation
Validate before calling
assert optimizer.lower() in ("adam", "gd"), f"unsupported optimizer {optimizer!r}; use 'adam' or 'gd'" Type guard
def is_supported_optimizer(name: str) -> bool:
return name.lower() in ("adam", "gd") Prevention
- Keep a per-model allowlist of optimizer strings validated at config load
- Remember 'gd' (not 'sgd') is the accepted spelling in qlib torch models
When it happens
Trigger: Constructing IGMTFModel(optimizer='adamw'), 'rmsprop', 'adagrad', or any string other than adam/gd (any case).
Common situations: Porting a config from a framework where 'adamw' or 'rmsprop' are standard; typos like 'Adamm'; copying hyperparameter blocks between models without checking each model's supported optimizer set.
Related errors
- unknown loss `%s`
- unknown metric `%s`
- unknown base model name `%s`
- optimizer {} is not supported!
- optimizer {} is not supported!
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/52bf822945ebe415.
Report an issue: GitHub.