Skip to main content

W&B로 ML 실험 관리와 추적

이 글은 Weights & Biases를 활용해 머신러닝 실험을 추적하는 방법을 여러 딥러닝 프로젝트에서 얻은 경험과 함께 자세히 소개하는 입문서입니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
이 글은 원래 다음에서 공개되었습니다 jarvislabs.ai 웹사이트. 작성자의 허가를 받아 여기에도 재게시합니다.
머신러닝에서 가장 덜 가르쳐지는 역량 중 하나가 실험을 효과적으로 관리하고 추적하는 방법입니다. 초급 수준의 프로젝트를 벗어나 본격적인 프로젝트나 연구로 들어가면, 실험 추적과 관리가 프로젝트에서 가장 핵심적인 요소 중 하나가 됩니다.
하지만 실험을 깊이 있게 어떻게 관리하는지는 어떤 강의에서도 잘 다루지 않기 때문에, 그 빈틈을 메우고자 제가 모든 프로젝트와 Kaggle 대회에서 실험을 효과적으로 추적하고 관리해 온 방법과 경험을 공유하려 합니다.
이 글에서는 제가 여러 ML과 DL 프로젝트를 진행하며 얻은 지식을 공유하고자 합니다.
  • 실험 추적의 필요성
  • 실험 추적과 구성 관리의 전통적인 방식
  • 머신러닝 프로젝트에서 추적해야 할 항목
  • Weights & Biases로 실험 추적하기
  • Hydra를 활용한 구성 관리
참고이는 제가 여러 해에 걸쳐 발전시킨 실험 추적 방식입니다. 어떤 방법은 여러분에게 잘 맞을 수 있고, 어떤 것은 그렇지 않을 수도 있습니다. 그러니 글 전체를 끝까지 읽고, 마음에 들고 프로젝트에 도움이 된다고 생각되는 아이디어만 골라 적용하세요.
💡
다음 내용을 다룹니다:

목차(클릭하여 펼치기)

왜 실험 추적이 필요할까?

아마 이런 질문이 떠오를 수 있습니다. 애초에 왜 실험 추적이 필요한 걸까요?
간단한 답은 이렇습니다. 머신러닝 실무자로서 우리는 해법을 개선하기 위해 상당한 시간과 노력을 투자합니다. 예를 들어, 모델 아키텍처, 데이터셋 파라미터, 평가 지표 등을 반복적으로 바꿀 수 있습니다. 대략 4–5번의 실험까지는 어떤 변경을 했는지 기억할 수 있습니다.
그 이후부터는 완전히 뒤죽박죽이 됩니다. 특정 실행에 어떤 설정들이 들어갔는지, 그리고 어떤 변경이 평가 지표를 긍정적으로 혹은 부정적으로 바꿨는지 기억하기가 매우 어렵습니다(초인적 기억력을 갖고 있지 않은 이상요). 최신 딥러닝 아키텍처는 사용자가 정의해야 하는 파라미터가 수백 개에 달해, 모두 기억하기가 훨씬 더 어렵습니다.
결국 결론은 이렇습니다. 지금 하고 있는 일에 집중할 수 있도록, 실험 전부를 관리하고 추적해 주는 시스템이 필요합니다. 그래야 매번 기억하고 걱정하는 데 에너지를 쓰지 않아도 됩니다.

머신러닝 프로젝트에서 무엇을 추적해야 할까?

실험을 추적하는 중요성을 이해했다면, 다음으로 떠오르는 질문은 아마 이럴 것입니다. 머신러닝 프로젝트에서 우리는 무엇을 추적해야 할까요?
여기 좋은 시작점이 있습니다:
  • 파라미터: 모델 아키텍처, 하이퍼파라미터
  • 잡/루틴: 전처리 루틴, 학습 및 검증 루틴, 후처리 루틴 등
  • 아티팩트: 데이터셋, 전처리된 데이터셋, 모델 체크포인트 등
  • 지표: 학습 및 평가 손실, 지표
  • 모델별 구성 요소: 옵티마이저 상태, 학습 진행 중의 그래디언트 등
  • 메타데이터: 실험 이름, 실험 유형, 아티팩트 위치(예: S3 버킷), 실행 요약, 구성 등
  • 코드: 실험을 실행했을 때의 코드 상태
  • 하드웨어 파트: CPU 또는 GPU 인스턴스 유형, CPU/GPU 사용량, 네트워크 사용량 등
본격적인 내용에 들어가기 전에, 많은 사람들이 일반적으로 따르는 전통적인 실험 추적 방식의 문제점을 짚어 보고 그 과정에서 드러나는 몇 가지 함정을 강조하고자 합니다.

실험 추적: 전통적인 기법

펜과 종이에 적기
가장 눈에 띄는 방법은 설정과 변경 사항을 종이에 적어 두는 것입니다. 하지만 이 방식에는 명확한 단점이 있습니다. 적는 과정에서 실수를 할 수 있고, 특정 실험을 찾아보거나 확인하고 싶을 때 여러 장의 종이 더미 속에서 검색하기가 전혀 쉽지 않습니다. 또한 수작���이 매우 많이 들고, 수백 건의 실험 내용을 계속 기록하는 것도 쉽지 않습니다.
Excel 또는 Google 스프레드시트 사용하기
음, 이전 방식보다는 더 체계적으로 실험을 추적할 수 있어 보이지만, 여전히 스프레드시트에 정확한 설정을 작성하거나 복사해 붙이는 과정에서 오류가 발생할 수 있다는 같은 문제가 있습니다. 모든 실험 설정을 디지털로 저장하고 손쉽게 검색할 수 있다는 장점이 있기는 하지만, 정확한 설정을 일일이 타이핑하거나 복사해 붙이고, 이를 스프레드시트 형태로 구조화하는 데 많은 수작업이 필요합니다. 그 결과, 모델링에 쓸 수 있었던 시간이 낭비됩니다.

구성 관리: 전통적인 기법

실험을 추적하는 일도 중요하지만, 구성값을 코드베이스에 전달하는 방식은 또 다른 문제입니다. 구성 관리는 실험을 효과적으로 관리하고 추적하는 데 있어 가장 핵심적인 요소 중 하나입니다. 머신러닝 실험의 대부분에서 코드는 거의 동일하게 유지되고, 변화가 생기는 부분은 주로 모델 하이퍼파라미터, 데이터셋 파라미터 등 구성값입니다.
특정 실험을 실행하기 위해 코드베이스에 넘겨야 할 파라미터가 수백 개에 달할 수 있으므로, 실제 코드와 구성값(조정 가능하고 변경 가능한 모든 파라미터)을 분리하는 것이 좋습니다. 많은 사람들이 파라미터와 데이터 경로를 코드 안에 하드코딩하는 실수를 하는 것을 자주 봅니다. 소규모 프로젝트에서는 그럭저럭 동작할 수 있지만, 프로젝트와 팀 규모가 커질수록 완전히 혼란스러워질 수 있습니다. 코드는 최소한의 변경만으로 어떤 시스템에서도 이식 가능해야 합니다.
코드와 분리해 구성을 관리하는 방법은 다양하며, 이를 통해 파라미터를 바꿔 서로 다른 실험을 손쉽게 실행할 수 있습니다.
여기서는 프로젝트에서 가장 흔히 쓰이는 구성 관리 방식과 그에 따른 문제점, 그리고 오픈 소스 패키지가 이를 어떻게 해결할 수 있는지에 대해 살펴보겠습니다. Meta Research 라고 불리는 Hydra.

Argparse

코드베이스에 모든 구성값을 전달하는 가장 흔한 방법 중 하나는 Python의 내장 모듈을 활용하는 것입니다. argparse이 모듈은 사용자 친화적인 명령줄 인터페이스를 손쉽게 작성할 수 있도록 도와줍니다. Argparse 는 소규모 프로젝트에서 명령줄을 통해 구성값을 전달하기에 훌륭한 방법입니다. 하지만 프로젝트 규모가 커지면 점점 복잡해지고 유지 보수가 어려워집니다. 또한 실험을 실행하려고 명령줄에 모든 인자를 일일이 작성하는 일은 큰 부담이 됩니다.
예를 들어, 다음은에서 직접 가져온 코드 스니펫을 보세요 PyTorch ImageNet 학습 예제. 예제가 비교적 최소한의 구성이라 하더라도, 명령줄 플래그의 개수는 이미 많습니다. 이상적으로는 일부 명령줄 인자를 논리적으로 묶어야 하지만, 이를 쉽게 빠르게 처리할 방법이 마땅치 않습니다.


YAML 파일

실행 인자를 지정하는 또 다른 일반적인 방법은 YAML 파일에 모두 작성하는 것입니다. YAML을 모른다면, 사람도 읽기 쉬운 데이터 직렬화 언어라고 이해하시면 됩니다. YAML에 대해 더 알아보려면 다음을 참고하세요. 이 글.
여기서는 이전의 argparse 기반 구성 관리 방식과 비교했을 때 몇 가지 장점을 확인할 수 있습니다. 첫째, 매번 명령줄에 모든 구성값을 반복해서 입력하거나, 실험 설정을 바꿀 때마다 bash 스크립트를 계속 만들어야 하는 수고가 사라집니다. 또 다른 장점은 유사한 항목들을 논리적으로 묶어 관리할 수 있다는 점입니다.
예를 들어, 아래에 제시한 스니펫을 보세요. 데이터와 관련된 모든 내용은 다음으로 들어갑니다 data key, 모델과 관련된 모든 내용은 다음으로 들어갑니다 model 키 등으로 구분할 수 있습니다. 더 나아가, 서로 다른 유형의 키를 중첩해서 구성할 수도 있습니다. 아래 스니펫에서 확인해 보세요. model 는 모델과 관련된 모든 항목을 담는 키이며, 심지어 model 키에서는, 다음 항목들을 위한 별도의 키들을 둘 수 있습니다 encoder 그리고 decoderYAML 파일 안에서는 사실상 어떤 데이터 구조든 정의할 수 있으며, 이를 Python으로 읽어 들이면 결국 사전 안에 사전이 들어 있는 형태(중첩 딕셔너리)의 딕셔너리가 됩니다. 자세한 내용은 다음을 참조하세요 이 글 YAML 파일에서 서로 다른 데이터 유형을 사용하는 방법을 알아보려면 확인하세요.
data:
train_path: '/path/to/my/train.csv'
valid_path: '/path/to/my/valid.csv'

model:
encoder:
dimension: 256
dropout: 0.2
decoder:
dimension: 512
dropout: 0.1

trainer:
learning_rate: 1e-3
train_batch_size: 16
val_batch_size: 16
하지만 YAML 파일의 이야기는 여기서 끝나지 않습니다. 수많은 실험을 실행하고, 각 실험에 사용한 YAML 파일을 기억하거나 저장할 방법이 필요하다고 가정해 봅시다. 모든 구성 파일을 추적하는 한 가지 방법은 실험에 의미 있는 이름을 붙이고, 해당 실험 이름을 YAML 파일 이름으로 사용하는 것입니다.
예를 들어, 어떤 NLP 문제를 해결하기 위해 트랜스포머 기반 모델을 학습한다고 해봅시다. 그러면 특정 실행에 사용한 YAML 파일 이름을 다음과 같이 정할 수 있습니다. experiment-number_model-name_short-run-description.yaml.
예를 들어 Roberta-base 모델을 학습하면서 그래디언트 누적 횟수를 2로 설정했다고 가정해 봅시다. 그러면 실험 파일 이름을 다음과 같이 정할 수 있습니다. 0_roberta-base_grad-accum2.yaml지금 당장은 그럴듯해 보일 수 있지만, 결국 YAML 파일이 산더미처럼 쌓이게 되고, 코드를 계속 업데이트하다 보면 그 대부분이 쓸모없어집니다. 기존 설정 파일들을 현재 코드베이스와 동기화되도록 계속 업데이트하는 것도 사실상 불가능합니다. 게다가 파일 이름과 내용이 대부분 비슷해 보이기 때문에 서로 구분하기 어렵고, 각 파일에 어떤 변경 사항이 반영되어 있는지 ��악하기도 어렵습니다.
예전에 저도 이런 방식으로 했고, 솔직히 문제를 많이 겪었습니다. 다행히 구성 파일을 더 깔끔하고 나은 방식으로 다루는 방법이 있는데, 그것은 다음과 같이 구현할 수 있습니다. HydraMeta Research(구 Facebook Research)이 공개한 오픈 소스 프레임워크로, 복잡한 애플리케이션의 구성을 간소화하는 것을 목표로 합니다.
먼저 Hydra를 활용해 구성을 어떻게 우아하게 관리할 수 있는지 살펴보고, 이어서 Weights & Biases로 실험을 어떻게 추적하고 관리할 수 있는지 알아보겠습니다.

Hydra로 구성 관리

1년여 전, MetaAI는 자사 플랫폼을 더 모듈식이고 상호 운용 가능하도록 재설계한다고 발표했습니다. Hydra는 이 재설계 과정에서 모든 구성 요구 사항을 처리하기 위한 핵심 구성 요소 중 하나입니다.
Hydra의 핵심 아이디어는 여러 구성 파일을 하나의 마스터 구성으로 합성할 수 있고, 이렇게 합성된 구성의 모든 항목을 명령줄에서 오버라이드할 수 있다는 것입니다.
이 글이 Hydra에 대한 완전하고 포괄적인 가이드를 제공하는 것을 목표로 하지는 않지만, 핵심 기능들은 최대한 짚어 보겠습니다. 다 읽고 나면, 다음 자료를 참고해 직접 학습하고 실험해 보세요. 문서.

Hydra 구성의 기본 예시

YAML 파일에 다음과 같은 이름으로 된 데이터셋 구성이 있다고 가정해 보겠습니다 config.yaml:
dataset:
name: cifar10
path: /home/datasets/cifar10
Hydra 기능을 활성화하려면 파이썬 스크립트에서 파일을 다음과 같이 읽으면 됩니다
import hydra
from omegaconf import DictConfig

@hydra.main(config_path="config.yaml")
def my_app(cfg: DictConfig) -> None:
print(cfg.pretty())

if __name__ == "__main__":
my_app()
데코레이터, hydra.main() 마스터가 위치한 경로를 입력으로 받아서 config.yaml 파일이 저장됩니다.
Hydra는 다음을 기반으로 구축되었습니다 OmegaConf, 즉 다음의 모든 기능을 사용할 수 있다는 뜻입니다 OmegaConf예를 들어, 변수 보간은 다음의 가장 유용한 기능 중 하나입니다 OmegaConf.
모른다면 OmegaConf, YAML 기반의 계층형 구성 시스템입니다. 자세한 내용은 OmegaConf, 읽어보실 수 있습니다 해당 문서.
특정 키에 접근하려면 아래와 같이 점 표기법이나 파이썬 딕셔너리 표기법을 사용할 수 있습니다:
# To access the dataset key from the above example

cfg.dataset
# OR
cfg['dataset']

구성

이제 여러 데이터셋으로 실험하고 싶은 상황을 생각해 봅시다. 전통적인 방법이라면, 사용하려는 데이터셋 유형을 명령줄 인자로 추가하고, 메인 코드에 여러 if-else 문을 넣어 적절한 데이터셋을 선택하도록 만들 것입니다. 하지만 이런 방식은 코드가 지저분해지고 유지 보수가 어려워집니다. Hydra를 사용하면 더 깔끔하게, 데이터셋별로 개별 구성 파일을 만들어 처리할 수 있습니다.
실험해 보고 싶다고 가정해 봅시다 CIFAR-10 그리고 the ImageNet 데이터셋이라면, 디렉터리 구조는 아래와 비슷할 것입니다:"
# DI
├── config
│ ├── config.yaml
│ ├── dataset
| ├── cifar10.yaml
│ ├── imagenet.yaml
└── train.py
모든 것은 마스터에서 구성됩니다 config.yaml 끝에는 파일. 심지어 추가할 수도 있습니다 defaults 섹션을 당신의 config.yaml, 사용자가 지정하지 않은 경우 기본으로 사용할 데이터셋을 Hydra에 알려 줍니다.
defaults:
- dataset: cifar10

명령줄에서 재정의하기

Hydra의 가장 멋진 기능 중 하나는 명령줄에서 설정 파일 내부의 어떤 값이든 재정의할 수 있다는 점입니다. 예를 들어 어떤 이유로든 CIFAR-10의 경로를 바꾸고 싶다고 해봅시다. 아래와 같이 명령줄을 통해 변경할 수 있습니다.
$ python3 app.py dataset.cifar10.path=/downloads/datasets/cifar10
여기에서 Hydra의 장점을 확인할 수 있습니다. 모든 것이 모듈식으로 체계화되어 있으며, 지저분한 if-else 문을 코드에서 걷어내 깨끗하게 유지해 줍니다. 설정은 계층적으로 조합할 수 있습니다. 여기서는 서로 다른 유형의 데이터셋을 사용하는 예시를 보여 주었지만, 설정의 다른 모든 항목(모델, 데이터 경로, 학습 설정, 클라우드 스토리지 경로 등)에도 동일한 방식을 적용할 수 있습니다.
Hydra를 사용하면 서로 다른 유형의 설정을 계층적으로 관리할 수 있는 가능성이 사실상 무한합니다. 소프트웨어를 작성할 때 코드를 모듈식으로 구성하듯, 이러한 설정 방식도 모듈식 구성으로 생각할 수 있습니다.
Hydra에는 다양한 기능이 있으며, 그중 일부는 아래와 같습니다:
  • 로깅 Hydra에는 자체 로깅 시스템이 있습니다(사용하고 싶지 않다면 언제든지 비활성화할 수 있습니다).
  • 명령줄에서 병렬 프로세스 실행하기
  • 스위퍼 - 하이퍼파라미터 튜닝을 위해 특정 매개변수 범위를 탐색할 수 있게 해 줍니다.
  • 그리고 이 외에도 정말 많습니다!
이 글에서 모두 다루기에는 Hydra의 기능이 훨씬 더 많습니다. 자세한 내용은 꼭 해당 문서를 읽어 보시길 권합니다. 문서 Hydra를 더 깊이 이해하시려면 문서를 참고하시고, 앞으로의 프로젝트에서 Hydra를 활용해 작업을 훨씬 더 수월하게 하시길 바랍니다 :)

프로젝트에서 Hydra를 어떻게 사용하나요?

저는 꽤 오랫동안 Hydra를 사용해 왔고, Hydra로 실험과 설정을 어떻게 관리하는지 보여 드리고자 합니다. 다음은 마스터 config.yaml 제가 진행 중인 NLP 프로젝트 중 하나에서.
defaults:
- paths: colab
- trainer: default_trainer

# disable logging by Hydra
- override hydra/job_logging: none
- override hydra/hydra_logging: none
- _self_

model:
model_name: roberta-base
class_name: RobertaForSequenceClassification

run:
exp_num: "00" # serial number of experiment
name: baseline # a short 1-2 word description of the experiment
experiment_name: ${run.exp_num}_${model.model_name}_${run.name}
comment: "baseline"
n_folds: 5
fold: 0
debug: False
disable_warnings: True

wandb:
enabled: True
log_artifacts: True
project: USPPPM-Kaggle
notes: ${run.comment}
name: fold_${run.fold}
그리고 여기에 해당하는 파일 구조가 있습니다
├── config.yaml
├── paths
│ ├── colab.yaml
│ ├── jarvislabs.yaml
│ ├── kaggle.yaml
│ └── local.yaml
└── trainer
├── deberta.yaml
├── deberta_v3_base.yaml
├── deberta_v3_large.yaml
├── default_trainer.yaml
├── roberta_base.yaml
└── roberta_large.yaml
제가 특정 실험에 이름을 붙이는 방식을 살펴보세요 — ${run.exp_num}_${model.model_name}_${run.name}.
예를 들어, roberta-base로 첫 실험을 진행하면서 multi-sample dropout을 사용한다면, 해당 실험의 이름은 다음과 같이 정할 수 있습니다. 1_roberta-base_multi-sample-dropout.
이렇게 하면 앞서 이야기한 것처럼 실험에 의미 있는 이름을 붙일 수 있고, 특정 유형의 실험을 쉽게 검색할 수 있습니다.
명령줄에서 해당 플래그만 바꿔 주면, 서로 다른 실험 이름을 붙이고 다양한 학습 설정과 모델 설정을 사용할 수 있습니다. 게다가 실험 이름에 일관된 구조를 적용해 두면, 실험 추적 도구의 검색창만으로 특정 실험을 쉽게 찾아볼 수 있습니다(이 부분은 블로그 후반부에서 다룹니다).
또한, 저는 짧게 작성하는 것을 좋아합니다 comment 제가 어떤 실험을 수행하고 있었는지 나중에 쉽게 이해할 수 있도록, 현재 진행 중인 실험에 대한 간단한 설명을 작성합니다.
제가 bash 스크립트로 실험을 실행하는 방법은 다음과 같습니다
#!/bin/bash

cd /home/US-Patent-Matching-Kaggle/src

for fold in 0 1 2 3 4
do
python3 train.py \
paths="jarvislabs" \
trainer="deberta_v3_base" \
run.debug=False \
run.fold=$fold \
run.exp_num="2" \
model.model_name="microsoft/deberta-v3-base" \
model.class_name="AutoModel" \
run.name="baseline" \
run.comment="folds grouped by anchors + add contexts + deberta v3 base with no modifications"
done
지금까지 복잡한 설정을 관리하는 방법과 Hydra가 이를 얼마나 쉽게 만들어 주는지 살펴봤습니다. 그렇다면 이제 이러한 실험은 어떻게 추적할까요? 모든 추적 요구를 해결해 주는 답은 Weights & Biases입니다.
그에 앞서, 프로젝트에 사용할 실험 추적 도구를 선택하기 전에 어떤 기능을 살펴봐야 하는지 먼저 이해해 봅시다.

좋은 실험 추적 도구의 조건은 무엇일까요?

  • 코드베이스에 최소한의 코드 변경만으로도 쉽게 사용할 수 있습니다.
  • 사용자 정의 지표를 유연하게 추적할 수 있어야 합니다.
  • 사용하기 쉬운 인터페이스.
  • 사용자 지정 가능한 대시보드.
  • 데이터셋, 모델, 코드까지 모두 추적할 수 있어야 합니다.
  • 대시보드와 플롯은 CSV 또는 PNG 파일로 쉽게 내보낼 수 있어야 합니다.
  • 시스템 지표를 추적할 수 있어야 합니다.
  • 가장 중요한 점: 프로그램에 어떤 오버헤드나 병목도 추가하지 않아야 합니다.
  • 팀과 쉽게 협업할 수 있습니다.
  • 오픈 소스여야 합니다(물론 개인적인 취향이지만, 오픈 소스를 싫어하는 사람은 없잖아요?).
실험 추적 도구는 정말 많습니다. 이 글에서는 Weights & Biases를 다룹니다. 기능이 풍부하고, 제가 써 본 도구들 가운데 가장 뛰어났으며, 좋은 실험 추적 도구의 위 요건들을 모두 충족하기 때문입니다.
혹시 아직 Weights & Biases를 모르신다면, 이는 개발자를 위한 MLOps 플랫폼으로, 실험을 추적하고 데이터셋과 모델의 버전을 관리하는 등 다양한 기능을 제공합니다. 실험 추적과 관리에 필요한 기능을 하나로 모아 제공하는 올인원 도구입니다. 게다가, 이는 개인 및 학술 용도로 무료입니다.

Weights & Biases로 실험 추적하기

이 글은 Weights & Biases를 사용하는 방법을 설명하는 가이드가 아닙니다. 대신, 모두가 반드시 활용해야 하고 실험 추적 효율을 수십 배 끌어올려 줄 W&B의 핵심 기능들을 소개합니다. 프로젝트에서 W&B를 사용하는 법을 배우고 싶다면, W&B의 문서 상당히 잘 되어 있고, 시작할 수 있도록 예제가 많이 제공됩니다. 또, 이들은 유튜브 채널 그 기능을 심층적으로 설명합니다.
이후부터는 Weights & Biases를 W&B로 통칭하겠습니다.
💡


기존 프로젝트에 W&B 통합하기

프로젝트에 W&B를 통합하는 것은 간단하며 몇 줄의 코드만 있으면 됩니다. W&B는 거의 모든 인기 있는 오픈 소스 패키지와의 통합을 제공하며, 문서에는 시작하는 데 도움이 되는 통합 방법과 코드 스니펫이 잘 정리되어 있습니다.
그들이 제공하는 모든 통합과 해당 패키지에서의 사용 방법을 정리한 링크가 여기 있습니다.
W&B를 통합하고 싶다고 가정해 보겠습니다. 케라스그렇다면 다음과 같이 하면 됩니다:
# Code taken from: https://docs.wandb.ai/guides/integrations/keras
import wandb
from wandb.keras import WandbCallback
wandb.init(config={"hyper": "parameter"})
... # code to set up your model in Keras
# 🧙 magic
model.fit(X_train, y_train, validation_data=(X_test, y_test),
callbacks=[WandbCallback()])
맞습니다. 여러분이 즐겨 사용하는 어떤 프레임워크와도 W&B를 이렇게 간단하게 통합할 수 있습니다. 그리고 여러분이 정의한 모든 하이퍼파라미터를 자동으로 기록합니다 config wandb.init() 메서드의 인자
일반적인 대시보드는 다음과 같습니다:


W&B가 기본으로 모니터링하는 항목

W&B는 명령줄 인수를 하이퍼파라미터로 자동 저장합니다. 실험 페이지에서 어떤 명령줄 인수를 정확히 전달했는지도 확인할 수 있습니다. 또한 다음과 같은 유용한 정보도 확인할 수 있습니다:
  • 실험이 시작된 시점
  • 실험의 지속 시간
  • 실험을 실행한 머신의 운영체제
  • Python 버전
  • Git 저장소
  • Git 상태
  • 실험을 실행하는 데 사용한 명령어
  • CPU 코어 수
  • GPU 종류


그리고 이 모든 것을 추적하기 위해 따로 할 일은 없습니다. 기본값으로 자동 기록됩니다. 비슷한 유형의 실험끼리 묶을 수도 있습니다. 예를 들어, 저는 항상 교차 검증 루프로 실험을 실행합니다. 그래서 위 스크린샷처럼 각 폴드의 실험을 마스터 실험 이름으로 묶어 관리합니다.
또한 W&B는 시스템 메트릭을 자동으로 모두 추적합니다. 예: CPU 사용률, GPU 사용률, GPU 온도, 네트워크 사용량, 디스크 사용률, 메모리 할당 등등. 무엇이든 말만 하세요. W&B가 이미 전부 알아서 처리합니다.


콘솔 로그까지 모두 W&B가 자동으로 모니터링하므로, 별도로 커스텀 로거를 작성할 걱정이 없습니다.

실험 검색

앞서 설명했듯이, 이러한 방식의 실험 추적 설정의 가장 큰 장점은 특정 실험을 빠르게 검색할 수 있다는 점입니다. W&B에서는 검색창을 통해 손쉽게 이를 수행할 수 있습니다. 검색 기능은 MySQL과 정규식도 지원하므로 상당히 강력합니다.


또한 W&B는 태그도 지원합니다. wandb.init() 메서드에 태그를 전달하면 테이블에 자동으로 표시됩니다. 사람이 읽기 쉬운 식별자로 특정 실험에 태그를 달고 싶을 때 유용합니다.


고급 로깅 사항

W&B의 가장 멋진 점 중 하나는 말 그대로 무엇이든 기록할 수 있다는 것입니다. 커스텀 메트릭, matplotlib 플롯, 데이터셋, 모델에서 나온 임베딩, 예측 분포 등 무엇이든 로깅할 수 있습니다.
최근 Weights & Biases에서 테이블(Tables) 기능을 발표했습니다. 이를 통해 표 형식 데이터를 로깅하고, 쿼리하며, 분석할 수 있습니다. 모델 예측을 시각화하고 모델 간에 비교하는 것도 가능합니다. 예를 들어, 아래 이미지처럼 확인할 수 있습니다(출처: W&B 문서), 두 개의 세그멘테이션 모델을 비교합니다.
세부 차이를 확인하세요. 왼쪽 모델은 일부 빨간 보도를 감지하지만, 오른쪽 모델은 감지하지 않습니다.
오디오 데이터, 이미지, 히스토그램, 텍스트, 동영상, 표 형식 데이터를 로깅하고, 이를 대화형으로 시각화하고 탐색할 수 있습니다. W&B에 대해 더 알아보려면 Tables, 그들의 내용을 살펴보고 문서.
대시보드를 CSV 파일로 내보내 추가 분석을 할 수도 있습니다. 또한 W&B는 내보내려는 데이터 유형에 따라 PNG, SVG, PDF, CSV 형식의 내보내기를 지원합니다.


코드 상태 저장

이것은 W&B에서 제가 가장 좋아하는 기능 중 하나입니다. 앞에서 이야기했듯이, 다른 요소들과 함께 코드도 추적하는 것은 매우 중요해집니다. 코드를 지속적으로 변경하다 보면, 특정 실험을 실행했을 때 코드가 정확히 어떤 상태였는지 확인할 방법이 필요합니다. W&B는 이를 자동으로 처리합니다. Git과 같은 버전 관리 도구를 사용하고 있다면, 클릭할 수 있는 상태를 자동으로 생성해 줍니다. 해당 항목을 클릭하면 GitHub 저장소의 그 특정 Git 상태로 바로 이동합니다.



데이터 + 모델 버전 관리

W&B는 데이터와 모델 버전 관리도 지원합니다. 특히 연구 중심 프로젝트에서는 데이터셋과 모델을 버전 관리하는 일이 매우 중요해집니다. 전체 데이터셋을 artifacts에 직접 저장하거나, S3, GCS 같은 다른 클라우드 스토리지나 로컬 스토리지의 데이터를 가리키는 artifact 참조를 사용할 수 있습니다. 이렇게 추적된 artifact는 이후 추론 파이프라인에서 재사용할 수 있으며, 몇 줄의 코드만으로 어디서든 다운로드할 수 있습니다.
데이터셋이나 모델의 특정 버전에 이름을 지정하고, 같은 이름을 사용해 해당 버전을 다운로드할 수도 있습니다.
W&B 대시보드에서 일반적으로 기록된 아티팩트는 다음과 같이 표시됩니다.

Artifacts 로깅에는 참고할 수 있는 추가 기능도 더 많이 있습니다. 문서.


협업 보고서

팀으로 작업 중이거나 다른 사람에게 결과를 공유해야 한다면, 이 기능은 판도를 바꿉니다. 기존 대시보드에서 시각화를 선택해 간단한 요약과 함께 보고서에 추가할 수 있습니다. 덕분에 Word나 PDF 형식의 별도 보고서를 만들지 않고도 아이디어를 쉽게 설명할 수 있습니다. 기존 W&B 프로젝트에서 보고서를 생성하는 데는 몇 분이면 충분하며, 팀은 물론 더 넓은 커뮤니티와도 손쉽게 공유할 수 있습니다.
다음은 W&B 문서에서 가져온 예시 보고서입니다



스크립트형 실행 알림

저처럼 한 번에 여러 실험을 줄줄이 걸어두고 산책을 나가는 타입이라면, 이 기능이 아주 유용할 것입니다.
기본적으로 W&B는 실행이 완료되거나 중단(crash)되면 이메일로 알림을 보냅니다(설정에서 변경 가능). 실행 완료/중단 알림으로 이메일함이 복잡해지는 것이 싫다면, Slack 채널을 연동해 거기로 알림을 받도록 설정할 수도 있습니다.
코드에 스크립트형 알림을 추가하면 W&B가 Slack이나 이메일로 알려줍니다. 이 기능을 사용하면 대시보드를 계속 들여다보거나 작��� 환경 근처에 있어야 할 필요가 없어 매우 유용합니다. 실행이 완료되었는지, 중단(crash)되었는지, 혹은 코드에 설정해 둔 사용자 지정 메시지가 있는지 등을 모바일에서도 바로 확인할 수 있습니다!
다음과 같이 스크립트형 알림을 설정할 수 있습니다:
wandb.alert(
title=f"{experiment_name}",
text=f"FOLD {fold} --> MAE: {mae}"
)
그리고 Slack(또는 이메일)에서 W&B 알림 메시지를 확인하세요


Weights & Biases에는 Sweeps, Private Hosting, Embedding projector 등 셀 수 없이 많은 기능이 있습니다. 이 글만으로 모두 다루기에는 분량이 이미 충분히 길어 자세한 소개는 생략합니다. 대신 공식 문서와 YouTube 영상을 살펴보며 기능을 익히고, 현재 또는 향후 프로젝트에 적용해 보시길 권합니다. 한 번 W&B를 사용해 보면, 자연스럽게 기본 실험 추적 도구로 자리 잡을 것입니다.

결론

이제 글의 끝까지 왔습니다. 끝까지 함께해 주셨다면 정말 대단합니다. 실험 추적과 관리의 중요성을 이해하고, 여기서 다룬 팁들을 실제 워크플로에 통합할 동기를 얻으셨길 바랍니다. 이 글에서 소개한 내용이 많기 때문에, 한 번에 모두 적용하는 것은 현실적으로 어렵습니다. 대신 한 번에 하나씩 도입해 보면서 본인에게 가장 잘 맞는 방법을 찾아가시길 권합니다.
실험 추적과 관리는 반복적인 학습 과정이며, 직접 손으로 해 보고 경험을 쌓으면서 익히게 됩니다. 실험을 효과적으로 ���적하고 관리하면 생산성이 높아지고 연구 프로젝트에서 겪는 여러 번거로움이 크게 줄어듭니다. 그 결과 현재 다루고 있는 문제 자체에 집중할 수 있게 됩니다.
이 글은 원래 Atharva Ingle이 다음 매체에 게재한 것입니다 jarvislabs.ai 웹사이트. 작성자의 허가를 받아 여기에도 재게시합니다.

이 글은 AI로 번역되었습니다. 오역이 의심되는 부분은 댓글로 알려 주세요. 원문 링크는 다음과 같습니다: 원문 보기