Развертывание моделей машинного обучения на Heroku от Jupyter Notebook

Поскольку машинное обучение становится все более популярным, многие специалисты по данным и разработчики сталкиваются с проблемой развертывания своих моделей в производственной среде. Хотя локальное обучение и тестирование моделей важно для экспериментов, это часто нецелесообразно для реальных приложений. Одним из решений этой проблемы является развертывание модели в облаке, что делает ее легкодоступной для конечных пользователей. Heroku, облачная платформа как услуга (PaaS), предлагает простой и эффективный способ развертывания моделей машинного обучения и создания масштабируемых приложений. В этой статье мы рассмотрим, почему вы можете захотеть развернуть свою модель на Heroku, и предоставим пошаговое руководство для начала работы.

В этом руководстве я покажу вам, как обслуживать простую модель машинного обучения в Heroku. В использовании Heroku есть плюсы, и они следующие:

  1. Простота использования: Heroku упрощает развертывание и управление вашим приложением. С Heroku вы можете развернуть свое приложение всего за несколько кликов и управлять им с помощью простого и интуитивно понятного веб-интерфейса.
  2. Масштабируемость: Heroku может легко увеличить или уменьшить количество экземпляров вашего приложения в соответствии с потребностями трафика. Это поможет обеспечить постоянную доступность вашего приложения для пользователей, даже в периоды пиковой нагрузки.
  3. Встроенные надстройки. Heroku предлагает множество встроенных надстроек, которые могут расширить функциональность вашего приложения. Например, Heroku предлагает надстройки для хранения данных, регистрации, мониторинга и многого другого.
  4. Экономичность: Heroku предлагает ряд тарифных планов для различных потребностей и бюджетов. Вы можете начать с бесплатного плана и расширять его по мере необходимости, что делает его экономичным вариантом для небольших и средних проектов.
  5. Интеграция с Git: Heroku полностью интегрирован с Git, что упрощает развертывание и управление кодом вашего приложения с помощью системы контроля версий Git.
  6. Поддержка сообщества. У Heroku большое и активное сообщество пользователей, а это означает, что в Интернете доступно множество информации и поддержки.

Это руководство будет состоять из 5 частей.

Часть 1 (Подготовка репозитория). Во-первых, нам нужен репозиторий. Ваш репозиторий должен включать следующие файлы (Heroku просмотрит их перед развертыванием вашего веб-приложения).

runtime.txt
app.py
Procfile
data.csv
requirements.txt

а. В app.py мы будем размещать нашу бизнес-логику и вызовы RESTful API.
b. Procfile необходим для платформы Heroku, чтобы объявить, какая команда должна быть выполнена для запуска приложения.
c. Файл runtime.txt используется Heroku, чтобы указать, какая версия Python требуется вашему приложению.
d. data.csv — это место, где лежат ваши обучающие данные.

Часть 2 (Подготовка библиотек и Procfile). Я предлагаю сначала поэкспериментировать локально, используя отдельную среду. Нам нужны следующие библиотеки для этого конкретного руководства.

flask
flask_cors
pandas
numpy
scikit-learn

Затем просто создайте файл requirements.txt, выполнив эту команду в своем терминале (убедитесь, что вы находитесь в корневой папке вашего проекта).

pip freeze > requirements.txt

Тогда ваш файл requirements.txt может выглядеть следующим образом:

Flask==2.2.2
Flask-Cors==3.0.10
flask-marshmallow==0.14.0
gunicorn==20.1.0
joblib==1.2.0
numpy==1.23.4
pandas==1.5.1
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.6
scikit-learn==1.1.3
scipy==1.9.3
threadpoolctl==3.1.0
Werkzeug==2.2.2
zipp==3.10.0

Наконец, введите следующий код в наш Procfile

web: gunicorn app:app

Это команда, включенная в файл с именем Procfile, который используется Heroku для указания команд, которые следует выполнить для запуска приложения. В данном случае определяется тип процесса web, а выполняемая команда — gunicorn app:app. gunicorn — это HTTP-сервер Python Web Server Gateway Interface (WSGI), который используется для запуска веб-приложений Python, а app:app относится к экземпляру приложения Flask (app) и имени файла, в котором он определен (app.py в данном случае) . Итак, эта команда говорит Heroku запустить приложение Flask, используя Gunicorn в качестве сервера.

Часть 3 (Создание API). Вы можете обслуживать модель, обученную локально, но в этом руководстве я включу отдельный API для обучения модели, который, в случае, в Heroku. Давайте проанализируем и заполним наш app.py

from flask import Flask, jsonify, request
from flask_cors import CORS, cross_origin

# configuration
DEBUG = True

# instantiate the app
app = Flask(__name__)
app.config.from_object(__name__)

# enable CORS
CORS(app, resources={r'/*': {'origins': '*'}})

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

@app.route('/train-model', methods = ['GET'])
def train_model():
    #Algorithm here - Decision Tree
    #import libraries
    import numpy as np
    import pandas as pd
    from sklearn.tree import DecisionTreeClassifier
    import joblib

    # Load the data into a pandas dataframe
    DATA_CSV_FILE = pd.read_csv('ride_data_set.csv')
    DATA_CSV_FILE.isnull().sum()

    X = pd.DataFrame(np.c_[
        DATA_CSV_FILE['age'],
        DATA_CSV_FILE['systolic'],
        DATA_CSV_FILE['diastolic'],
        DATA_CSV_FILE['heart_rate'],
        DATA_CSV_FILE['respiration_rate'],
    ],
    columns = ['age',
        'systolic',
        'diastolic',
        'heart_rate',
        'respiration_rate',
    ])
    Y = DATA_CSV_FILE['allow_ride']

    # Train the model
    clf = DecisionTreeClassifier()
    clf.fit(X, Y)

    # Save the trained model as a .pkl file
    joblib.dump(clf, "trained_model.pkl")

    return jsonify({"message: ":"Model trained and saved as trained_model.pkl"}) 

Этот код определяет маршрут Flask для обучения модели машинного обучения с использованием алгоритма дерева решений и сохранения обученной модели в виде файла joblib .pkl. Входные данные загружаются из CSV-файла, предварительно обрабатываются и используются для обучения модели. Обученная модель сохраняется в виде файла с именем trained_model.pkl в том же каталоге. Маршрут Flask возвращает сообщение JSON, подтверждающее успешное обучение и сохранение модели. Однако важно отметить, что предоставленный нами код может не требовать разделения данных, если цель состоит в том, чтобы просто обучить модель и использовать ее для прогнозирования новых данных.

@app.route('/get-suggestion', methods = ['GET', 'POST'])
def recommend_suggest():
    if request.method == 'POST':
        try:
            #import libraries
            import joblib
            import numpy as np
            import pandas as pd

            # Get the data from the POST request.
            age = request.form.get('age')
            blood_pressure_systolic = request.form.get('blood_pressure_systolic')
            blood_pressure_diastolic = request.form.get('blood_pressure_diastolic')
            heart_rate = request.form.get('heart_rate')
            respiration = request.form.get('respiration')
            
            DATA_CSV_FILE = pd.read_csv('ride_data_set.csv')

            # Load the model from the saved .pkl file
            clf = joblib.load("trained_model.pkl")

            allow = clf.predict([[age, blood_pressure_systolic, blood_pressure_diastolic, heart_rate, respiration]])
            allow = allow[0]

            #Suggestions
            suggestions = DATA_CSV_FILE[DATA_CSV_FILE['allow_ride'] == allow]
            suggestions = suggestions.head(1)
            suggestion = suggestions['suggestion'].values[0]

            return jsonify({"allow":allow, "suggestions":suggestion})
        except Exception as e:
            #return what is the error from the try block
            return jsonify({"Error: ":str(e)})
    else:
        pass
        return jsonify({"Error: ":'Please submit the fields first.'})

Блок кода загружает обученную модель дерева решений из сохраненного файла .pkl и использует ее, чтобы предсказать, следует ли разрешить поездку на основе входных данных. Входные данные получаются из запроса POST, а ответ возвращается в виде объекта JSON с ключами allow и suggestions, где allow — логическое значение, указывающее, разрешена ли поездка, а suggestions — строка, содержащая предложения для гонщика. При возникновении исключения сообщение об ошибке возвращается в виде объекта JSON с ключом Error. Если метод запроса не POST, функция возвращает сообщение об ошибке, в котором пользователю предлагается сначала отправить поля.

Вот весь код для шага 3: https://github.com/blankspeedster/ride_app_backend/blob/main/app.py

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

Шаг 1. Войдите в Heroku
Шаг 2. Нажмите New -> Create App
Шаг 3. Заполните поля App Name (у меня написано ride-app).
Шаг 4. Выберите метод развертывания GitHub < br /> Шаг 5. Затем найдите свой репозиторий в GitHub (убедитесь, что у вас есть доступ к команде).

Шаг 6. Нажмите Connect
Шаг 7. Перейдите к разделу Развертывание вручную, выберите ветку и нажмите Deploy Branch

На этом этапе следует начать сборку веб-приложения. Он установит необходимые библиотеки, найденные в вашем requirements.txt

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

Часть 5 (попробуйте вызвать API). Это заключительная часть этого руководства, и мы хотим проверить, работают ли две созданные нами конечные точки. Я буду использовать POSTMAN для проверки варианта использования. Вы можете использовать другой клиент.

а. Пробуем корневой домен веб-приложения. Вы можете проверить домен веб-приложения, щелкнув View сразу после успешной сборки или под колонкой Settings. У меня написано «https://ride-app.herokuapp.com».

б. Теперь об обучении на наших данных.

в. Наконец, проверяем, можем ли мы делать прогнозы.

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

Финал

Если вы создаете небольшое или среднее приложение и вам не нужно беспокоиться об автоматическом масштабировании, использование Heroku для производства ваших моделей машинного обучения — отличный выбор. Это позволяет вам сосредоточиться исключительно на создании приложения машинного обучения без необходимости управления инфраструктурой.

Вот мой репозиторий для этого руководства: https://github.com/blankspeedster/ride_app_backend