Thanks a lot, I believe I have done all of these, here is the bulk of my training snippet :
#moving model to cuda()
model.cuda()

#training core snippet
...
#activate training mode
model.train()

  end = time.time()
  for i, (input, target) in enumerate(train_loader):
    # measure data loading time
    data_time.update(time.time() - end)

    if args.use_cuda:
      target = target.cuda(async=True)
      input = input.cuda()
    input_var = torch.autograd.Variable(input)
    target_var = torch.autograd.Variable(target)

    # compute output
    output = model(input_var)
    loss = criterion(output, target_var) 
    
    # measure accuracy and record loss
    prec1, prec5 = accuracy(output.data, target, topk=(1, 5))
    losses.update(loss.item(), input.size(0))
    top1.update(prec1.item(), input.size(0)) 
    top5.update(prec5.item(), input.size(0)) 

    # compute gradient and do SGD step
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()