Развертывание модели глубокого обучения с помощью Facebook Messenger с Rasa

Согласно старой поговорке, если все, что у вас есть, - это молоток, то все выглядит как гвоздь. Вывод из этого высказывания состоит в том, что молоток иногда выполняет не только забивать гвозди, но и не только. В этой статье я расскажу, как молоток в моем наборе инструментов (Facebook Messenger с Rasa) выполнил неожиданную работу: развернул модель глубокого обучения Keras.

Ниже я объясню, как более традиционные подходы к развертыванию моделей (AWS Sagemaker, Flask) мне не помогли. Затем я расскажу, как я адаптировал Facebook Messenger с Rasa для выполнения первоначального развертывания модели.

Модель (подробно описанная здесь) делает прогноз да / нет относительно того, будет ли отложена поездка на трамвае. Его обучили с использованием открытого набора данных, содержащего подробную информацию о задержках трамвая за последние 6 лет. Развернутая обученная модель должна производить прогноз на основе 7 входных данных:

  • Маршрут
  • Направление
  • Час
  • День
  • День месяца
  • Месяц
  • Год

Варианты развертывания, которые я исследовал

Прежде чем наткнуться на решение для развертывания, которое сработало для меня, я рассмотрел пару других альтернатив: AWS Sagemaker и Flask с Paperspace Gradient.

AWS Sagemaker. Я попытался развернуть раннюю версию модели с помощью AWS Sagemaker, но столкнулся с проблемами, потому что API AWS ожидал, что модель будет иметь один входной поток, а моя модель имеет несколько входов (в соответствии с функциями, перечисленными выше). Я разработал общую сквозную стратегию на основе AWS, но я просто не мог обойти ограничение одного входного потока. Я также обнаружил, что ежемесячные расходы на все эти функции AWS были непосильными, поэтому мне нужно было двигаться дальше.

Фляга с градиентом пространства бумаги. Я использовал среду Paperspace Gradient для обучения модели. Gradient произвел на меня впечатление - он дал мне все необходимое для обучения модели глубокого обучения без непрозрачного биллинга или облачного раздувания, от которых страдают другие облачные провайдеры (AWS, Google Cloud Platform). Я возлагал большие надежды на развертывание с Paperspace Gradient, но пример hello world потребовал двух подробных статей для объяснения (Развертывание моделей глубокого обучения, часть 1 и Часть 2). Я ожидаю, что в какой-то момент я вернусь к этому подходу, но это было слишком сложно для первоначального развертывания модели.

Ни одна из этих альтернатив не дала мне беспрепятственного пути к развертыванию моей модели Keras, поэтому мне нужно было найти другой метод развертывания.

Почему Facebook Messenger с Rasa - хороший выбор для развертывания модели

Я ломал голову над проблемой развертывания модели в течение нескольких месяцев, в течение которых я работал над другим проектом, который включал создание чат-бота в Rasa с Facebook Messenger в качестве интерфейса. Затем однажды я понял, что то, что я узнал в этом новом проекте, дало мне все необходимое для решения проблемы развертывания модели Keras:

  • Простота - благодаря проекту чат-бота Facebook Messenger с Rasa стали привычной частью моего набора инструментов, и мне было комфортно со всем стеком. Это сделало Facebook Messenger с Rasa простым выбором для меня. Кроме того, Facebook Messenger дал начальный простой и легкий интерфейс для ввода данных, которые необходимо было оценить. Они могли вводить данные, используя заявление на естественном языке, например: «Будет ли задержка Queen East?». Интерфейс Facebook Messenger гораздо лучше подходил для такого случайного ввода, чем полноценный веб-сайт, который я изначально предполагал для этой модели.
  • Control - Facebook Messenger со стеком Rasa включает среду Python для настраиваемых действий. В отличие от развертывания с помощью AWS Sagemaker, у меня был полный контроль в этой среде Python, чтобы вызывать конвейер и модель в точности так, как я хотел, не беспокоясь о количестве входов в модель.
  • Стоимость - весь стек развертывания можно использовать бесплатно.
  • Доступ - Facebook для разработчиков упрощает предоставление доступа избранным пользователям, и я могу использовать ngrok, чтобы сделать Rasa, работающий в моей локальной системе, доступным через Facebook Messenger.

Возвращаясь к схеме, которую я создал для предлагаемого развертывания с AWS Sagemaker, я спланировал подход, который я предприму для развертывания модели с помощью Facebook Messenger с Rasa:

Вот шаги, которые я предпринял, чтобы перейти от обученной модели к развернутой:

  • Определите набор настраиваемых классов для конвейера sklearn, чтобы подготовить набор данных: кодировать категориальные значения, работать с пустыми значениями и подготовить набор данных для ввода в модель Keras. Чтобы использовать эти классы в коде оценки, мне нужно было определить эти классы в отдельном файле (custom_classes.py) и импортировать классы в файлы, содержащие обучающий и оценочный код.
## intent:predict_delay_complete
- will route [501](Route) [eastbound](Direction:e) be delayed?
- will [St Clair](Route:512) [eastbound](Direction:e) be delayed?
- will [St Clair](Route:512) [westbound](Direction:w) be delayed?
- will [Downtowner](Route:502) [eastbound](Direction:e) be delayed?
- will [Downtowner](Route:502) [westbound](Direction:w) be delayed?
- is [Spadina](Route:510) [south](Direction:s) going to be delayed?
- will there be a delay on [Spadina](Route:510) [northbound](Direction:n)?
- will there be a delay on [511](route) [southbound](Direction:s)?
- will there be a delay on [502](route) [eastbound](Direction:e)?
- will there be a delay on [502](route) [west](Direction:w)?
  • Обновите actions.py (файл Python, содержащий классы, реализующие настраиваемые действия для модели Rasa), чтобы импортировать файл классов конвейера Keras, загрузить конвейеры и модель Keras и определить класс настраиваемых действий, который применяет конвейер и модель к значениям, переданным от Rasa. Класс настраиваемых действий включает в себя код, который устанавливает 5 из 7 входов (час, день, день недели, месяц и год) на текущую дату и время, если они не установлены явно во вводе пользователя. Это позволяет модели оценивать такие входные данные, как Будет ли задержка Carlton west? где пользователь не указал никакой информации о времени.

Вот несколько примеров того, как пользователь делает запросы и получает прогнозы в Facebook Messenger:

Рассмотрим приведенные выше пары запросов с одинаковым числовым тегом. Возьмем, к примеру, 4-ю пару. В этой паре «маршрут 510 на север» означает то же самое, что и «северное направление Спадины». Несмотря на то, что формулировка различается в каждой паре, Rasa определяет, что запросы имеют одинаковое семантическое предназначение, поэтому Rasa отправляет эквивалентные значения в класс настраиваемых действий Python для каждой пары, и возвращается тот же результат прогноза.

Заключение

Facebook Messenger с Rasa оказался удобным способом развернуть мою модель глубокого обучения Keras. Это позволило мне повторно использовать навыки, которые я приобрел при создании чат-бота Rasa, и предоставило простой интерфейс, хорошо подходящий для приложения. Я ожидаю, что в какой-то момент проекта я вернусь к более традиционному подходу к развертыванию, но Facebook Messenger с Rasa дал мне простой и понятный способ, наконец, выполнить начальное развертывание с нулевыми затратами.

Ключевые ссылки

  • Код для развертывания, описанный в этой статье, доступен здесь.
  • Основной код, используемый для обучения модели, доступен здесь.
  • Примеры обученных моделей доступны здесь.
  • Обзор настройки Facebook Messenger с Rasa доступен здесь.