【科研小白系列】模型训练已经停止(强行中断)了,可GPU不释放显存,如何解决?

在这里插入图片描述

0、前言(问题描述)

最近好不容易用服务器把模型跑起来了,美滋滋地看他一轮一轮训练,感觉应该没啥问题,想着一个晚上训练完肯定没问题!

结果第二条早上来一看:

在这里插入图片描述
报错信息来看:

Traceback (most recent call last):
  File "myTrain.py", line 424, in <module>
    main()
  File "myTrain.py", line 140, in main
    scores_list, test_imgs, gt_list, gt_mask_list = test(models, inference_round, fixed_fewshot_list,
  File "myTrain.py", line 389, in test
    embedding_vectors = embedding_concat(embedding_vectors, test_outputs[layer_name], True)
  File "/Workpace_data/hfy_data/RegAD/utils/funcs.py", line 33, in embedding_concat
    z = F.fold(z, kernel_size=s, output_size=(H1, W1), stride=s)
  File "/home/lmf/anaconda3/env/anaconda/envs/unetr_pp/lib/python3.8/site-packages/torch/nn/functional.py", line 4811, in fold
    return torch._C._nn.col2im(
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 3.71 GiB. GPU 0 has a total capacity of 47.45 GiB of which 2.01 GiB is free. Process 2244006 has 26.29 GiB memory in use. Including non-PyTorch memory, this process has 19.12 GiB memory in use. Of the allocated memory 10.43 GiB is allocated by PyTorch, and 7.42 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation.  See documentation for Memory Management  (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)

这不是说我显存不够了吗!

使用nvidia-smi命令查看服务器显卡使用情况:

在这里插入图片描述
没错,我用的就是0号显卡,难道是实验室师兄师姐在训练模型?不应该呀!这个显存占用量和我模型训练的显存占用量极为相似,何况师兄师姐他们训练模型之前肯定会查看显卡的使用情况的!

后来我又尝试运行了一下模型训练,果不其然,又报错说显存容量不足,我强行终止程序后,再查看显卡情况:在这里插入图片描述
噫噫噫,这不是我程序开始运行时占用的显存吗?

哦~原来是强行终止模型训练,GPU没有释放显存的原因

一、解决方法

1、查看当前用户占用GPU情况

其实通过我前言部分的检查,大概可以证实是我强行终止程序而没有释放显存,但是以防万一,可以使用以下命令查看一下线程(看看是哪些用户在使用GPU):

top

在这里插入图片描述

2、查看占用显卡的进程

输入以下命令,看看有哪些进程在占用哪个显卡:

nvidia-smi

可以看到,主要是以下两个程序占用了我的0号显卡:

在这里插入图片描述

3、kill杀死进程

采用以下命令强行终止占用GPU的进程:

kill -9 进程的PID编号

上图可以看到,我需要强行终止的是22440062252511号进程:

于是我依次输入以下命令即可:

kill -9 2244006
kill -9 2252511

再次查看显卡使用情况,可以看到显存已经成功被释放:

在这里插入图片描述

二、切换GPU

如果确实是其他人在占用GPU,可以使用以下代码来切GPU:

在这里插入图片描述

# 手动指定GPU设备ID,例如使用 GPU 1 和 GPU 2
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"
# 检查是否可以使用CUDA
use_cuda = torch.cuda.is_available()
# 检查GPU数量并手动选择某个GPU(例如 GPU 0)
if use_cuda:
    if torch.cuda.device_count() > 1:
        print(f"使用 {torch.cuda.device_count()} 个 GPUs!")
        device = torch.device('cuda')  # 使用所有可见的GPU
    else:
        device = torch.device('cuda:2')  # 使用 GPU 2
else:
    device = torch.device('cpu')  # 如果没有CUDA则使用CPU

# 打印当前选择的设备
print(f"正在使用的设备: {device}")

可以看到成功切换到2号显卡了:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是瑶瑶子啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值