大模型训练时的内存泄漏与显存不足

news2024/12/22 18:24:53

内存泄漏位置

位置1 FaceDetection

不可重复创建FaceDetection,该位置是内存泄漏的大头

mediapipe.solutions.face_detection.FaceDetection(model_selection=1, min_detection_confidence=0.5)

位置2 tensorboardX

不可重复创建 tensorboardX.SummaryWriter

SummaryWriter(file_name)

位置3 torch.utils.data.DataLoader

torch.utils.data.DataLoader是torch中已知的内存泄漏点,直接压测DataLoader能直接观察到内测无法释放的现象。

解决办法是改为单线程。这在大规模数据训练时,是不可取的。数据量少,倒是无所谓。

data_loader = torch.utils.data.DataLoader({}, num_workers=1,
                                              collate_fn=funa,
                                              )

位置4 GeneralCustomKStablePipeline

对于diffuser_extension.pipeline.GeneralCustomKDiffusionPipeline,无法完全释放内存。

pipe = GeneralCustomKDiffusionPipeline

del pipe # 显存得到完全释放,而内存却有泄漏

多模型显存不足的问题解决

由于pipeline不能重复创建与释放,但显存无法容纳两个模型。
解决办法是把模型在内存与显存之间反复迁移,以解决显存不足的问题。

pipeline.to('cuda')

pipeline.to('cpu')

显存回收时的效果:

内存泄漏的分析过程

主要用到的工具就是memory_profiler与objgraph。当然还有别的内存分析工具。

第一个工具memory_profiler

非常简单,只需一个注解,能显示每行代码执行后的内存增量变化。

from memory_profiler import profile

@profile(precision=4, stream=open("memo_profiler.log", "w"))
def your_function():
  pass

第一个工具memory_profiler,显示每行代码执行后的内存增量,在大的内存泄漏时能大致定位到代码位置,只在FaceDetection上有明确指导。
但是微量内存泄漏,看不出来哪行代码的导致的最终增量。

第二个工具objgraph

微量内存泄漏,主要用到objgraph。

import objgraph
import gc
mem_incress_file = open("", "w")
while True:
  # your code
  gc.collect()
  objgraph.show_growth(limit=10, file=mem_incress_file)
  mem_incress_file.write("===>>>finished once time.\n")
  mem_incress_file.flush()

工具objgraph,能在执行完一段代码后,展示增量。
正常的代码逻辑只会在前几次有增量,之后就完全没有增量,而内存泄漏的代码则每次循环中都有稳定的增量。
例如排除结束后,确认没有增量的日志。

dict                         111214   +111214
function                     100747   +100747
tuple                         72811    +72811
list                          26095    +26095
cell                          25263    +25263
ReferenceType                 23604    +23604
OrderedDict                   19758    +19758
builtin_function_or_method    18043    +18043
getset_descriptor             15438    +15438
type                          11861    +11861
===>>>finished once time.
TopLevelThreadTracerNoBackFrame       13       +12
ThreadTracer                          19       +12
tuple                              72822       +11
dict                              111219        +5
ReferenceType                      23606        +2
list                               26096        +1
builtin_function_or_method         18044        +1
NetCommand                             1        +1
SafeCallWrapper                        5        +1
===>>>finished once time.
tuple                              72860       +38
TopLevelThreadTracerNoBackFrame       50       +37
ThreadTracer                          56       +37
dict                              111227        +8
lock                                 111        +5
ReferenceType                      23611        +5
cell                               25268        +5
builtin_function_or_method         18048        +4
method                              2134        +2
Event                                 18        +2
===>>>finished once time.
ReferenceType    23613        +2
===>>>finished once time.
===>>>finished once time.
tuple    72861        +1
===>>>finished once time.
===>>>finished once time.
===>>>finished once time.
===>>>finished once time.
===>>>finished once time.
===>>>finished once time.
===>>>finished once time.

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

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

相关文章

2023年新疆电气年会-安科瑞 蒋静

2023年新疆电气年会于10月12-13日在五家渠市五家渠青湖御园酒店隆重召开。安科瑞电气股份有限公司受邀参会,为大会带来了主题演讲和产品现场展示! 大会以“绿色低碳、智慧新疆”主题,分为专题学术报告、工程信息交流、论文颁奖、产品展示等环…

基于Vite使用VitePress搭建静态站点博客

使用VitePress搭建静态站点博客 官方文档什么是VitePress?一、初始化项目1.安装依赖包VitePress可以单独使用,也可以安装到现有的项目中。在这两种情况下,您都可以安装它: (也可以全局安装,建议:当前项目内安装) 2.初始…

c语言思维框图

思维框图 文章目录 前言一、c语言思维框图总结 前言 附件为c语言思维框图。 一、c语言思维框图 后面可以增加更多框图,比如c/c学习路线图。 总结 提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单…

Xilinx 产品制程工艺

A – 45nm 供货至2030年 Sparton6 xx 提供卓越的连接功能,例如高逻辑引脚比、小尺寸封装、MicroBlaze™ 软处理器,以及多种受支持的 I/O 协议。 B – 28nm 供货至2035年 spartan-7\artix-7 \kintex-7\virtex-7\Zynq™ 7000 SoC 工艺节点上的持续创新…

Python-市场交易中的概率夏普比率 (PSR)

“虽然偏度和峰度不会影响夏普比率的点估计,但它会极大地影响其置信带,从而影响其统计显着性”Bailey 和 Lpez de Prado 1 0. 简介 今天,我们将讨论备受推崇的夏普比率(SR),该指标几

野火霸天虎 STM32F407 学习笔记_2 寄存器介绍

寄存器 虽然正式编程没有必要用寄存器编程,通常都是库函数或者 hal 库。但是还是有必要学一下原理的。 寄存器映射 芯片视图如下。 丝印:芯片上印的信息。型号,内核,生产批次等。 引脚:左上角是有小圆点的&#x…

CH09_重新组织数据

拆分变量(Split Variable) 曾用名:移除对参数的赋值(Remove Assignments to Parameters) 曾用名:分解临时变量(Split Temp) let temp 2 * (height width); console.log(temp); t…

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录 1.加载阶段2.连接阶段1.验证2.准备3.解析 3.初始化阶段4.总结 类的生命周期 1.加载阶段 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类…

SAP 物料凭证在凭证流中显示归档

问题: 在交货单做过PGI/PGR之后,显示物料凭证已归档,但是实际上并不是人为归档 MIGO去显示物料凭证的时候显示不存在 VL09 无法冲销 如下图所示 原因:1.人为做了归档 2.在做PGI的时候出现了异常。导致出现了问题 解决…

本章内容的重点是对各种电子式电动机保护器电路的原理分析和故障维修指导,对电子式电动机保护器以下简称为电动机保护器。

上世纪八十年代之前,电子技术的应用尚处于初级阶段,对电动机的保护任务多由热继电器承担,国内型号为为JR20-XX系列、JR36-XX系列等。其保护机理如下:热继电器由发热元件、双金属片、触点及一套传动和调整机构组成。发热元件是一段…

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候,原生html标签input可以add时候自动获取焦点,聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢,内部提供foucs??属…

【C++】医学影像信息管理系统源码

狭义的医学影像信息系统是指基于医学影像存储和通信系统的管理系统,从技术上解决了影像处理技术。临床信息系统是指支持医院医务人员临床活动,收集和处理患者临床医疗信息的信息管理系统。放射科信息系统是指放射科挂号、分诊、影像诊断报告、信息查询、…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示: 2.查阅资料 查了一些资料,说想要解决这个问题,需要用到freetype库或者用opencv…

ASO优化之Google Play评分评论的重要性

应用程序的成果不仅仅是拥有功能齐全且无错误的产品,评分和评论会影响谷歌应用商店的排名算法,好评和差评都会影响应用在商店中的排名,这是关于与用户建立信任的一个环节。 1、积极主动地管理评论。 定期监控评论、解决用户问题以及根据反馈…

python脚本-网页爬虫获取网页图片

python脚本-网页爬虫获取网页图片 代码 import requests import re import time url"http://10.9.47.154/python-spider/" # 爬取网站的url headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

阿里云双11特惠:云服务器1年99元,新老同享,续费同价!

2023年双11阿里云推出了金秋云创季活动,云服务器特惠,2核2G云服务器1年99元,新老同享,续费同价! 活动地址: https://txy.ink/aliyun/ 活动详情: 阿里云面向个人开发者、学生、小微企业推出爆…

电压跟随器输入脚悬空引起的振荡

昨天在调试一个电路板的时候,发现进单片机AD脚的信号上面有个50Hz的波形,峰峰值还挺大,有几百毫伏。这种情况只有在输入端悬空的时候才出现;在输入端接了信号或者传感器的时候,就又正常了。 经过排查,发现…

92 数据流中的中位数

数据流中的中位数 题解1 小根堆大根堆另一种写法 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFi…

使用Java与Jsoup库构建有趣的爬虫项目

目录 一、网络爬虫的概念和应用 二、Jsoup库的功能和优势 三、使用Java与Jsoup库编写网络爬虫 四、网络爬虫的法律和道德问题 五、注意事项 六、总结 本文将深入探讨如何使用Java与Jsoup库构建一个实际且有趣的网络爬虫项目。我们将首先简要介绍网络爬虫的概念和应用&…

运动耳机哪个好?跑步耳机哪个好?运动耳机排行榜推荐

​运动时没有音乐的相伴真的很枯燥,当你打开音乐,世界就只剩下你和你的运动。运动的同时听歌还能让你完全沉浸在音乐中,享受运动的乐趣。无论是在激烈的比赛中,还是在轻松的晨跑中,它都能为你提供最佳的听觉体验。然而…