Study/머신러닝

PyTorch Hydra

김 도경 2024. 12. 17. 15:48
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