问题描述
使用darts
做时间序列预测时,使用optuna
做超参数优化,调用study.optimize(objective, timeout=7200)
,报错:ValueError: Expected a parent
原因
新版本的pytorch_lightning
改名为lightning
,在函数objective
中采用了pytorch_lightning
的EarlyStopping
的回调函数,同时采用了from optuna.integration import PyTorchLightningPruningCallback
的PyTorchLightningPruningCallback
回调函数,在optuna
的3.5版本中采用了lightning.pytorch
来代替pytorch_lightning
,因此同时存在pytorch_lightning
和lightning.pytorch
两个新老版本引发了冲突。
解决方式
- 定义OptunaPruning类替代PyTorchLightningPruningCallback,使两个版本兼容(不推荐)。
class OptunaPruning(PyTorchLightningPruningCallback, pytorch_lightning.Callback):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def objective(trial):
callback = [OptunaPruning(trial, monitor="val_loss")]
参考连接:https://github.com/optuna/optuna/issues/4689
2.统一使用pytorch_lightning
或lightning
(推荐)。
我的具体的做法是,卸载了optuna3.5,重新安装了optuna3.4,因为optuna3.4采用的是旧版的pytorch_lightning
。
注意
1.下载lightning
的时候注意要pytorch、python版本之间的兼容。
lightning
是真的坑,直接安装如果和torch
版本不兼容会直接把原来的torch
卸载掉,然后安装最新版本的torch
,然后就会出现各种cuda、显卡驱动不适配等问题,所以下载的时候一定加上对应的版本号。
2.吐槽:怎么还有库改名字的呀,之前叫pytorch_lightning
,现在又改名叫lightning
,导致依赖于他们的库变得很乱,强烈吐槽!!!