训练模型时,一般我们会把模型model,数据data和标签label放到GPU显存中进行加速。

但有的时候GPU Memory会增加,有的时候会保持不变,以及我们要怎么清理掉一些用完的变量呢?

下面让我们一起来探究下原理吧!

一、pytorch训练模型

只要你把任何东西(无论是多小的tensor)放到GPU显存中,那么你至少会栈1000MiB左右的显存(根据cuda版本,会略有不同)。这部分显存是cuda running时固有配件必须要占掉的显存,你先训练过程汇总也是无法释放的。

import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 把一个很小的tensor加到GPU显存中(大约2MiB)
x = torch.randn((2, 3), device=device) 

现在我再放入一个比较大的tensor,GPU显存升到了1919MiB

y = torch.randn((200, 300, 200, 20), device=device)

也就是说当你有个新的东西加进去时,GPU显存会不断扩大。

二、batch训练模型时,GPU显存的容量会保持不变?

但是为什么我们像下面这样拿出一个个batch训练模型时,GPU显存的容量会保持不变的呢?

batch_loss = []
for epoch in range(self.epoch):
    pbar = enumerate(tqdm(self.train_dataloader, desc="Training Bar"), 0)
    for i, (inputs, labels) in pbar:
        inputs = inputs.to(self.device) # 放到GPU显存中
        labels = labels.to(self.device) # 放到GPU显存中
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)  
        batch_loss.append(loss)
        loss.backward()
        optimizer.step()

这实际上跟cuda的内存管理有关,但你的一块内存不再由引用它的变量时,他就不再是Active memory。他会残留在一个队列中,如果下一次有新的东西进来,那就会把他挤出队列(FIFO),当然如果新进来的东西和你那部分空间的大小差不多,那么出去一块空间,又进来一块空间,那么看上去你的GPU显存就不会有增加,看上去是一直不变。这就解释了一个个batch训练模型时GPU显存不变的原因。

当然如果新加进来的东西很多,就是那些unactivate的memory全部被挤出还是放不下新的东西,那GPU的显存就会增加了。(有点类似C++中的capacity增加的情况)

实际运行中,我们会发现这个队列capacity会有个阈值(这个阈值好像不是固定的),当你还没到达这个阈值时不会触发垃圾回收机制(即清理unactivate memeory的空间)

也就是说我不断运行下面代码

y = torch.randn((200, 300, 200, 20), device=device)

GPU显存会增加到9247MiB在这里插入图片描述

这时再加入y,容量不再增加,会把原来unactivate的memory挤掉。

三、如何释放GPU显存空间

那么我们要怎么样释放掉空间呢

我们上面很多空间原来是被y指向的,后来y指向新的地方,那这些空间都是残留的,我们可以用下面命令继续释放(如果你想释放的话)

torch.cuda.empty_cache()

上述命令可能要运行多次才会释放空间,我运行了大概5次吧

残留内存成功被释放
在这里插入图片描述

现在这里面GPU显存 = 基础配置(1001MiB) + y(918MiB) + x(忽略不计)

最后我们再来把y这部分释放掉

y = 2,那么原来y所指的那部分显存空间就会变成unactivate,我们可以使用torch.cuda.empty_cache()把这部分空间释放掉

最终只剩下基础配置的GPU显存占用(这部分已经无法释放了)
在这里插入图片描述

四、torch.cuda.memory_summary()查看显存信息

使用print(torch.cuda.memory_summary())可以看到更多关于cuda显存的信息

五、写在最后

经过上面的摸索,我感觉这部分内容跟操作系统的内存管理有点像,所以说计算机的那几门基础课真的很重要,大家都要好好学一学!

当然实际中cuda的显存管理肯定没有那么简单,有兴趣的同学可以继续探究下。

前言训练模型时,一般我们会把模型model,数据data和标签label放到GPU显存中进行加速。但有的时候GPU Memory会增加,有的时候会保持不变,以及我们要怎么清理掉一些用完的变量呢?下面让我们一起来探究下原理吧!pytorch训练只要你把任何东西(无论是多小的tensor)放到GPU显存中,那么你至少会栈1000MiB左右的显存(根据cuda版本,会略有不同)。这部分显存是cuda running时固有配件必须要占掉的显存,你先训练过程汇总也是无法释放的。import torch
如果在python内调用pytorch有可能显存GPU占用不会被自动释放,此需要加入如下代码 torch.cuda.empty_cache() 我们来看一下官方文档的说明 Releases all unoccupied cached memory currently held by the caching allocator so that those can be used in other GPU application and visible in nvidia-smi. empty_cache() doesn’t increase the amount of GPU me
跑模型出现RuntimeError: CUDA out of memory.错误 查阅了许多相关内容,原因是:GPU显存内存不够 简单总结一下解决方法: 将batch_size改小。 取torch变量标量值使用item()属性。 可以在测试阶段添加如下代码: with torch.no_grad(): # 停止自动反向计算梯度 https://wisdomai.xyz/tool/pytorch/archives/2301 https://ptorch.com/news/160.html 作者:菜叶儿掉啦
可以看到cuda驱动等安装没有问题。 进程序去看.cuda()或者.todevice之类代码,看程序确实放在GPU上了,故排除 但是在查看代码是看到这里是一个and,参数args.no_cuda是设置的Flase,所以问题因为在torch.cuda.is_available(),没有获得cuda加速。 查看深度学习环境搭建torch.cuda.is_available()这里返回了
PyTorch 在训练和预测的候,出现显存一直增加的问题,占用显存越来越多,甚至导致最终出现 out of memory 问题。 1. 显存管理(Memory Management) Memory management PyTorch 采用缓存分配器(caching memory allocator) 机制以加速内存分配(memory allocations),使得在不需要设备同步(d...
我想要对一个大批量的数据分批输入模型得到所有的embedding,但是过程进行到中间报 cuda out of memory。经查勘是因为早些的embedding没有及cuda释放内存导致后面的model无法进行forward。 只需要pytorch的tensor.cpu()就可以释放了。 举个例子: embeddings=[] for batch in data_loader: embedding_batch=model(input_data) embeddings.append(e
Pytorch 训练候会因为加载的东西过多而爆显存,有些候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法。 使用torch.cuda.empty_cache()删除一些不需要的变量代码示例如下: output = model(input) except RuntimeError as exception: if "out of...
torch.cuda.outofmemoryerror: cuda out of memory,意思是在使用PyTorch深度学习库GPU内存不足,无法完成计算。这通常是因为训练的数据集过大或模型过于复杂,导致需要大量的显存来存储计算图和中间计算结果。 为了解决这个问题,可以尝试以下解决方案: 1. 减小batch size:可以适当降低每次训练的batch size,以减少GPU内存的使用。 2. 减小模型规模:可以减少模型的规模,去掉一些不必要的特征或层。 3. 使用更大的GPU:如果你的电脑配备了多个GPU,可以尝试使用更大的GPU。 4. 使用分布式训练:可以使用多台GPU来分别存储数据和计算图,从而减少单个GPU的负担。 5. 释放不必要的GPU内存:可以使用torch.cuda.empty_cache()方法来释放不必要的GPU内存。 总之,要解决torch.cuda.outofmemoryerror: cuda out of memory问题,需要适当调整模型和训练参数,以使GPU能够更有效地利用内存
问题解决:Pycharm无法跳转到自己定义的模块 Cannot find declaration to go to(mark xxx as source root) 爱冒险的manen: 原来如此 解决了 多谢解答 看来还是python基础不牢固啊 问题解决:Pycharm一直卡在Uploading PyCharm helpers && Python Interpreter... Python helpers are not copied yet 抓个马尾女孩: win系统在哪 深入理解NLP中LayerNorm的原理以及LN的代码详解 捡起一束光: 你说的参考资料是CV领域的LayerNorm 深入理解NLP中LayerNorm的原理以及LN的代码详解 捡起一束光: Transformer中的LayerNorm是按照一个个单词去算mean和var的,可以看下源码哈 深入理解NLP中LayerNorm的原理以及LN的代码详解 shuoyes123: 我觉得作者手画的layerNorm图解有问题,查看作者的参考资料1,里面讲解layerNorm时,说求LayerNorm时对于N,C,H,W,保留N维度(即批量的维度)。而作者图解时明显是以样本一中一个单词的embedding求mean和var,我觉得应该是对所有单词加起来在求mean和var