Skip to content

Instantly share code, notes, and snippets.

@vfdev-5
Last active August 17, 2018 22:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vfdev-5/0c0f3136fba275b3f35d0d52dd781ab0 to your computer and use it in GitHub Desktop.
Save vfdev-5/0c0f3136fba275b3f35d0d52dd781ab0 to your computer and use it in GitHub Desktop.
Ignite training with online metrics profiling

Just run as

python -m cProfile -o run.prof script.py
from __future__ import print_function
from argparse import ArgumentParser
from torch import nn
from torch.optim import SGD
from torch.utils.data import DataLoader
import torch
import torch.nn.functional as F
from torchvision.transforms import Compose, ToTensor, Normalize
from torchvision.datasets import FakeData
from torchvision.models.resnet import resnet34
from ignite.engine import Events, Engine, _prepare_batch
from ignite.metrics import CategoricalAccuracy, Loss, TopKCategoricalAccuracy
def get_data_loaders(train_batch_size, val_batch_size):
data_transform = Compose([ToTensor()])
train_loader = DataLoader(FakeData(size=1000, image_size=(3, 224, 224), num_classes=10,
transform=data_transform, target_transform=lambda t: t.long()),
batch_size=train_batch_size, shuffle=True)
val_loader = DataLoader(FakeData(size=1000, image_size=(3, 224, 224), num_classes=10,
transform=data_transform, target_transform=lambda t: t.long()),
batch_size=val_batch_size, shuffle=False)
return train_loader, val_loader
def run(train_batch_size, val_batch_size, epochs, lr, momentum, log_interval):
train_loader, _ = get_data_loaders(train_batch_size, val_batch_size)
model = resnet34(pretrained=False, num_classes=10)
device = 'cpu'
if torch.cuda.is_available():
device = 'cuda'
loss_fn = F.cross_entropy
optimizer = SGD(model.parameters(), lr=lr, momentum=momentum)
if device:
model.to(device)
def process_function(engine, batch):
model.train()
optimizer.zero_grad()
x, y = _prepare_batch(batch, device=device)
y_pred = model(x)
loss = loss_fn(y_pred, y)
loss.backward()
optimizer.step()
return [loss.item(), y_pred, y]
trainer = Engine(process_function)
output_transform = lambda x: [x[1], x[2]]
metrics={
'accuracy': CategoricalAccuracy(output_transform=output_transform),
'topk': TopKCategoricalAccuracy(output_transform=output_transform),
'xentropy': Loss(loss_fn, output_transform=output_transform)
}
for name, metric in metrics.items():
metric.attach(trainer, name)
@trainer.on(Events.ITERATION_COMPLETED)
def log_training_loss(engine):
iter = (engine.state.iteration - 1) % len(train_loader) + 1
if iter % log_interval == 0:
print("Epoch[{}] Iteration[{}/{}] Loss: {:.2f}"
"".format(engine.state.epoch, iter, len(train_loader), engine.state.output[0]))
trainer.run(train_loader, max_epochs=epochs)
print(trainer.state.metrics)
run(96, 64, 20, 0.001, 0.1, 10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment