首页 文章

为什么h2o.saveModel挂在R v3.3.2和H2O v3.10.4.2中

提问于
浏览
1

23Jun2017: Yet another update...
11Apr2017: I added another update below...
I added an update below...

我们使用梯度增强机(GBM)开发了一个模型 . 该模型最初是在Linux机器上通过R v3.2.3使用H2O v3.6.0.8开发的:

$ uname -a
Linux xrdcldapprra01.unix.medcity.net 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

以下代码已经好几个月了:

modelname <- 'gbm_34325f.hex'
h2o.gbm(x = predictors, y = "outcome", training_frame = modified.hex,
    validation_frame = modified_holdout.hex, distribution="bernoulli",
    ntrees = 6000, learn_rate = 0.01, max_depth = 5,
    min_rows = 40, model_id = modelname)
gbm <- h2o.getModel(modelname)
h2o.saveModel( gbm, path='.', force = TRUE )

上周我们将Linux机器升级为:

  • R:v 3.3.2

  • H2O:v 3.10.4.2

h2o.init() 的输出所示:

> h2o.init()
 Connection successful!

R is connected to the H2O cluster: 
    H2O cluster uptime:         2 days 1 hours 
    H2O cluster version:        3.10.4.2 
    H2O cluster version age:    14 days, 22 hours and 48 minutes  
    H2O cluster name:           H2O_started_from_R_bac_ytl642 
    H2O cluster total nodes:    1 
    H2O cluster total memory:   18.18 GB 
    H2O cluster total cores:    64 
    H2O cluster allowed cores:  64 
    H2O cluster healthy:        TRUE 
    H2O Connection ip:          localhost 
    H2O Connection port:        54321 
    H2O Connection proxy:       NA 
    H2O Internal Security:      FALSE 
    R Version:                  R version 3.3.2 (2016-10-31)

我现在正在从较新版本的R和H2O中重建这个模型 . 当我运行上面的R / H2O代码时,它挂起在这个命令上:

h2o.saveModel( gbm, path='.', force = TRUE )

当我的程序挂在 h2o.saveModel 时,我启动了另一个R / H2O会话并连接到当前挂起的进程 . 我可以成功获得模型 . 我可以成功运行 h2o.saveModelDetails 并将其另存为JSON . 我可以把它保存为MOJO . 但是,我无法通过 h2o.saveModel 将其保存为原生'hex'模型 .

这些是我的命令和连接会话的输出(原始会话保持挂起状态):

> h2o.init()
 Connection successful!

R is connected to the H2O cluster: 
    H2O cluster uptime:         2 days 1 hours 
    H2O cluster version:        3.10.4.2 
    H2O cluster version age:    14 days, 22 hours and 48 minutes  
    H2O cluster name:           H2O_started_from_R_bac_ytl642 
    H2O cluster total nodes:    1 
    H2O cluster total memory:   18.18 GB 
    H2O cluster total cores:    64 
    H2O cluster allowed cores:  64 
    H2O cluster healthy:        TRUE 
    H2O Connection ip:          localhost 
    H2O Connection port:        54321 
    H2O Connection proxy:       NA 
    H2O Internal Security:      FALSE 
    R Version:                  R version 3.3.2 (2016-10-31) 

> modelname <- 'gbm_34325f.hex'
> gbm <- h2o.getModel(modelname)
> gbm
Model Details:
==============

H2OBinomialModel: gbm
Model ID:  gbm_34325f.hex 
Model Summary: 
  number_of_trees number_of_internal_trees model_size_in_bytes min_depth
1            6000                     6000           839613730         5
  max_depth mean_depth min_leaves max_leaves mean_leaves
1         5    5.00000          6         32    17.51517
[ snip ]

> model_path <- h2o.saveModelDetails( object=gbm, path='.', force=TRUE )
> model_path
[1] "/home/bac/gbm_34325f.hex.json"

# file created:
# -rw-rw-r-- 1 bac bac      552K Apr  2 12:20 gbm_34325f.hex.json
#
# first few characters are:
# {"__meta":{"schema_version":3,"schema_name":"GBMModelV3","schema_type":"GBMModel"},

> h2o.saveMojo( gbm, path='.', force=TRUE )
[1] "/home/bac/gbm_34325f.hex.zip"

# file created:
# -rw-rw-r-- 1 bac bac   7120899 Apr  2 11:57 gbm_34325f.hex.zip
#
# when I unzip this file, things look okay (altho MOJOs are new to me).

> h2o.saveModel( gbm, path='.', force=TRUE )
[ this hangs and never returns; i have to kill the entire R session ]

# empty file created:
# -rw-rw-r-- 1 bac bac         0 Apr  2 12:00 gbm_34325f.hex

然后,我通过Web界面H2OFlow访问这个挂起的进程 . 我再次加载并查看模型 . 当我尝试导出模型时,会创建一个空的 .hex 文件,我看到了以下消息:

Waiting for 2 responses...

2 responses 因为我导出了两次 . )

要清楚,我没有加载旧模型 . 相反,我正在新的R / H2O环境中从头开始重建模型 . 但是,我使用的是在旧环境中成功的相同R / H2O代码 .

对于发生了什么的任何想法?谢谢 .


更新:

我遇到的问题 h2o.saveModel 挂起 - 与 OOM (内存不足)有关 .

我在_2932560_文件中创建的 .out 文件中看到这些消息:

Note:  In case of errors look at the following log files:
    /tmp/RtmpOnJn83/h2o_bfo7328_started_from_r.out
    /tmp/RtmpOnJn83/h2o_bfo7328_started_from_r.err

$ tail -n 6 h2o_bfo7328_started_from_r.out
[ I removed the timestamp / IP info to help made this readable ]

FJ-1-107  INFO:  2017-04-04 01:27:04 30 min 56.196 sec            6000       0.25485          0.22119      0.96950       3.54582                       0.08634
2946-780 INFO: GET /3/Models/gbm_34325f.hex, parms: {}
2946-780 INFO: GET /3/Models/gbm_34325f.hex, parms: {}
946-1102 INFO: GET /99/Models.bin/gbm_34325f.hex, parms: {dir=/opt/app/STUFF/bpci/training/facility_models/gbm_34325f.hex, force=TRUE}
946-1102 WARN: Unblock allocations; cache below desired, but also OOM: OOM, (K/V:3.15 GB + POJO:Zero   + FREE:441.54 GB == MEM_MAX:444.44 GB), desiredKV=299.74 GB OOM!
946-1102 WARN: Unblock allocations; cache below desired, but also OOM: OOM, (K/V:3.15 GB + POJO:Zero   + FREE:441.54 GB == MEM_MAX:444.44 GB), desiredKV=299.74 GB OOM!

一旦我意识到这是一个OOM问题,我改变了 h2o.init 以包含 max_mem_size

localH2O = h2o.init(ip = "localhost", port = 54321, nthreads = -1, max_mem_size = '500G')

即使 max_mem_size = '500G' 设置为高,我仍然会收到OOM错误(见上文) .

当我运行H2O v3.6.0.8时,我没有明确定义 max_mem_size .
我很好奇:现在我升级到H2O v3.10.4.2,是否有更大的内存需求? H2O v3.6.0.8中的默认 max_mem_size 是什么?

想知道两个版本的H2O之间的内存改变了什么?我怎么能让它再次运行?

谢谢!


11 Apr2017更新:

我希望共享生成此错误的数据集 . 不幸的是,数据包含受保护的信息,因此我无法共享它 . 我创建了这个文件的“擦洗”版本 - 包含无意义的数据 - 但我发现由于各种依赖性和验证检查,通过我们的模型训练R代码运行这个擦除数据太困难了 .

我对 h2o.saveModel 期间导致OOM(内存不足)错误的各种参数有一般的了解 .
导致错误:

  • 51380条记录,包含1413列用于训练的数据

  • ntrees = 6000

不会导致错误:

  • 51380条记录,包含1413列用于训练的数据

  • ntrees = 3750(但是ntrees = 4000会导致错误)

不会导致错误:

  • 25000条记录,包含1413列用于训练的数据(但40000条记录导致错误)

  • ntrees = 6000

有一些记录数,列数和最终导致OOM的树的组合 .

设置 max_mem_size 根本没有帮助 . 我将它设置为'100G','200G'和'300G',并且在 h2o.saveModel 期间仍然是OOM .

测试早期版本的H2O

因为我不能在记录的数量和用于训练的列数以及GBM中所需的树数量上妥协,所以我不得不回到早期版本的h2o .

在使用十个不同版本的h2o之后,我找到了最新发布的版本,它不会产生OOM . 版本和结果是:

  • v3.6.0.8 - 成功(用于创建模型的原始版本)

  • v3.8.1.4 - 成功

  • v3.10.0.8 - 成功

  • v3.10.2.1 - 成功

  • v3.10.3.1 - 错误:OOM

  • v3.10.3.2 - 错误:OOM

  • v3.10.3.5 - 错误:OOM

  • v3.10.4.2 - 错误:OOM(升级到此;发现OOM错误)

  • v3.10.4.3 - 错误:OOM

  • v3.11.0.3839 - 成功

我没有使用v3.11.0.3839,因为它似乎是“前沿” . 我目前正在运行v3.10.2.1 .

我希望这可以帮助有人追踪这个错误 .


23 Jun2017更新:

我能够解决这个问题:

1 回答

  • 0

    由于此问题与内存直接相关,请让您为h2o实例正确设置内存并确保设置正常 . 当你将max_mem_size随机设置为任意数字(100g,200g,300g)时,它无济于事 . 首先,我们需要了解您机器中的总RAM,然后您可以将大约80%的内存用于您的h2o实例 .

    例如,我的机器中有16GB,我想从R启动时为H2O实例提供12GB,我将执行以下操作:

    h2o.init(max_mem_size = "12g")
    

    一旦H2O启动并运行,我将获得H2O过程的内存设置确认,如下所示:

    R is connected to the H2O cluster: 
    H2O cluster uptime:         2 seconds 166 milliseconds 
    H2O cluster version:        3.10.4.3 
    H2O cluster version age:    12 days  
    H2O cluster name:           H2O_started_from_R_avkashchauhan_kuc791 
    H2O cluster total nodes:    1 
    H2O cluster total memory:   10.67 GB <=== [memory setting working]
    H2O cluster total cores:    8 
    H2O cluster allowed cores:  2 
    H2O cluster healthy:        TRUE 
    H2O Connection ip:          localhost 
    H2O Connection port:        54321 
    H2O Connection proxy:       NA 
    H2O Internal Security:      FALSE 
    R Version:                  R version 3.3.2 (2016-10-31)
    

    如果在各种模型构建步骤中更改数据集大小,您将看到具有随机行数的OOM,因为有时Java GC将清除未使用的内存,有时等待清除 . 因此,您将使用N编号命中OOM一次,有时您不会在同一个Java实例中使用2N编号命中OOM . 所以追逐那条路线是没用的 .

    它肯定是一个与内存相关的问题,并确保你给H2O集群提供足够的内存,然后看看它是如何工作的 .

相关问题