https://raw.githubusercontent.com/facebookresearch/hydra/master/website/static/img/Hydra-Readme-logo2.svg

Introduction

하나의 완성된 모형을 만들기 위해서는 데이터셋이나 학습 파라미터 값을 변경하여 적어도 수십번의 실험을 하게 됩니다. 이 때 사용된 arguments와 결과값들을 사람이 엑셀 혹은 메모장으로 관리 할 수도 있습니다. 그러나 arguments가 복잡할 수록 이를 구조화하거나 관리하기 힘들기 때문에 별도의 config 파일을 프로그램으로 작성하여 관리하는 것을 추천합니다. 신화 속의 동물 Hydra가 비슷하지만 서로 다른 머리를 가지면서도 하나의 몸에서 유기적으로 움직이듯이, configs를 통해 비슷한 여러 job을 관리 및 실행할 수 있도록 합니다. 이 글에서는 Hydra에서 어떻게 config 관리의 장점들을 강화하고 반대로 단점들을 보완하고 있는지 살펴봅니다.

Hydra의 Config 철학

01. 변경에 민감할 것

Config를 이용해 머신러닝 실험을 할 때 learning rate만 바꾸고 배치 사이즈는 동일하게 가져 갈 경우 서로 다른 2개의 파일(configs)을 별도로 미리 가지고 있어야 할까요? 만약 CLI(Command-Line Interface)에서 config에 원하는 값들만 덮어쓰기(override)가 가능하다면 모든 셋팅에 대한 config 파일이 없어도 될 것 입니다. 즉 작은 변경에 민감하게 디자인 되어야 합니다.

다음과 같은 config.yaml 이 있을 때

app:
  task: classfication
  optimizer: adamw

아래와 같이 실행하면 override할 수 있습니다.

python my_app.py app.task=regression

다음은 config 출력 결과입니다.

app:
  task: regression
  optimizer: adamw

또한, +를 이용해 새로운 arguments를 추가할 수 있습니다.

python my_app.py app.task=regression +app.epochs=10

app:
  task: regression
  optimizer: adamw
  epochs: 10

02. Monolithic 구조

머신러닝 실험에서 datasets, model, optimizer 등으로 구조화하여 실험을 할 수 있습니다. 또한 다양한 계층의 config를 구조화하여 통합 관리할 수 있습니다.

하위 config를 그대로 사용하기 위해 Hydra에서는 몇 가지 개념들을 도입하고 있습니다.