Создание вашей модели машинного обучения с использованием веб-фреймворка Flask
Несмотря на то, что внедрение вашей модели машинного обучения в рабочую среду является одним из наиболее важных шагов при создании приложения машинного обучения, существует не так много руководств, показывающих, как это сделать. Особенно для небольших библиотек машинного или глубокого обучения, таких как Uber Ludwig.
Поэтому в этой статье я расскажу, как создать модель Людвига путем создания Rest-API, а также обычного веб-сайта с использованием веб-микро-инфраструктуры Flask. Тот же процесс можно применить практически к любой другой среде машинного обучения с небольшими изменениями.
И веб-сайт, и RESTful-API, который мы создадим в этой статье, очень просты и плохо масштабируются. Поэтому в следующей статье мы рассмотрим, как масштабировать наш веб-сайт Flask для обработки нескольких повторяющихся запросов, что также показано в этой отличной статье.
Если вы предпочитаете наглядное пособие, вы можете посмотреть мое видео по этой теме.
Что такое Flask?
Flask - это микро-веб-фреймворк, написанный на Python. Это называется микрофреймворком, потому что в нем не используются определенные инструменты или библиотеки.
Flask упрощает создание простого веб-приложения, которое можно развернуть на множестве различных платформ, а также позволяет легко создавать модели машинного обучения, написанные на Python.
Создание базового веб-сайта Flask.
Для начала мы установим Flask и с его помощью создадим базовый веб-сайт с приветственным словом. Чтобы установить Flask, вы можете использовать pip или conda
pip install Flask
or
conda install -c anaconda flask
Чтобы создать базовый веб-сайт Flask, нам нужно его импортировать, создать приложение и базовый маршрут. Для получения дополнительной информации ознакомьтесь с официальной документацией Flask.
from flask import Flask app = Flask(__name__) # create a Flask app @app.route("/") def hello(): return "Hello World!" if __name__=='__main__': app.run(port=3000, debug=True)
Теперь его можно запустить, как и любой другой скрипт python, и после его запуска вы сможете получить доступ к веб-сайту через порт 3000 localhost.
python flask_hello_world.py
Создание RESTful-API для нашей модели
RESTful API - это программный интерфейс приложения (API), который использует HTTP запросы к данным GET, PUT, POST и DELETE.
Этот вид API / сервиса идеально подходит, если вы хотите использовать свою модель из множества других сервисов, таких как графические интерфейсы или веб-сайты. Это также действительно хорошо, потому что к нему можно получить доступ практически на всех языках программирования.
Flask можно использовать для создания простых RESTful-API из коробки, но для более крупных проектов я бы рекомендовал использовать расширение Flask-RESTful, которое добавляет поддержку для создания больших RESTful-API путем введения ООП.
from flask import Flask, request, jsonify # loading in Flask | |
from ludwig import LudwigModel # loading in Ludwig | |
import pandas as pd # loading pandas for reading csv | |
# creating a Flask application | |
app = Flask(__name__) | |
# Load the model | |
model = LudwigModel.load('model') | |
# creating predict url and only allowing post requests. | |
@app.route('/predict', methods=['POST']) | |
def predict(): | |
# Get data from Post request | |
data = request.get_json() | |
# Make prediction | |
df = pd.DataFrame([str(data['text'])], columns=['content']) | |
print(df.head()) | |
# making predictions | |
pred = model.predict(data_df=df) | |
print(pred) | |
# returning the predictions as json | |
return jsonify(pred['airline_sentiment_predictions'][0]) | |
if __name__ == '__main__': | |
app.run(port=3000, debug=True) |
Создание RESTful-API для использования модели машинного обучения требует следующих шагов:
- Импорт необходимых библиотек: Flask, Ludwig и Pandas в нашем примере.
- Создание приложения Flask
- Определение маршрута
- Получение и преобразование данных (нам нужно преобразовать наши данные в фрейм данных pandas или словарь Python для прогнозирования с помощью Людвига)
- Делать прогнозы
- Возврат прогнозов как json
Чтобы опробовать наш RESTful-API, мы можем создать простой скрипт, используя библиотеку запросов.
import requests # import request library | |
url = 'http://localhost:3000/predict' | |
# make post request and print response | |
r = requests.post(url,json={'text': 'very good'}) | |
print(r.json()) |
После выполнения этого скрипта мы получим следующий результат:
Output: positive
Создание веб-сайта для нашей модели
Чтобы превратить наш RESTful-API в простой веб-сайт, нужно внести совсем немного изменений. Основные из них заключаются в том, что теперь нам нужно разрешить запросы как на получение, так и на публикацию, и что теперь мы будем отображать HTML с помощью метода render_template вместо того, чтобы просто возвращать json.
Эта статья не посвящена HTML и CSS, поэтому я не буду ее объяснять, но если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях.
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Twitter US-Airline Sentiment Analysis</title> | |
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | |
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> | |
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> | |
</head> | |
<body style="width:60%; margin-left:20%;"> | |
<h1 class="text-center">US Airline Sentiment Analysis</h1> | |
<form action="/" method="post"> | |
<input class="form-control" type="text" name="text" placeholder="Text"> | |
<input class="btn btn-primary" type="submit" value="Make prediction"> | |
</form> | |
</body> | |
</html> |
Теперь, когда наш HTML готов, мы можем написать логику веб-сайта.
from flask import Flask, request, render_template | |
from ludwig import LudwigModel | |
import pandas as pd | |
# Creating a flask app and specifying a folder for our templates (HTML files) | |
app = Flask(__name__, template_folder="templates") | |
# Load the model | |
model = LudwigModel.load('model') | |
# Creating a route and allowing for both get and post requests | |
@app.route('/', methods=['GET','POST']) | |
def home(): | |
# Checking if the request is a post request | |
if request.method == 'POST': | |
# getting data from the form | |
data = request.form.get('text') | |
# Making prediction | |
df = pd.DataFrame([str(data)], columns=['content']) | |
print(df.head()) | |
pred = model.predict(data_df=df) | |
print(pred) | |
# Returning the html and passing it our sentiment | |
return render_template('index.html', sentiment=pred['airline_sentiment_predictions'][0]) | |
# If we have a get request we won't return a sentiment | |
return render_template('index.html', sentiment='') | |
if __name__ == '__main__': | |
app.run(port=3000, debug=True) |
В приведенном выше коде есть только несколько изменений по сравнению с RESTful-API:
- При создании приложения Flask мы теперь также передаем путь, который указывает, где у нас есть наши шаблоны (файлы HTML).
- Вместо использования маршрута / predic мы будем использовать маршрут по умолчанию, указанный параметром /.
- В этом методе мы проверяем, есть ли у нас запрос на получение или отправку, и соответствующим образом реагируем.
- Если у нас есть почтовый запрос, мы получим данные из формы, сделаем прогноз, используя нашу модель, и передадим прогноз в функцию render_template, которая отображает наш файл index.html.
- Если у нас есть запрос на получение, мы вызовем функцию render_template, не передавая ей сообщение.
Последнее, что нам нужно сделать, это отобразить переданное мнение, чтобы пользователь мог видеть результат введенного им текста. Это можно сделать с помощью Jinja - языка шаблонов, который использует Flask.
Jinja позволяет нам загружать переменные, создавать операторы if и циклы for, а также многое другое внутри наших шаблонов. Он использует синтаксис {% для операторов и {{для переменных.
Мы добавим следующие строки в конец нашего тега body, чтобы отобразить настроение.
{% if sentiment %} | |
<p>The sentiment of the text is: {{sentiment}}</p> | |
{% endif %} |
Теперь, когда это сделано, мы можем использовать нашу модель анализа настроений, введя некоторый текст в форму и нажав кнопку отправки. Это отобразит прогноз под формой.
Рекомендуемая литература
Заключение
Создание вашей модели машинного обучения - важная часть проекта машинного обучения, и Flask можно использовать для создания как веб-сайта, так и RESTful-API с помощью всего нескольких строк кода.
В этой статье мы узнали, как создать простой веб-сайт и RESTful-API. В следующей статье мы рассмотрим, как масштабировать наши приложения Flask для обработки нескольких повторяющихся запросов.
Если вам понравилась эта статья, подпишитесь на мой Youtube канал и подпишитесь на меня в социальных сетях.
Код, описанный в этой статье, доступен как репозиторий Github.
Если у вас есть какие-либо вопросы, рекомендации или критические замечания, со мной можно связаться через Twitter или в разделе комментариев.