Почему h2o.saveModel зависает в R v3.3.2 и H2O v3.10.4.2

23Jun2017: Еще одно обновление ...
11Apr2017: Я добавил еще одно обновление ниже ...
Я добавил обновление ниже ... < / сильный>

Мы разработали модель с использованием машины для повышения градиента (GBM). Эта модель была первоначально разработана с использованием H2O v3.6.0.8 через R v3.2.3 на машине Linux:

$ 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

Затем я получаю доступ к этому процессу зависания через веб-интерфейс H2OFlow. Опять же, я могу загрузить и просмотреть модель. Когда я пытаюсь экспортировать модель, создается пустой файл .hex, и я вижу сообщение:

Waiting for 2 responses...

(2 responses потому что я дважды экспортировал.)

  1. Снимок экспорта через H2OFlow
  2. Снимок сообщения "Ожидание двух ответов" от exportModel

Чтобы было ясно, я не загружаю старую модель. Скорее я перестраиваю модель с нуля в новой среде R / H2O. Однако я использую тот же код R / H2O, который был успешным в более старой среде.

Есть идеи о том, что происходит? Спасибо.


ОБНОВИТЬ:

У меня проблема - h2o.saveModel зависает - связана с OOM (нехватка памяти).

Я вижу эти сообщения в .out файле, созданном, когда я h2o.init:

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, увеличилась ли потребность в памяти? Что было по умолчанию max_mem_size в H2O v3.6.0.8?

Есть идеи, что изменилось с точки зрения памяти между двумя версиями H2O? И как я могу заставить это работать снова?

Спасибо!


ОБНОВЛЕНИЕ 11Apr2017:

Я надеялся поделиться набором данных, который вызывает эту ошибку. К сожалению, данные содержат защищенную информацию, поэтому я не могу ею поделиться. Я создал «очищенную» версию этого файла, содержащую бессмысленные данные, но я обнаружил, что слишком сложно запустить эти очищенные данные через наш R-код для обучения модели из-за различных зависимостей и проверок достоверности.

У меня есть общее представление о том, какие параметры вызывают ошибку OOM (нехватка памяти) во время h2o.saveModel.
Вызывает ошибки:

  • 51380 записей с 1413 столбцами данных, используемых для обучения
  • ntrees = 6000

Не вызывает ошибок:

  • 51380 записей с 1413 столбцами данных, используемых для обучения
  • ntrees = 3750 (но ntrees = 4000 вызывает ошибку)

Не вызывает ошибок:

  • 25000 записей с 1413 столбцами данных, используемых для обучения (но 40000 записей вызывают ошибку)
  • ntrees = 6000

Существует некоторая комбинация количества записей, количества столбцов и ntrees, которая в конечном итоге вызывает OOM.

Установка max_mem_size совершенно не помогает. Я установил его на «100ГБ», «200ГБ» и «300ГБ», и все еще OOM в течение h2o.saveModel.

Тестирование более ранних версий 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 - успех

Я не использую версию 3.11.0.3839, поскольку она кажется «передовой». В настоящее время я работаю с v3.10.2.1.

Надеюсь, это поможет кому-нибудь отследить эту ошибку.


ОБНОВЛЕНИЕ 23Jun2017:

Мне удалось решить эту проблему:

  1. обновление до v3.10.5.1
  2. установка обоих min_mem_size и max_mem_size в течение h2o.init()

См .: https://stackoverflow.com/a/44724813/7733787


person BA88    schedule 02.04.2017    source источник
comment
Вы пробовали вернуться к предыдущей версии R или H2O, используя старые данные?   -  person c69    schedule 03.04.2017
comment
Есть ли шанс привести воспроизводимый пример? Я попытался воспроизвести на другом наборе данных, и у меня нет h2o.saveModel ошибок: gist.github.com / ledell / 5223980f9cfe3cf170648c3ff2748486 Я предполагаю, что у вас сейчас такой же объем памяти, доступный для H2O, как и тогда, когда вы использовали 3.6?   -  person Erin LeDell    schedule 03.04.2017
comment
@ c69, К сожалению не могу откатить версии R и H2O на машине Linux. Наш сисадмин не поддерживал ни предыдущую, ни новую версии. У меня большая гибкость, работающая на моем Mac, поэтому я поиграю там.   -  person BA88    schedule 03.04.2017
comment
@Erin LeDell, да, у меня столько же доступной памяти. Я попытаюсь создать воспроизводимый пример, пытаясь отладить это. Также спасибо за размещение инкапсулированного примера. Я посмотрю, работает ли ваш пример в моей среде. Спасибо всем!   -  person BA88    schedule 03.04.2017
comment
Я обновил свой исходный пост. Я обнаружил ошибку OOM (нехватка памяти). Я установил max_mem_size = '500G', но все равно получаю ошибку OOM. Есть идеи, как это обойти?   -  person BA88    schedule 04.04.2017
comment
Я добавил еще одно обновление в свой исходный пост. Я не могу понять, откуда взялась ошибка OOM. Поэтому мне пришлось понизить версию H2O, которую я использую. Спасибо.   -  person BA88    schedule 12.04.2017


Ответы (1)


Поскольку эта проблема напрямую связана с памятью, позвольте вам правильно настроить память для вашего экземпляра H2O и убедиться, что настройка работает. Поскольку вы случайным образом устанавливаете max_mem_size на произвольное число (100 г, 200 г, 300 г), это не поможет. Сначала нам нужно узнать общий объем оперативной памяти на вашем компьютере, а затем вы можете использовать около 80% этой памяти для своего экземпляра H2O.

Например, у меня на машине 16 ГБ, и я хочу выделить 12 ГБ для экземпляра H2O при запуске из R, я сделаю следующее:

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 очищает неиспользуемую память и иногда ожидает очистки. Таким образом, вы нажмете OOM один раз с номером N, и когда-нибудь вы не нажмете OOM с 2N номерами в том же экземпляре java. Так что гнаться за этим маршрутом бесполезно.

Это определенно проблема, связанная с памятью, и убедитесь, что вы выделяете достаточно хорошей памяти для кластера H2O, а затем посмотрите, как это работает.

person AvkashChauhan    schedule 13.04.2017
comment
Спасибо за ваш ответ. Я согласен, преследование этого маршрута [изменение max_mem_size] бесполезно. Наша Linux-машина имеет 1,5 Тера памяти. В какой-то момент я выделил max_mem_size = 500G, но все еще получал ошибку OOM. На нашей Linux-машине ничего не изменилось, кроме обновлений до R (с v3.2.3 до v3.3.2) и H2O (с v3.6.0.8 до v3.10.4.2). - person BA88; 13.04.2017
comment
Код R не изменился. Звонки в H2O не изменились. Обучение модели GBM успешно завершено (т. Е. h2o.saveModel был записан на диск) со старой версией R / H2O. Обучение модели GBM бросает OOM в h2o.saveModel с новой средой. Поработав с 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 также работает, но я не использую эту версию, так как она кажется передовой. - person BA88; 13.04.2017
comment
Я надеюсь, что эту ошибку OOM можно исправить, иначе мы застрянем с v3.10.2.1 или нам придется перейти, скажем, на scikit-learn python. - person BA88; 13.04.2017
comment
Отправьте электронное письмо на адрес [email protected], чтобы мы могли решить вашу проблему на вашем компьютере, я помогу вам в этом. - person AvkashChauhan; 13.04.2017
comment
спасибо за предложение помощи. Я только что отправил письмо на адрес [email protected]. Спасибо! - person BA88; 17.04.2017