首页 文章

如何使用H2O处理大数据集

提问于
浏览
1

我正在尝试用H2O训练机器学习模型(3.14) . 我的数据集大小是4Gb,我的计算机RAM是2Gb,2G交换,JDK 1.8 . 参考这个article,H2O可以处理带有2Gb RAM的庞大数据集 .

关于Bigger Data和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 收集器正在等待清除swap中的一些未使用的内存 .

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

2 回答

  • 1

    如果这是商业化的,购买更多内存,或支付几美元在 Cloud 服务器上租几个小时 .

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

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

    如果你真的,真的,真的,必须使用整个数据集 Build 一个模型,那么仍然可以做到这一点 . 但随后保存模型,然后移动到8个数据集中的第2个 . 到目前为止,您已经调整了超参数,所以您只是生成一个模型,而且速度很快 . 重复第3至8部分 . 现在您有8个模型,可以在整体中使用它们 .

    *:我选择了8,它为你提供了0.5GB的数据集,这是可用内存的四分之一 . 对于早期的实验,我实际上建议更小,例如50MB,因为它会使迭代更快 .

    还有一些想法:

    • H2O压缩内存中的数据 . 因此,如果4GB是未压缩的数据大小,则可能会使用较小的内存 . (但请记住,建议使用的内存大小是数据量的3-4倍 . )

    • 如果您有一些拥有类似小内存计算机的朋友,您可以将它们联网在一起 . 4到8台计算机可能足以加载您的数据 . 它可能运行良好,可能非常慢,这取决于算法(以及您的网络速度) .

  • 1

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

    但是H2O-3(它在2015年初成为主要的H2O代码库)从未得到过支持,因为引用的StackOverflow帖子解释说,性能很糟糕 .

相关问题