Hydra パラメータをデコレータを使わずに取得する方法
Hydra はパラメータ管理ツールです。
Hydra で管理しているパラメータは @hydra.main デコレータで読み出すのが一般的ですが、デコレータを使えないユニットテストや notebook でパラメータを取得したいときにどうするかを調べました。
ドキュメントを読むと Hydra in Unit Tests | Hydra のページが見つかります。 一見これでよさそうなのですが、パラメータ全体をそのまま読むのではなく、別の型に変換したり cfg.foo のように個々のパラメータを取り出そうとすると次のようなエラーが発生します。
omegaconf.errors.InterpolationResolutionError: ValueError raised while resolving interpolation: HydraConfig was not set
これを回避するには下記のようにします。
from hydra import compose, initialize from hydra.core.hydra_config import HydraConfig from omegaconf import DictConfig with initialize(config_path=CONFIG_PATH, job_name=JOB_NAME, version_base=None): cfg: DictConfig = compose( config_name=CONFIG_NAME, overrides=[], return_hydra_config=True, ) HydraConfig.instance().set_config(cfg)
HydraConfig.instance().set_config(cfg) を行うのがポイントです。
また、HydraConfig.set_config() は cfg の中に hydra 自体の config が存在している前提で動きますので、hydra.compose() の return_hydra_config は True にする必要があります。
実装はこのあたりにあります。
なお、この挙動を確認したのは下記のバージョンです。
- hydra-core: 1.3.2
- omegaconf: 2.3.0