in diagnostics.py [0:0]
def scsg_diagnostics(epoch, args, train_loader, optimizer, model, criterion):
if (epoch == 1 or (epoch % 10) == 0) and optimizer.epoch >= optimizer.vr_from_epoch:
nbatches = len(train_loader)
mega_batch_size = optimizer.megabatch_size
recalibration_interval = optimizer.recalibration_interval
#print("interval, interval = {}".format(interval))
optimizer.logging_pass_start()
# Compute the snapshot
data_buffer = []
inner_iters = optimizer.recalibration_interval
megabatch_size = optimizer.megabatch_size
optimizer.recalibration_i = 0
for batch_idx, (data, target) in enumerate(train_loader):
batch_id = batch_idx
if args.cuda:
data, target = data.cuda(), target.cuda()
data, target = Variable(data), Variable(target)
data_buffer.append((data, target))
# Store megabatch gradients
def outer_closure():
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
return loss
loss = optimizer.step_outer_part(closure=outer_closure)
if len(data_buffer) == megabatch_size:
logging.info("Snapshot complete")
for interval in range(recalibration_interval):
logging.info("Interval: {}, recal_i: {}".format(interval, optimizer.recalibration_i))
optimizer.full_grad_init()
# Do a full gradient calculation:
for inner_batch_idx, (data, target) in enumerate(train_loader):
if args.cuda:
data, target = data.cuda(), target.cuda()
data, target = Variable(data), Variable(target)
def eval_closure():
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
return loss
optimizer.full_grad_calc(closure=eval_closure)
logging.info("Full grad calculation finished")
for inner_i in range(inner_iters):
data, target = data_buffer[inner_i]
def eval_closure():
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
return loss
optimizer.logging_pass(interval, closure=eval_closure)
logging.info("Logging pass finished")
# Take a single step at the end to progress in the interval
data, target = data_buffer[interval]
def eval_closure():
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
return loss
optimizer.step_inner_part(closure=eval_closure)
data_buffer = []
optimizer.recalibration_i = 0
return