Не годятся модели машинного обучения, лежащие в блокнотах IPy или разрозненных скриптах Python. Чтобы изменить жизни и повлиять на мир, модель должна быть развернута таким образом, чтобы ее могли использовать широкие слои населения, а не только эксперты в предметной области. Для этого модель должна быть инкапсулирована за своего рода API, который другие приложения могли бы использовать для связи с моделью. Он включает в себя довольно много веб-разработки, и людей это часто пугает. Однако это не так уж и сложно. Прочтите этот пост и убедитесь в этом сами!
Цель этого поста - развернуть модель машинного обучения в качестве общего API через Интернет, который можно использовать на различных платформах, таких как:
- Сайты
- Боты для таких приложений, как Telegram, Slack, Discord и многие другие
- Приложения для Android / iOS
- Навыки Alexa
- Любая другая платформа, которая позволяет отправлять базовые запросы GET / POST через HTTP / HTTPS.
Разместите API БЕСПЛАТНО *!
* Если ваша модель не использует CUDA, для которого требуются графические процессоры nvidia, этот метод является бесплатным. Вам необходимо купить сервер с графическим процессором nvidia, если вы хотите использовать CUDA или любую другую библиотеку с интенсивным использованием графических процессоров. Если у вас есть сервер, я рассмотрел вводные рекомендации в конце этого сообщения.
Предпосылки
Читатели должны иметь возможность создавать модели машинного обучения, обучать их, а затем использовать их для прогнозирования результатов в Python. Этот пост предназначен только для того, чтобы дать представление о развертывании модели машинного обучения в производстве для небольшого использования.
Ниже приведены несколько библиотек и ресурсов, которые будут использоваться:
- Pickle: собственная библиотека Python для сохранения (сериализации) и загрузки (де-сериализации) объектов Python в виде файлов на диске.
- flask: простой в использовании веб-фреймворк на основе Python. Вот документы и хорошая серия видеоуроков от sentdex
- Pythonanywhere: бесплатный образовательный веб-сайт, на котором можно разместить флягу Python и предоставить полную среду разработки на Python.
Настройка среды
Обязательно используйте python 3+
pip установите следующие пакеты:
- колба (наш веб-фреймворк на Python)
- flask_cors: для заголовков CORS
- jsonify: вернуть файлы JSON с помощью колбы
- Другие учебные библиотеки в соответствии с потребностями, такие как numpy, pandas, sklearn и т. Д.
pip install flask flask_cors jsonify numpy pandas
Поток данных
Ниже приведено схематическое представление данных, передаваемых между пользователем и серверным пространством.
Вот краткое изложение того, что необходимо сделать:
- Обучите модель с помощью блокнота Jupyter
- Сохраните обученный объект модели как файл рассола (сериализация)
- Создайте среду фляги, которая будет иметь конечную точку API, которая будет инкапсулировать нашу обученную модель и позволить ей получать входные данные (функции) через запросы GET через HTTP / HTTPS, а затем возвращать выходные данные после десериализации более ранней сериализованной модели
- Загрузите скрипт фляги вместе с обученной моделью на pythonanywhere.
- Делайте запросы к размещенному сценарию фляги через веб-сайт, бота, приложение для 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 следующим образом:
- request.args.get (‘date’) вернет 12.
- request.args.get («month») вернет 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, чат-ботов и многих других приложений, использующих серверную часть моделей машинного обучения, теперь можно создавать с большой легкостью.
Спасибо за прочтение. Пожалуйста, дайте мне знать в ответах, если я допустил какие-либо ошибки или что-то можно было бы сделать лучше.