热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PytorchDataLoader内存泄漏RuntimeError:received0itemsofancdata

现象内存占用随着训练过程逐渐增大,最终Outofmemory。即使将不再用到的变量及时删除并使用gc.collect(),也无法解决。解决方案方案

现象

内存占用随着训练过程逐渐增大,最终Out of memory。即使将不再用到的变量及时删除并使用gc.collect(),也无法解决。

解决方案


方案1:Dataset 的成员变量避免使用Python原生数据格式

以下面的Dataset代码为例,如果使用 self.data = [x for x in range(24000000)],即使用了List作为Dataset的成员变量,当 num_worker>0 时就会导致前面的现象,而改用numpy ndarray 包装一下就没问题了。另外,参考资料3里面说用DataFrame也会有问题。

小结:定义Dataset的成员变量时,使用 numpy ndarray 代替 List 和 DataFrame.

from torch.utils.data import Dataset, DataLoader
import numpy as np
import torchclass DataIter(Dataset):def __init__(self):self.data = [x for x in range(24000000)] # 有内存溢出风险!!!# 改成下面这样可以避免!self.data = np.array([x for x in range(24000000)]) def __len__(self):return len(self.data)def __getitem__(self, idx):data = self.data[idx]data = np.array([data], dtype=np.int64)return torch.tensor(data)

方案2&#xff1a;将 num_worker 设成 <总CPU物理核心数

# 总核数 &#61; 物理CPU个数 X 每颗物理CPU的核数 # 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

例如我的机器得到结果是 物理CPU个数 1 乘以 7个物理核/CPU&#61;总7个物理核心&#xff0c;所以需要将 num_worker 设得比7更小&#xff0c;例如可以设为 5&#xff08;设为5表示有5个子进程&#xff0c;加上主进程&#xff0c;整个训练的过程就启动了6个进程&#xff09;.

方案3&#xff1a;避免使用cycle和zip函数

之前参加了一些数据比赛&#xff0c;其中有些baseline使用到了 cycle 来封装一层dataloader&#xff0c;使其可以循环读取&#xff0c;但是这会导致内存泄漏&#xff0c;即使你解决了一个问题&#xff0c;另一个问题又会冒出来&#xff0c;我这里举几个会导致的错误&#xff1a;

1、RuntimeError: received 0 items of ancdata

2、RuntimeError: DataLoader worker (pid 20655) is killed by signal: Killed

3、OSError: [Errno 12] Cannot allocate memory.

等等等等。总之&#xff0c;避免使用cycle&#xff01;万恶之源啊&#xff01;

另外&#xff0c;据说 zip 函数也会导致内存泄漏&#xff0c;见 https://www.mmbyte.com/article/48441.html

方案4&#xff1a;将num_worker设为0

如果前面的方案都不奏效&#xff0c;而且2个一起用上也没用的话&#xff0c;最后还可以考虑将num_worker设为0&#xff0c;设为0表示只使用主进程进行加载数据。

参考资料

[1] https://discuss.pytorch.org/t/num-workers-in-dataloader-will-increase-memory-usage/28522/7
[2] https://github.com/pytorch/pytorch/issues/13246
[3] https://github.com/pytorch/pytorch/issues/5902


推荐阅读
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Conda环境中高效配置并安装PyTorch和TensorFlow GPU版的方法如下:首先,创建一个新的Conda环境以避免与基础环境发生冲突,例如使用 `conda create -n pytorch_gpu python=3.7` 命令。接着,激活该环境,确保所有依赖项都正确安装。此外,建议在安装过程中指定CUDA版本,以确保与GPU兼容性。通过这些步骤,可以确保PyTorch和TensorFlow GPU版的顺利安装和运行。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 从文本中全面提取所有URL链接
    本文探讨了一种高效的方法,用于从大量文本数据中全面提取所有URL链接。通过使用正则表达式和Python编程语言,该方法能够准确识别并提取出各种格式的URL,包括HTTP、HTTPS等常见协议。实验结果表明,该方法在处理大规模文本数据时具有较高的准确率和效率。 ... [详细]
  • 在《Python编程基础》课程中,我们将深入探讨Python中的循环结构。通过详细解析for循环和while循环的语法与应用场景,帮助初学者掌握循环控制语句的核心概念和实际应用技巧。此外,还将介绍如何利用循环结构解决复杂问题,提高编程效率和代码可读性。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • 处理POI导入Excel时遇到的数值单元格无法获取文本值问题
    在使用Apache POI库将数据从Excel导入到Java应用程序时,可能会遇到‘Cannot get a text value from a numeric cell’错误。本文将详细介绍该问题的原因及解决方案。 ... [详细]
  • 深入解析Django CBV模型的源码运行机制
    本文详细探讨了Django CBV(Class-Based Views)模型的源码运行流程,通过具体的示例代码和详细的解释,帮助读者更好地理解和应用这一强大的功能。 ... [详细]
author-avatar
广东木叶冷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有