Получить H2OFrame в качестве объекта вместо получения ссылки на местоположение в кластере H2O - PullRequest
1 голос
/ 11 апреля 2019

Мы создали и обучили модель, используя библиотеки H2O.Сконфигурировал H2O в контейнере OpenShift и развернул обученную модель для получения вывода в реальном времени.Это работало хорошо, когда у нас есть один контейнер.Мы должны увеличить масштабы, чтобы справиться с увеличением объема транзакций.Обнаружена проблема с состоянием H2OFrame.Посмотрите мой пример кода.

Шаг-1: Преобразует словарь JSON в кадр Pandas.
Шаг-2: Преобразует кадр Pandas в кадр H2O.
Шаг-3: Запуститемодель с кадром H2O в качестве входных данных.

Здесь шаг 2 возвращает дескриптор данных, хранящихся в контейнере.«H2OFrame похож на DataFrame от pandas или data.frame R. Одно из критических отличий состоит в том, что данные обычно не хранятся в памяти, а вместо этого располагаются в (возможно, удаленном) кластере H2O, и, таким образом, H2OFrame представляет собой простойобращаться с этими данными. "Таким образом, запрос шага 3 должен идти в тот же контейнер.Если нет, он не может найти кадр H2O и выдает ошибку.

Шаг 1: преобразовать словарь JSON во фрейм данных с помощью Pandas dataFrame

 ToBeScored = pd.DataFrame([jsonDictionary])

Шаг 2: преобразовать фрейм данных panda в кадр H2o

 ToBeScored_hex = h2o.H2OFrame(ToBeScored)

Шаг-3: запустить модель

 outPredections = rf_model.predict(ToBeScored_hex)

Если H2OFrame может быть возвращен как объект в памяти на шаге-2, тогда можно избежать состояния с полным состоянием.Там в любом случае?Или можно ли настроить кластеризацию H2O для хранения H2OFrame таким образом, чтобы он был доступен из любого контейнера OpenShift в кластере?

Полезные ссылки
Функция Predict H2O принимает данные только в формате H2OFrame.Функция Predict - http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/model_categories.html#h2o.model.model_base.ModelBase.predict
Тип данных кадра H2O - http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/frame.html

Обновлен вопрос о продолжении 19.06.2009 к разъяснению @ ErinLeDell
У нас естьобновлен до H2O 3.24 и используется модель MOJO.Удалил шаг 2 и заменил шаг 3 этим вызовом функции.

import h2o as h 
result = h.mojo_predict_csv(input_csv_path="PredictionDataRow.csv",mojo_zip_path="rf_model.zip",
genmodel_jar_path="h2o-genmodel.jar", java_options='-Xmx512m -XX:ReservedCodeCacheSize=256m', verbose=True) 

Внутренне он выполнил приведенную ниже команду, которая инициализировала новую JVM и запускала локальный сервер H2O для каждого вызова.Локальный сервер H2O инициализируется, чтобы найти путь к java.

java = H2OLocalServer._find_java()   // Find java path then creates below command line

C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe -Xmx512m -XX:ReservedCodeCacheSize=256m -cp h2o-genmodel.jar hex.genmodel.tools.PredictCsv --mojo C:\Users\admin\Documents\Code\python\rf_model.zip --input PredictionDataRow.csv --output C:\Users\admin\Documents\Code\python\prediction.csv --decimal 

Вопрос-1: Есть ли способ использовать существующую JVM и не всегда порождать новую для каждой транзакции?
Вопрос-2: Есть ли способ пройти путь Java, чтобы избежать инициализации локального сервера H2O?Требуется ли H2OLocalServer для чего-либо, кроме поиска пути по Java?Если этого нельзя избежать, можно ли один раз инициализировать локальный сервер и направить новые запросы на существующий локальный сервер H2O вместо запуска нового локального сервера H2O?

1 Ответ

1 голос
/ 11 апреля 2019

Альтернативой является использование модели H2O MOJO (вместо двоичной модели , которая должна существовать в памяти кластера H2O для прогнозирования).Модели MOJO могут сидеть на диске и не требуют работающего кластера H2O.Затем вы можете пропустить шаг 2 и использовать функцию h2o.mojo_predict_pandas () в шаге 3.

...