Привет, ученые! В этом блоге мы собираемся изучить развертывание на облачном сервере Heroku. Если у вас есть какие-либо сомнения относительно разработки моделей и Flask API, пожалуйста, обратитесь к моим предыдущим блогам. Важно знать о Heroku, Docker и GitHub Actions, прежде чем углубляться в нашу тему.

Что такое Героку?

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

Что такое Докер?

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

Что такое действия GitHub?

GitHub Actions — это платформа непрерывной интеграции и непрерывной доставки (CI/CD), которая позволяет автоматизировать процесс сборки, тестирования и развертывания. Вы можете создавать рабочие процессы, которые создают и тестируют каждый запрос на включение в ваш репозиторий или развертывают объединенные запросы на вытягивание в рабочей среде.

Разработка модели

Чтобы предсказать, купит ли покупатель автомобиль или нет, мы применяем алгоритм машинного обучения Random Forest Classifier.

model.py

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
from sklearn import metrics

# Importing the dataset
dataset = pd.read_csv('purhchase_data.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

# Feature Scaling
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Fitting Random Forest Classification to the Training set
classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)
# Accuracy 
print('Accuracy Score:', metrics.accuracy_score(y_test,y_pred))
# Confusion Matrix
print('Confusion Matrix')
print(confusion_matrix(y_test, y_pred))

Вывод

Прогноз

user_age_salary=[[32,300000]]
scaled_result = sc.transform(user_age_salary)
res=classifier.predict(scaled_result)
if res==1:
    print("Purchaser")
else:
    print("Not a purchaser")

Вывод

Сохранить модель и масштабировать

#save model and Scaler
import pickle
from pickle import dump
pickle.dump(classifier, open('model.pkl','wb'))
dump(sc, open('scaler.pkl', 'wb'))

Веб-приложение Flask для развертывания модели

index.hml

<html >
<head>
  <meta charset="UTF-8">
  <title>Sales Prediction</title>
 </head>
<body>
<center>
  <div class="login">
  <h2>SALES PREDICTION</H2>
   <form action="{{ url_for('predict')}}"method="post">
     <input type="text" name="age" placeholder="Enter the Age" required="required" />
     <input type="text" name="salary" placeholder="Enter the Salary" required="required" />
        <button type="submit" class="button button2">Predict</button>
    </form>
   <br>
   <br>
   {{ prediction_text }}
 </div>
 </center>
</body>
</html>

app.py

import numpy as np
from flask import Flask, request, jsonify, render_template
import pickle
import json
from sklearn.preprocessing import StandardScaler
app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))
scaler=pickle.load(open('scaler.pkl', 'rb'))

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

@app.route('/predict',methods=['POST'])
def predict():

    user_age_salary = [int(x) for x in request.form.values()]
    user_age_salary1=[user_age_salary]
    scaled_result = scaler.transform(user_age_salary1)
    prediction = model.predict(scaled_result)
    if prediction==1:
        return render_template('index.html', prediction_text='Yes, Purchaser')
    else:
        return render_template('index.html', prediction_text='No, Not a Purchaser')


@app.route('/predict_api',methods=['POST'])
def predict_api():

    data = request.get_json()
    age=data['age']
    salary=data['salary']
    user_age_salary=[[age,salary]]
    scaled_result = scaler.transform(user_age_salary)
    res=model.predict(scaled_result)
    if res==1:
        return jsonify({'Sales Prediction': 'Yes, Purchaser' })
    else:
        return jsonify({'Sales Prediction': 'No, Not a Purchaser' })

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

Вывод

После выполнения этих кодов вы получите вывод, как на экране ниже.

Скопируйте последний URL-адрес (http://127.0.0.1:5000/) и вставьте его в Chrome или любой другой браузер. Введите возраст и зарплату, нажмите кнопку прогнозирования, она будет прогнозировать и отображать ее на экране.

Создание Dockerfile

Создайте новый файл с именем «Dockerfile» и не требуйте расширения для этого файла. Скопируйте приведенный ниже код и вставьте в файл докера.

FROM python:3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirement.txt
EXPOSE $PORT
CMD gunicorn --workers=4 --bind 0.0.0.0:$PORT app:app

Создать приложение в Heroku

Войдите в Heroku, на панели инструментов нажмите Создать, затем выберите Создать новое приложение. На панели инструментов Heroku перейдите в личные настройки. Найдите свой ключ API, нажмите Показать и скопируйте его, он понадобится вам позже.

Действия на GitHub

Перейдите на вкладку «Настройки» репозитория GitHub, прокрутите вниз до «Секреты» и добавьте свои HEROKU_EMAIL и HEROKU_API_KEY в качестве секретов репозитория.

Создать файл .yaml

Сборка/выталкивание Docker может быть достигнута с помощью команд оболочки. Я включаю версию оболочки здесь в качестве ссылки. Используйте приведенный ниже код для своего проекта.

# Your workflow name.
name: Deploy to heroku.

# Run workflow on every push to main branch.
on:
  push:
    branches: [main]

# Your workflows jobs.
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # Check-out your repository.
      - name: Checkout
        uses: actions/checkout@v2


### ⬇ IMPORTANT PART ⬇ ###

      - name: Build, Push and Release a Docker container to Heroku. # Your custom step name
        uses: gonuit/[email protected] # GitHub action name (leave it as it is).
        with:
          # Below you must provide variables for your Heroku app.

          # The email address associated with your Heroku account.
          # If you don't want to use repository secrets (which is recommended) you can do:
          # email: [email protected]
          email: ${{ secrets.HEROKU_EMAIL }}
          
          # Heroku API key associated with provided user's email.
          # Api Key is available under your Heroku account settings.
          heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
          
          # Name of the heroku application to which the build is to be sent.
          heroku_app_name: ${{ secrets.HEROKU_APP_NAME }}

          # (Optional, default: "./")
          # Dockerfile directory.
          # For example, if you have a Dockerfile in the root of your project, leave it as follows:
          dockerfile_directory: ./

          # (Optional, default: "Dockerfile")
          # Dockerfile name.
          dockerfile_name: Dockerfile

          # (Optional, default: "")
          # Additional options of docker build command.
          docker_options: "--no-cache"

          # (Optional, default: "web")
          # Select the process type for which you want the docker container to be uploaded.
          # By default, this argument is set to "web".
          # For more information look at https://devcenter.heroku.com/articles/process-model
          process_type: web
          
   
          
### ⬆ IMPORTANT PART ⬆ ###

Теперь откройте терминал в вашей среде IDE, затем используйте команду фиксации и нажатия, чтобы увидеть результаты в GitHub и Heroku. Для фиксации используйте git commit -m «Heroku commit». Для Push используйте git push origin main.

После того, как все сделано, откройте приложение Heroku, которое будет запущено на новой вкладке в вашем браузере.

Полный исходный код на GitHub: https://github.com/DharmarajPi/Machine-Learning-Model-Deployment-in-Heroku-using-Docker-GitHub-Actions

Поздравляем!!

Вы завершили развертывание модели машинного обучения !!

Надеюсь, вам понравился этот пост. Хорошего дня.

Спасибо, что читаете мой блог, вы можете проверить другие мои блоги…









Есть сомнения? Нужна помощь? Свяжитесь со мной!

LinkedIn: https://www.linkedin.com/in/dharmaraj-d-1b707898

Github:https://github.com/DharmarajPi