Мы создали и обучили модель, используя библиотеки 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?