Обертка Pyspark для H2O POJO

Я создал модель, используя газированную воду H2O. И теперь я хотел бы применить его к огромному Spark DF (населенному разреженными векторами). Я использую python и pyspark, pysparkling. В основном мне нужно выполнить задание карты с функцией model.predict() внутри. Но копирование данных в контекст H2O — это огромные накладные расходы, а не вариант. Я думаю, что собираюсь сделать это, извлечь модель POJO (класс Java) из модели h2o и использовать ее для создания карты в кадре данных. Мои вопросы:

  1. Есть ли способ лучше?
  2. Как написать оболочку pyspark для класса java, из которого я намерен использовать только один метод .score (двойные [] данные, двойной [] результат)
  3. Как максимально повторно использовать обертки из библиотеки Spark ML?

Благодарю вас!


person USER    schedule 06.03.2016    source источник


Ответы (1)


В этом случае вы можете:

1) используйте метод h2o.predict(H2OFrame) для создания прогноза, но вам нужно преобразовать RDD в H2OFrame. Это не идеальное решение... однако в некоторых случаях оно может обеспечить разумное решение.

2) переключиться на JVM и вызвать JVM напрямую через шлюз Spark Py4J. Это не совсем рабочее решение прямо сейчас, так как метод score0 должен принимать непримитивные типы на стороне H2O, а также быть видимым (сейчас он защищен), но хотя бы идея:

model = sc._jvm.water.DKV.getGet("deeplearning.model")
double_class = sc._jvm.double
row = sc._gateway.new_array(double_class, nfeatures)
row[0] = ...
...
row[nfeatures-1] = ...
prediction = model.score0(row)

Я создал улучшение JIRA для этого случая https://0xdata.atlassian.net/browse/PUBDEV-2726< /а>

Однако обходным путем является создание Java-оболочки вокруг модели, которая будет отображать правильную форму функции score0:

class ModelWrapper extends Model {
   public double[] score(double[] row) {
     return score0(row)
   }
}

См. также hex.ModelUtils: https://github.com/h2oai/sparkling-water/blob/master/core/src/main/scala/hex/ModelUtils.scala (опять же, вы можете вызывать их напрямую через шлюз Py4J, предоставляемый Spark)

person Michal    schedule 07.03.2016
comment
Еще один способ: вы можете загрузить модель как код, скомпилировать ее, развернуть, а затем вызвать прямо из Python через Py4J. - person Michal; 08.03.2016
comment
Спасибо, Михал, решение 2 выглядит достаточно просто (я скомпилировал модель в банке). Но я не могу ссылаться на контекст искры в операции карты. Как с этим быть? - person USER; 08.03.2016
comment
@USER вы правы - я забыл, что sc недоступен в операциях rdd (это хороший пост с возможными альтернативами: stackoverflow.com/questions/31684842/) На данный момент я нет хорошего ответа. Нам нужно как-то разобраться в этих ограничениях. - person Michal; 11.03.2016