训练程式码 part.2
import torchfrom tqdm.auto import tqdmprogress_bar = tqdm(range(num_training_steps))# directory to save the modelsoutput_dir = "MLP_TrainedModels"for epoch in range(num_train_epochs): # Training model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() progress_bar.update(1) # Evaluation model.eval() losses = [] for step, batch in enumerate(eval_dataloader): with torch.no_grad(): outputs = model(**batch) loss = outputs.loss losses.append(accelerator.gather(loss.repeat(batch_size))) losses = torch.cat(losses) losses = losses[: len(eval_dataset)] # perplexity metric used for mask language model training try: perplexity = math.exp(torch.mean(losses)) except OverflowError: perplexity = float("inf") print(f">>> Epoch {epoch}: Perplexity: {perplexity}") # Save model accelerator.wait_for_everyone() unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save) if accelerator.is_main_process: tokenizer.save_pretrained(output_dir)
首先使用python内建的tqdm设定一个进度条来监控训练进度,然后为输出训练模型设定一个目录。接下来定义一个for循环来循环遍历epoch数,对于每个epoch,我们开始资料集的训练,循环遍历训练资料载入器,计算模型的输出,计算输出的损失,使用变压器导入加速器包对模型进行反向传播,使用优化器优化模型以最小化损失。并且应用学习率调度程序,使用优化器将累积梯度设为零,并更新了进度条。 我们这样做,直到完成一个时期的整个资料集的训练。然后在测试资料集上评估了一个时期的训练模型,计算了测试资料集上的损失,类似于训练期间的计算方式,计算模型的交叉熵损失,然后计算损失的指数以获得模型的 Perplexity。最后使用加速器保存预训练模型,并使用分词器保存有关模型的重要文件,例如分词器和词彙资讯。训练后的模型和设定档保存在输出目录资料夹 MLP_TrainedModels 中。