microsoft/qlib · error · NotImplementedError
optimizer {} is not supported!
Error message
optimizer {} is not supported! What it means
LSTMModel's constructor wires up exactly two optimizers: 'adam' (optim.Adam, lr only) and 'gd' (optim.SGD, lr only) — note neither applies weight decay in this model. Any other optimizer string raises NotImplementedError('optimizer {} is not supported!') during __init__, so the model is unusable until fixed.
Source
Thrown at qlib/contrib/model/pytorch_lstm.py:123
)
)
if self.seed is not None:
np.random.seed(self.seed)
torch.manual_seed(self.seed)
self.lstm_model = LSTMModel(
d_feat=self.d_feat,
hidden_size=self.hidden_size,
num_layers=self.num_layers,
dropout=self.dropout,
)
if optimizer.lower() == "adam":
self.train_optimizer = optim.Adam(self.lstm_model.parameters(), lr=self.lr)
elif optimizer.lower() == "gd":
self.train_optimizer = optim.SGD(self.lstm_model.parameters(), lr=self.lr)
else:
raise NotImplementedError("optimizer {} is not supported!".format(optimizer))
self.fitted = False
self.lstm_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
- Change the model kwarg to optimizer='adam' or optimizer='gd'.
- For other optimizers, subclass, call super().__init__(), then set self.train_optimizer = optim.<Opt>(self.lstm_model.parameters(), lr=self.lr, ...).
- Double-check spelling; matching is lowercased but exact.
Example fix
# before model = LSTMModel(..., optimizer="sgd") # NotImplementedError # after model = LSTMModel(..., optimizer="adam") # or "gd" for SGD
Defensive patterns
Strategy: validation
Validate before calling
assert optimizer.lower() in {"adam", "gd"}, "LSTMModel supports only 'adam' and 'gd'"
model = LSTMModel(..., 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 = LSTMModel(..., optimizer=opt)
except NotImplementedError as e:
raise ValueError(f"{e} — use 'adam' or 'gd'") from e Prevention
- Use 'gd' (not 'sgd') for SGD across qlib pytorch contrib models.
- Keep a shared supported-optimizer set next to your experiment configs.
- Validate model kwargs in one place before building models.
When it happens
Trigger: Constructing LSTMModel(..., optimizer=X) in qlib/contrib/model/pytorch_lstm.py with X.lower() not in {'adam','gd'} — e.g. 'sgd', 'adamw', 'rmsprop', or a typo.
Common situations: Reusing YAML from another contrib model; expecting 'sgd' as the SGD keyword when this codebase uses 'gd'; copy-paste of optimizer names from raw PyTorch examples.
Related errors
- optimizer {} is not supported!
- optimizer {} is not supported!
- unknown loss `%s`
- unknown metric `%s`
- unknown loss `%s`
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/573848b44cf32bd9.
Report an issue: GitHub.