본문 바로가기

Upstage AI Lab 2기

Hydra

Hydra의 필요성

파라미터가 너무 많아지면서 코드 내부에 직접 작성하는 것이 불편하게 됨 -> 

Hydra는 파라미터 관리를 위해 별도의 yaml(yet another markup language) 파일로 관리

yaml 포맷은 key-value 구성, 들여쓰기 두 칸으로 구조 구분

OmegaConf 를 발전시킨 것이라 변수 접근, 변수 참조 등의 기능을 사용할 수 있음 (${variable})

 

Hydra 만의 특징

  1. yaml 파일을 수정하지 않고 config 값을 터미널에서 추가 및 변경 가능
  2. 여러 설정 파일들을 하나의 설정 파일처럼 유기적 구성 가능
  3. 서로 다른 설정 파일 실험 조합 가능

Hydra를 위한 yaml 작성

  1. 들여쓰기 2칸
  2. key : value 형식
  3. list는 - 로 나열
  4. # 주석
  5. true, TRUE, false, FALSE, yes, no 도 됨
  6. 정수 또는 실수를 따옴표 없이 쓰면 숫자로 인식함

 

Config group - 설정파일마다 구분하는 것을 지향함 -> 모델만 바꿔서 실험하는 것이 가능함

 

<directory layout>

configs

  |- callback

  |- data

  |- logger

  |- model

  |- optimizer

  |- scheduler

  |- trainer

  config.yaml

 

confings/config.yaml - default list를 구성해야함

batch_size, learning_rate, num_epochs 등

 

 

작동구조

실행할 메인 파일에 (예. main.py)

import hydra

@hydra.main(config_path = "configs", config_name = "config")
def main(cfg):
	#####
    
if __name__ == "__main__":
	main()

 

cfg 를 인자로 받음

hydra에서 가져오는 hyperparams 를 dict type으로 cfg 변수에 저장

객체 방식 접근 / 딕셔너리 방식 접근 모두 가능

 

커맨드 라인에서 설정파일의 설정값 변경 및 추가 가능

예 1) 설정값 변경

python main.py data.batch_size=64 optimizer.lr=0.1

python main.py model=resnet34

예 2) 설정값 추가 (+ 커맨드로 가능함)

python main.py +optimizer.weight_decay=0.001

예 3) 변경&추가 (++ 커맨드로 가능함)

python main.py ++optimizer.lr=0.05

 

hydra로 실행시 설정값과 log가 기록됨

outputs/yyyy-MM-dd/hh-mm-ss

  |- .hydra

  |    |- config.yaml (-> 사용한 설정값)

  |    |- hydra.yaml

  |    |- overrides.yaml (-> 터미널에서 오버라이드한 설정값)

  |- (소스코드이름).log

 

instantiate

hydra는 Alias를 인식하지 못함

예)

criterion = instantiate(cfg.loss_function)

instantiate(torch.nn.CrossEntropyLoss)

잘못된 예) 

instantiate(nn.CrossEntropyLoss)

instantiate 하고자 하는 설정 파일에 _target_ : 객체이름 명시

예) _target_ : torch.nn.CrossEntropyLoss

=> 이렇게 했을 경우의 장점 : 사용하고자 하는 loss 등을 다 yaml에 저장해두고 바꿔가며 쓸 수 있음.

 

Multi-run

커맨드라인에 --multirun 입력 -> 여러 실험 조합