pytorch 运行一段时间后出现GPU OOM的问题
pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在每个step后用del删除一些变量,也可以使用torch.cuda.empty_cache()释放显存:
del targets, input_k, input_mask
torch.cuda.empty_cache()
这时能观察到GPU的显存一直在动态变化。
但是上述方式不是一个根本的解决方案,因为他受到峰值的影响很大。比如某个batch的数据量明显大于其他batch,可能模型处理该batch时显存会不够用,这也会导致OOM,虽然其他的batch都能顺利执行。
显存的占用跟这几个因素相关:
模型参数量
batch size
一个batch的数据 size
通常我们不希望改变模型参数量,所以只能通过动态调整batch-size,使得一个batch的数据 size不会导致显存OOM:
ilen = int(sorted_data[start][1]['input'][0]['shape'][0])
olen = int(sorted_data[start][1]['output'][0]['shape'][0])
# if ilen = 1000 and max_length_in = 800
# then b = batchsize / 2
# and max(1, .) avoids batchsize = 0
# 太长的句子会被动态改变bsz,单独成一个batch,否则padding的部分就太多了,数据量太大,OOM
factor = max(int(ilen / max_length_in), int(olen / max_length_out))
b = max(1, int(batch_size / (1 + factor)))
#b = batch_size
end = min(len(sorted_data), start + b)
minibatch.append(sorted_data[start:end])
if end == len(sorted_data):
break
start = end
此外,如何选择一个合适的batchsize也是个很重要的问题,我们可以先对所有数据按照大小(长短)排好序(降序),不进行shuffle,按照64,32,16依次尝试bsz,如果模型在执行第一个batch的时候没出现OOM,那么以后一定也不会出现OOM(因为降序排列了数据,所以前面的batch的数据size最大)。
还有以下问题
pytorch increasing cuda memory OOM 问题
改了点model 的计算方式,然后就 OOM 了,调小了 batch_size,然后发现发现是模型每次迭代都会动态增长 CUDA MEMORY, 在排除了 python code 中的潜在内存溢出问题之后,基本可以把问题定在 pytorch 的图计算问题上了,说明每次迭代都重新生成了一张计算图,然后都保存着在,就 OOM 了。
参考
CUDA memory continuously increases when net(images) called in every iteration
Understanding graphs and state
说是会生成多个计算图:
loss = SomeLossFunction(out) + SomeLossFunction(out)
准备用 sum来避免多次生成计算图的问题:
loss = Variable(torch.sum(torch.cat([loss1, loss2], 0)))
然而,调着调着就好了,和报错前的 code 没太大差别。估计的原因是在pycharm 远程连接服务器的时候 code 的保存版本差异问题,这个也需要解决一下。
还有个多次迭代再计算梯度的问题,类似于 caffe中的iter_size,这个再仔细看看。
(资源库 www.zyku.net)
原文链接:https://blog.csdn.net/zongza/article/details/98647490
栏 目:Python教程
下一篇:PyTorch dropout设置训练和测试模式的实现
本文标题:pytorch 运行一段时间后出现GPU OOM的问题
本文地址:https://www.zyku.net/python/9880.html
您可能感兴趣的文章
- 02-11pytorch交叉熵损失函数的weight参数的使用
- 02-11pytorch 如何把图像数据集进行划分成train,test和val
- 02-11pytorch 6 batch_train 批训练操作
- 02-11pytorch固定BN层参数的操作
- 02-11pytorch 如何实现HWC转CHW
- 02-10pytorch 使用半精度模型部署的操作
- 02-10pytorch 中nn.Dropout的使用说明
- 02-10浅谈pytorch中的dropout的概率p
- 02-10基于PyTorch实现一个简单的CNN图像分类器
- 02-10pytorch中.to(device) 和.cuda()的区别说明
- 02-10Pytorch 中net.train 和 net.eval的使用说明
- 02-10Pytorch 如何训练网络时调整学习率
- 02-10pytorch model.cuda()花费时间很长的解决
- 02-10Pytorch GPU内存占用很高,但是利用率很低如何解决
- 02-09PyTorch 如何自动计算梯度
- 02-09pytorch 实现计算 kl散度 F.kl_div()
- 02-09pytorch中LN(LayerNorm)及Relu和其变相的输出操作
- 02-09pytorch 实现多个Dataloader同时训练
- 02-09解决pytorch trainloader遇到的多进程问题
- 02-09Pytorch使用shuffle打乱数据的操作
最近更新
阅读排行
猜你喜欢
- 01-11未来街区-未来街区应用软件功能介绍
- 02-22dedecms调用当前文档url地址的标签
- 02-19php redis提高消息队列的实时性方法
- 10-09苹果13pro开启个人热点方法介绍
- 06-03HTML使用栅格布局实现六种筛子样式的
- 09-20真我gtneo2怎么设置息屏显示
- 11-24小米10s怎么关闭震动效果
- 01-12照片特效大师-照片特效大师应用软件功
- 03-30vivos9手机手势截屏设置方法
- 01-14WiFi速联精灵-WiFi速联精灵应用软件功