딥러닝이나 머신러닝 프로젝트를 하다 보면, 모델의 config 파일을 통해 학습에 필요한 다양한 설정을 정의하게 됩니다. 이러한 설정 파일을 만들 때 가장 많이 사용하는 포맷이 YAML입니다. 또한, 설정 파일을 효율적으로 관리하고, 다양한 실험 환경을 지원하기 위해 Hydra라는 프레임워크도 함께 사용하는 경우가 많습니다.
오늘은 YAML과 Hydra로 모델의 설정 파일을 만들고 관리하는 방법에 대해서 살펴보겠습니다.
먼저, YAML은 "YAML Ain't Markup Language"의 줄임말로, 데이터를 표현하는 데 매우 간결하고 사람이 읽기 쉬운 포맷입니다. JSON과 비슷한 형식이지만, 가독성이 훨씬 뛰어나기 때문에 구성 파일로 많이 사용됩니다.
YAML 사용 이유
YAML의 기본 문법
YAML에서 가장 기본적인 데이터 표현은 키-값 쌍입니다. 설정 파일에서 변수와 그 값을 정의하는 방식입니다.
model:
name: resnet50
learning_rate: 0.001
epochs: 50
위의 예시는 model이라는 키에 대한 세부 설정을 표현한 것입니다. name, learning_rate, epochs는 각각 모델의 이름, 학습률, 학습 횟수를 나타냅니다.
리스트와 딕셔너리 표현
YAML은 리스트와 딕셔너리를 사용하여 복잡한 데이터를 직관적으로 표현할 수 있습니다.
# 리스트 표현
layers:
- conv1
- conv2
- conv3
# 딕셔너리 표현
dataset:
name: CIFAR10
path: /datasets/cifar10
batch_size: 32
리스트는 -로 항목을 구분하며, 딕셔너리는 들여쓰기를 통해 하위 키와 값을 표현합니다. 이런 방식으로 모델의 구성이나 데이터셋 정보를 YAML에 정의할 수 있습니다.
다음으로 Hydra는 구성 파일을 동적으로 관리하고 다양한 실험 환경을 지원하기 위해 만들어진 Python 프레임워크입니다. 실험에서 하이퍼파라미터 튜닝이나 다양한 설정을 테스트할 때 매우 유용합니다.
Hydra의 핵심 기능
Hydra는 YAML 파일을 바탕으로, 실행 시점에 설정 값을 쉽게 변경하거나, 여러 실험을 자동으로 관리하는 기능을 제공합니다.
Config Override
Hydra는 커맨드 라인에서 설정 파일에 정의된 값을 쉽게 오버라이드할 수 있습니다. 예를 들어, config.yaml 파일에서 학습률을 0.001로 정의했더라도 실행 시 다음과 같이 값을 변경할 수 있습니다.
python train.py model.learning_rate=0.01
이처럼 코드 수정 없이 커맨드 라인에서 파라미터 값을 변경할 수 있어 매우 유용합니다.
구성 파일 상속 및 계층화
Hydra는 구성 파일을 상속하고, 계층적으로 관리할 수 있습니다. 예를 들어, 모델 구조, 데이터셋, 학습 파라미터 등 여러 설정 파일을 나누고, 실행 시 필요한 부분만 결합하여 사용할 수 있습니다.
# config.yaml
defaults:
- dataset: cifar10
- model: resnet50
- optimizer: adam
실행 시 데이터셋을 cifar100으로 바꾸고 싶다면 이렇게 할 수 있습니다.
python train.py dataset=cifar100
멀티런 기능 (Multirun)
여러 하이퍼파라미터 조합을 실험할 때, Hydra의 멀티런 기능을 사용하면 한 번의 명령어로 여러 설정을 자동으로 테스트할 수 있습니다.
python train.py -m model.learning_rate=0.001,0.01 optimizer=adam,sgd
위 명령어는 learning_rate와 optimizer의 다양한 조합으로 자동으로 여러 번의 실험을 수행합니다.
이제 YAML과 Hydra를 결합하여 어떻게 사용하는지 살펴보겠습니다.
1) YAML 파일 작성
우선, config.yaml 파일에 모델과 학습에 필요한 기본 설정을 정의합니다.
# config.yaml
model:
name: resnet50
learning_rate: 0.001
layers:
- conv1
- conv2
- conv3
dataset:
name: CIFAR10
path: /datasets/cifar10
batch_size: 32
optimizer:
type: adam
weight_decay: 0.0005
2) Hydra로 설정 파일 로드
이제 Python 코드에서 Hydra를 이용해 이 설정 파일을 로드하고, 필요한 값을 사용합니다.
import hydra
from omegaconf import DictConfig
@hydra.main(config_path=".", config_name="config")
def train(cfg: DictConfig):
print(f"Using model: {cfg.model.name}")
print(f"Learning rate: {cfg.model.learning_rate}")
print(f"Dataset path: {cfg.dataset.path}")
if __name__ == "__main__":
train()
3) 실행 시 설정 오버라이드
위의 코드를 실행할 때, 다음과 같이 설정을 동적으로 오버라이드할 수 있습니다.
python train.py model.learning_rate=0.01 dataset.batch_size=64
이 명령어는 학습률을 0.01로, 배치 사이즈를 64로 변경하여 실행하게 됩니다.
4) 멀티런으로 실험 자동화
하이퍼파라미터 튜닝을 위해 멀티런 기능을 사용할 수도 있습니다.
python train.py -m model.learning_rate=0.001,0.01 optimizer.type=adam,sgd
이 명령어는 learning rate와 optimizer의 다양한 조합으로 자동으로 실험을 수행합니다.
모델의 config를 관리하는 것은 매우 중요하지만, 이를 직접 코드로 구현하면 복잡해지고 관리가 어려워질 수 있기 때문에 YAML과 Hydra를 사용하면 설정 파일을 보다 직관적이고 가독성 좋게 관리할 수 있으며, 다양한 실험을 손쉽게 실행할 수 있습니다.