PyTorch模型训练的几个加速技巧

这里尝试一下网上找到pyorch模型训练加速技巧,尝试一下,看看加速的效果,然后尽可能分析一下加速在哪个地方。

1.有时我们会发现,使用Pytorch的模型,训着训着,越来慢了或者outofmemory,这时我们该怎么解决呢?

    主要是因为,模型可能在不断的产生临时变量,这个时候,我们可以设置程序每隔多少次进行一次清除操作:torch.cuda.empty_cache()

2.在数据读取速度不变的情况下,怎样进一步提高模型的训练速度呢?

    PyTorch 会默认使用 cuDNN 加速,并且cuDNN 里面是有很多加速算法,有些加速算法是针对大矩阵,有些加速算法是针对小矩阵,但 torch.backends.cudnn.benchmark=False,会导致,模型所选择的cuDNN里面的加速算法只是一个通用的,并不是最优。当 torch.backends.cudnn.benchmark=True的时候,模型就会为每一步选择一个最优cuDNN 加速算法,所以第一步的训练速度是慢于常规,但后面都是快于常规。

    但使用这个是有一个前提,模型结构在训练过程中是不变化的,传入数据批次和大小数也是不变的。

3.使用累计梯度做加速。

计算梯度、梯度更新,这两个步骤在每一个batch,都会执行。这里减少梯度更新的次数,来起到加速模型训练的作用。变相的增大了batch_size。不足之处是:会损失一定的精度。我尝试了一下该方法,对加速很有效,查到的资料显示,可以累积[1,10],具体选择 多少,没有说,做了一些实验,发现4的时候效果最好,算是速度和精度的一个balance。

示例:

    for epoch in range(config.num_epochs):
        print('Epoch [{}/{}]'.format(epoch + 1, config.num_epochs))
        for step, batch in enumerate(train_dataloader):
            batch[0] = torch.LongTensor(batch[0]).to(config.device)
            batch[1] = torch.LongTensor(batch[1]).to(config.device)
            loss, logits, hidden_states = model(batch[0], attention_mask=(batch[0] > 0), labels=batch[1])   # Forward pass
            loss_avg = loss / config.accumulation_steps # 多卡训练时,loss的计算方式
            loss_avg.mean().backward()  # Backward pass
            if (step + 1) % config.accumulation_steps == 0:  # Wait for several backward steps
                torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
                optimizer.step()
                model.zero_grad()   # Reset gradients tensors
            if total_batch % config.print_eval_info_step == 0:  # 可以设定打印acc等指标的步长
                label = batch[1].data.cpu()
                predic = torch.max(logits, 1)[1].cpu()
                train_acc = metrics.accuracy_score(label, predic)
                dev_acc, dev_loss = evaluate(model, val_dataloader, config)

4.训练数据预加载。

主要起作用的是BackgroundGenerator,示例:

新建一个文件datax.py,内容:

from torch.utils.data import DataLoader
from prefetch_generator import BackgroundGenerator

class DataLoaderX(DataLoader):

    def __iter__(self):
        return BackgroundGenerator(super().__iter__())

然后再加载数据的地方,将原来的DataLoader替换为DataLoaderX,即可。如下所示:

def split_train_eval_data(train, config):
    # Get text values and labels
    text_values = train['text'] # 训练数据
    tokenizer = config.tokenizer 
    all_input_ids = encode_fn(text_values, tokenizer, config) # 对训练数据编码  
    labels = encode_fn_labels(text_values, tokenizer) # 训练 数据的标签
    # Split data into train and validation
    dataset = TensorDataset(all_input_ids, labels)  # 将训练数据和labels捆绑起来
    train_size = int(config.ratio * len(dataset)) # 将完整的数据划分为训练数据和eval数据
    val_size = len(dataset) - train_size
    train_dataset, val_dataset = random_split(dataset, [train_size, val_size])
    # Create train and validation dataloaders :: , num_workers=10, pin_memory=True
    train_dataloader = DataLoaderX(train_dataset, batch_size=config.batch_size, shuffle=True) # 数据预加载
    val_dataloader = DataLoaderX(val_dataset, batch_size=config.batch_size, shuffle=True)
    return train_dataloader, val_dataloader

 

参考:

1.九大加速训练技巧:https://towardsdatascience.com/9-tips-for-training-lightning-fast-neural-networks-in-pytorch-8e63a502f565(翻译:https://jishuin.proginn.com/p/763bfbd31a84)

2.轻量化模型加速思考:https://jishuin.proginn.com/p/763bfbd31a84

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一种流行的深度学习框架,可以用于各种任务,如图像分类、自然语言处理、语音识别等。在PyTorch训练模型可以分为以下几个步骤: 1. 数据准备:首先需要准备好训练数据集和测试数据集。可以使用PyTorch提供的数据加载工具,如torchvision.datasets等,也可以自定义数据加载。对数据进行预处理,如图像数据进行归一化、数据增强等。 2. 定义模型:根据任务需求,选择合适的深度学习模型,如卷积神经网络、循环神经网络等,并定义模型的结构。 3. 损失函数:选择合适的损失函数,如交叉熵、均方误差等。 4. 优化器:选择合适的优化算法,如随机梯度下降、Adam等,并设置学习率、权重衰减等超参数。 5. 训练模型:将数据输入到模型中,计算损失并反向传播更新模型参数,重复该过程直到达到设定的停止条件。 6. 测试模型:使用测试数据集评估训练好的模型的性能,如准确度、召回率等。 7. 保存模型:将训练好的模型保存到硬盘上,以便后续使用。 在实际训练过程中,还需要注意以下几点: 1. GPU加速:如果拥有GPU资源,可以使用PyTorch的GPU加速功能,将计算转移到GPU上,加快训练速度。 2. 批量训练:将数据分批次输入到模型中进行训练,可以降低内存消耗和加快训练速度。 3. 学习率调整:在训练过程中,可以根据模型的性能调整学习率,如使用学习率衰减等策略。 4. 防止过拟合:可以使用正则化、dropout等技术防止模型训练集上过拟合。 5. 模型可视化:可以使用TensorBoard等工具对模型进行可视化,以便更好地理解模型训练过程和性能。 总之,PyTorch提供了丰富的工具和API,可以帮助用户轻松地训练深度学习模型。熟练掌握PyTorch训练流程和技巧,可以帮助用户更好地应对各种深度学习任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值