Развертывание вашей модели на Linux-машине и сохранение ее в рабочем состоянии.

Как энтузиаст науки о данных, я всегда задавался вопросом, как я могу поделиться своей работой со всем миром; вместо того, чтобы просто помещать свой код в Github или писать о них в статьях. Многие, как и я, задаются вопросом, как можно развернуть наши модели машинного обучения.

Предварительные требования:
1. Базовое понимание команд Linux было бы дополнительным преимуществом.
2. Опыт работы с Git и предпочтительно использование GitHub для создания репозитория.
3. Базовые знания Python3, pip, виртуальной среды.

Не волнуйтесь, весь код будет объяснен, и если вы раньше не использовали Git, Pip, виртуальную среду и Github, вам будут предоставлены ссылки, чтобы вы имели полное представление о них.

Идея написания этой статьи состоит в том, чтобы отойти от обычных норм и поделиться некоторой дополнительной информацией наряду с существующей информацией. Статья написана в форме вопросов и ответов, чтобы охватить все связанные темы и общие вопросы по этой теме .

Три основных строительных блока при развертывании веб-приложения Python в производственной среде:

  • Веб-сервер (например, nginx)
  • Сервер приложений WSGI (например, Gunicorn)
  • Ваше реальное приложение (написанное с использованием удобной для разработчиков среды, такой как Flask)

Не волнуйтесь, все термины будут вам подробно объяснены.

Любая модель, будь то модель классификации или регрессионная модель, может быть развернута с помощью Flask.

В. Что такое Flask?

A. Согласно Wiki; Flask - это микро-веб-фреймворк, написанный на Python. Он классифицируется как микрофреймворк, поскольку не требует определенных инструментов или библиотек. В нем нет уровня абстракции базы данных, проверки формы или каких-либо других компонентов, где уже существующие сторонние библиотеки предоставляют общие функции.

Существует множество других веб-фреймворков, таких как Django, Web2py, CherryPy и т. Д. Веб-фреймворки предоставляют стандартный способ создания и развертывания веб-приложений. Итак, Flask поможет нам развернуть наше веб-приложение Python.

В. Что такое Nginx?
A. NGINX
- это бесплатный высокопроизводительный веб-сервер HTTP с открытым исходным кодом, который также можно использовать в качестве обратного прокси, балансировщика нагрузки, почтового прокси и HTTP-кеша. Вы можете использовать свой собственный Linux-сервер или развернуть его в Heroku, PythonAnyWhere и т. Д.

Есть много других серверов, таких как Apache, Docker, Redis и т. Д. Причина, по которой я выбрал Nginx, заключается в том, что он построен так, чтобы предлагать низкое использование памяти и высокий уровень параллелизма, поэтому вместо того, чтобы создавать новые процессы для каждого веб-запроса, Nginx использует асинхронный, событийный- управляемый подход, при котором запросы обрабатываются в одном потоке. Итак, для развертывания нашей модели нам понадобится сервер, предоставляемый Nginx.

В. Что такое Gunicorn?
A.
Green Unicorn, обычно сокращаемое до «Gunicorn», представляет собой реализацию сервера интерфейса шлюза веб-сервера (WSGI), который обычно используется для запускать веб-приложения Python.

Но зачем нам Gunicorn?
Gunicorn
позаботится обо всем, что происходит между веб-сервером и вашим веб-приложением. . Если у вас не было Gunicorn, то после создания веб-приложения нам необходимо:

  • Размещение статических файлов
  • Обработка https-соединений
  • Восстановление после сбоев
  • Убедитесь, что ваше приложение может масштабироваться (с помощью фреймворка или вашего собственного кода).
    Все это делает Gunicorn.

Итак, что такое WSGI?
WSGI
появляется, потому что веб-серверу необходимо взаимодействовать с веб-приложением. WSGI определяет правила, которые необходимо реализовать на стороне веб-приложения и на стороне веб-сервера, чтобы они могли взаимодействовать друг с другом.

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

В. Что такое Git? Зачем нам нужен Github?
A. Git
- это распределенная система контроля версий для отслеживания изменений в исходном коде во время разработки программного обеспечения. Он предназначен для координации работы программистов, но его можно использовать для отслеживания изменений в любом наборе файлов.
Таким образом, git гарантирует, что контроль версий для всех изменений кода будет отслеживаться. Например: любая новая функция существующей модели (точная настройка модели для повышения ее точности) будет отслеживаться как новая версия.

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

Если у вас возникнут дополнительные вопросы, посмотрите серию этого видео на Git и Github; эти видео дадут вам достаточно информации.

ЧАСТЬ 1: Настройка сервера и необходимых зависимостей.

Если вы используете сервер Linux, скорее всего, вы будете использовать виртуальную машину таких компаний, как Amazon, Microsoft, Google, Linode и т. Д. В этой статье мы будем делать это с помощью экземпляра Amazon AWS EC2.

В этой статье мы рассмотрим использование экземпляра AWS EC2.
Примечание: для всех пользователей Amazon, если вы ранее не использовали сервисы AWS, вы получите 1 год бесплатного доступа к серверу, базе данных и многому другому, и этого будет достаточно для вашей модели машинного обучения (ML).

Чтобы создать свой собственный экземпляр EC2, перейдите на страницу this, а если вы предпочитаете видеоурок, посмотрите this.
Итак, если вы следовали руководству AWS или читали эту страницу; теперь у вас есть Linux-сервер. Теперь все просто.

Установка компонентов из репозиториев Ubuntu

$ sudo apt update
$ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
(pip is the package manager for python; for more information visit this page)
$ pip install Flask
$ pip install nginx

Nginx и Gunicorn работают вместе таким образом, что Nginx будет действовать как веб-сервер и обрабатывать все запросы статических файлов и позволяет Gunicorn обрабатывать весь код Python. Таким образом, Nginx обрабатывает все Javascripts, HTML, CSS, изображения и т. Д., А Gunicorn обрабатывает. файлы Python.

$ mkdir flaskProject
$ cd flaskProject
$ sudo apt install python3-venv
(python3-venv helps you create a virtual environment. If you don’t know what virtual environment is then visit this page.)
$ python -m venv flaskProject/venv
(this command creates a virtual environment for us .Now we need to activate the virtual environment.)
$ source venv/bin/activate
$ pip install gunicorn
$ sudo apt install supervisor

Конфигурация NGINX:
После установки Nginx выполните следующую команду:

$ sudo rm /etc/nginx/sites-enabled/default
$ sudo nano /etc/nginx/sites-enabled/flaskProject

Конфигурация nginx по умолчанию удаляется командой rm, а новая добавляется командой nano. После ввода команды nano откроется новый файл; просто скопируйте туда приведенный ниже код и убедитесь, что имя_пользователя и имя_проекта скопировано правильно.

server {
    listen 80;
    server_name YOUR_IP_OR_DOMAIN;

    location /static {
        alias /home/YOUR_USER/flaskProject/YOUR_PROJECT/templates;
    }

    location / {
        proxy_pass http://localhost:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}

Конфигурация супервизора:

После установки супервизора выполните следующую команду:

$ sudo nano /etc/supervisor/conf.d/flaskProject.conf

После ввода команды nano откроется новый файл; просто скопируйте туда код ниже.

[program:flaskProject]
directory=/home/YOUR_USER/flaskProject/YOUR_PROJECT
command=/home/YOUR_USER/YOUR_PROJECT/venv/bin/gunicorn — bind 0.0.0.0:8000 app:app
user=YOUR_USER
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/flaskProject/flaskProject.err.log
stdout_logfile=/var/log/flaskProject/flaskProject.out.log

Пути stderr_logfile и stdout_logfile не были созданы, поэтому после выхода из файла супервизора; введите эту команду

$ sudo mkdir -p /var/log/flaskProject
$ sudo touch /var/log/flaskProject/flaskProject.err.log
$ sudo touch /var/log/flaskProject/flaskProject.out.log

Вы можете использовать touch или nano для создания нового файла журнала.

Всем тем, кто немного больше увлечен тем, как происходит развертывание и каковы его различные аспекты. Посмотрите эти видео Кори Шафера на YouTube.

Как запустить Linux / Bash в Windows
Учебное пособие по аутентификации на основе ключей SSH
Ключи SSH в« Windows ».
Учебное пособие по Python Django: развертывание вашего приложения (вариант № 1) - Развертывание на Сервер Linux.

ЧАСТЬ 2: Создание репозитория Github

Структура папок вашего репозитория GitHub:
(не обязательно соблюдать этот порядок).
1. app.py (для приложения flask)
2. model.py (ваш файл модели Ml)
3.template / index.html (папка для обработки любых файлов html, css и т. д.)

В. Где я могу получить полный код? Есть ли живой пример веб-приложения на Python, работающего на сервере Linux?
A.
Вы можете получить весь код модели извлечения ключевых слов в этом репозитории Github. Для рабочей демонстрации проверьте this.

Если у вас нет репозитория GitHub и вы хотите протестировать его перед развертыванием собственной модели; не стесняйтесь клонировать это репо на свой Linux-компьютер с помощью следующей команды в папке flaskProject.

$ git clone https://github.com/THE-USERNAME/THE-REPOSITORY (format example)
$ git clone https://github.com/AjayJohnAlex/Keyword-Extraction.git

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

app.py:

Он содержит API-интерфейсы Flask, которые получают данные через графический интерфейс или вызовы API, вычисляют прогнозируемое значение на основе нашей модели и возвращают его.

import pandas
import numpy
import spacy
from flask import Flask, request, jsonify, render_template, json
import model as md
# import pickle

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/predict',methods=['POST'])
def predict():
    '''
    For rendering results on HTML GUI
    '''
    int_features = str(request.form.get("description"))

    vocab_dict , arr = md.textProcessing(int_features)
    
    tf = md.computeTF(vocab_dict,arr)
    idf = md.computeIDF([vocab_dict])
    tfidf = md.computeTfidf(tf,idf)

    return jsonify(tfidf)


if __name__ == "__main__":
    app.run(debug=True)

template / index.html:

<!DOCTYPE html>
<html >

<head>
  <meta charset="UTF-8">
  <title>ML API</title>
  
</head>

<body>
 <div class="login">
	<h1>Predict Keyword Analysis</h1>

     <!-- Main Input For Receiving Query to our ML -->
    <form action="{{ url_for('predict')}}"method="post">
    	<textarea rows = "30" cols = "100" name = "description" placeholder="Description" required="required" ></textarea>
        

        <button type="submit" class="btn btn-primary btn-block btn-large">Predict</button>
    </form>

   <br>
   <br>

 </div>


</body>
</html>

model.py:
Он содержит код модели машинного обучения для прогнозирования желаемого результата. Это будет отличаться от вашего, если вы не клонируете репозиторий, но для уточнения отметьте это.

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

В. Но как все эти файлы работают? Как они зависят друг от друга?
A.
Давайте разберемся, как работают все строки кода:

В файле index.html -
Здесь главное внимание уделяется форме, поэтому формы выполняют следующие действия:

form action = «{{url_for (« прогнозировать »)}}» метод = «сообщение»

А еще у него есть TextArea и кнопка «Отправить».

Таким образом, при нажатии кнопки отправки данные затем отправляются в API с предсказанием имени маршрута и отправляют данные в этот API. Этот API прогнозирования определен в файле app.py.

В файле app.py -
у нас есть render_template для визуализации вывода или HTML-файла, jsonify для получения ответа JSON.
Теперь app = Flask (__ name__) гарантирует, что приложение flask инициализировано.

И этот инициализированный объект фляги «приложение» теперь можно использовать для создания маршрутов / API, и каждый маршрут состоит из имени API и метода (POST / GET).
Внутри определенного API у нас есть вызывается метод Python или отображается HTML-страница.

Поэтому я обычно сохраняю свое имя API и имя метода внутри него одинаковыми. Поэтому, когда API вызывается, он выполняет метод внутри него, который, в свою очередь, запускает мою модель машинного обучения, которая определена в файле model.py и выводит результат.

if __name__ == "__main__":
    app.run(debug=True)
This line of code ensures that you can debug your Flask app if you run into any errors.

Для более глубокого понимания всех возможных методов Flask проверьте страницу this.
Теперь, когда вы понимаете, как Flask развертывает модель ML, просто запустите следующие коды для успешного запуска вашего приложения. Любые другие изменения, которые вы хотите внести в свой код ML, можно сделать вручную.

$ sudo systemctl restart nginx
$ sudo systemctl
$ sudo supervisorctl reload

Ваша модель машинного обучения запущена и работает.

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