CUDA out of memory

本文讲述了如何在遇到CUDA内存不足时,通过检查显存占用、进程管理以及调整代码中数据类型和梯度计算来解决问题,包括使用`nvidia-smi`监控GPU状态,设置`CUDA_VISIBLE_DEVICES`,优化模型运行等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在终端输入命令:nvidia-smi:

左边的0,1,2,3是4090的4张卡,Memory-Usage是显存占用,可以看出0,1,2卡都有程序在跑,可以换成空的卡3,在代码文件中添加以下代码:

os.environ["CUDA_VISIBLE_DEVICES"] = "3"

如果都没有空的卡,可以根据进程号(PID)检查正在跑的占用显存比较多的程序,有可能是僵尸程序,需要kill掉。

首先在终端输入:ps -aux | grep 2809712(PID号)

如果需要kill进程,则在终端输入以下指令:

kill PID号 或 kill -HUP PID号

如果消灭不了该进程,则寻找他的父进程:

ps -A -ostat,ppid,pid,cmd | grep PID号

-o 后面自定义输出字段,设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数。输出如下:

可见父进程号是3378394。消灭其父进程:kill -HUP 3378394

成功!

2、又一次遇到了CUDA out of memory的问题,但这次显存没问题,查看代码:

avg_att的type是dict,而att是一个tensor,将avg_att改为tensor类型。并且不用梯度应该要加上model.eval()和with torch.no_grad():这两句话,改为:

avg_att = torch.zeros(240,128)
model.eval()
with torch.no_grad():
    for batch_index, data_feature in enumerate(tqdm(dataloader)): 
        data_feature = data_feature.to(device) 
        att = model(data_feature)  
        avg_att[batch_index] = att.sum(dim=0)/float(2600) 

3、again and again...

类似的问题,data_embed_collect的type是list,att是一个tensor,这次直接把最后一句加一个cpu()改为:

label_collect.append(data_label.cpu())

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值