def train_model_simple( model,train_loader, val_loader, optimizer, device, num_epochs, eval_freq,eval_iter,start_context,tokenizer ): train_losses = [] val_losses = [] track_tokens_seen = [] tokens_seen = 0 global_step = -1 for epoch in range(num_epochs): model.train() for input_batch, target_batch in train_loader: optimizer.zero_grad() loss = calc_loss_batch( input_batch, target_batch, model, device ) loss.backward() optimizer.step() tokens_seen += input_batch.numel() global_step += 1 if global_step % eval_freq == 0: train_loss, val_loss = evaluate_model( model, train_loader, val_loader, device, eval_iter ) train_losses.append(train_loss) val_losses.append(val_loss) track_tokens_seen.append(tokens_seen) print( f"Epoch: {epoch + 1}, " f"Global Step: {global_step}, " f"Train Loss: {train_loss:.4f}, " f"Val Loss: {val_loss:.4f}" ) generate_and_print_sample(model,tokenizer,device, start_context) return train_losses, val_losses, track_tokens_seen __ __