(config, model, criterion, data_loader, optimizer, epoch, mixup_fn, lr_scheduler, model_ema=None)
| 223 | |
| 224 | |
| 225 | def train_epoch(config, model, criterion, data_loader, optimizer, epoch, mixup_fn, lr_scheduler, model_ema=None): |
| 226 | model.train() |
| 227 | |
| 228 | num_steps = len(data_loader) |
| 229 | batch_time = AverageMeter() |
| 230 | model_time = AverageMeter() |
| 231 | loss_meter = AverageMeter() |
| 232 | norm_meter = MyAverageMeter(300) |
| 233 | |
| 234 | start = time.time() |
| 235 | end = time.time() |
| 236 | |
| 237 | for idx, (samples, targets) in enumerate(data_loader): |
| 238 | iter_begin_time = time.time() |
| 239 | samples = samples.cuda(non_blocking=True) |
| 240 | targets = targets.cuda(non_blocking=True) |
| 241 | |
| 242 | if mixup_fn is not None: |
| 243 | samples, targets = mixup_fn(samples, targets) |
| 244 | |
| 245 | outputs = model(samples) |
| 246 | loss = criterion(outputs, targets) |
| 247 | |
| 248 | model.backward(loss) |
| 249 | model.step() |
| 250 | |
| 251 | if model_ema is not None: |
| 252 | model_ema(model) |
| 253 | |
| 254 | if (idx + 1) % config.TRAIN.ACCUMULATION_STEPS == 0: |
| 255 | lr_scheduler.step_update(epoch * num_steps + idx) |
| 256 | |
| 257 | torch.cuda.synchronize() |
| 258 | loss_meter.update(loss.item(), targets.size(0)) |
| 259 | norm_meter.update(optimizer._global_grad_norm) |
| 260 | batch_time.update(time.time() - end) |
| 261 | model_time.update(time.time() - iter_begin_time) |
| 262 | end = time.time() |
| 263 | |
| 264 | if idx % config.PRINT_FREQ == 0: |
| 265 | lr = optimizer.param_groups[0]['lr'] |
| 266 | memory_used = torch.cuda.max_memory_allocated() / (1024.0 * 1024.0) |
| 267 | etas = batch_time.avg * (num_steps - idx) |
| 268 | logger.info( |
| 269 | f'Train: [{epoch}/{config.TRAIN.EPOCHS}][{idx}/{num_steps}]\t' |
| 270 | f'eta {datetime.timedelta(seconds=int(etas))} lr {lr:.6f}\t' |
| 271 | f'time {batch_time.val:.4f} ({batch_time.avg:.4f})\t' |
| 272 | f'model_time {model_time.val:.4f} ({model_time.avg:.4f})\t' |
| 273 | f'loss {loss_meter.val:.4f} ({loss_meter.avg:.4f})\t' |
| 274 | f'grad_norm {norm_meter.val:.4f} ({norm_meter.avg:.4f}/{norm_meter.var:.4f})\t' |
| 275 | f'mem {memory_used:.0f}MB') |
| 276 | |
| 277 | epoch_time = time.time() - start |
| 278 | logger.info(f'EPOCH {epoch} training takes {datetime.timedelta(seconds=int(epoch_time))}') |
| 279 | |
| 280 | |
| 281 | @torch.no_grad() |
no test coverage detected