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

RuntimeError: CUDA out of memory.【多种场景下的解决方案】

RuntimeError: CUDA out of memory.【多种场景下的解决方案】

在这里插入图片描述


🌈 个人主页:高斯小哥
🔥 高质量专栏:【Matplotlib之旅:零基础精通数据可视化】
🏆🏆关注博主,随时获取更多关于深度学习、PyTorch、Python领域的优质内容!🏆🏆

🌵文章目录🌵

  • 🚀 一、引言
  • 🎯 二、多种场景下的解决方案
    • 💡 1. 【首次运行完整项目时(如GitHub项目)报错】场景下的解决方案
    • 💡 2. 【前几次都顺利执行,突然报错】场景下的解决方案
  • 📚 三、参考文档
  • 🌳 四、结尾

🚀 一、引言

  随着深度学习的繁荣发展,GPU已成为推动这一浪潮的核心动力。🚀 然而,正如任何强大的工具一样,GPU也有其局限性。😅 其中最常见且令人头疼的问题之一就是CUDA内存溢出,或称为“RuntimeError: CUDA out of memory”。😖 这一错误不仅可能中断您宝贵的训练过程,🛑 还可能导致资源浪费和时间损失。💸🕰️ 但别担心,本文将带您深入了解CUDA内存溢出的多种场景,🔍 并提供实用的解决方案,💡 助您轻松驾驭GPU内存管理,🎯 让深度学习之路更加顺畅无阻!🚀💪

🎯 二、多种场景下的解决方案

💡 1. 【首次运行完整项目时(如GitHub项目)报错】场景下的解决方案

🔥 当您在尝试运行GitHub上的完整项目时,若遇到RuntimeError: CUDA out of memory错误,通常意味着GPU内存不足以处理当前的计算需求。以下是一系列针对此问题的实用解决方案。 💡

🔍【方案一】:调整批量大小

  • 如果您👀当前的批量大小(Batch Size)大于1,建议逐步减小它。选择一个较小的批量大小,如从256减少到128、64或更低,通常能有效降低GPU内存的使用。同时,请确保🔄训练、测试和验证数据集都使用相同的批量大小

  • 即使当🔍批量大小已经设置为1时,如果仍然遇到内存溢出错误,您还有以下两种选择(但🔍首先,请确保已检查并处理【方案二和方案三】提到的情况):

    1. 💻 使用更高显存的GPU:考虑升级您的硬件设备或租赁具有更高显存的云服务器来进行训练。
    2. 🛠️ 优化模型结构:通过减少模型层数、降低特征图维度或采用其他内存优化技术,使模型更轻量化。

🔍【方案二】:检查并避免不必要的GPU张量累积

🚫 在训练过程中,确保不要累积GPU上的张量,因为这会导致显存占用逐渐增加。例如,在记录每个batch的损失时,不要简单地将loss张量相加,而是应该提取其值并存储在CPU内存中。

报错代码关键片段示例:

total_loss = 0.0  # 初始化为浮点数,而不是GPU张量
for i in range(100):optimizer.zero_grad()output = model(data_input)loss = criterion(output)loss.backward()optimizer.step()total_loss += loss # 累积GPU上的张量

修正后的代码示例:

total_loss = 0.0  # 初始化为浮点数,而不是GPU张量
for i in range(100):optimizer.zero_grad()output = model(data_input)loss = criterion(output)loss.backward()optimizer.step()# 使用.item()提取loss的值,并将其添加到total_loss中total_loss += loss.item()

通过这样修改,您可以避免不必要的GPU显存占用,从而减少内存溢出的风险。 🔒

🔍【方案三】:释放未使用的缓存

🗑️ 在每个epoch或迭代结束后,使用torch.cuda.empty_cache()来释放未使用的CUDA缓存。这有助于回收不再需要的内存,为接下来的计算任务腾出空间。 🚀

希望这些解决方案能帮助您顺利运行GitHub项目!加油!💪

💡 2. 【前几次都顺利执行,突然报错】场景下的解决方案

🚨 当你遇到前几次执行都顺利,但突然报错的情况,首先要怀疑的是GPU显存溢出。🚨

🔍 为了诊断问题,你可以使用nvidia-smi命令来查看显存的占用情况,就像下图所展示的。

GPU显存占用情况

😵 从上图中我们可以看到,编号为7的GPU显存占用较高,这可能导致新任务无法分配足够的显存而报错。😵

🛠️ 针对这种情况,你可以尝试以下解决方案:

  1. 检查服务器使用情况

    • 多人共用服务器:👥 如果服务器由多人共用,可能存在其他用户占用大量显存的情况。你可以尝试切换到其他显存较充足的GPU上运行你的任务,通过设置环境变量CUDA_VISIBLE_DEVICES来实现,例如os.environ['CUDA_VISIBLE_DEVICES'] = "1"
    • 单人使用服务器:👤 若服务器仅由你一人使用,检查是否有其他程序或任务正在同一GPU上运行。🤔 如果有,考虑停止或暂停这些任务,释放显存给当前需要的任务。

希望这些解决方案能够帮助你快速定位和解决问题!💪💪

未完待续。。。
如果有其它使用场景下出现报错RuntimeError: CUDA out of memory,欢迎在评论区留言沟通~

📚 三、参考文档

  1. pytorch: 四种方法解决RuntimeError: CUDA out of memory. Tried to allocate … MiB
  2. CUDA out of memory.

🌳 四、结尾

  亲爱的读者,感谢您每一次停留和阅读,这是对我们最大的支持和鼓励!🙏在茫茫网海中,您的关注让我们深感荣幸。您的独到见解和建议,如明灯照亮我们前行的道路。🌟若在阅读中有所收获,一个赞或收藏,对我们意义重大。

  我们承诺,会不断自我挑战,为您呈现更精彩的内容。📚有任何疑问或建议,欢迎在评论区畅所欲言,我们时刻倾听。💬让我们携手在知识的海洋中航行,共同成长,共创辉煌!🌱🌳感谢您的厚爱与支持,期待与您共同书写精彩篇章!

  您的点赞👍、收藏🌟、评论💬和关注💖,是我们前行的最大动力!

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

相关文章:

  • LeetCode刷题| Leetcode 45. 跳跃游戏,1190. 反转每对括号间的子串,781. 森林中的兔子,739. 每日温度
  • Redis(03)——发布订阅
  • ⭐北邮复试刷题LCR 034. 验证外星语词典__哈希思想 (力扣119经典题变种挑战)
  • ECMAScript 6+ 新特性 ( 二 )
  • JS游戏项目合集【附源码】
  • React中hooks使用限制及保存函数组件状态
  • 用git命令来上传项目到GitHub我自己的仓库
  • .NET有哪些微服务框架
  • uniapp中打开蓝牙需要哪些权限
  • virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”
  • 【JVM篇】什么是运行时数据区
  • Jetpack 之Glance+Compose实现一个小组件
  • 实时矢量搜索如何彻底改变各行各业?
  • 【Linux】指令 【scp】
  • 文件IO,目录IO的学习
  • leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12
  • BUGKU-WEB bp
  • 代码的复用——Mixin使用例子
  • easyx 枪声模拟器
  • python 与 neo4j 交互(py2neo 使用)
  • Python基础笔记11
  • vulhub中Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
  • 智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套
  • 大模型爆款应用fabric_构建优雅的提示
  • js 对象属性描述符详解
  • 文件操作QFile
  • 【Langchain】+ 【baichuan】实现领域知识库【RAG】问答系统
  • Anaconda、conda、pip、virtualenv的区别
  • 【数据结构】每天五分钟,快速入门数据结构(一)——数组
  • NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue