LLM - CUDA out of memory. 到底怎么事

news2024/10/6 22:27:19

目录

一.引言

二.报错日志

1.日志数据

2.日志提示

◆ max_split_size_mb 

◆ See documentation

◆ 更多解决方案

三.日志扩展

1.Reserved Memory 是什么?

2.Tired to allocate 小于 free MiB 就会报 OOM 嘛?

3.already allocated 是当前任务占用内存,还是和其他任务共用的内存?

四.问题解决


一.引言

[ torch.cuda.OutOfMemoryError: CUDA out of memory. ] 相信这个错误大家都不陌生,在使用 GPU 进行单机单卡,单机多卡的训练任务中,经常遇到该报错。由于 OOM 是很明显的内存不足告警,通常情况下笔者发现错误就直接去 kill 其他任务或者加内存了,很少关心任务中具体的报错信息,今天趁着训练又报错来整理下。

二.报错日志

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 50.00 MiB 
(GPU 0; 79.35 GiB total capacity; 78.25 GiB already allocated; 10.12 MiB free; 
78.46 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

1.日志数据

torch.cuda.OutOfMemoryError: CUDA out of memory. 
Tried to allocate 50.00 MiB 
(GPU 0; 
    79.35 GiB total capacity; 
    78.25 GiB already allocated; 
    10.12 MiB free;
    78.46 GiB reserved in total by PyTorch)

为了日志更加清晰,这里我把日志逐行分开:

  • torch.cuda.OutOfMemoryError - 表示发生了 CUDA 内存不足的错误

  • Tried to allocate 50.00 MB - 尝试分配的内存大小为 50.00 MB

  • GPU 0 - 指示错误发生在 Device-0 即第一个 GPU 设备上

  • 79.35 GIB total capacity - 表示该 GPU 的总内存容量为 79.35 GB

  • 78.25 GIB already allocated - 已被其他任务或操作占用显存大小为 78.25 GB

  • 10.12 MiB free - 当前可用的空闲显存大小为 10.12 MB

  • 78.46 GiB reserver in total by PyTorch - 由 PyTorch 保留的总显存大小为 78.46 MIB

这个报错信息代表在进行 CUDA 操作时,GPU 内存不足以分配所需要的 50 MB 所以报错。

2.日志提示

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

除了给出详细的内存占用数据外,报错信息中还给出了该报错的可能解决方案:

◆ max_split_size_mb 

如果保留内存 reserver memory 远远大于 已分配内存 allocated memory,可以尝试调整 max_split_size_mb 参数来避免内存碎片化。该方法通常用语大规模模型和数据集,意在减少内存碎片导致的性能问题。这里较小的值可能会增加内存分配次数,但减少了单个分配的内存大小,有助于缓解内存碎片化问题。较大的值则可以减少内存分配次数,但可能导致更大的内存碎片。

import os

os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb=256'

See documentation

除了尝试调整 max_split_size_mb 适配自己的模型和数据外,也可以到 Pytorch 文档了解更多内存管理的知识:CUDA semantics — PyTorch 2.0 documentation

有兴趣的同学也可以阅读文档获取更多相关的 PyTorch 内存信息。

更多解决方案

  • 模型 / 数据集大小 - 减少模型、数据集大小,减少对 GPU 内存的需求

  • batch_size - 调整训练过程中的 batch_size 降低内存使用量

  • 分布式 - 如果有多个 GPU 设备,可以使用多卡分布式训练

  • 代码优化 - 例如减少重复计算,使用更高效的实现 

这里最暴力的方法就是堆资源增加显存。

三.日志扩展

1.Reserved Memory 是什么?

在 PyTorch 中,保留内存 Reserved Memory 是指由 PyTorch 在 GPU 上预先分配和保留的显存。这部分显存不会被释放用于其他目的,而是用于缓冲、缓存和其他内部操作,以提高计算性能和效率。

当使用 PyTorch 进行训练或推断时,PyTorch 会为了优化内存管理而保留一定量的显存。这样,即使释放了一些不再需要的变量或张量,这部分显存也不会立即被释放,而是保留给PyTorch 供后续使用。保留内存的目的是避免频繁的内存分配和释放操作,从而减少内存碎片化和提高计算性能。然而,过多的保留内存可能导致整体可用内存减少,进而导致出现 "CUDA out of memory" 错误。如果你的模型特别大或数据集很大,保留内存可能会占据较大的一部分显存,因此可能需要根据具体情况进行调整。

2.Tired to allocate 小于 free MiB 就会报 OOM 嘛?

不一定。报错信息中的 "Tried to allocate" 指示尝试分配的内存大小,而 "free" 是当前可用的空闲显存大小。通常情况下,如果要分配的内存大小超过了当前可用的空闲显存大小,就可能会出现 CUDA 内存不足的错误。然而也存在其他因素导致 CUDA 内存不足问题:

  • GPU 上已经分配了大量的显存给其他任务或操作

  • PyTorch 保留了较大的显存供内部操作使用

  • 程序中存在内存泄漏或未正确释放显存

因此在解决 CUDA 问题是,仅仅关注 "Tried to allocate" 和 "free" 还不够,还需要综合其他因素判断和调整以解决具体的问题。

3.already allocated 是当前任务占用内存,还是和其他任务共用的内存?

already allocated 表示已经被其他任务或操作占用的显存大小。这个值表示当前已经由系统中运行的其他任务或操作所占用的显存总量。

在多任务或者多进程的环境中,GPU 的显存是被共享使用的。每个任务或操作会分配一部分显存来存储其相关数据和计算过程中的中间结果。因此,当你的任务尝试分配更多的显存时,就需要考虑到已经被其他任务占用的显存大小。

如果 already allocated 的值很接近 GPU 的总内存容量,则说明系统中已经有较多的任务占用了显存,导致当前任务无法分配足够的显存而报错。

四.问题解决

上述报错发生在模型预训练阶段,博主使用 A800 显卡申请 50G 显存报错。后续尝试将 batch_size 从 8 减少至 2,模型训练恢复正常。

不过这里由于是多人共享 GPU 资源,且报错日志中 already allocated = 78.25 GB 已经接近 A800 单卡的极限,所以不排除是卡本身资源已经不足的问题。如果你是独享资源则可以尝试减少模型大小、调整 batch_size 等,共享情况下就半夜跑吧 🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高危】 Microsoft Teams 远程代码执行漏洞

漏洞描述 Microsoft Teams 是微软推出的一款团队协作平台,提供了聊天、通话、在线会议、文件共享等功能。 Microsoft Teams 受影响版本中,当用户加入攻击者设置的恶意 Microsoft Teams 会议时,攻击者可远程执行任意代码。 漏洞名称Microso…

游戏类APP的如何设置广告场景最大化用户价值?提升变现收益?

最近几年,游戏类市场的不断增长激发了广告主预算的不断投入,越来越多的游戏类APP通过广告变现的方式增收,并且获得持续上涨的eCPM。 具有潜力的游戏品类参考 根据游戏品类的增长数据和广告收益规模,休闲/模拟/街机均为收益正向的…

Echarts 让饼图中间文字居中并自适应图表

背景: 产品提出需求在饼图中间放两行文字且居中 “简单,劈劈啪啪写完了” 产品再提出你这个没有自适应啊,屏幕放大、缩小你这个就没有居中了,甚至会和饼图重叠 “emmmmm…" UI图如下: 方案一:使用ti…

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

目录 开放地址法(Open Addressing) 线性探测(Linear Probing) 散列表查找性能分析 平方探测(Quadratic Probing) 定理 平方探测法的查找与插入 双散列探测法(Double Hashing&#xff09…

【C语言】经典题目(四)

HI,大家好~😝😝这是一篇C语言经典题目的博客。 更多C语言经典题目及刷题篇,可以参考: 🌸 【C语言】经典题目(一) 🌸 【C语言】经典题目(二) 🌸 【C语言】经典题目(三) 🌸…

生信分析pandas数据处理 Python简明教程 | 视频17

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

ant design pro 中ModalForm的参数open无法控制的问题

根据antd自己的说明,visible这个参数在下个版本会被替换成open,所以今天我试着用open。 但是用了open之后发现这个model弹不出来,用visible是正常的。 那么问题在哪呢?又是在import的位置不对 open可以使用的是: imp…

在2023年及以后可以改善企业业务的五种软件

在当今互通互联的世界,依赖人工流程和传统方法的日子早已过去。目前,各种各样的软件解决方案有助于推动企业走向成功。这些解决方案是重塑客户关系、优化项目工作流程、革新财务管理实践以及通过沉浸式的培训体验增强员工能力的关键。 采用软件解决方案…

政府部门联合开展智能制造试点示范行动,对企业发展有哪些利好?

智能制造(也称为工业 4.0 或工业物联网 (IIoT))的试点示范可以为业务发展带来诸多好处。主要优势体现在: 1.提高效率:智能制造集成了自动化、数据分析、人工智能和机器学习等先进技术。这些技术优化了生产流程,从而提…

Ubuntu 20.04 APT 方式安装 mysql 5.7

Ubuntu 20.04 直接 apt 安装的 mysql 是 8.0 ,现在需要安装 5.7 版本,还颇费周章!按照文档直接点进去那个 MySQL APT Repository 中(https://dev.mysql.com/downloads/repo/apt/)只显示了 8.0 ,没有其他版本…

ClickHouse(十六):Clickhouse MergeTree系列表引擎 - CollapsingMergeTree

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

风丘科技将亮相 EVM ASIA 2023

风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会,专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…

SpringBoot(十)SpringBoot自定义starter

一个月的时间,转眼已经到了我的SpringBoot系列的第十篇文章。还记得我的第二篇文章SpringBoot(二)starter介绍_springboot的starter_heart荼毒的博客-CSDN博客 曾经介绍过starter。starter除了官方提供的以外,我们也可以自定义。本…

【前端 | CSS】align-items与align-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用,它的基本单位是每一个子项,在所有情况下都有效果&…

面试热题(路径总和II)

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 在这里给大家提供两种方法进行思考,第一种方法是递归,第二种方式使用回溯的方式进行爆…

携程验证码

今日话题:凑字数水文章。大表哥们感兴趣可以看看。 携程验证类型总共有3种。无感,滑块,点选。 process_type:None为无感 验证接口:https://ic.ctrip.com/captcha/v4/risk_inspect process_type:JIGSAW为…

opencv带GStreamer之Windows编译

目录 1、下载GStreamer和安装2. GSTReamer CMake配置3. 验证是否配置成功 1、下载GStreamer和安装 下载地址如下: gstreamer-1.0-msvc-x86_64-1.18.2.msi gstreamer-1.0-devel-msvc-x86_64-1.18.2.msi 安装目录无要求,主要是安装完设置环境变量 xxx\1…

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …

科学家揭示:爱的能量是光——能够治愈一切!

当你和你的恋人食指相触时,指尖发出的辉光会产生闪电般绚烂的连结; 当你对着亲密的另一半说“我爱你”时,一团物质能量随即从你的胸口释出,飞向另一个人——这听起来像魔幻电影般的场景,却是实实在在的物理现象。 1、人…

uniapp input输入框placeholder文本右对齐

input输入框placeholder文本右对齐 给input标签加上placeholder-class,这个是给placeholder设置样式,右对齐这就是text-align:right;字体颜色之类依次编辑即可。