🗂

Hydraメモ

2021/12/15に公開

hydra自分用のメモ

hydra-core = "^1.1.0"

dir構造

.
├── conf
│   ├── opt
│   │   ├── sgd.yaml
│   │   └── adam.yaml
│   └── config.yaml
├── config.py
└── main.py
config.yaml
# no change working dir
hydra:
  run:
    dir: ./
  output_subdir: null

defaults:
- opt: sgd
# no use logging
- override hydra/hydra_logging: none
- override hydra/job_logging: none

param: "paramです!"
list: [1,2,3]

defualtsの下に書いたものは他のyamlを参照する

sgd.yaml
lr: 0.01
momentum: 0.9
weight_decay: 5e-4
adam.yaml
lr: 0.001
betas: (0.9, 0.999)
eps: 1e-08
weight_decay: 0

コマンドラインからパラメータを渡す

main.py
import os
import hydra
from config import Config
#param = Config.get_cnf()


@hydra.main(config_path="conf", config_name="config.yaml")
def main(param):
    print(param)
    print(f"Current working directory : {os.getcwd()}")

実行結果

python main.py
{'opt': {'lr': 0.01, 'momentum': 0.9, 'weight_decay': 0.0005}, 'param': 'paramです!', 'list': [1, 2, 3]}
Current working directory : ~/

引数は=でわたし、listはstrにする必要がある

> python main.py opt=adam 'list=[5,6,7]'
{'opt': {'lr': 0.001, 'betas': '(0.9, 0.999)', 'eps': 1e-08, 'weight_decay': 0}, 'param': 'paramです!', 'list': [5, 6, 7]}
Current working directory : ~/

ファイルからパラメータを参照(コマンドラインを使わない)

これはjupyterやunittestなどで利用するときに便利

config.py
import sys
import os
from hydra import compose, initialize_config_dir


class Config():
    """
    hydraによる設定値の取得 (conf)
    """
    @staticmethod
    def get_cnf():
        """
        設定値の辞書を取得
        @return
            cnf: OmegaDict
        """
        conf_dir = os.path.join(os.getcwd(), "conf")
        if not os.path.isdir(conf_dir):
            print(f"Can not find file: {conf_dir}.")
            sys.exit(-1)
        with initialize_config_dir(config_dir=config.yaml):
            cnf = compose(config_name="default.yaml")
            return cnf

機械学習でbaselineとなる既存研究ごとのconfig fileを作って、共有しておくと便利かもしれない

Discussion