๐ WandB๊ฐ ์ ํ์ํ ๊น?
1. Model Experiment Pipeline
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ ์ ์๋ฏ, MLOps๊ณผ์ ์ ํฌ๊ฒ 3๋จ๊ณ๋ก ๋๋๋ค.
โ Project Design
โ Experiment & Development
โ ๋ฐฐํฌ ๋ฐ ์ด์
์ด์ค, 2๋จ๊ณ์ธ "์คํ์ ๋์์ ์ฃผ๋ Tool"์ค ํ๋๊ฐ ๋ฐ๋ก WandB์ด๋ค.
(cf. TensorBoard๋ ์กด์ฌ.)
2. Configuration
ML๊ตฌ์ถ์ ์ํ ํ์๊ตฌ์ฑ์์๋ก ๋ํ์ ์ธ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
โ Dataset
โ Metric
โ Model
โ Hyper-parameter
Training๊ณผ์ ์์, ์ด Configuration๊ฐ์ ์ ์ ํ๊ฒ ์ ํํด์ค์ผํ๋ค.
๐ง Batch size์ ๋ํ์ฌ
Data๋ Model์ ์ข ๋ฅ์ ๋ฐ๋ผ ์ ์ ํ Batch_size๊ฐ ์กด์ฌํ๊ธฐ์
batch_size๋ฅผ ๋๋ฌด ์์๊ฐ์ด๋ ํฐ๊ฐ์ ์ฐ๋ฉด ์คํ๋ ค ํ์ต์ด ์ ์๋๋ ๊ฒฝํฅ์ด ์กด์ฌํ๋ค.
cf) ํน์ ํ ๊ฐ์คํ์ ์ฐ์ญ์ ์ผ๋ก ์ฆ๋ช ๊ฐ๋ฅํ ๋,
batch size๋ฅผ 2๋ฐฐ ์ฆ๊ฐ์ํค๋ฉด step size๋ √2๋ฐฐ ์ฆ๊ฐ์์ผ์ผํ๋ค.
cf) batch size๋ฅผ ์ฆ๊ฐ์์ผฐ๋๋ฐ๋ ์ด epoch์๋ฅผ ๊ทธ๋๋ก ๋๋ฉด
ํ epoch๋น iteration์๊ฐ ์ค์ด๋ค๊ธฐ์
๊ทธ๋งํผ gradient๋ก parameter update๋ฅผ ๋ ์ํค๋ ๊ฒ์ด๋ฏ๋ก
Loss๊ฐ์์๋๊ฐ ๋๋ ค์ ธ ํ์ต์ด ์ ์๋ ์๋ ์๋ค.
๊ทธ๋ ๊ธฐ์ ์ ์ ํ Configuration์ค์ ์ ์คํ์์ ์ด๋ค.
ํนํ, Dataset์ Data Augmentation
Metric์ ์ถ๊ฐํ๊ฑฐ๋ ๊ต์ฒดํ๊ณ , Model๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ์๊ฐ์ ์๋์ ์ผ๋ก ์ ์ ์๊ฐ์ด ๋ค์ง๋ง
Hyper-parameter Tuning์ ๊ฒฝ์ฐ ์ ์ ํ ๊ฐ์ ์ฐพ๊ธฐ ์ํด์๋ ์๋นํ ๋ง์ ์๊ฐ์ ํ ์ ํด์ผํ๋ค.
Model์ parameter ์ต์ ํ๋ฅผ ์ํด Hyper-parameter๋ฅผ ์ ์ ํ ์กฐ์ ํด์ผํ๊ณ , ์ด๋ Hyper-parameter๋ฅผ ๋ณ๊ฒฝ์ํค๋ฉฐ ๋ค์ํ ์คํ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ์ฌ๋์ด ์ผ์ผํ ํ๋ค๋ฉด?
์ฆ, Hyper-parameter๋ฅผ ์ฌ๋์ด ์ง์ ์ผ์ผํ tuningํ๋ ์์ ์
๋งค์ฐ ๋นํจ์จ์ ์ด๊ณ , ๊ธฐ๋ก์ด ๋๋ฝ๋ ์๋ ์๊ณ ์ด๋ฅผ ์๊ธฐ๋ก ์ ๋ฆฌ๊น์ง ํด์ผํ๋,
์ข
ํฉ๊ณ ๋ฏผ3์ข
์ธํธ๋ผ ํ ์ ์๊ฒ ๋ค.
๐ WandB?
WandB(Weights & Biases)๋ ๋ ์ต์ ํ๋ ๋ชจ๋ธ์ ๋น ๋ฅธ์๊ฐ๋ด์ ๋ง๋ค ์ ์๊ฒ ๋์์ฃผ๋, ML Experiment Tracking Tool์ด๋ค.
์ฃผ์๊ธฐ๋ฅ
W&B Platform
- Experiments: ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์คํ์ ์ถ์ ํ๊ธฐ ์ํ Dashboard ์ ๊ณต.
- Artifacts: Dataset version ๊ด๋ฆฌ์ Model version ๊ด๋ฆฌ.
- Tables: Data๋ฅผ logingํ์ฌ W&B๋ก ์๊ฐํํ๊ณ queryํ๋ ๋ฐ ์ฌ์ฉ.
- Sweeps: Hyper-parameter๋ฅผ ์๋์ผ๋ก tuningํ์ฌ ์ต์ ํ ํจ.
- Reports: ์คํ์ document๋ก ์ ๋ฆฌํ์ฌ collaborators์ ๊ณต์ .
๐ W&B Experiments. ํจ์ ๋ฐ ์์
๋ชจ๋ธํ์ต ์, ๋ชจ๋ธ ํ์ต log๋ฅผ ์ถ์ ํ์ฌ Dashboard๋ฅผ ํตํด ์๊ฐํ
์ด๋ฅผ ํตํด ํ์ต์ด ์ ๋๊ณ ์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค.
1. config setting
W&B์คํ์ ์ํด configํ์ผ์ด ํ์ํ๊ธฐ์
Hyper-parameter, Data๋ช ๋ฑ ํ์ต์ ํ์ํ ๊ตฌ์ฑ๋ค์ ๊ทธ๋ฃนํํ๋ค.
๋ํ, ์ด configํ์ผ์ sweep์ ์ค์ํ๊ฒ ์ฌ์ฉ๋๋ค.
config = {
'dataset': 'MNIST',
'batch_size': 128,
'epochs': 5,
'architecture': 'CNN',
'classes':10,
'kernels': [16, 32],
'weight_decay': 0.0005,
'learning_rate': 1e-3,
'seed': 42
}
2. Dataset with DataLoader
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
3. CNN 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
์ถ๊ฐ์ ์ผ๋ก W&B๋ ๋ชจ๋ธ์ weights์ bias๊ฐ์ parameter๋ฅผ ์ถ์ ํ ์ ์๋ค.
์ด๋ฅผ ํตํด ํ์ต ๋์ค weights์ histogram์ด๋ distribution์ ํตํด ์ํํ ํ์ต๋ฐฉํฅ์์ ์ด ๊ฐ๋ฅํ๋ค.
4. 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}")
wandb.log()ํจ์๋ฅผ ํตํด lossํจ์๋ฅผ ์๊ฐํ ํ ์ ์์.
์ด๋, step์ epoch์ผ๋ก ๋ฐ์ avg_loss๊ฐ์ ๊ธฐ๋กํ๋ ๊ฒ์ ์ ์ ์๋ค.
wandb.watch()๋ Dashboard์์ ์คํ log๋ฅผ ์๊ฐํํ๋ ์ญํ ์ ์ํ.
5. Run ํจ์
def run(config=None):
wandb.init(project='MNIST', entity='๊ณ์ ๋ช
', 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
wandb.int()์ผ๋ก wandb web์๋ฒ์ ์ฐ๊ฒฐ.
cf) project์ entity๋ฅผ ๊ธฐ์ ๊ฐ๋ฅํ ๊ณณ
- config ์ค์ ํ๋ ํ์ผ (config.py ํน์ config.yaml)
- wandb.sweep()
- wandb.init()
- wandb.agent()
6. ๊ฒฐ๊ณผ
์คํ๊ฒฐ๊ณผ, ๊ฐ ์ํญ๋ง๋ค ํด๋น Layer์ ์ ํ๋๋ Gradient๊ฐ๋ค์ ํ์ธํ ์ ์๋ค.
์ถ๊ฐ์ ์ผ๋ก ํด๋น epoch์ ๋ํ gradient distribution์ ๊ฒฝ์ฐ ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๋ค ๋์ผ๋ฉด ์์ ๊ทธ๋ฆผ์ฒ๋ผ ํ์ธ๊ฐ๋ฅํ๋ค.
'Deep Learning : Vision System > Pytorch & MLOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ฅPyTorch 2.2]: transformv2 , torch.compile (0) | 2024.01.31 |
---|---|
[WandB] Step 3. WandB ์๊ฐํ ๋ฐฉ๋ฒ. (0) | 2024.01.09 |
[WandB] Step 2. WandB Sweeps (2) | 2024.01.09 |