Hydra
- 파라미터가 복잡해지면서 코드를 구조화하거나 관리하기 어려운 문제를 해결하기 위해, 별도의 설정 파일을 작성하여 관리하는데 사용하는 오픈소스 프레임워크
- 설정 파일을 통해 비슷한 여러 태스크를 관리 및 실행할 수 있도록 도와주는 프레임워크
- 배경
- 관리의 어려움: 파라미터가 여러 파일이나 클래스, 함수에 분산돼 있으면, 각각의 위치에서 파라미터를 변경해야 하므로 파라미터 관리가 어려워
- 코드 일관성의 어려움: 같은 파라미터가 여러 위치에서 사용된다면, 일관성을 유지하기 위해 모든 위치를 동시에 업데이트 - Yet Another Markup Language(yaml)
- Hydra에서 파라미터 관리를 위해 yaml이라는 데이터 포맷을 사용
- 포맷의 특징
- key-value 구성으로 작성된 파일
- 들여쓰기로 구조를 구분
- 주석 사용 가능
- XML, JSON 데이터 포맷에 비해 가독성이 좋음 - Hydra 이전의 OmegaConf
- 프로젝트에서 설정을 관리하기 위해 개발된 파이썬 라이브러리
- 파이썬으로 yaml 설정 파일을 쉽게 관리하고 조작할 수 있도록 기능을 제공
- OmegaConf를 사용해 yaml 파일을 쉽게 로드하고, 로드한 데이터는 딕셔너리 형태
- yaml 파일에 ${variable} 형태로 값을 작성하여, 설정값 내부에서 다른 설정 값을 참조할 수 있는 기능을 제공
- 불러온 변수는 객체 방식이나 딕셔너리 방식으로 접근 가능 - 특징
- OmegaConf에서 발전된 프레임워크
- OmegaConf에서의 yaml 데이터 포맷을 사용하며 변수 접근, 변수 참조 (${variable}) 등의 기능을 사용
- 설정 파일의 값을 터미널의 커맨드라인을 통해 쉽게 추가하거나 변경
- 나눠진 여러 설정 파일들을 이용하여 하나의 설정 파일처럼 유기적으로 구성
- 서로 다른 설정 파일의 실험 조합을 하나의 터미널의 커맨드라인으로 실행 - yaml 문법
- 들여쓰기는 기본적으로 2칸(권장) 또는 4칸을 지원
- 데이터는 `key: value` 형식으로 정의
- 배열(list)은 `-`로 표시
- 주석은 `#`으로 표시
- 참/거짓은 `true`, `false` 외에 `yes`, `no`를 지원
- 정수 또는 실수를 따옴표(“)없이 사용하면 숫자로 인식 - Config group
- Hydra에서는 설정 파일을 그룹으로 묶어 관리할 수 있도록 지원 : Hydra에서는 설정 파일들을 구분하는 것을 지향
- 모델을 여러 개 사용하고 싶을 경우, 설정 파일들이 있는 폴더 하위에 `model`이라는 폴더를 생성하고, 각각의 모델(e.g. resnet-18, resnet-34) 설정 파일을 `model` 폴더에 생성 - Default list
- Config group을 통해 설정값에 들어갈 수 있는 항목이 여러 개 있는 경우, 디폴트로 실행할 리스트를 베이스가 되는 ‘configs/config.yaml’에 구성
- `model` 폴더에서 `resnet18.yaml`, `resnet34.yaml`로 있는 경우, default list로 하나를 지정해서 사용 - 작동 구조
- 실행할 함수(main)의 데코레이터(@)로 hydra.main을 선언
- @hydra.main의 인자로 설정 파일들이 위치할 폴더의 경로와 베이스가 되는 설정 파일의 이름을 적음
- 실행할 함수의 인자로 config(e.g. main(cfg))를 받음
: 실행할 함수에 자동으로 설정 파일을 불러와 cfg 변수에 dictionary 타입으로 넘겨야함
- config는 OmegaConf와 마찬가지로, 객체 방식 접근(e.g. cfg.data.batch_size)과 딕셔너리 방식 접근(e.g. cfg[‘data’][‘batch_size’])을 모두 사용
- 터미널의 커맨드라인으로 설정 파일의 설정값을 변경
- ‘+’ 커맨드를 사용하면 새로운 설정값을 추가
- ‘++’ 커맨드를 사용하면 기존의 설정값을 변경하거나 새로운 설정값을 추가
- Hydra를 사용해서 소스코드를 실행할 경우, Hydra는 자동으로 실행 당시의 설정값과 log를 기록
- 자동으로 `outputs/[년도-월-일]/[시간-분-초]`로 폴더가 생성
- 해당 폴더에는 설정값 기록을 위한 `.hydra`의 폴더와 `[소스 코드 이름].log` 파일이 생성
- 결과 파일 : 생성된 `.hydra` 폴더에는 3개의 yaml 파일이 생성
- config.yaml: 프로그래머가 사용한 설정값이 기록
- overrides.yaml: 프로그래머가 터미널의 커맨드라인을 통해 오버라이딩한 설정값이 기록
- hydra.yaml: Hydra의 내부적인 설정값이 기록됩니다. 예를 들어, 소스코드가 실행되는 위치, Hydra 버전 등이 기록 - Hydra 추가 기능
- Instantiate
- Instantiate를 하고자하는 설정 파일에 `_target_`을 명시하고, `_target_`에 객체 이름을 명시
- 설정 파일에서 정의한 클래스의 인스턴스를 쉽게 생성
- 예시 ) 설정 파일에 `torch.nn.CrossEntropyLoss`을 적는다면 일반적으로는 문자열일 뿐인데, , `instantiate`를 사용한다면 `torch.nn.CrossEntropyLoss` 인스턴스를 바로 생성
- Multi-run
- 터미널의 커맨드라인에서 `--multirun` 옵션을 사용하면 여러 설정 파일의 조합을 한 번에 여러 번 실행
- 많은 수의 실험을 수행해야 하는 경우, 편리하게 실험을 실행
Hydra 실습
- Hydra 설치 : https://hydra.cc/docs/intro/
- 로컬에 설치하는 경우, Window OS의 명령 프롬프트나 Mac OS, Linux OS의 터미널에서 `pip install hydra-core`를 통해 설치
- Dataset, DataLoader
- 데이터와 관련된 파라미터(`data_dir`, `batch_size`, `valid_split`)를 설정 파일에 작성 - LightningModule
- CNN 구성과 관련된 파라미터(`model_name`, `num_classes`, `dropout_ratio`)를 설정 파일에 작성
- 다양한 실험을 진행하기 위해 ResNet을 추가
- Hydra의 `instantiate`을 사용하면, 서로 다른 레이어 수를 갖는 ResNet도 유연하게 처리 - optimizer, scheduler
- LightningModule의 `configure_optimizers` 메서드에 필요한 optimizer, scheduler 파라미터를 설정 파일로 작성 - Callbacks, logger, trainer
- Trainer의 `callbacks`, `logger` 인자에 필요한 `EarlyStopping`, `LearningRateMonitor`, `WandbLogger`에 필요한 파라미터를 설정 파일로 작성
- 마찬가지로 Trainer 인자에 필요한 파라미터도 설정 파일로 작성 - Default list
- 앞서 정의한 설정 파일들을 이용해 `defaults`를 구성합니다. 별도의 변경이 없다면, 정의된 `defaults`를 디폴트로 사용
Multi-run 실습
- Hydra의 `Multi-run`을 사용해서 설정 파일의 다양한 조합에 대한 실험을 진행
- 실습에서는 `model`, `optimizer`, `scheduler` 3개의 config group에 대해서 설정 파일을 조합하여 실험 : 12번(3 * 2 * 2)의 실험을 진행
- model: simple_cnn, resnet18, resnet34
- optimizer: sgd, adam
- scheduler: step_lr, exponential_lr
- multi-run 모드로 실행
- Command line을 통해 `python trainer.py --multirun model=simple_cnn,resnet18,resnet34 scheduler=step_lr, exponential_lr optimizer=sgd,adam`을 입력
'Study > 머신러닝' 카테고리의 다른 글
PyTorch Lightning (0) | 2024.12.17 |
---|---|
PyTorch 전이학습 (2) | 2024.12.17 |
딥러닝과 PyTorch (0) | 2024.12.17 |
텐서 조작, Tensor Manipulation(with PyTorch) (0) | 2024.12.16 |
Pytorch (0) | 2024.12.16 |