【问题标题】:Why is h2o.saveModel hanging in R v3.3.2 and H2O v3.10.4.2为什么 h2o.saveModel 挂在 R v3.3.2 和 H2O v3.10.4.2 中
【发布时间】:2017-08-27 13:17:18
【问题描述】:

2017 年 6 月 23 日:又一个更新...
2017 年 4 月 11 日:我在下面添加了另一个更新...
我在下面添加了一个更新。 ..

我们开发了一个使用梯度提升机 (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 将其保存为本机“十六进制”模型。

这些是我连接会话的命令和输出(原始会话仍然挂起):

> 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 因为我导出了两次。)

  1. Snapshot of Export via H2OFlow
  2. Snapshot of 'Waiting for 2 responses' message from exportModel

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

对正在发生的事情有任何想法吗? 谢谢。


更新:

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

我在h2o.init 时创建的.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 的两个版本之间的内存方面发生了什么变化吗?我怎样才能让它再次运行?

谢谢!


2017 年 4 月 11 日更新:

我希望分享产生此错误的数据集。不幸的是,这些数据包含受保护的信息,所以我不能分享它。我创建了这个文件的“清理”版本——包含无意义的数据——但我发现通过我们的模型训练 R 代码运行这些清理数据太困难了,因为存在各种依赖关系和验证检查。

我大致了解在h2o.saveModel 期间哪些类型的参数会导致 OOM(内存不足)错误。
导致错误:

  • 51380 条记录,1413 列数据用于训练
  • ntrees = 6000

不会导致错误:

  • 51380 条记录,1413 列数据用于训练
  • ntrees = 3750(但 ntrees = 4000 会导致错误)

不会导致错误:

  • 25000 条记录,1413 列数据用于训练(但 40000 条记录会导致错误)
  • ntrees = 6000

记录数、列数和 ntree 的某种组合最终会导致 OOM。

设置max_mem_size 根本没有帮助。我将其设置为“100G”、“200G”和“300G”,但在 h2o.saveModel 期间仍然 OOM。

测试早期版本的 H2O

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

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

  1. v3.6.0.8 - 成功(用于创建模型的原始版本)
  2. v3.8.1.4 - 成功
  3. v3.10.0.8 - 成功
  4. v3.10.2.1 - 成功
  5. v3.10.3.1 - 错误:OOM
  6. v3.10.3.2 - 错误:OOM
  7. v3.10.3.5 - 错误:OOM
  8. v3.10.4.2 - 错误:OOM(升级到此;发现 OOM 错误)
  9. v3.10.4.3 - 错误:OOM
  10. v3.11.0.3839 - 成功

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

我希望这有助于有人追踪这个错误。


2017 年 6 月 23 日更新:

我能够通过以下方式解决此问题:

  1. 升级到 v3.10.5.1
  2. h2o.init() 期间设置both min_mem_sizemax_mem_size

见: https://stackoverflow.com/a/44724813/7733787

【问题讨论】:

  • 您是否尝试过使用旧数据回滚到以前版本的 R、H2O?
  • 你有没有机会提供一个可重现的例子?我试图在另一个数据集上重现,但我没有 h2o.saveModel 错误:gist.github.com/ledell/5223980f9cfe3cf170648c3ff2748486 我假设您现在拥有与使用 3.6 时相同的 H2O 可用内存量?
  • @c69,很遗憾我无法在 Linux 机器上回滚 R 和 H2O 的版本。我们的系统管理员没有同时维护旧版本和新版本。我在我的 Mac 上运行的灵活性更大,所以我会在那里玩。
  • @Erin LeDell,是的,我有相同数量的可用内存。当我尝试调试它时,我将尝试创建一个可重现的示例。另外,感谢您发布一个封装的示例。我会看看你的例子是否适用于我的环境。谢谢大家!
  • 我更新了我原来的帖子。我发现了 OOM(内存不足)错误。我设置了max_mem_size = '500G',但仍然出现 OOM 错误。任何想法如何解决这个问题?

标签: r linux h2o


【解决方案1】:

由于此问题与内存直接相关,请让您为您的 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 集群提供足够好的内存,然后看看它是如何工作的。

【讨论】:

  • 感谢您的回复。我同意,“追逐那条路线 [改变max_mem_size] 没有用”。我们的 Linux 机器有 1.5 Tera 的内存。有一次我分配了max_mem_size = 500G,但仍然出现OOM错误。除了升级到 R(从 v3.2.3 到 v3.3.2)和 H2O(从 v3.6.0.8 到 v3.10.4.2)之外,我们的 Linux 机器上没有任何变化。
  • R 代码没有改变。对 H2O 的调用没有改变。使用旧版本的 R/H2O 成功完成了 GBM 模型训练(即,h2o.saveModel 已写入磁盘)。 GBM 模型训练在 h2o.saveModel 与新环境引发 OOM。在使用了 10 个不同版本的 H2O(始终使用新版本的 R v3.3.2)后,我发现所有 H2O 版本 3.10.3.x 和 3.10.4.x 都会抛出 OOM 错误。我发现 H2O v3.10.2.1 有效;我现在正在使用这个版本。 H2O 版本 3.11.0.3839 也可以,但我没有使用这个版本,因为它似乎是最前沿的。
  • 我希望这个 OOM 错误可以得到修复,否则我们会被 v3.10.2.1 卡住,或者必须迁移到例如 python 的 scikit-learn。
  • 请发送电子邮件至 support@h2o.ai,以便我们解决您机器上的问题,我会在那里为您提供帮助。
  • 感谢您提供帮助。我刚刚向 support@h2o.ai 发送了一封电子邮件。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2016-02-23
  • 2017-02-21
  • 2018-11-18
相关资源
最近更新 更多