R中的h2o:模型计算挂起

R中的h2o:模型计算挂起,r,random-forest,h2o,freeze,R,Random Forest,H2o,Freeze,我不明白为什么我的随机森林网格搜索挂起。我在Stackoverflow上尝试了很多建议,但都没有效果。 首先,这是我的代码: library(data.table) library(h2o) library(dplyr) # Initialise H2O localH2O = h2o.init(nthreads = -1, min_mem_size = "9240M", max_mem_size = "11336M") h2o.removeAll() # Specify some dirs

我不明白为什么我的随机森林网格搜索挂起。我在Stackoverflow上尝试了很多建议,但都没有效果。 首先,这是我的代码:

library(data.table)
library(h2o)
library(dplyr)

# Initialise H2O
localH2O = h2o.init(nthreads = -1, min_mem_size = "9240M", max_mem_size = "11336M")

h2o.removeAll()

# Specify some dirs, inputs etc. (not shown)
laufnummer  <- 10
set.seed(laufnummer)
maxmodels   <- 500

# Convert to h2o
h2o_input <- as.h2o(input)

# Split: 80% = train; 0 = valid; rest = 20% = test
splits <- h2o.splitFrame(h2o_input, c(0.80,0))
train  <- h2o.assign(splits[[1]], "train") # 80%
test   <- h2o.assign(splits[[3]], "test")  # 10%
库(data.table)
图书馆(h2o)
图书馆(dplyr)
#初始化H2O
localH2O=h2o.init(nthreads=-1,最小值为9240M,最大值为11336M)
h2o.removeAll()
#指定一些指令、输入等(未显示)

laufnummer挂起的原因很可能是内存不足。您要么需要使用更少的内存,要么在内存更多的系统上运行作业

这里有许多因素在起作用,除非您了解底层资源的使用情况,否则不一定清楚如何调试它们

下面是关于如何监控内存使用、如何减少内存使用以及如何获得具有更多内存的系统的建议的三个部分


以下是一些内存监控建议:

  • 监视物理内存使用情况。在Mac或Linux上使用类似于
    top
    的程序来实现这一点。要查看的一个重要数字是RSS(常驻集大小),它表示主机上实际使用的物理内存量

  • 监视任何交换。确保您的系统未交换到磁盘。当您试图使用的虚拟内存(一次)超过主机上的物理内存时,会发生交换。在linux上,
    vmstat
    命令用于显示交换

  • 使用-XX:+PrintGCDetails-XX:+PrintGCTimeStamps打开java GC日志记录,您将获得更多的日志输出,这将显示java本身是否因为内存不足而陷入困境。这很有可能。下面是一个示例,说明如何在从R内部启动H2O-3时通过传递
    jvm\u custom\u args
    标志来实现这一点:

  • 您将看到一条消息,其中显示:

    H2O is not running yet, starting it now...
    
    Note:  In case of errors look at the following log files:
        /var/folders/vv/pkzvhy8x5hsfbsjg75_6q4ch0000gn/T//RtmpUsdTRQ/h2o_tomk_started_from_r.out
        /var/folders/vv/pkzvhy8x5hsfbsjg75_6q4ch0000gn/T//RtmpUsdTRQ/h2o_tomk_started_from_r.err
    
    上面的.out文件现在将包含GC日志输出,如下所示:

    ...
    02-02 08:30:29.785 127.0.0.1:54321       21814  main      INFO: Open H2O Flow in your web browser: http://127.0.0.1:54321
    02-02 08:30:29.785 127.0.0.1:54321       21814  main      INFO:
    02-02 08:30:29.886 127.0.0.1:54321       21814  #84503-22 INFO: GET /, parms: {}
    02-02 08:30:29.946 127.0.0.1:54321       21814  #84503-20 INFO: GET /, parms: {}
    02-02 08:30:29.959 127.0.0.1:54321       21814  #84503-21 INFO: GET /, parms: {}
    02-02 08:30:29.980 127.0.0.1:54321       21814  #84503-22 INFO: GET /3/Capabilities/API, parms: {}
    02-02 08:30:29.981 127.0.0.1:54321       21814  #84503-22 INFO: Locking cloud to new members, because water.api.schemas3.CapabilitiesV3
    02-02 08:30:30.005 127.0.0.1:54321       21814  #84503-25 INFO: GET /3/InitID, parms: {}
    14.334: [GC (Allocation Failure) [PSYoungGen: 94891K->3020K(153088K)] 109101K->56300K(299008K), 0.0193290 secs] [Times: user=0.22 sys=0.01, real=0.02 secs]
    14.371: [GC (Allocation Failure) [PSYoungGen: 120914K->3084K(153088K)] 174194K->173560K(338432K), 0.0256458 secs] [Times: user=0.29 sys=0.04, real=0.03 secs]
    14.396: [Full GC (Ergonomics) [PSYoungGen: 3084K->0K(153088K)] [ParOldGen: 170475K->163650K(435200K)] 173560K->163650K(588288K), [Metaspace: 22282K->22282K(1069056K)], 0.0484233 secs] [Times: user=0.47 sys=0.00, real=0.05 secs]
    14.452: [GC (Allocation Failure) [PSYoungGen: 118503K->160K(281088K)] 282153K->280997K(716288K), 0.0273738 secs] [Times: user=0.30 sys=0.05, real=0.02 secs]
    14.479: [Full GC (Ergonomics) [PSYoungGen: 160K->0K(281088K)] [ParOldGen: 280837K->280838K(609792K)] 280997K->280838K(890880K), [Metaspace: 22282K->22282K(1069056K)], 0.0160751 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
    14.516: [GC (Allocation Failure) [PSYoungGen: 235456K->160K(281088K)] 516294K->515373K(890880K), 0.0320757 secs] [Times: user=0.30 sys=0.10, real=0.03 secs]
    14.548: [Full GC (Ergonomics) [PSYoungGen: 160K->0K(281088K)] [ParOldGen: 515213K->515213K(969216K)] 515373K->515213K(1250304K), [Metaspace: 22282K->22282K(1069056K)], 0.0171208 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
    
    “分配失败”消息看起来很可怕,但实际上是完全正常的。需要担心的是,当您看到背对背的完整GC周期需要大量“实秒”时


    以下是使用更少内存的一些建议:

    • 拆分数据一次并将其保存到磁盘,然后通过两个单独的as.H2O或H2O.importFile步骤将其读回新的H2O-3群集

      在您的示例中,您正在执行splitFrame。这将在内存中复制您的数据

    • 首选h2o.importFile而不是as.h2o

      我不知道这对您的案例有多大影响,但h2o.importFile是针对大数据设计和测试的,而as.h2o则不是

    • 使用更少的数据

      您没有提到任何关于数据形状的内容,但是如果automl或网格搜索与GBM(而不是DRF)一起工作,那么肯定是内存不足。这两种算法在计算方面做的几乎完全相同,但DRF模型往往更大,因为DRF具有更高的树深度,这意味着它需要更多的内存来存储模型

    • 使用nthreads选项减少并发工作线程的数量

      运行的活动并发线程越多,需要的内存就越多,因为每个线程都需要一些工作内存。例如,您可以尝试将nthreads设置为现有CPU内核数的一半

    • 不要使用xgboost

      Xgboost的特殊之处在于它使用内存,因为它在java堆之外生成数据的第二个副本。这意味着在使用xgboost时,您不希望将整个主机的内存分配给java max_mem_size(或Xmx),否则可能会遇到问题(尤其是交换)

    • 不要使用DRF

      DRF树更深,因此生成的模型更大。或者,构建(并在内存中保留)更少的DRF模型、更浅的DRF模型或具有更少树的模型



    获取更多内存的最佳快速建议是在云中运行。您不一定需要多节点设置。如果单个大型节点能够充分解决问题,则更容易使用。在你的情况下,很可能会。考虑到您上面所说的(即您现在有16 GB,如果不使用DRF,它将完成),我将首先使用EC2中的
    m5.4xlagle
    实例,它有64 GB的RAM,成本低于1美元/小时,并将其最大内存大小设置为48G。

    看起来您已经耗尽了资源。您尝试过AWS/Azure群集吗?谢谢。不,我没有尝试群集。我不在乎它是否需要1-2天在我的机器上,但它不应该挂起。。。限制为1个CPU并没有帮助,所以这可能不是原因。您可能希望直接在他们的流上联系h2o,并链接到这个so问题。但是他们需要知道你的数据集的大小。非常感谢你的详细回答。我将在未来几天内尝试这些建议。但是,数据集非常小(263行x25列),我设置了最大内存,所以我不确定到底会出现多少内存?但是让我们拭目以待,看看测试会带来什么。我会先尝试一个不同的/更大的主机,以排除您自己计算机上的一些未知问题。
    h2o.init(jvm_custom_args = c("-XX:+PrintGCDetails", "-XX:+PrintGCTimeStamps"))
    
    H2O is not running yet, starting it now...
    
    Note:  In case of errors look at the following log files:
        /var/folders/vv/pkzvhy8x5hsfbsjg75_6q4ch0000gn/T//RtmpUsdTRQ/h2o_tomk_started_from_r.out
        /var/folders/vv/pkzvhy8x5hsfbsjg75_6q4ch0000gn/T//RtmpUsdTRQ/h2o_tomk_started_from_r.err
    
    ...
    02-02 08:30:29.785 127.0.0.1:54321       21814  main      INFO: Open H2O Flow in your web browser: http://127.0.0.1:54321
    02-02 08:30:29.785 127.0.0.1:54321       21814  main      INFO:
    02-02 08:30:29.886 127.0.0.1:54321       21814  #84503-22 INFO: GET /, parms: {}
    02-02 08:30:29.946 127.0.0.1:54321       21814  #84503-20 INFO: GET /, parms: {}
    02-02 08:30:29.959 127.0.0.1:54321       21814  #84503-21 INFO: GET /, parms: {}
    02-02 08:30:29.980 127.0.0.1:54321       21814  #84503-22 INFO: GET /3/Capabilities/API, parms: {}
    02-02 08:30:29.981 127.0.0.1:54321       21814  #84503-22 INFO: Locking cloud to new members, because water.api.schemas3.CapabilitiesV3
    02-02 08:30:30.005 127.0.0.1:54321       21814  #84503-25 INFO: GET /3/InitID, parms: {}
    14.334: [GC (Allocation Failure) [PSYoungGen: 94891K->3020K(153088K)] 109101K->56300K(299008K), 0.0193290 secs] [Times: user=0.22 sys=0.01, real=0.02 secs]
    14.371: [GC (Allocation Failure) [PSYoungGen: 120914K->3084K(153088K)] 174194K->173560K(338432K), 0.0256458 secs] [Times: user=0.29 sys=0.04, real=0.03 secs]
    14.396: [Full GC (Ergonomics) [PSYoungGen: 3084K->0K(153088K)] [ParOldGen: 170475K->163650K(435200K)] 173560K->163650K(588288K), [Metaspace: 22282K->22282K(1069056K)], 0.0484233 secs] [Times: user=0.47 sys=0.00, real=0.05 secs]
    14.452: [GC (Allocation Failure) [PSYoungGen: 118503K->160K(281088K)] 282153K->280997K(716288K), 0.0273738 secs] [Times: user=0.30 sys=0.05, real=0.02 secs]
    14.479: [Full GC (Ergonomics) [PSYoungGen: 160K->0K(281088K)] [ParOldGen: 280837K->280838K(609792K)] 280997K->280838K(890880K), [Metaspace: 22282K->22282K(1069056K)], 0.0160751 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
    14.516: [GC (Allocation Failure) [PSYoungGen: 235456K->160K(281088K)] 516294K->515373K(890880K), 0.0320757 secs] [Times: user=0.30 sys=0.10, real=0.03 secs]
    14.548: [Full GC (Ergonomics) [PSYoungGen: 160K->0K(281088K)] [ParOldGen: 515213K->515213K(969216K)] 515373K->515213K(1250304K), [Metaspace: 22282K->22282K(1069056K)], 0.0171208 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]