码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 显存充足却提示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'
    
    • 1
    • 2

    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"
    
    • 1
    • 2

    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
    
    • 1
    • 2
  • 相关阅读:
    14天机器学习DAY1-5|线性回归原理小结
    如何在 Spartacus 使用 UserAccountFacade 在语言设置更改后重新读取用户数据
    全国大学生智能汽车大赛(一):摄像头识别赛道代码
    LeetCode994. 腐烂的橘子(C++中等题)
    【Redis】5.消息队列
    Google Earth Engine(GEE)——指数运算并加载和影像下载
    Condition条件队列
    前端部署iis后axios跨域请求问题
    网络库OKHTTP(2)面试题
    零代码—0代码—无代码平台是什么?怎么选?
  • 原文地址:https://blog.csdn.net/mustuo/article/details/134090209
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号