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

Optimizing RAM usage when training a learning model

我第一次致力于创建和训练深度学习模型。在项目之前我对这个主题没有任何了解,因此即使现在我的知识也很有限。

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

我的代码似乎有一些非常低效的问题,我想知道是否可以解决这些问题。一个例子是,通过使用 pandas.concat,我的模型的 RAM 使用量从 3GB 猛增到 11GB,这看起来非常极端,之后我删除了几列使 RAM 飙升到 19GB 但实际上在计算完成后返回到 11GB(不像连接)。我还强迫自己暂时停止使用 SMOTE,因为 RAM 使用量会增加太多。

在代码的末尾,也就是训练发生的地方,模型在尝试拟合模型时呼吸了最后一口气。我可以做些什么来优化它?

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

P.S.: 如果可能的话我也想要我的 SMOTE

提前谢谢大家!

与您的实际问题略有正交,如果您的高 RAM 使用率是由于将整个数据集存储在内存中用于训练,您可以通过一次只读取和存储一个批次来消除这种内存占用:读取一个批次,在这批上训练,阅读下一批等等。

我们来分析一下步骤:

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

步骤 1.1:确定类别 流读取您的数据点,收集所有类别。读到的数据点不需要保存。

步骤 1.2:转换数据 在步骤 1.1 之后,每个数据点都可以独立转换。所以流式读取、转换、流式写入。您始终只需要一个或很少的内存数据点。

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

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

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

第 3 步:训练 看看训练是否可以分批或流式(在线,基本上)完成,或者简单地使用较少的采样数据。

关于保存到磁盘:使用可以轻松流式传输的格式,如 csv 或其他一些可拆分格式。不要为此使用 pickle。