본문 바로가기
프로그래밍 언어

[TIL] 간단한 ML Serving 방법 / Flask (1)

by 다람이도토리 2021. 12. 6.

Flask 를 통한 ML Serving 개요

코드 출처
https://github.com/bharatc9530/Machine-Learning/tree/master/Model-Deployment-Using-Flask

개요

기본적인 구조는 다음과 같다.

FRONT(화면에버 보여지는 것)  <->  Flask   <-> ML/DL  Model

즉 FRONT에서 값을 입력하면, 그 값을 받아 Flask에서 처리후 이를 넘겨 학습한다.
학습한 결과물을 다시 가져와서 Flask에서 처리 후에 FRONT로 보내버린다. 이 과정을 만드는 것이 Flask를 통한 ML Serving의 간단한 개요라고 할 수 있을 것이다.

 

Flask의 아주 간단한 사용법

Flask의 구조도 이전에 보았던 django와 비슷하나, 훨씬 더 간편하게 serving시킬 수 있다.

코드 출처에 있는 내용에 주석을 추가로 달아보았다....

# static에 고정적으로 들어가야할 사진 등이 들어간다
# templates 등에 html이 들어가는 구조이다.

from flask import Flask, render_template, request
import pickle
import numpy as np

# 만들어온 모델은 다음과 같이 불러온다.
# 즉, 이미 저장되어 있어야한다.!
model = pickle.load(open('iris.pkl', 'rb'))

# 다음과 같이 Flask Module이 시작된다.
app = Flask(__name__)


# 기본주소에서 일어나는 일
@app.route('/')
def main():
	# home.html을 띄워준다.
    return render_template('home.html')

# predict 페이지에서는 POST라는 method가 사용될 것이다.
@app.route('/predict', methods=['POST'])
def home():
    data1 = request.form['a']
    data2 = request.form['b']
    data3 = request.form['c']
    data4 = request.form['d']
    arr = np.array([[data1, data2, data3, data4]])
    pred = model.predict(arr)
    # 보여줄 페이지 그리고 어떤 데이터를 넘길지에 대해서 확인한다....
    # 모델이 예측한 결과를 넘겨서 그 값에 따라 if문을 작성하게 한다.
    return render_template('after.html', data=pred)


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

즉 home에서 기본 입력값을 받아오면 이를 바탕으로 POSTmethod가 시행되어  predict 페이지에서 최종 결과를 뱉어줄 것이다. 여기서 형태는 after.html 형태로 띄워준다는 의미이다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body bgcolor=#d4aeae>
    <center>
        <h1> IRIS Flower Detection</h1>

        <form method="POST", action="{{url_for('home')}}">
           <b> Sepal Length :  <input type="text", name='a', placeholder="enter 1"> <br><br>
            Sepal Width :  <input type="text", name='b', placeholder="enter 2"> <br><br>
            Petal Length :  <input type="text", name='c', placeholder="enter 3"> <br><br>
            Petal Length : <input type="text", name='d', placeholder="enter 4"> <br><br><br></b>
            <input type="submit" , value='predict!' >
        </form>

        <img src='static\flower1.jpg' alt="flower">
    </center>


</body>
</html>

 home은 다음과 같이 구성되어 있다.   POST를 할 값들을 입력을 넣어준다.  submit을 통해 값을 보내면 모델에서 예측을 하고 결과를 뱉게 된다.  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
      <h1>  PREDICTION :  </h1>

    {%if data == 0%}
    <h1>Iris-setosa</h1>
    <img src='static\setosa.jpg'>

    {%elif data == 1%}
    <h1>Iris-versicolor</h1>
    <img src='static\verci.jpg'>

    {%else %}
    <h1>Iris-verginica</h1>
    <img src='static\vergi.jpg'>


    {%endif%}

        <br><br>
    <a href='/'>go back to home page</a>
    </center>
</body>
</html>

after 페이지는 약간의 수정을 하였다. data = 0, 1, 2에 따라서  결과값이 달라지는 구조이다.

각 결과에따라 최종 결과를 뱉고 그에 맡는 사진을 가져오는 구조로 되어있다.

 

즉, render_template을 통해서 프론트에서 페이지를 구성하거나 기본적인 값을 가져오고,

그 값을 flask로 불러들어와서 모델에서 처리를 하고 다시 뱉어서 프론트로 보내준다.