释放pytorch占用的gpu显存_Pytorch 节省显存的训练方法总结

本文总结了在PyTorch中训练模型时如何有效节省GPU显存的几种方法,包括清理GPU缓存、改进反向传播中activation的存储方式、使用NVIDIA apex进行16位混合浮点运算,以及结合这些方法来提高训练效率。
摘要由CSDN通过智能技术生成

前言

最近的工作中,用到了Pytorch框架训练医学图像分割模型。精心设计的模型经常会因为显存不足而失败。减小模型训练过程中对显存的占用,可能我们能想到最简单的方法就是减小batchsize,减少卷积核数量,裁剪输入图像的大小等。但是,以上方法可能会影响模型性能。经过多次尝试,总结了几种尽可能不改变模型结构,不影响模型性能且能够节省显存的训练方法。

清理GPU缓存

Pytorch提供了torch.cuda.empty_cache()函数用来清理GPU的缓存数据,在实际的模型训练中,我们可以将此函数与异常处理相结合,一旦发生显存溢出,异常处理机制可以捕获异常信息,清理GPU缓存,以保证模型正常训练。总体实现代码如下:

...

try:

output_data = model(input_data)

loss = calcloss(output_data,input_label)

...

except RuntimeError as exception:

if "out of memory" in str(exception):

print("GPU 显存不足!")

if hasattr(torch.cuda,"empty_cache"):

torch.cuda.empty_cache()

else:

raise exception

...

此方法能够起作用的前提是模型自身占用显存较小,如果模型过大,很容易丢失大量训练数据,影响模型性能。

改进反向传播中activation

PyTorch支持使用多张显卡进行并行训练,可以使用`torch.nn.DataParallel`或`torch.nn.parallel.DistributedDataParallel`来实现。以下是使用`torch.nn.DataParallel`的示例代码: ```python import torch import torch.nn as nn from torch.utils.data import DataLoader # 定义模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1) def forward(self, x): x = self.fc1(x) x = torch.relu(x) x = self.fc2(x) return x # 定义数据集 class MyDataset(torch.utils.data.Dataset): def __init__(self): self.data = torch.randn(100, 10) self.targets = torch.randn(100, 1) def __getitem__(self, index): return self.data[index], self.targets[index] def __len__(self): return len(self.data) # 定义训练函数 def train(model, dataloader, optimizer, criterion): model.train() for i, (inputs, targets) in enumerate(dataloader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() # 创建模型、数据集、数据加载器、优化器、损失函数 model = MyModel() dataset = MyDataset() dataloader = DataLoader(dataset, batch_size=8, shuffle=True) optimizer = torch.optim.SGD(model.parameters(), lr=0.01) criterion = nn.MSELoss() # 使用DataParallel进行多GPU并行训练 model = nn.DataParallel(model) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model.to(device) for epoch in range(10): train(model, dataloader, optimizer, criterion) ``` 在上面的代码,我们首先定义了一个模型`MyModel`和一个数据集`MyDataset`。然后,我们使用`DataLoader`将数据集加载到内存。接下来,我们创建了一个优化器和一个损失函数。最后,我们将模型移到GPU上,并使用`DataParallel`对其进行并行处理。在训练循环,我们调用`train`函数来训练模型。`train`函数的参数分别是模型、数据加载器、优化器和损失函数。由于我们在模型上调用了`DataParallel`,因此在训练循环,我们不需要手动处理多个GPU的并行计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值