Не годятся модели машинного обучения, лежащие в блокнотах IPy или разрозненных скриптах Python. Чтобы изменить жизни и повлиять на мир, модель должна быть развернута таким образом, чтобы ее могли использовать широкие слои населения, а не только эксперты в предметной области. Для этого модель должна быть инкапсулирована за своего рода API, который другие приложения могли бы использовать для связи с моделью. Он включает в себя довольно много веб-разработки, и людей это часто пугает. Однако это не так уж и сложно. Прочтите этот пост и убедитесь в этом сами!

Цель этого поста - развернуть модель машинного обучения в качестве общего API через Интернет, который можно использовать на различных платформах, таких как:

  1. Сайты
  2. Боты для таких приложений, как Telegram, Slack, Discord и многие другие
  3. Приложения для Android / iOS
  4. Навыки Alexa
  5. Любая другая платформа, которая позволяет отправлять базовые запросы GET / POST через HTTP / HTTPS.

Разместите API БЕСПЛАТНО *!

* Если ваша модель не использует CUDA, для которого требуются графические процессоры nvidia, этот метод является бесплатным. Вам необходимо купить сервер с графическим процессором nvidia, если вы хотите использовать CUDA или любую другую библиотеку с интенсивным использованием графических процессоров. Если у вас есть сервер, я рассмотрел вводные рекомендации в конце этого сообщения.

Предпосылки

Читатели должны иметь возможность создавать модели машинного обучения, обучать их, а затем использовать их для прогнозирования результатов в Python. Этот пост предназначен только для того, чтобы дать представление о развертывании модели машинного обучения в производстве для небольшого использования.

Ниже приведены несколько библиотек и ресурсов, которые будут использоваться:

  • Pickle: собственная библиотека Python для сохранения (сериализации) и загрузки (де-сериализации) объектов Python в виде файлов на диске.
  • flask: простой в использовании веб-фреймворк на основе Python. Вот документы и хорошая серия видеоуроков от sentdex
  • Pythonanywhere: бесплатный образовательный веб-сайт, на котором можно разместить флягу Python и предоставить полную среду разработки на Python.

Настройка среды

Обязательно используйте python 3+

pip установите следующие пакеты:

  1. колба (наш веб-фреймворк на Python)
  2. flask_cors: для заголовков CORS
  3. jsonify: вернуть файлы JSON с помощью колбы
  4. Другие учебные библиотеки в соответствии с потребностями, такие как numpy, pandas, sklearn и т. Д.

pip install flask flask_cors jsonify numpy pandas

Поток данных

Ниже приведено схематическое представление данных, передаваемых между пользователем и серверным пространством.

Вот краткое изложение того, что необходимо сделать:

  1. Обучите модель с помощью блокнота Jupyter
  2. Сохраните обученный объект модели как файл рассола (сериализация)
  3. Создайте среду фляги, которая будет иметь конечную точку API, которая будет инкапсулировать нашу обученную модель и позволить ей получать входные данные (функции) через запросы GET через HTTP / HTTPS, а затем возвращать выходные данные после десериализации более ранней сериализованной модели
  4. Загрузите скрипт фляги вместе с обученной моделью на pythonanywhere.
  5. Делайте запросы к размещенному сценарию фляги через веб-сайт, бота, приложение для Android или любое другое приложение, способное отправлять запросы HTTP / HTTPS.

Модель машинного обучения

Целью этой публикации является развертывание модели, а не ее создание. Давайте просто предположим, что у нас есть модель, которая принимает дату в качестве входных данных и предсказывает цену биткойна. Модель уже обучена на исторических данных о ценах.

Если вам интересно узнать об этой модели, вы можете обратиться к моему репозиторию github. Хотя, будьте осторожны! Цену биткойна невозможно предсказать с помощью машинного обучения, и это всего лишь неудачная попытка (тоже очень глупая) закрепить эту точку зрения. Эффективность модели не является предметом внимания в этом сообщении в блоге, поэтому давайте пока рассмотрим эту модель. Сериализация и десериализация модели

Соленый огурец

Модуль под названием pickle помогает выполнять сериализацию и десериализацию в Python.

Сериализация

Проще говоря, сериализация - это способ записи объекта python на диск, который можно передать куда угодно, а затем десериализовать (прочитать) обратно с помощью сценария python.

Вот как это делается:

После выполнения вышеуказанного кода создается файл с именем «mlp_nn.pkl», который представляет собой обученную модель, которую можно перенести куда угодно и использовать после десериализации следующим образом:

Десериализация

Настройка фляги

Давайте сначала настроим флеш-сервер на локальном хосте, а затем бесплатно развернем его на pythonanywhere.

Настройка flask-app на локальном хосте:

Убедитесь, что колба установлена. pip install flask

Следующий скрипт запускает флеш-сервер на локальном хосте и порте по умолчанию (5000), создавая URL: http://127.0.0.1: 5000 /

Просто вставьте http://127.0.0.1: 5000 / в браузер и нажмите Enter, чтобы увидеть, что сервер работает.

  • Маршрут приложений

Декоратор app.route используется для указания маршрута приложения flask через Интернет.

/ просто означает дом http://127.0.0.1:5000/.

/ price / означает http://127.0.0.1:5000/price/.

  • Аргументы

По этим маршрутам можно передавать следующие аргументы:

Http://127.0.0.1:5000/price/?date=12&month=3&year=2019

Общий шаблон будет выглядеть так:

Https: // [HOME] / [ROUTE] /? [Var 1_name] = [var1_value] & [var 2_name] = [var2_value]

Эти аргументы анализируются в сценарии flask следующим образом:

  1. request.args.get (‘date’) вернет 12.
  2. request.args.get («month») вернет 3
  3. request.args.get (‘year’) вернет 2019

Когда вы вводите URL-адрес в браузер, он фактически отправляет запрос GET через HTTP / HTTPS на указанный URL-адрес.

В нашем случае мы отправили запрос GET с аргументами, имеющими дату, месяц и год, на сервер фляги, чтобы вернуть прогноз нашей модели.

  • jsonify

Функция flask.jsonify () вернет словарь Python в формате JSON. Формат JSON можно рассматривать как словарь Python, который можно вкладывать любое количество раз и передавать через Интернет. Это отличный способ структурировать данные, совместно используемые приложениями. Всегда рекомендуется использовать формат JSON при работе с веб-API.

  • CORS

Пакет flask_cors используется для исправления заголовков CORS, используемых для вызовов AJAX , что делает возможным использование AJAX с разными источниками.

Вы можете узнать больше о CORS здесь или использовать его как есть. Вы НЕ МОЖЕТЕ игнорировать это, потому что без правильных заголовков CORS наш API был бы непригоден для использования почти любыми другими внешними приложениями. Я лично много боролся с ошибками CORS, и мне пришлось прочитать flask и некоторую документацию по веб-разработке, чтобы придумать это простое решение. Если у вас есть лучший способ справиться с заголовками CORS с помощью flask, сообщите мне об этом в ответах.

Функция прогноза

В приведенном выше коде есть функция прогнозирования в классе my_bitcoin_predictor, которая требует небольшого объяснения.

Функция прогнозирования может принимать входные характеристики и выводить прогноз модели. Это функция, фактически развернутая через Интернет с помощью python flask. Вместо получения входных функций из той же среды в скрипте python или IPy-ноутбуке, функции теперь принимаются через веб-серверы, такие как flask через Интернет, чтобы вернуть предсказанный результат.

Для простоты я пропускаю многие части класса my_bitcoin_predictor и просто пишу важные части.

Файловая структура

Простая файловая структура выглядит так:

Bitcoin predictor
 |
 +-- flask_app.py
 |    
 +-- predictor.py
 |
 +-- mlp_nn.pkl
 | 
 +-- data
 |  |  
 |  +-- bitcoin_price_historical_data.csv

Я не рассмотрел ту часть, где модель обучается на исторических данных.

Папка с именем Bitcoin predictor - это та, которую нужно загрузить на pythonanywhere

Размещение приложения Flask

Приложение flask, размещенное на локальном хосте, не может быть передано другим пользователям, поскольку оно «локальное». Разместите скрипт на бесплатном веб-сайте хостинга Python под названием pythonanywhere, выполнив несколько простых шагов:

Шаг 1. Зарегистрируйте новую учетную запись.

А пока давайте остановимся на бесплатной учетной записи. Вы можете купить лучшие планы хостинга для более разнообразных и сложных задач. (На этом веб-сайте есть приятный тур для новых пользователей, который поможет вам)

Шаг 2. Добавьте новое веб-приложение

Выберите колбу и ту версию Python, которая вам нужна. Для этого урока я буду использовать последнюю версию Python 3.7. После создания веб-приложения вы получите URL-адрес, указывающий на конечную точку фляги. По умолчанию отображается сообщение «Привет из Flask!». Ваша конечная точка выглядит примерно так: [username].pythonanywhere.com

Шаг 3. Установите зависимости

Ваша модель машинного обучения должна использовать различные внешние библиотеки, такие как sklearn, numpy, pandas и т. Д. Установите их все в своей среде pythonanywhere. Для этого откройте новую консоль bash и установите библиотеки с помощью pip. Обязательно устанавливайте библиотеки с помощью pip, используя параметр user , потому что у нас нет прав суперпользователя. Flask уже будет установлен, повторная установка не требуется.

pip install --user flask_cors numpy pandas

Шаг 4. Загрузите файлы

Внутри папки по умолчанию - / mysite / вам нужно загрузить свою полную папку. Вы можете сделать это либо с помощью страницы файлов на веб-сайте, либо с помощью консоли bash, используя команду wget для загрузки файлов.

Шаг 5. Перезагрузите веб-приложение.

Теперь ваша конечная точка будет действовать как API для облегчения работы других приложений.

Пример интерфейсного приложения

Для этого вам необходимо знать основы HTML, CSS и JavaScript.

Было замечено, что многие энтузиасты машинного обучения не любят веб-разработку, поэтому я создал простой шаблон, который можно использовать для получения функций ввода через HTML-форму и отправки запроса к API для получения результатов. Даже если вы не владеете HTML-CSS-JavaScript, вы можете легко отредактировать этот шаблон.

Вот репозиторий GitHub для того же.

В обсуждаемом примере отредактированный шаблон JavaScript должен выглядеть следующим образом:

Разместите этот сайт в Интернете, и все готово! Любой человек в любом месте может использовать этот веб-сайт для отправки функций и получения прогнозируемых результатов от модели машинного обучения, находящейся на бэкэнде под различными уровнями данных.

* Я предпочитаю загрузить свой сайт на GitHub, а затем запустить его с помощью netlify. Все бесплатно!

Хостинг на личном сервере

pythonanywhere предназначен только для образовательных целей и не имеет графического процессора. Для сложных моделей глубокого обучения, в значительной степени зависящих от вычислений на основе CUDA и GPU, необходим более мощный сервер. Flask работает на новом сервере с нуля с использованием сервера WSGI, такого как gunicorn, за веб-сервером, таким как nginx. Также может использоваться система управления технологическим процессом, такая как супервизор.

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

Вы также можете сослаться на мою модель классификации изображений, которая использует CUDA и размещена на локальном хосте. Он показывает, как можно работать с файлами изображений с помощью колбы и передавать их модели. Я скоро напишу полный пост, посвященный этому.

Заключение

Размещение и совместное использование моделей машинного обучения может быть очень простым делом. Создание приложений для Android, чат-ботов и многих других приложений, использующих серверную часть моделей машинного обучения, теперь можно создавать с большой легкостью.

Спасибо за прочтение. Пожалуйста, дайте мне знать в ответах, если я допустил какие-либо ошибки или что-то можно было бы сделать лучше.