【问题标题】:Optimizing RAM usage when training a learning model在训练学习模型时优化 RAM 使用
【发布时间】:2018-06-07 17:42:45
【问题描述】:

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

我曾经在自己的笔记本电脑上运行该模型,但在实现了运行良好的 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 回来

提前谢谢大家!

【问题讨论】:

  • OHE 编码的类别有多少?也许显示一些代码会有所帮助,例如你对串联做了什么?
  • 原始表有 7 列,其中 3 列是我 OHE 编码的。这三列总共有大约 5400 个类别。连接用于将 OHE 编码的列添加回原始列(因为剩余的 4 列未编码),然后直接使用“drop”命令删除未编码的分类列。
  • 这部分代码如下所示:pastebin.com/jtxbTv1C 抱歉,如果它看起来一团糟。我在高效编码领域真的不为人知

标签: python deep-learning ram rdp


【解决方案1】:

我们来分析一下步骤:

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

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

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

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

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

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

第 3 步:训练 看看是否可以批量或流式(基本上是在线)进行训练,或者只是使用较少的采样数据。

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

【讨论】:

    【解决方案2】:

    与您的实际问题略微正交,如果您的高 RAM 使用率是由于将整个数据集放在内存中进行训练,您可以通过一次仅读取和存储一个批次来消除这种内存占用:读取批次,训练这批,读下一批,依此类推。

    【讨论】:

    • 感谢您的回复,我明白这有什么意义,但我确实有一些后续问题。如果我不一次全部读取我的数据,或者至少一次将其全部保存在我的记忆中,那么像 SMOTE 这样的东西还有可能吗?同样假设这是不可能的,我想知道如果您选择较小的批次,一个不平衡的类别是否会产生更小的影响。
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2020-11-10
    • 2021-05-05
    • 2019-05-22
    • 1970-01-01
    • 2018-01-13
    • 2020-05-21
    • 2021-10-01
    相关资源
    最近更新 更多