機械学習のモデル開発において、実験管理は非常に重要です。この記事では、Pytorchを用いたモデル学習の基本的な流れと、実験管理ツールであるWandbの使い方について解説します。
必要なライブラリのインストール
まず、必要なライブラリをインストールします。
!pip install torch>=1.9 torchvision wandb -qqq
モデルの定義
次に、学習させるモデルを定義します。ここでは、シンプルなCNNを例として使用します。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = torch.flatten(x, 1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
データの準備
モデルに入力するデータを準備します。ここでは、CIFAR10データセットを使用します。
import torchvision
import torchvision.transforms as transforms
def get_transforms(norm=0.5):
return transforms.Compose([transforms.ToTensor(),
transforms.Normalize((norm, norm, norm), (norm, norm, norm))])
def get_data(transforms, batch_size=4):
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transforms)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True, num_workers=2)
return trainloader
モデルの学習
定義したモデルを学習させます。
import torch.optim as optim
def get_predictions(model, inputs, optimizer):
optimizer.zero_grad()
return model(inputs)
def update_model(data, model, criterion, optimizer):
inputs, labels = data
preds = get_predictions(model, inputs, optimizer)
loss = criterion(preds, labels)
loss.backward()
optimizer.step()
return loss.item()
def save_model(model, path):
torch.save(model.state_dict(), path)
Wandbの設定
実験管理ツールであるWandbを使用するための設定を行います。
import wandb
from google.colab import userdata
wandb_api_key = userdata.get('WANDB_API_KEY')
!wandb login $wandb_api_key
学習の実行とログの記録
最後に、学習を実行し、Wandbを用いてログを記録します。
def train(config):
# setup training
with wandb.init(project='get_started1', config=config) as run:
config = run.config
transforms = get_transforms(config.norm)
data = get_data(transforms, config.batch_size)
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=config.lr, momentum=config.momentum)
# train model
for epoch in range(config.epochs):
for i, batch in enumerate(data, 0):
loss = update_model(batch, model, criterion, optimizer)
# log results
run.log({'epoch': epoch, 'loss': loss, "lr":config.lr})
path = './cifar_net.pth'
save_model(model, path)
config = {
'norm': 0.9,
'batch_size': 8,
'lr': 0.1,
'momentum': 0.8,
'epochs': 1
}
train(config)
注意点として、with wandb.init(...)
を使用することで、エラーが発生した場合でも確実にwandb.finish()
が呼び出されるようにしています。これにより、必要な情報が確実にアップロードされます。
以上が、PytorchとWandbを使ったモデル学習の基本的な流れです。実験管理を適切に行うことで、モデル開発の効率化を図ることができます。
ノートブック
Google Colaboratory
参考サイト
Hugging Faceトランスフォーマー | Weights & Biases 선적 서류 비치
Hugging Faceトランスフォーマー ライブラリは、BERTのような最先端のNLPモデルや、混合精度演算や勾配チェックポイントのようなトレーニング手法を簡単に利用できるようにしています。W&Bインテグレーションは、使いやすさを損なうことなく、インタラクティブな中央集約ダッシュボードに豊富で柔軟な実験トラッキングと...
コメント