Flask를 사용하여 Heroku에 기계 학습 모델 배포

이 게시물은 Flask를 사용하여 웹에서 기계 학습 모델을 배포하는 방법을 이해하는 데 도움이 됩니다. heroku을 사용하여 ML 모델을 배포했습니다.

헤로쿠란?



Heroku는 개발자가 애플리케이션을 배포, 확장 및 관리할 수 있는 다국어 클라우드 애플리케이션 플랫폼입니다. Heroku는 우아하고 유연하며 사용하기 쉬우므로 개발자에게 앱을 시장에 출시하는 가장 간단한 경로를 제공합니다. Salesforce은 2010년에 Heroku를 인수하여 클라우드 컴퓨팅 장비에 2억 1,200만 달러를 지출했습니다.

아래 언급된 단계를 따르십시오.


  • 학습 ML 모델
  • Flask를 사용하여 웹 앱 만들기
  • GitHub에 코드 커밋
  • GitHub를 Heroku에 연결
  • 모델 배포

  • 기계 학습 모델 교육



    분류 알고리즘으로 로지스틱 회귀를 사용하고 있습니다. 심장병 발병 위험을 예측하기 위해 Framingham Heart study dataset을 사용했습니다. Framingham 연구의 목적은 심혈관 질환(CVD)의 발병률과 유병률 및 위험 요인을 연구하는 것입니다.

    import pandas as pd
    import numpy as np
    import pickle
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split
    
    # Reading dataframe and dropping rows with na values
    data = pd.read_csv("framingham.csv")
    data.dropna(inplace=True)  # Consists 3658 records
    
    # Computing Correlation
    corr_matrix = data.corr().abs()
    high_corr_var = np.where(corr_matrix > 0.35)
    high_corr_var = [(corr_matrix.index[x], corr_matrix.columns[y]) for x, y in zip(*high_corr_var) if x != y and x < y]
    
    """
    Variables to consider
    age: Age of a person (Input a number)
    smoker: Yes or No
    Cigs per day: (Input a number)
    diabaties: Yes or No
    bmi: weight(Kg) and height(meters) calculate
    BP: input a number
    """
    
    
    def bmi(weight, height):
        return round(float(weight) / (float(height) * float(height)), 2)
    
    
    X_cols = ['male', 'age', 'currentSmoker', 'cigsPerDay', 'diabetes',
              'sysBP', 'BMI']
    Y_col = ['TenYearCHD']
    
    X_vars = data[X_cols]
    Y_var = data[Y_col]
    
    # Renaming Columns
    X_vars.columns = ['Gender', 'Age', 'Smoker', 'Cigarettes_Per_Day',
                      'Diabetic', 'BP', 'BMI']
    Y_var.columns = ['Chances_of_hear_disease']
    
    # Splitting data
    X_train, X_test, y_train, y_test = train_test_split(X_vars, Y_var, test_size=0.25, random_state=0)
    
    # Initiate the Model
    logreg = LogisticRegression()
    
    # fit the model with data
    logreg.fit(X_train, y_train)
    
    pickle.dump(logreg, open('model.pkl', 'wb'))
    

    기본적으로 양식 문자 스트림에서 모델을 덤프하는 데 도움이 되는 라이브러리pickle를 사용했습니다. 아이디어는 이 문자 스트림이 다른 Python 스크립트에서 개체를 재구성하는 데 필요한 모든 정보를 포함한다는 것입니다. 이렇게 하면 나중에 모델을 배포하는 데 사용될 바이트 쓰기 모드에서 model.pkl 파일이 생성됩니다.

    Flask를 사용하여 웹앱 만들기



    아래에서 앱 경로를 정의하고 app.py 파일을 완성했습니다. 모델을 실행하는 데 필요한 모든 필드가 있는 홈 페이지 역할을 할 Index.html을 만들었습니다.
    첫 번째 단계는 클라이언트 측 세션을 안전하게 유지하는 데 필요한 비밀 키를 설정하는 것입니다. Flask에서 세션으로 작업할 때 16진수로 표시되는 임의의 바이트로 구성된 secret_key를 생성해야 합니다.

    # Set the secret key to some random bytes. 
    # Keep this really secret!
    app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
    

    Dataform 클래스는 라디오 버튼, 확인란 및 레이블로 구성된 페이지의 구조를 정의합니다. 이렇게 하면 적절한 방식으로 데이터를 캡처하는 데 도움이 됩니다. 마지막 단계는 index.html 템플릿을 렌더링하고 사용자로부터 입력을 받는 것입니다. 사용자가 입력을 제출하면 인덱스 기능이 트리거되고 앱이 최종 출력 계산을 시작합니다.

    import os
    import pickle
    from flask_wtf import FlaskForm
    from flask import Flask, render_template
    from wtforms.validators import DataRequired
    from wtforms import IntegerField, BooleanField, FloatField, SubmitField, RadioField
    
    
    class Config(object):
        SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
        APP_PATH = os.path.dirname(__file__)
    
    
    app = Flask(__name__)
    app.config.from_object(Config)
    
    
    class DataForm(FlaskForm):
        gender = RadioField('Gender', validators=[DataRequired()], choices=['Male', 'Female'])
        age = IntegerField('Age', validators=[DataRequired()])
        diabetic = BooleanField('Are you Diabetic?')
        smoker = BooleanField('Do you smoke? ')
        cig_count = FloatField('How many cigarettes do you smoke per day ?', default=0)
        weight = FloatField('Weight (Kg)', validators=[DataRequired()])
        height = FloatField('Height (cm)', validators=[DataRequired()])
        bp = IntegerField('Blood Pressure (mmHg)  Normal range : (90-120)/(60-80)', validators=[DataRequired()])
        submit = SubmitField('Submit')
    
    
    @app.route('/')
    @app.route('/index', methods=['GET', 'POST'])
    def index():
        form = DataForm()
        if form.validate_on_submit():
            li = ['age', 'gender', 'cig_count', 'diabetic', 'height', 'weight', 'smoker', 'bp']
            data = {}
            for ele in li:
                data[ele] = eval('form.' + ele + '.data')
    
            gender = 1 if data['gender'] == 'Male' else 0
            smoker = 1 if data['smoker'] else 0
            diabetic = 1 if data['diabetic'] else 0
            filename = os.path.join(app.config['APP_PATH'], 'model.pkl')
            with open(filename, 'rb') as f:
                model = pickle.load(f)
                value = model.predict([[gender, data['age'], smoker, data['cig_count'],
                                        diabetic, data['bp'], bmi(data['weight'], data['height'])]])
                data = ['done', value[0]]
            return render_template('index.html', value=data, form=form, data=data)
        return render_template('/index.html', form=form)
    
    
    def bmi(weight, height):
        return round(float(weight) / (float(height / 100) * float(height / 100)), 2)
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    가장 중요한 것은 모델을 heroku 서버에 배포하기 위해 구성 부분을 처리하는 Procfile 및 requirements.txt를 만드는 것입니다. web: gunicorn은 고정 명령이며, 그 다음 첫 번째 매개변수는 app.py 파일, 즉 첫 번째로 실행될 파일입니다. 파일 확장자 없이 첫 번째 매개변수를 제공하십시오. 두 번째 매개변수는 플라스크 앱 이름입니다.
    요구 사항은 heroku 환경에 설치해야 하는 모든 라이브러리로 구성됩니다.

    web: gunicorn app:app
    



    click==7.1.2
    Flask==1.1.2
    Flask-WTF==0.14.3
    gunicorn==20.0.4
    itsdangerous==1.1.0
    Jinja2==2.11.2
    joblib==0.16.0
    MarkupSafe==1.1.1
    numpy==1.19.1
    pandas==1.1.0
    python-dateutil==2.8.1
    python-dotenv==0.14.0
    pytz==2020.1
    scikit-learn==0.23.2
    scipy==1.5.2
    six==1.15.0
    sklearn==0.0
    threadpoolctl==2.1.0
    Werkzeug==1.0.1
    WTForms==2.3.3
    

    코드 GitHub를 커밋하고 Heroku를 GitHub에 연결합니다.



    heroku에서 앱 이름을 만들고 아래와 같이 github 저장소를 연결합니다.



    연결 후 두 가지 방법으로 앱을 배포할 수 있습니다. 자동 배포 또는 수동 배포를 선택할 수 있습니다. github 리포지토리에 무엇이든 커밋할 때마다 자동 배포가 수행됩니다. 자동으로 빌드가 시작됩니다. 수동 배포를 사용하여 배포했습니다.
    브랜치를 선택하고 배포를 클릭하기만 하면 빌드가 시작됩니다. 배포에 성공하면 배포 탭이 아래와 같이 표시됩니다.


    최종 앱



    성공적인 배포 후 앱이 생성됩니다. 보기를 클릭하면 앱이 열립니다. 새로운 URL이 생성됩니다.

    내 앱 확인: https://heart-disease-predictor-api.herokuapp.com/

    이 게시물이 도움이 되었기를 바랍니다. 이를 통해 최종 사용자는 외부 종속성 없이 ML 모델과 상호 작용할 수 있습니다.

    완료!

    Octocat이 내 GitHub 리포지토리로 이동합니다...

    좋은 웹페이지 즐겨찾기