상세 컨텐츠

본문 제목

[ Python ] argparse 대신에 Hydra를 사용해보자 - 1 ( basic )

Python

by teang1995 2022. 2. 16. 23:56

본문

반응형

Documents
지인의 추천으로 알게 된 Hydra. argparse 대신 사용하기 좋다 하니 사용해보도록 하자.

 


1. Installation

pip install hydra-core --upgrade 를 입력해 설치한다. 무척 금방 된다.

2. create .py file

우선 docs에 있는 코드를 그대로 따라해보도록 하자.

import hydra
from omegaconf import DictConfig, OmegaConf


@hydra.main(config_path="conf", config_name="config")
def my_app(cfg : DictConfig) -> None:
    print(OmegaConf.to_yaml(cfg))


if __name__ == "__main__":
    my_app()

만들었다.
my_app에 달린 decorator는 어떤 폴더에(config_path), 어떤 이름으로(config_name) config.yaml 파일을 만들었는지 잡아주는 코드다.
이 말을 잘 생각해보면, 우리는 .py 파일과 같은 레벨에 conf/config.yaml 파일을 만들어야 함을 알 수 있다.

3. create config file

우선, conf 폴더 안에 config.yaml 파일을 만들어 보도록 하자.
그렇다면 아래와 같은 구조를 띄게 될 것이다.

.
├── conf
│   └── config.yaml
└── main.py

우선은 config.yaml은 비워두도록 하자.

4. main.py 실행해보기

(blabla) teang1995@YongTaekui-MacBookAir blabla % python main.py
{}

와 같이 출력되는 것을 확인할 수 있다.
왜냐면 현재 config.yaml파일이 비어있으니까!

5. config.yaml 채우기

typing에서 Dict라고 적어준 것처럼 config.yaml 파일은 dictionary 형태로 관리된다.
우선 아래 내용을 따라 쳐보자. 물론 아래의 형태만 맞춘다면 다르게 써도 무방하다.

# this is content for config.yaml
teang1995:
    name: ytlim
    age: 28
    height: 188
    weight: secret

이를 저장한 뒤, 다시 main.py를 실행해보면..

(blabla) teang1995@YongTaekui-MacBookAir blabla % python main.py
teang1995:
  name: ytlim
  age: 28
  height: 188
  weight: secret

와 같이 출력되는 것을 알 수 있다.

6. 그렇다면 main.py에서 config 파일에 접근하는 방법은?

위의 my_app 함수 내용을 아래와 같이 바꿔보자.

def my_app(cfg: DictConfig) -> None:
    print(cfg)
    print(type(cfg))

그렇다면

(blabla) teang1995@YongTaekui-MacBookAir blabla % python main.py
{'teang1995': {'name': 'ytlim', 'age': 28, 'height': 188, 'weight': 'secret'}}
<class 'omegaconf.dictconfig.DictConfig'>

와 같이 결과가 출력되는데, 출력된 cfg가 꼭 dict처럼 생겼다. 무언가 해보고 싶은 게 생겼으니 my_app함수를 아래와 같이 바꿔주자.

def my_app(cfg: DictConfig) -> None:
    print(cfg)
    print(type(cfg))
    print(cfg['teang1995'])

그러면

(blabla) teang1995@YongTaekui-MacBookAir blabla % python main.py
{'teang1995': {'name': 'ytlim', 'age': 28, 'height': 188, 'weight': 'secret'}}
<class 'omegaconf.dictconfig.DictConfig'>
{'name': 'ytlim', 'age': 28, 'height': 188, 'weight': 'secret'}

와 같이 출력되는 것을 볼 수 있다.
아하 그렇다면?

my_app 함수를 다시 한 번 아래와 같이 바꿔주자.

def my_app(cfg: DictConfig) -> None:
    profile = cfg['teang1995']
    name = profile['name']
    age = profile['age']
    height = profile['height']
    weight = profile['weight']

    print(name, age, height, weight)

그러면

(blabla) teang1995@YongTaekui-MacBookAir blabla % python main.py
ytlim 28 188 secret

처럼 출력되는 것을 확인할 수 있다.

이렇게 하면 hydra의 아주 기본적인 사용법을 익힌 셈인데.. 이를 돌리다 보면 경로에 outputs라는 폴더가 생성되어있을 것이다.
이를 다루는 법은 다음 포스팅에 적도록 하겠다.

관련글 더보기

댓글 영역