首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用H2O处理大型数据集

如何使用H2O处理大型数据集
EN

Stack Overflow用户
提问于 2017-08-31 08:04:57
回答 2查看 1.7K关注 0票数 3

我正在尝试用H2O (3.14)来训练一个机器学习模型。我的数据集大小为4Gb,我的计算机RAM为2Gb,带有2G交换(JDK1.8)。参考这个文章,H2O可以用2GBRAM处理一个巨大的数据集。

  • 关于更大的数据和GC的注意事项:当Java堆太满时,我们使用用户模式交换到磁盘,也就是说,您使用的大数据比物理DRAM多。我们不会死在GC死亡螺旋,但我们会降低到核心外的速度。我们将以磁盘允许的速度前进。我亲自测试过将12 2Gb数据集加载到2GB(32位)JVM中;加载数据大约需要5分钟,运行Logistic回归需要5分钟。

围绕这一问题提出的一些问题:

  • 在h2o中加载大于内存大小的数据。上面提到的用户模式交换到磁盘的答案是禁用的,因为性能非常差。但是,他没有解释任何替代方法,以及如何在h2o中启用标志h2o?

工作范围为1:

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

然而,JVM消耗了所有的内存和交换,然后操作系统停止了java h2o程序。

工作范围约2:

我安装了H2O火花。我可以加载数据集,但是spark挂起了具有完整交换内存的下列日志:

代码语言:javascript
复制
 + 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内存处理巨大的数据集?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-31 08:44:29

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

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

如果这是一个学习项目,完全没有预算:将数据集中到8个大小相等的部分(*),只需使用第一部分来制作和调整模型。(如果数据不是随机排序的,那么将其切割成32个等份,然后将第1、9、17和25部分连接起来,或者类似的内容。)

如果您真的必须使用整个数据集来构建一个模型,那么仍然可以这样做。然后保存模型,然后移动到8组数据中的第2组。到目前为止,您已经调优了超参数,所以您只是在生成一个模型,而且它会非常快。重复第3到第8部分。现在你有了8种模型,并且可以在一个整体中使用它们。

*:我选择了8,它为您提供了0.5GB的数据集,这是可用内存的四分之一。对于早期的实验,我建议进行更小的,例如50 it,因为这样会使迭代速度更快。

还有几个想法:

  • H2O压缩内存中的数据.因此,如果4GB是未压缩的数据大小,您可能需要使用较小的内存。(但是,请记住,推荐的内存是数据大小的3-4倍。)
  • 如果你有一些有类似小内存计算机的朋友,你可以把它们连接在一起。4到8台计算机可能足以加载您的数据。它可能运行良好,它可能会非常慢,这取决于算法(以及您的网络的速度)。
票数 1
EN

Stack Overflow用户

发布于 2017-08-31 10:36:46

这篇引用自2014年的文章已经过时很多年了,并且提到了H2O-2。内H2O用户模式交换到磁盘的概念在当时是实验性的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45976338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档