最近Hydraを使い始めた。tutorialに従えばひとまず使えるようにはなる。 例えば以下のyamlファイルをconfig.yamlとして保存したとする(ニューラルネット的なconfig)。
model: hidden_dim: 128 latent_dim: 32 output_dim: 256 training: epoch: 100 batch_size: 16
次にconfig.yamlと同じディレクトリに、以下のexample.pyを保存しておくとする。
# -*- coding: utf-8 -*- """Hydra example. Copyright (C) 2022 by ballforest MIT licence. """ from omegaconf import DictConfig import hydra # config_pathはyamlファイルの場所(ディレクトリ) # config_nameはyamlファイル名から拡張子を抜いたもの("config.yaml" なら "config") @hydra.main(version_base=None, config_path=".", config_name="config") def main(cfg: DictConfig): """Perform examples.""" print(cfg.model.hidden_dim) print(cfg["model"]["latent_dim"]) if __name__ == "__main__": main()
そして実行する。
python3 example.py
実行結果は
128 32
といった具合で、yamlの中身を引っ張ってこれる。
このexample.pyをpylintにかけたところ、以下の警告文で怒られた。
example.py:21:4: E1120: No value for argument 'cfg' in function call (no-value-for-parameter)
つまりmain関数の呼び出しに際して、引数がないので怒られているというわけだ。pylintがhydraのデコレータを解釈できないので、それはそうなのだが、修正方法はあるのか?と。
tutorialを引き続き調べると、initialize と composeを使えば良いことがわかった。
"""Hydra example. Copyright (C) 2022 by ballforest MIT licence. """ from omegaconf import DictConfig from hydra import compose, initialize def main(cfg: DictConfig): """Perform examples.""" print(cfg.model.hidden_dim) print(cfg["model"]["latent_dim"]) if __name__ == "__main__": with initialize(version_base=None, config_path="."): config = compose(config_name="config") main(cfg=config)
このコードならばpylintから怒られずに済む(引数を明示的に与えているので)。
以上、備忘録であった。