2017-08-31 119 views
1

我正在尝试用H2O(3.14)来训练机器学习模型。我的数据集大小是4Gb,而我的计算机RAM是2Gb,JDK 1.8是2Gb。参考article,H2O可以处理2Gb RAM的大数据集。如何用H2O处理大数据集

  • 在更大的数据和GC的说明:我们做一个用户模式交换到磁盘时,Java堆已满,即你正在使用更多的大数据比 物理DRAM。我们不会死于GC死亡螺旋,但我们会降低到核心外的速度。我们将尽可能快地达到 允许的磁盘。我亲自测试了将12Gb数据集加载到2Gb (32位)JVM中;大约需要5分钟才能加载数据,另外需要5分钟来运行Logistic回归。

解决此问题的一些问题:

解决方法1:

我配置的选项java -Xmx10g -jar h2o.jar Java堆。当我加载数据集。 H2O信息如下:

但是,JVM消耗了所有的RAM内存和Swap,然后操作系统暂停了java h2o程序。

解决方法2:

我安装H2O spark。我可以加载的数据集,但火花与一个完整的交换内存以下日志挂:

+ FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.377 192.168.233.133:54321 6965 Thread-47 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.377 192.168.233.133:54321 6965 Thread-48 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.381 192.168.233.133:54321 6965 Thread-45 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.3 MB + FREE:426.7 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 
09-01 02:01:12.382 192.168.233.133:54321 6965 Thread-46 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=840.9 MB OOM! 
09-01 02:01:12.384 192.168.233.133:54321 6965 #e Thread WARN: Swapping! GC CALLBACK, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=802.7 MB OOM! 
09-01 02:01:12.867 192.168.233.133:54321 6965 FJ-3-1 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=1.03 GB OOM! 
09-01 02:01:13.376 192.168.233.133:54321 6965 Thread-46 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 
09-01 02:01:13.934 192.168.233.133:54321 6965 Thread-45 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.867 192.168.233.133:54321 6965 #e Thread WARN: Swapping! GC CALLBACK, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 

在这种情况下,我认为gc收集正在等待清理掉一些不用的内存。

如何在有限的RAM内存中处理大型数据集?

+0

为什么'r'标签? – shmosel

+0

我删除了'r'标签。我的客户端是一个'r'程序 – khant

回答

1

如果这是以任何方式商业化,购买更多的RAM,或支付几美元在云服务器上租用几个小时。

这是因为在太小的机器上进行机器学习的额外时间和精力是不值得的。

如果是一个学习项目,根本没有预算:将数据集切成8个相同大小的部分(*),然后使用第一部分来制作和调整模型。 (如果数据不是随机排列的,请将它分成32等分,然后连接部分1,9,17和25;或类似的东西)。

如果您确实真的需要构建模型使用整个数据集,然后仍然执行上述操作。但是,然后保存模型,然后移动到8个数据集中的第二个。在这一点上,您将已经调整了超参数,因此您只需生成一个模型,并且它会很快。重复3到8部分。现在你有8个模型,并且可以在一个合奏中使用它们。

*:我选择了8,它给了你一个0。5GB数据集,这是可用内存的四分之一。对于早期的实验,我实际上建议进行更小的实验,例如, 50MB,因为它会使迭代速度更快。

一对夫妇更多的心思:

  • H2O压缩在内存中的数据。因此,如果4GB是未压缩的数据大小,您可能会用较小的内存。 (但是,请记住,建议使用的内存大小是数据大小的3-4倍。)
  • 如果您有一些拥有类似小内存计算机的朋友,则可以将它们联网在一起。 4到8台计算机可能足以装载您的数据。它可能运行良好,速度可能非常慢,这取决于算法(以及网络的速度)。
+0

是否有任何解决方案用像keras框架这样的生成器方法来拟合模型? – khant

+0

@khant不是我所知道的。 H2O理念是内存机器学习,它可以在群集上高效工作:不断添加机器,直到总群集内存足够大以满足您的数据集。 (我只是给我的答案增加了几个想法,希望它有帮助。) –

1

从2014年引用的文章已经过时了很多年,是指H2O-2。 H2O内用户模式交换到磁盘的概念当时是实验性的。

但是这在H2O-3(它成为2015年初的主要H2O代码库)中从未得到支持,因为性能很差,正如引用的StackOverflow文章所解释的那样。