메인 콘텐츠로 건너뛰기
Hydra는 연구용 및 기타 복잡한 애플리케이션 개발을 단순화하는 오픈 소스 Python 프레임워크입니다. 핵심 기능은 구성을 조합해 계층적 설정을 동적으로 생성하고, 설정 파일과 커맨드 라인을 통해 이를 덮어쓸 수 있는 능력입니다.
W&B의 강력한 기능을 활용하면서도 설정 관리를 위해 계속 Hydra를 사용할 수 있습니다.

메트릭 추적

wandb.init()wandb.Run.log()을 사용해 평소와 같이 메트릭을 추적합니다. 여기서는 wandb.entitywandb.project가 Hydra 설정 파일 안에서 정의됩니다.
import wandb


@hydra.main(config_path="configs/", config_name="defaults")
def run_experiment(cfg):

    with wandb.init(entity=cfg.wandb.entity, project=cfg.wandb.project) as run:
      run.log({"loss": loss})

하이퍼파라미터 추적

Hydra는 설정 사전과 상호작용하기 위한 기본 인터페이스로 omegaconf를 사용합니다. OmegaConf의 사전 객체는 기본 사전의 서브클래스가 아니므로 Hydra의 Config를 그대로 wandb.Run.config에 전달하면 대시보드에서 예기치 않은 결과가 발생할 수 있습니다. wandb.Run.config에 전달하기 전에 omegaconf.DictConfig를 파이썬의 기본 dict 타입으로 변환해야 합니다.
@hydra.main(config_path="configs/", config_name="defaults")
def run_experiment(cfg):
  with wandb.init(entity=cfg.wandb.entity, project=cfg.wandb.project) as run:
    run.config = omegaconf.OmegaConf.to_container(
        cfg, resolve=True, throw_on_missing=True
    )
    run = wandb.init(entity=cfg.wandb.entity, project=cfg.wandb.project)
    run.log({"loss": loss})
    model = Model(**run.config.model.configs)

멀티프로세싱 문제 해결

프로세스가 시작될 때 멈춰 버린다면 알려진 이 문제 때문에 발생했을 수 있습니다. 이를 해결하려면 wandb.init()에 추가 설정 파라미터를 넣어서 wandb의 멀티프로세싱 프로토콜을 다음과 같이 변경해 보세요:
wandb.init(settings=wandb.Settings(start_method="thread"))
또는 셸에서 전역 환경 변수를 설정하여:
$ export WANDB_START_METHOD=thread

하이퍼파라미터 최적화

W&B Sweeps는 매우 확장 가능한 하이퍼파라미터 탐색 플랫폼으로, 최소한의 코드만으로 W&B 실험에 대한 유용한 인사이트와 시각화를 제공합니다. Sweeps는 Hydra 프로젝트와 별도 코드 작성 없이 자연스럽게 통합됩니다. 필요한 것은 평소와 동일한 방식으로 스윕할 여러 파라미터를 정의한 설정 파일 하나뿐입니다. 간단한 예시 sweep.yaml 파일은 다음과 같습니다:
program: main.py
method: bayes
metric:
  goal: maximize
  name: test/accuracy
parameters:
  dataset:
    values: [mnist, cifar10]

command:
  - ${env}
  - python
  - ${program}
  - ${args_no_hyphens}
스윕을 실행합니다:
wandb sweep sweep.yaml
W&B는 프로젝트 내에 스윕을 자동으로 생성하고, 스윕을 실행하려는 각 머신에서 실행할 수 있는 wandb agent 명령을 반환합니다.

Hydra 기본값에 없는 파라미터 전달하기

Hydra는 기본 설정 파일에 존재하지 않는 추가 파라미터도 명령줄을 통해 전달하는 것을 지원하며, 이때 명령어 앞에 +를 붙이면 됩니다. 예를 들어, 다음과 같이 호출해 값이 지정된 추가 파라미터를 전달할 수 있습니다:
$ python program.py +experiment=some_experiment
Hydra Experiments를 설정할 때 하는 것과 비슷하게, 이런 + 설정에 대해서는 스윕을 수행할 수 없습니다. 이를 우회하려면 실험 파라미터를 기본값으로 빈 파일로 초기화한 다음, 각 호출 시 W&B Sweep을 사용해 그 빈 설정을 덮어쓰면 됩니다. 더 자세한 내용은 이 W&B Report를 참고하세요.