如何用 H2O 处理大数据集

How to deal with a big dataset with H2O

我正在尝试使用 H2O (3.14) 训练机器学习模型。我的数据集大小为 4Gb,我的计算机 RAM 为 2Gb,交换空间为 2G,JDK 1.8。参考这个article,H2O可以用2Gb RAM处理一个巨大的数据集。

  • A note on Bigger Data and GC: We do a user-mode swap-to-disk when the Java heap gets too full, i.e., you're using more Big Data than physical DRAM. We won't die with a GC death-spiral, but we will degrade to out-of-core speeds. We'll go as fast as the disk will allow. I've personally tested loading a 12Gb dataset into a 2Gb (32bit) JVM; it took about 5 minutes to load the data, and another 5 minutes to run a Logistic Regression.

关于这个问题的一些问题:

解决方法 1:

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

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

解决方法 2:

我安装了 H2O spark。我可以加载数据集,但 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 内存处理庞大的数据集?

如果这有任何商业意义,请购买更多 RAM,或支付几美元在云服务器上租用几个小时。

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

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

如果你真的真的真的一定要用整个数据集建立模型,那还是照上面的做。但是然后保存模型,然后移动到 8 个数据集中的第二个。此时你已经调整了超参数,所以你只是在生成一个模型,而且速度很快。重复第 3 部分到第 8 部分。现在你有 8 个模型,可以在一个整体中使用它们。

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

还有一些想法:

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

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

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