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 사용법을 건너 뛰시고 바로 코드 구현해보는 걸 추천!