(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法

问题描述

        这个和之前的问题不太一样,这个是客户端请求之后,第一次可以正常运行,但是客户端第二次请求便会报错:RuntimeError: CUDA out of memory. Tried to allocate 2048.00 MiB (GPU 0; 11.00 GiB total capacity; 9.50 GiB already allocated; 11.37 MiB free; 10.52 GiB cached),而且是在执行过程中报了这样的错误,这就很奇怪,明明已经生成了需要的内容,为什么还会报显存不够的问题呢?

        之前这个程序在本机运行,不管用命令行运行几次,都可以正常运行,并不会报错啊!这就很诡异!为什么会在运行过程中报错呢?

        而之前其他程序报错,是在本机运行就会报错:RuntimeError: CUDA out of memory. Tried to allocate  10.52 GiB (GPU 0; 11.00 GiB total capacity; 11.37 MiB already allocated; 9.50 GiB free; 11.37 MiB cached)。在运行程序之初报这种错,很明显是因为模型和需要处理的数据太大,导致torch预估显存使用量都比你的可使用量都要大,那就一开始便注定了结局。

        那和这个也联系不到一起去啊!

初步分析

        报显存不够肯定是因为,我的显存不够。我倒要看看,显存,显存,你要去哪里呀~

 nvidia-smi

(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第1张图片 

 

         ok,fine!我的程序只占了10284M,总共还有将近2G显存,那应该是没问题的啊,怎么就跑不下去呢?

        肯定是后面的程序有问题,开始排查,哦哦哦原来如此:

(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第2张图片

 想不到还有个decode()步骤,这当然要用到显存了,而且2G还不够他用的,怎么办?只能把前面用不到的删删了:

(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第3张图片

        ok,执行一下看看效果: 

(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第4张图片

        注意看python项:由 10326MiB变为了10284MiB,这说明del确实有效的,分析请看:Python中的delicon-default.png?t=N6B9https://blog.csdn.net/crisschan/article/details/117016633

但是也有人给出了不同意见,我在这里不置可否,附上链接,大家根据自己项目自行判断。

深度学习:用del删掉不用的tensor真的能降低显存消耗吗icon-default.png?t=N6B9https://blog.csdn.net/weixin_48915167/article/details/128587304

进一步分析        

        回到正题,这部分减少的完全不够我用的啊关键是,那继续想办法,哦!有了,我把之前使用过不再需要的网络删除不就可以了吗?先.cuda,再释放缓存,在这里贴个示例:

(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第5张图片

         ok,作好了,果然又释放一些。

        但是,但是,再次运行还是跑不起来!代码和我都跑不了,怎么办呢?先吃饭吧!

再接着分析

        我运行的时候明明是每次命令行执行,都不会报out of cuda,这个程序就是运行完了就会把程序关闭,然后相关的显存清空,运行时如图:(已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第6张图片

        运行结束后如图: (已解决)在本机跑得好好的,连上客户端之后,第二次运行报错:RuntimeError:CUDA out of memory……显存不够导致程序再次运行不成功的原因分析即解决办法_第7张图片

         很明显,程序结束后就把显存清掉了,说明上述分析的是没有问题的,那问题在哪呢?

究极分析

        既然程序结束会清除显存,但是和客户端连接的时候还是会报显存错误,那我可要看看你到底安的什么心思了,用下面这条指令查看显卡的实时使用情况:

watch -n 1 -d nvidia-smi 

        竟然程序跑完之后显存占用还是10548Mib/12288Mib!!! 

        心机蛙摸你肚子,真相只有一个:再和客户端连接期间,程序是一直在跑的,那也就不会释放显存,他不释放,后面的程序就没地方运行,周而复始,后面的就一直堵在这。问题终于找到了,那解决的办法也很明了了:我只需要在每次程序运行结束时手动把显存中所有内容释放掉就可以了。

torch.cuda.empty_cache()

        ok,解决,无论访问多少次都不会因为程序而报显存的错误 。

另附

        在深度学习框架中,GPU 显存的释放通常是由框架自动处理的,但有时候你可能需要手动操作以确保显存被及时释放。以下是一些常见框架的释放 GPU 显存的方法:

在 TensorFlow 中,你可以使用以下方法释放 GPU 显存:

import tensorflow as tf

# 创建或训练模型

# 释放 GPU 显存
tf.keras.backend.clear_session()
在 PyTorch 中,显存的释放通常需要使用以下步骤:

import torch

# 创建或训练模型

# 释放 GPU 显存
torch.cuda.empty_cache()
对于 MXNet,你可以使用以下代码来释放显存:

import mxnet as mx

# 创建或训练模型

# 释放 GPU 显存
mx.ndarray.waitall()  # 等待所有操作完成

完结撒花

        在解决这问题提前,我一直觉得别人代码,没事别动,老翻人家内裤干什么?他写的烂那就是他的原因,我就要骂他。但是朋友们,骂人可带不来进步(虽然挺爽的),但是你能一直爽下去吗(一直骂也不是不行)?显然不太现实,所以还是多找找出路,多想想办法!

        所以啊,关注我,带你从小白的角度思考解决问题的方法!

你可能感兴趣的:(深度学习,人工智能,opencv,神经网络,机器学习,python,visual,studio)