| from tqdm.notebook import tqdm |
| from Vathos.blocks import * |
|
|
|
|
| def symbolic_1d_ar_target_train(model, train_loader, val_loader, optimizer, scheduler, criterion, |
| device, NUM_EPOCHS=100, use_amp=False, CLIP_NORM=1.0, div=1): |
| scaler = torch.cuda.amp.GradScaler(enabled=use_amp) |
|
|
| steps_per_epoch = len(train_loader) // div |
|
|
| for epoch in range(NUM_EPOCHS): |
| model.train() |
| running_loss = 0.0 |
| pbar = tqdm(train_loader, desc=f"Epoch {epoch + 1}/{NUM_EPOCHS} Train", total=steps_per_epoch) |
| steps = 0 |
|
|
| for batch_x, batch_tgt in pbar: |
| batch_x = batch_x.to(device) |
| steps += 1 |
|
|
| optimizer.zero_grad() |
| with torch.amp.autocast('cuda'): |
| logits = model(batch_x) |
| loss = criterion( |
| logits[:, :-1, :].reshape(-1, logits.size(-1)), |
| batch_x[:, 1:].reshape(-1) |
| ) |
|
|
| scaler.scale(loss).backward() |
|
|
| scaler.unscale_(optimizer) |
| torch.nn.utils.clip_grad_norm_(model.parameters(), CLIP_NORM) |
| scaler.step(optimizer) |
| scaler.update() |
|
|
| scheduler.step() |
|
|
| running_loss += loss.item() |
| lr_now = optimizer.param_groups[0]['lr'] |
| pbar.set_postfix({'loss': running_loss / (pbar.n + 1), 'lr': lr_now}) |
|
|
| if steps >= steps_per_epoch: |
| break |
|
|
| model.eval() |
| val_loss = 0.0 |
| |
| if True: |
| for batch_x, batch_tgt, composer_idx in tqdm(val_loader, desc=f"Epoch {epoch + 1}/{NUM_EPOCHS} Val"): |
| batch_x = batch_x.to(device).requires_grad_(False) |
|
|
| logits = model(batch_x) |
| loss = criterion( |
| logits[:, :-1, :].reshape(-1, logits.size(-1)), |
| batch_x[:, 1:].reshape(-1) |
| ) |
| val_loss += loss.item() |
| if isinstance(model, VathosModel): |
| model.module.register_loss(loss.item()) |
|
|
| val_avg = val_loss / len(val_loader) |
| if isinstance(model, VathosModel): |
| model.module.register_epoch() |
| print(f"Epoch {epoch + 1} val avg loss: {val_avg:.4f}") |
|
|
|
|
| def symbolic_1d_ar_input_ids_train(model, train_loader, val_loader, optimizer, scheduler, criterion, |
| device, NUM_EPOCHS=100, use_amp=False, CLIP_NORM=1.0, spe=1000, val_steps=float('inf')): |
| scaler = torch.cuda.amp.GradScaler(enabled=use_amp) |
|
|
| steps_per_epoch = spe |
|
|
| for epoch in range(NUM_EPOCHS): |
| model.train() |
| running_loss = 0.0 |
| pbar = tqdm(train_loader, desc=f"Epoch {epoch + 1}/{NUM_EPOCHS} Train", total=steps_per_epoch) |
| steps = 0 |
|
|
| for batch_x in pbar: |
| batch_x = batch_x['input_ids'].to(device) |
| steps += 1 |
|
|
| optimizer.zero_grad() |
| with torch.amp.autocast('cuda'): |
| logits = model(batch_x) |
| loss = criterion( |
| logits[:, :-1, :].reshape(-1, logits.size(-1)), |
| batch_x[:, 1:].reshape(-1) |
| ) |
|
|
| scaler.scale(loss).backward() |
|
|
| scaler.unscale_(optimizer) |
| torch.nn.utils.clip_grad_norm_(model.parameters(), CLIP_NORM) |
| scaler.step(optimizer) |
| scaler.update() |
| if scheduler is not None: |
| scheduler.step() |
|
|
| running_loss += loss.item() |
| lr_now = optimizer.param_groups[0]['lr'] |
| pbar.set_postfix({'loss': running_loss / (pbar.n + 1), 'lr': lr_now}) |
|
|
| if steps >= steps_per_epoch: |
| break |
|
|
| model.eval() |
| val_loss = 0.0 |
| with torch.no_grad(): |
| |
| val_s = 0 |
| for batch_x in tqdm(val_loader, desc=f"Epoch {epoch + 1}/{NUM_EPOCHS} Val"): |
| batch_x = batch_x['input_ids'].to(device).requires_grad_(False) |
| val_s += 1 |
| if val_s >= val_steps: |
| break |
| logits = model(batch_x) |
| loss = criterion( |
| logits[:, :-1, :].reshape(-1, logits.size(-1)), |
| batch_x[:, 1:].reshape(-1) |
| ) |
| model.module.register_loss(loss.item()) |
|
|
| val_avg = model.module.get_mean_loss() |
| model.module.register_epoch() |
| print(f"Epoch {epoch + 1} val avg loss: {val_avg:.4f}") |
|
|
|
|
|
|
|
|