1--问题描述

在最近的一个课题中,需要加载接近1T的数据集。由于内存的限制,无法一次加载整个数据集到内存中。

想到的一个解决方案是,将大数据集处理为单个样本,根据DataLoader随机产生的索引index,通过一个list表来找到索引index对应的样本名及其路径path,最后当需要用到样本时,才会根据其路径path去加载数据。

但上述的方法也会涉及内存瓶颈磁盘io瓶颈的问题,当预加载到内存的数据不足时,程序就会处在等待的状态,等待从磁盘读取的数据传送至内存中,再从内存中读取数据。

同时,由于博主存放数据集的服务器硬盘是机械硬盘,这就会导致从磁盘加载数据到内存的过程十分缓慢。而从内存读取的数据一旦传送到GPU上,就会被迅速处理掉,这也导致显卡长时间处于等待的空闲状态,GPU的利用率非常低,长时间处于0%。

这时,博主想到的一个解决方法就是,减少数据在内存上的停留时间,即把CPU对数据集进行预处理的模块放在显卡上进行,不再由CPU放在内存中进行,而是直接传送到GPU上处理。通过这种方式缓解内存的压力,但终究治标不治本。

由于内存的紧张,导致空闲的内存低,所以不能每次加载足够多的样本存放在内存中等待读取。同时,也会导致对磁盘的io请求十分频繁。

这时候,也会产生一个疑问?即不能一次加载完整的数据集到内存中,而频繁的io请求来加载单个样本的数据,也会导致机械硬盘的io瓶颈。那为什么不把小部分的样本合并成一个大文件,一次就加载这个大文件放在内存中呢?博主也想过这个问题,但问题是博主读取训练样本的时候是随机产生索引的(即shuffle),我并不能保证一个batchsize中产生的样本索引都在这个大文件中,所以这种方法并不合适。

在模型代码不能得到优化的前提下,目前想到的解决方法就是改用固态硬盘或者加大服务器的内存条容量

(写得比较乱。。。。。)

2--相关代码

①查看linux服务器内存情况

watch -n 1 free -h

②查看linux服务器磁盘io情况

iostat -x 1

③查看linux服务器显卡利用情况

watch -n 1 nvidia-smi

④查看用户进程情况

top -u username
top 1

3--相关解决方法

①参考给pytorch的Dataloader打鸡血:

参考链接1

参考链接2

②代码:

class data_prefetcher():def __init__(self, loader):self.loader = iter(loader)self.stream = torch.cuda.Stream()self.preload()def preload(self):try:self.next_data, self.next_label, self.next_index = next(self.loader)except StopIteration:self.next_data = Noneself.next_label = Noneself.next_index = Nonereturnwith torch.cuda.stream(self.stream):self.next_data = self.next_data.cuda(non_blocking=True)self.next_label = self.next_label.cuda(non_blocking=True)self.next_index = self.next_index.cuda(non_blocking=True)def next(self):torch.cuda.current_stream().wait_stream(self.stream)data = self.next_datalabel = self.next_labelindex = self.next_indexself.preload()return data, label, index######self.data_loader['train'] = torch.utils.data.DataLoader(dataset=Feeder(**self.arg.train_feeder_args),batch_size=self.arg.batch_size,shuffle=True,num_workers=self.arg.num_worker,drop_last=True,worker_init_fn=init_seed,pin_memory=True)
loader = self.data_loader['train']
process = tqdm(loader, ncols=40)#######prefetcher = data_prefetcher(process)
rgb_data, label, index = prefetcher.next()
while rgb_data is not None:# forward##### backward####rgb_data, label, index = prefetcher.next()

经本人测试,这种prefetcher的方法无法解决io瓶颈;

4--参考

参考1

参考2

参考3

5--最新补充

博主将单个数据处理为单个小样本,并存放在固态硬盘(完美解决io瓶颈)中。根据Dataloader产生的索引去寻址加载数据,顺利解决上述问题,加载数据迅速,GPU利用率高。

记录--深度学习加载大数据集遭遇内存和磁盘io瓶颈的问题相关推荐

  1. 深度学习加载预训练权重好处

    深度学习加载预训练权重好处: 在模型开始训练前,使模型参数得到一个好的初始化,对于后面的训练学习有非常大的帮助.

  2. jqgrid本地加载分页_jqgrid无需分页即可加载大数据集

    我想知道是否有更好的方法从服务器加载大型Json数据集. 我正在使用jqgrid作为loadonce:true.我需要一次加载大约1500条记录,而且我不使用分页选项.有没有更好的方法来实现这一目标? ...

  3. [转]Android有效解决加载大图片时内存溢出的问题

    http://hi.baidu.com/%D6%C7%B4%EF%B8%DF%D4%B6lee/blog/item/7bd659af3f40dc1d4b36d68d.html 尽量不要使用setIma ...

  4. 使用sklearn加载公共数据集、内存数据与CSV文件

    本文介绍了如何加载各种数据源,以生成可以用于sklearn使用的数据集.主要包括以下几类数据源: 预定义的公共数据源 内存中的数据 csv文件 任意格式的数据文件 稀疏数据格式文件 sklearn使用 ...

  5. android 动画 图片 内存溢出,Android有效解决加载大图片时内存溢出的问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过ja ...

  6. 加载大图片,内存溢出问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过ja ...

  7. Weka加载大数据量内存不足的解决办法

    150M的训练集用WEKA做起来应该比较困难有这么几个办法: 1 增加内存. 其实WEKA不光可以用物理内存,还可以占用虚拟内存.把JAVA的可用内存设置成2G的话,如果机器的物理内存只有1G,操作系 ...

  8. Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题

    今天在交流群里,有人问我他经常遇到加载图片时内存溢出的问题,遇到的情况还是在自己的测试机或者手机里没有问题,做好了, 到了客户手机里就内存溢出了.其实有时候不同的手机和不同的系统对内存的要求不一样,尤 ...

  9. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(综合性)--机器学习.深度学习算法中常用数据集大集合(建议收藏,持续更新) 目录 常规数据集 各大方向分类数据集汇总 具体数据集分类 相关文章 DL:关于深度学习常用数据集 ...

最新文章

  1. es6 - foreach
  2. 决策树——CART和模型树
  3. python必背语法_python常用语法合集
  4. this调用语句必须是构造函数中的第一个可执行语句_详解-JavaScript 的 this 指向和绑定...
  5. 新装Ubuntu 11.04有感
  6. UNIX 环境高级编程(六)—— 程序和进程
  7. MySql Binlog初识
  8. 常用liunx / mysql命令
  9. Laravel的中间件
  10. 想要写出漂亮文档,(表情图标)资源你值得收藏
  11. 南航考研计算机学院学硕分数,2019南航计算机学硕经验贴
  12. 计算机上数字代表那个音符,音符时值
  13. 运维监控系列(4)-Prometheus控制台功能详解
  14. html卡通人物旋转,AE教程-把平面卡通人物制作成头部扭动旋转动画 3D Head Rotation for Detailed Artwork 带中文字幕...
  15. html表格分行分列,excel表格内怎样设置分行和分列
  16. uptime 之一 /proc/uptime
  17. 个人成长:简单写写《乔布斯传》读后感
  18. 基于S12ZVM的无感FOC失步检测
  19. 2022温州经开区沙城街道办事处招聘编外人员综合试题及答案
  20. 【阿里云】深入分析阿里云中图片服务的架构经验

热门文章

  1. python高级函数,将函数作为变量、返回函数
  2. TN-S TN-C TN-C-S TT IT接地系统的接线图解
  3. OkHttp面试之--HttpEngine中的sendRequest方法详解
  4. VR+全景播放器+头控讲解-01
  5. 什么是ACK攻击?ACK攻击的原理是什么?
  6. 《计算机组成原理》学习笔记
  7. Saleae Logic16 逻辑分析仪使用说明
  8. t检验自由度的意义_T检验和F检验\自由度_f检验和t检验的区别
  9. iOS_版本低于iOS13 Crash:dyld: Library not loaded CryptoKit
  10. 企业网站制作中应注意的几个问题