'TPESampler' 对象没有属性 '_group'

问题描述

今天,当我在 Optuna 2.8.0 上加载Colab 后尝试对其进行优化时,我的研究中出现了以下错误。每次试验开始或结束时,我都会使用 joblib 将研究保存在每个试验的单独文件中。我以前从来没有遇到过这个问题,也不知道是什么原因造成的。

Colab 显示以下跟踪:

/usr/local/lib/python3.7/dist-packages/optuna/study.py in optimize(self,func,n_trials,timeout,n_jobs,catch,callbacks,gc_after_trial,show_progress_bar)
    408             callbacks=callbacks,409             gc_after_trial=gc_after_trial,--> 410             show_progress_bar=show_progress_bar,411         )
    412 

/usr/local/lib/python3.7/dist-packages/optuna/_optimize.py in _optimize(study,show_progress_bar)
     73                 reseed_sampler_rng=False,74                 time_start=None,---> 75                 progress_bar=progress_bar,76             )
     77         else:

/usr/local/lib/python3.7/dist-packages/optuna/_optimize.py in _optimize_sequential(study,reseed_sampler_rng,time_start,progress_bar)
    160 
    161         try:
--> 162             trial = _run_trial(study,catch)
    163         except Exception:
    164             raise

/usr/local/lib/python3.7/dist-packages/optuna/_optimize.py in _run_trial(study,catch)
    195                 Failed_trial_callback(study,Failed_trial)
    196 
--> 197     trial = study.ask()
    198 
    199     state: Optional[TrialState] = None

/usr/local/lib/python3.7/dist-packages/optuna/study.py in ask(self,fixed_distributions)
    485         if trial_id is None:
    486             trial_id = self._storage.create_new_trial(self._study_id)
--> 487         trial = trial_module.Trial(self,trial_id)
    488 
    489         for name,param in fixed_distributions.items():

/usr/local/lib/python3.7/dist-packages/optuna/trial/_trial.py in __init__(self,study,trial_id)
     55         self.storage = self.study._storage
     56 
---> 57         self._init_relative_params()
     58 
     59     def _init_relative_params(self) -> None:

/usr/local/lib/python3.7/dist-packages/optuna/trial/_trial.py in _init_relative_params(self)
     65         self.relative_search_space = self.study.sampler.infer_relative_search_space(study,trial)
     66         self.relative_params = self.study.sampler.sample_relative(
---> 67             study,trial,self.relative_search_space
     68         )
     69 

/usr/local/lib/python3.7/dist-packages/optuna/samplers/_tpe/sampler.py in sample_relative(self,search_space)
    327         self._raise_error_if_multi_objective(study)
    328 
--> 329         if self._group:
    330             assert self._search_space_group is not None
    331             params = {}

AttributeError: 'TPESampler' object has no attribute '_group'

附注。有趣的是,这项研究的问题似乎并不存在于我的本地机器上。我使用的是 2.5.0 版本。

解决方法

刚刚从 Optuna 开发人员那里得到答案:

在 v2.8 中向 TPESampler 引入了一个(私有)属性,如果 在本介绍之前,您已经腌制或序列化了采样器, 使用 v2.8 解压时会遇到此 AttributeError。

这个问题的解决方案是重新实例化采样器对象并将其替换为 study.sampler:

study = optuna.load_study(...) 
sampler = optuna.samplers.TPESampler() 
study.sampler = sampler
study.optimize(...)

附注。修剪器可能会出现同样的问题。如果是这样,也重新实例化修剪器!