显存充足却提示out of memory

2023-10-28 14:28
文章标签 memory 提示 显存 充足

本文主要是介绍显存充足却提示out of memory,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 问题描述

用Pytorch进行模型训练时出现以下OOM提示:

RuntimeError: CUDA out of memory. Tried to allocate 98.00 MiB (GPU 0; 12.00 GiB total capacity; 3.19 GiB already allocated; 6.40 GiB free; 9.60 GiB allowed; 3.33 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

CUDA尝试分配98MB显存,但失败了。GPU的显存为12G,其中已分配显存3.19G(允许分配上限为9.6G),仍有6.4G的显存空闲。

简言之,显存有一半以上的空间都是闲置的,却连区区98MB都挤不出来,这显然不对劲!

2 解决方案

先说结论:通过降低num_workers解决。 具体方法见2.3节。

根据网络上相关问题的经验贴,本人进行了一系列的尝试,现将相关解决方法记录如下。

2.1 确认是否因找不到GPU资源引起

参考:找不到GPU资源——显存充足,但是却出现CUDA error:out of memory错误_gpu out of memory-CSDN博客

尝试手工指定GPU资源:

1、通过python代码配置

import os
os.environ['CUDA_VISIBLE_DEVICES']='0'

2、通过设置环境配置

  • Linux:export CUDA_VISIBLE_DEVICES=0
  • Windows:setx CUDA_VISIBLE_DEVICES=0

进行如上配置后问题依旧存在。

2.2 调整max_split_size_mb参数

参考:CUDA oom 通过设置PYTORCH_CUDA_ALLOC_CONF中的max_split_size_mb解决Pytorch的显存碎片化导致的CUDA:Out Of Memory - 知乎 (zhihu.com)

pytoch的显存管理中,分配显存请求必须是连续的,max_split_size_mb设置的是可分割最大的空闲block,小于该值的空闲block可能由于被分割而无法连续使用,大于该值的空闲block将不会被分割。比如max_split_size_mb 设置为4000时,所有小于4000MB空闲block都可能被分割开,当需要连续4g的空间时,就不存在可分配的4g的连续空闲block,而报OOM错误。

最优设置策略:将max_split_size_mb设置为小于OOM发生时的显存请求大小最小值的最大整数值

基于以上理论,本人尝试根据OOM提示将max_split_size_mb参数设置为98:

1、方法一

import os 
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:98"

2、方法二

  • Linux:export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:98
  • windows:setx PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:98

配置后问题依旧存在,也就是说目前显卡内存已经有能力切分出98MB大小的存储空间,却无法提供。

想了半天没搞明白究竟是怎么回事,于是想着检查下配置看看,打开配置文件,目光立即被那行num_workers=6吸引,顿时恍然大悟,请见下一节。

2.3 调整锁页配置

关于锁页的介绍可以看这篇文章:Pytorch DataLoader pin_memory 理解 - 知乎 (zhihu.com)。

简言之,锁页是一种允许GPU直接访问CPU存储空间的机制,通过提前锁定一部分存储空间来解决分页存储频繁换入换出的问题,从而提升访问速度。

之前为了提升模型的训练速度,开启了锁页机制,并设置num_workers=8

合理猜测,显卡之所以无法提供模型需要的98MB空间,是因为空闲内存被锁定造成的。

通过缩小num_workers的数值,问题解决:

pin_memory = True
num_workers = 6

这篇关于显存充足却提示out of memory的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293827

相关文章

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑提示msvcp90.dll缺少怎么办? MSVCP90.dll文件丢失的修复方法

《电脑提示msvcp90.dll缺少怎么办?MSVCP90.dll文件丢失的修复方法》今天我想和大家分享的主题是关于在使用软件时遇到的一个问题——msvcp90.dll丢失,相信很多老师在使用电脑时... 在计算机使用过程中,可能会遇到 MSVCP90.dll 丢失的问题。MSVCP90.dll 是 Mic

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Mybatis提示Tag name expected的问题及解决

《Mybatis提示Tagnameexpected的问题及解决》MyBatis是一个开源的Java持久层框架,用于将Java对象与数据库表进行映射,它提供了一种简单、灵活的方式来访问数据库,同时也... 目录概念说明MyBATis特点发现问题解决问题第一种方式第二种方式问题总结概念说明MyBatis(原名