Объект ‘TPESampler’ не имеет атрибута ‘_group’

#optuna

Вопрос:

Сегодня в моем исследовании появилась следующая ошибка, когда я пытаюсь оптимизировать его после загрузки в Colab на Optuna 2.8.0. Я сохраняю исследование с помощью 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, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, 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, func, n_trials, timeout, catch, callbacks, gc_after_trial, reseed_sampler_rng, time_start, progress_bar)
    160 
    161         try:
--> 162             trial = _run_trial(study, func, catch)
    163         except Exception:
    164             raise

/usr/local/lib/python3.7/dist-packages/optuna/_optimize.py in _run_trial(study, func, 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, study, trial, 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.

Ответ №1:

Только что получил ответ от разработчиков Optuna:

(Частный) атрибут был введен в TPESampler в версии v2.8, и если вы замариновали или сериализовали пробоотборник до этого введения, вы столкнетесь с этой ошибкой при снятии его с версии v2.8.

Решение этой проблемы заключается в повторном создании экземпляра объекта sampler и замене его объектом study.sampler:

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

пс. Такая же проблема может возникнуть с секатором. Если это так, создайте еще один экземпляр секатора!