Search

WandB

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
LLM 정리 노트
유형
머신 러닝
딥 러닝
LLM
부유형
MLOps
주요 레퍼런스
https://pebpung.github.io/wandb/2021/10/06/WandB-1.html
https://devbasket.tistory.com/58
https://docs.wandb.ai/ko/guides/?_gl=1*18hyotj*_gcl_au*NDUwODE5Mjg4LjE3Mjk1NjA4MzU.*_ga*MTMxNTM5NDc1OS4xNzI5NTYwODM1*_ga_JH1SJHJQXJ*MTczMDMzODAwMy4yLjAuMTczMDMzODAwMy42MC4wLjA.*_ga_GMYDGNGKDT*MTczMDMzODAwMy4yLjAuMTczMDMzODAwMy4wLjAuMA..
최종 편집 일시
2024/10/31 03:27
생성 일시
2024/10/24 07:13
13 more properties

Model Experiment Pipeline

MLOps

1.
ML 기반의 프로젝트 Design 하는 단계
2.
머신러닝 실험하고 개발하는 단계
3.
모델을 product로 배포하고 운영하는 단계
wandb는 해당 2번 단계에서 도움을 주는 툴이다.

필수 구성 요소

머신러닝을 구축하려면 여러가지 구성요소(configuration)가 필요하다.
그 중 대표적인 요소
1.
Dataset 머신러닝 모델을 학습 시키기 위한 데이터.
2.
Metric 모델의 성능을 측정을 위한 평가 지표.
3.
Model 해결하고자 하는 Task의 종류와 Data의 특성에 맞는 알고리즘.
4.
Hyper-parameter 모델링 성능을 높이기 위해 사용자가 직접 세팅해주는 값.

모델 실험

머신러닝 혹은 딥러닝 모델을 학습할 때, configuration 값을 적절하게 선택해야 한다.
예를 들어 모델의 파라미터를 최적화 시키려면 hyper-parameter를 적절하게 선택해야 한다.
하지만 처음부터 완벽한 값을 찾기는 어렵다.
우리가 원하는 결과를 얻기 위해서는 여러가지 hyper-parameter 값을 변경하며 다양한 실험을 해야 한다.
일일이 hyper-parameter를 변경하며 학습 경과를 지켜볼 경우
→ 학습자가 직관적으로 값을 변경하는 경우 다음과 같은 문제점이 발생
hyper-parameter를 변경하고, 성능을 체크하고, 다른 값으로 바꾸는 과정은 매우 비효율적이다.
실험이 많아지고 복잡해지면, 기록이 누락되고 방향을 잃을 수 있다.
여러 실험 결과를 비교하기 위해 정리하는 과정이 번거롭다.

wandb(Configuration)

wandb는 MLOps 플랫폼으로 머신러닝, 딥러닝을 학습하는데 필요한 다양한 기능들을 제공한다.
대표적으로 다음 기능을 갖추고 있다.
실험관리
하이퍼파라미터 튜닝
데이터, 모델 버저닝
모델 관리
데이터 시각화
협업 리포트

사용 방법

가입

project 생성하기

Pytorch Tutorial with WandB

1.
로그인
import wandb # 그냥 로그인 부터 할거면 wandb.login() wandb.init() # wandb web 서버와 연결 시켜주는 기능 # 이후 화면에서 api key 삽입 - 링크르 제공해준다. wandb: You can find your API key in your browser here: https://wandb.ai/authorize
Python
복사
2.
config setting
모델의 하이퍼파라미터, 데이터명 등 학습에 필요한 구성들을 그룹화
이 config 파일은 sweep을 할 때 중요하게 사용
config = { 'epochs': 5, 'classes':10, 'batch_size': 128, 'kernels': [16, 32], 'weight_decay': 0.0005, 'learning_rate': 1e-3, 'dataset': 'MNIST', 'architecture': 'CNN', 'seed': 42 } # 또는 hugging face
Python
복사
config = PPOConfig( model_name="lvwerra/gpt2-imdb", learning_rate=1.41e-5, log_with="wandb", ) sent_kwargs = {"top_k": None, "function_to_apply": "none", "batch_size": 16}
Python
복사
3.
예제 - Mnist
dataset 함수
def make_loader(batch_size, train=True): full_dataset = datasets.MNIST(root='./data/MNIST', train=train, download=True, transform=transforms.ToTensor()) loader = DataLoader(dataset=full_dataset, batch_size=batch_size, shuffle=True, pin_memory=True, num_workers=2) return loader
Python
복사
model 함수
class ConvNet(nn.Module): def __init__(self, kernels, classes=10): super(ConvNet, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(1, kernels[0], kernel_size=5, stride=1, padding=2), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) self.layer2 = nn.Sequential( nn.Conv2d(16, kernels[1], kernel_size=5, stride=1, padding=2), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) self.fc = nn.Linear(7 * 7 * kernels[-1], classes) def forward(self, x): out = self.layer1(x) out = self.layer2(out) out = out.reshape(out.size(0), -1) out = self.fc(out) return out
Python
복사
train 함수
def train(model, loader, criterion, optimizer, config): wandb.watch(model, criterion, log="all", log_freq=10) example_ct = 0 for epoch in tqdm(range(config.epochs)): cumu_loss = 0 for images, labels in loader: images, labels = images.to(device), labels.to(device) outputs = model(images) loss = criterion(outputs, labels) cumu_loss += loss.item() optimizer.zero_grad() loss.backward() optimizer.step() example_ct += len(images) avg_loss = cumu_loss / len(loader) wandb.log({"loss": avg_loss}, step=epoch) print(f"TRAIN: EPOCH {epoch + 1:04d} / {config.epochs:04d} | Epoch LOSS {avg_loss:.4f}")
Python
복사
실행
def run(config=None): wandb.init(project='test-pytorch', entity='pebpung', config=config) config = wandb.config train_loader = make_loader(batch_size=config.batch_size, train=True) test_loader = make_loader(batch_size=config.batch_size, train=False) model = ConvNet(config.kernels, config.classes).to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate) train(model, train_loader, criterion, optimizer, config) test(model, test_loader) return model
Python
복사

Sweep

Hyper Parameter 최적화 Tool
Hyper parameter를 사용자가 선택한 method로 최적화를 진행한다.
Sweep에서 제공하는 search 방식은 grid 방식, random 방식, bayes 방식이 있다.
선택한 search 방식으로 하이퍼 파라미터 튜닝이 완료 되면 WandB의 웹에서 제공되는 dashboard로 시각화된 모습을 볼 수 있다.
이렇게 시각화된 모습은 아래 그림과 같다.
Sweep은 자동으로 tuning해주는 기능 뿐만 아니라, 각각의 hyper parameter들이 metric(accuracy, loss 등)에 얼마나 중요한 지 알려주고 상관관계를 보여준다.

Sweep 사용법

Sweep을 실행하려면 꼭 필요한 2개의 단계가 있다.
Initialize the sweepSweep의 구성요소를 정의하고, 프로젝트에서 사용하기 위해 Sweep API로 초기화 하는 부분이다.
Run the sweep agent함수 또는 프로그램은 WandB 서버에서 실행 시킵니다.
1.
Initialize the sweep
Sweep의 구성요소를 정의하고, 프로젝트에서 사용하기 위해 Sweep API로 초기화 하는 부분
2.
Run the sweep agent
함수 또는 프로그램은 WandB 서버에서 실행
이 2가지 단계만 실행한다면 Sweep을 사용할 수 있다. : 참고 링크
코드를 통해 전체적인 process만 이해하고 싶으신 분들은 Sweep 사용법을 건너 뛰시고 바로 코드 구현해보는 걸 추천!