我正在尝试用H2O (3.14)来训练一个机器学习模型。我的数据集大小为4Gb,我的计算机RAM为2Gb,带有2G交换(JDK1.8)。参考这个文章,H2O可以用2GBRAM处理一个巨大的数据集。
围绕这一问题提出的一些问题:
工作范围为1:
我用选项java -Xmx10g -jar h2o.jar配置了java堆。当我加载数据集时。H2O信息如下:
然而,JVM消耗了所有的内存和交换,然后操作系统停止了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内存处理巨大的数据集?
发布于 2017-08-31 08:44:29
如果这是以任何商业方式,购买更多的RAM,或支付几美元租用几个小时的云服务器。
这是因为在太小的机器上做机器学习的额外时间和精力是不值得的。
如果这是一个学习项目,完全没有预算:将数据集中到8个大小相等的部分(*),只需使用第一部分来制作和调整模型。(如果数据不是随机排序的,那么将其切割成32个等份,然后将第1、9、17和25部分连接起来,或者类似的内容。)
如果您真的必须使用整个数据集来构建一个模型,那么仍然可以这样做。然后保存模型,然后移动到8组数据中的第2组。到目前为止,您已经调优了超参数,所以您只是在生成一个模型,而且它会非常快。重复第3到第8部分。现在你有了8种模型,并且可以在一个整体中使用它们。
*:我选择了8,它为您提供了0.5GB的数据集,这是可用内存的四分之一。对于早期的实验,我建议进行更小的,例如50 it,因为这样会使迭代速度更快。
还有几个想法:
发布于 2017-08-31 10:36:46
这篇引用自2014年的文章已经过时很多年了,并且提到了H2O-2。内H2O用户模式交换到磁盘的概念在当时是实验性的。
但这在H2O-3中(在2015年初左右成为主要的H2O代码库)中从未支持过,因为性能很差,正如引用的StackOverflow文章所解释的那样。
https://stackoverflow.com/questions/45976338
复制相似问题