在终端输入命令: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())