Использование модели keras в функции лямбда-карты pyspark - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу использовать модель для прогнозирования оценок в лямбда-функции карты в PySpark.

def inference(user_embed, item_embed):
    feats = user_embed + item_embed
    dnn_model =  load_model("best_model.h5")
    infer = dnn_model.predict(np.array([feats]), verbose=0, steps=1)
    return infer
iu_score = iu.map(lambda x: Row(userid=x.userid, entryid=x.entryid, score = inference(x.user_embed, x.item_embed)))

Работа выполняется очень медленно, и после запуска кода она застряла на последнем этапе.

[Stage 119:==================================================>(4048 + 2) / 4050]

В мониторе HTOP только 2 из 80 ядер работают с полной нагрузкой, остальные ядра не работают. Итак, что я должен сделать, чтобы модель предсказывала параллельно? IU составляет 300 миллионов, поэтому эффективность для меня важна. Спасибо.

enter image description here

У меня есть verbose = 1, и появляется журнал прогнозирования, но кажется, что прогноз только один за другим, а не прогноз параллельно.

1 Ответ

0 голосов
/ 17 сентября 2018

Во время ответа я немного исследовал и нашел этот вопрос интересным.Во-первых, если эффективность действительно важна, потратьте немного времени на перекодировку всего без Кереса.Вы по-прежнему можете использовать высокоуровневый API для тензорного потока (Модели) и без особых усилий извлечь параметры и назначить их новой модели.Несмотря на то, что из всех массовых реализаций в рамках оболочек неясно (разве TensorFlow не является достаточно богатой платформой?), Вы, скорее всего, столкнетесь с проблемами обратной совместимости при обновлении.Действительно не рекомендуется для производства.

Сказав это, вы можете проверить, в чем конкретно проблема, например, используете ли вы графические процессоры?может они перегружены?Можете ли вы обернуть все это, чтобы не превысить некоторую емкость и использовать систему приоритетов?Вы можете использовать простую очередь, если нет приоритетов.Вы также можете проверить, действительно ли вы прекращаете сеансы tenorflow или на той же машине работает много моделей, которые мешают другим.Есть много проблем, которые могут быть причиной этого явления, было бы здорово иметь больше деталей.

Относительно параллельных вычислений - вы не реализовали ничего, что действительно открывает поток или процесс для этих моделейтак что я подозреваю, что pyspark просто не может справиться со всем этим самостоятельно.Возможно, реализация (если честно, я не читал всю документацию pyspark) предполагает, что отправленные функции работают достаточно быстро и не распределяются должным образом. PySpark - это просто сложная реализация принципов сокращения карт .Отправленные функции играют роль функции отображения за один шаг, что может быть проблематично для вашего случая.Хотя оно передается как лямбда-выражение, вы должны более тщательно проверить, какие экземпляры работают медленно и на каких машинах они работают.

Я настоятельно рекомендую вам сделать следующее:
Перейдите на Tensorflow, разверните официальные документы и прочитайте, как действительно развернуть модель.Существует протокол для связи с развернутыми моделями, который называется RPC , а также API-интерфейс restful.Затем, используя свой pyspark, вы можете обернуть вызовы и подключиться к обслуживаемой модели.Вы можете создать пул, сколько моделей вы хотите, управлять им в pyspark, распределять вычисления по сети, и отсюда небо и cpus / gpus / tpus являются пределами (я все еще скептически отношусь к небу).

Было бы здорово получить от вас обновление о результатах :) Вы заинтересовали меня.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...