当前位置: 首页 > news >正文

RuntimeError: CUDA out of memory

今天在训练模型的时候突然报了显存不够的问题,然后分析了一下,找到了解决的办法,这里记录一下,方便以后查阅。

:以下的解决方案是在模型测试而不是模型训练时出现这个报错的!

RuntimeError: CUDA out of memory

完整的报错信息:

Traceback (most recent call last):File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 420, in <module>main()File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 414, in maintrain_with_cross_validate(training_epochs, kfolds, train_indices, eval_indices, X_train, Y_train, model, losser, optimizer)File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 77, in train_with_cross_validateval_probs = model(inputs)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 235, in forwardx = self.camlp_mixer(x) # (batch_size, F, C, L)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/container.py", line 139, in forwardinput = module(input)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 202, in forwardx = self.time_mixing_unit(x)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 186, in forwardx = self.mixing_unit(x)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 147, in forwardx = self.activate(x)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_implreturn forward_call(*input, **kwargs)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/activation.py", line 772, in forwardreturn F.leaky_relu(input, self.negative_slope, self.inplace)File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/functional.py", line 1633, in leaky_reluresult = torch._C._nn.leaky_relu(input, negative_slope)
RuntimeError: CUDA out of memory. Tried to allocate 2.49 GiB (GPU 0; 23.70 GiB total capacity; 21.49 GiB already allocated; 550.81 MiB free; 21.53 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

因为自己写的程序训练完成一轮会有输出,所以这些信息是在模型预测过程中发生的

关键的报错信息:

RuntimeError: CUDA out of memory. Tried to allocate 2.49 GiB (GPU 0; 23.70 GiB total capacity; 21.49 GiB already allocated; 550.81 MiB free; 21.53 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

大体意思就是显存不够了。

通过下面的代码查看程序运行过程中显卡的状态:

nvidia-smi -l 1

模型加载完成后,此时的显卡状态:

在这里插入图片描述

模型训练过程中显卡的状态:

在这里插入图片描述

模型训练完成,开始模型预测阶段,并且是数据输入模型之后,紧接着出现如下的显卡状态,并且这个状态持续时间很短,在显示过程中,只有一次输出结果是这样的:

在这里插入图片描述

紧接着程序报错,显卡内存被释放,显卡的任务栏中,运行的程序也没有了:

在这里插入图片描述

然后,就感觉很奇怪,觉得是梯度的问题,因为在训练的时候很正常,然后模型预测就出现问题了,然后模型训练需要梯度信息,模型预测不需要梯度信息,就尝试着解决梯度的问题:

就是在模型训练代码的前面加入下面这句话:

with torch.no_grad():

更改后的代码如下所示:

with torch.no_grad():# validationmodel.eval()inputs = x_eval.to(device)val_probs = model(inputs)val_acc = (val_probs.argmax(dim=1) == y_eval.to(device)).float().mean()# print(f"Eval : Epoch : {iter} - kfold : {kfold+1} - acc: {val_acc:.4f}\n")epoch_val_acc += val_acc

更改之后模型预测阶段显卡的状态如下所示:

在这里插入图片描述
然后开始新一轮的训练过程,显卡的显存占用情况也没有再发生变化。

这样就不再报错了!!!

http://www.lryc.cn/news/4282.html

相关文章:

  • Kubernetes1.25中Redis集群部署实例
  • C++11实现计算机网络中的TCP/IP连接(Windows端)
  • Spring框架自定义实现IOC基础功能/IDEA如何手动实现IOC功能
  • pip离线安装windows版torch
  • Redis核心知识点
  • 14. 最长公共前缀
  • SignalR注册成Windows后台服务,并实现web前端断线重连
  • 【前端笔试题二】从一个指定数组中,每次随机取一个数,且不能与上次取数相同,即避免相邻取数重复
  • 专栏关注学习
  • 【手写 Vuex 源码】第八篇 - Vuex 的 State 状态安装
  • Mac下拉式终端的安装与配置 (iTerm2)
  • 使用 Spring 框架结合阿里云 OSS 实现文件上传的代码示例
  • 神经网络基础知识
  • SpringBoot开发规范部分通用模板+idea配置【项目通用-1】
  • 程序的机器级表示part3——算术和逻辑操作
  • 基于YOLOV5的钢材缺陷检测
  • Session与Cookie的区别(三)
  • 七大设计原则之接口隔离原则应用
  • 【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc
  • JavaScript HTML DOM - 改变CSS
  • mycat连接mysql 简单配置
  • Spring常用注解
  • I.MX6ULL内核开发9:kobject-驱动的基石
  • Docker-harbor私有仓库
  • Java之动态规划之子序列问题
  • java ArrayList
  • 前端——周总结系列四
  • Linux重定向符、管道符讲解
  • 【C++】多态
  • 分布式项目-品牌管理(5、6)