在训练学习模型时优化RAM使用

时间:2018-06-06 11:33:58

标签: python deep-learning ram rdp

我第一次致力于创建和训练深度学习模型。在项目开始之前,我对这个主题一无所知,因此我的知识即使现在也是有限的。

我曾经在我自己的笔记本电脑上运行该模型但是在实现了良好的OHE和SMOTE之后,由于MemoryError(8GB的RAM),我根本无法在我自己的设备上运行它。因此,我现在正在使用30GB RAM RDP运行该模型,这让我可以做更多,我想。

我的代码似乎有一些可怕的低效率,我想知道它们是否可以解决。一个例子是,通过使用pandas.concat,我的模型的RAM使用从3GB到11GB的冲突,这看起来非常极端,之后我放下几列使RAm峰值达到19GB但实际上在计算完成后返回到11GB(不同于concat) )。我现在也强迫自己停止使用SMOTE,因为RAM的使用率会上升太多。

在代码结束时,训练发生的地方,模特在试图适应模型的同时呼出最后的呼吸。我该怎么做才能优化它?

我已经考虑过将代码分成多个部分(例如用于预处理和训练)但是为了这样做,我需要将大量数据集存储在一个只能达到4GB的pickle中(如果我错了,请纠正我)。我也考虑过使用预先训练的模型,但我真的不明白这个过程如何工作以及如何在Python中使用它。

P.S。:如果可能的话,我也想恢复我的SMOTE

提前谢谢大家!

2 个答案:

答案 0 :(得分:0)

与您的实际问题略有正交,如果您的高RAM使用率是由内存中的整个数据集引起的,那么您可以通过一次只读取和存储一个批次来消除此类内存占用:读取批处理,培训这批次,请阅读下一批等等。

答案 1 :(得分:0)

让我们分析一下步骤:

第1步:OHE 对于您的OHE,数据点之间唯一的依赖关系是需要清楚总体上有哪些类别。因此,OHE可以分为两个步骤,这两个步骤都不要求所有数据点都在RAM中。

步骤1.1:确定类别 Stream读取您的数据点,收集所有类别。没有必要保存您阅读的数据点。

步骤1.2:转换数据 在步骤1.1之后,可以独立地转换每个数据点。所以流读,转换,流写。您始终只需要内存中的一个或几个数据点。

步骤1.3:特征选择 查看功能选择以减少内存占用并提高性能可能是值得的。这个answer认为它应该在SMOTE之前发生。

基于熵的特征选择方法取决于所有数据。虽然你可能也可以将哪些内容放在一起,但过去一种适合我的方法是删除只有一个或两个数据点的功能,因为这些功能肯定具有低熵并且可能对分类器没有多大帮助。这可以像步骤1.1和步骤1.2一样再次完成

第2步:SMOTE 我不知道SMOTE足以给出答案,但如果您进行功能选择,问题可能已经解决了。在任何情况下,将结果数据保存到磁盘,这样您就不需要为每次培训重新计算。

第3步:培训 看看培训是分批进行还是流式传输(在线,基本上),或者只是采用较少的采样数据。

关于保存到磁盘:使用可轻松流式传输的格式,如csv或其他可拆分格式。不要使用泡菜。