public note

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/hydra_config.py

なお、この挙動を確認したのは下記のバージョンです。

  • hydra-core: 1.3.2
  • omegaconf: 2.3.0