Hydraのtutorialに従って書いたらpylintに怒られたので修正した話

最近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から怒られずに済む(引数を明示的に与えているので)。

以上、備忘録であった。