Развертывание модели глубокого обучения с помощью 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) и импортировать классы в файлы, содержащие обучающий и оценочный код.
- Создайте простую модель Rasa для общих высказываний, которые пользователи будут делать в Facebook Messenger, чтобы вызвать модель, например, будет ли Queen east отложена? Этот шаг требовал настройки базовой среды Rasa, а затем обновления nlu.md, stories.md, domain.yml, чтобы включить высказывания, намерения, действия и слоты, необходимые для взаимодействия с обученной моделью. Файл credentials.yml также необходимо обновить, как описано в моей предыдущей статье об использовании Rasa с Facebook Messenger, чтобы включить учетные данные, необходимые для Facebook Messenger. Вот фрагмент файла nlu.md, показывающий некоторые высказывания, используемые для обучения модели Rasa:
## 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 дал мне простой и понятный способ, наконец, выполнить начальное развертывание с нулевыми затратами.