오늘 할 일: 갈고 닦기
article thumbnail

Flask 소개

Flask는 파이썬에서 사용하는 경량 WSGI(Web Server Gateway Interface)로, 웹 애플리케이션을 구축할 수 있는 라이브러리입니다. Flask를 활용하면 웹 페이지, 블로그 혹은 머신러닝 예측 결과를 제공하는 웹 API를 만들 수 있습니다. 아래 그림에서 보는 바와 같이 머신러닝 모델과 프론트엔드 웹 페이지를 연결해주는 중간 다리로 사용되죠. 장고Django와 함께 파이썬 웹 프레임워크의 양대산맥으로 알려져 있습니다. Django는 이미 잘 짜여진 다양한 기능을 제공하는 반면 Flask는 심플한 대신에 사용자 자유도가 높다고 하네요. (마치 케라스와 파이토치같은..?ㅎ 아님 말고..)

API 데이터 흐름

 

이제 아래 예시에서 iris 데이터를 이용하여 모델을 만든 후, 플라스크가 모델에게 값을 주고 예측값을 받아 반환하는 프로세스를 살펴보겠습니다. 플라스크를 이용한 이 프로젝트는 크게 다음 4가지 부분으로 구성됩니다.

 

  • iris.py
    • iris.data 파일의 학습 데이터에 대해 iris의 종류를 예측하는 머신러닝 모델 코드가 포함되어 있습니다.
  • app.py
    • GUI 또는 API 호출을 통해 iris 데이터 입력을 받고, 모델을 통해 예측값을 계산하여 반환하는 Flask API가 포함되어 있습니다.
  • iris.pkl 
    • iris 데이터를 이용해 학습한 머신러닝 모델로, iris.py를 실행하면 생성됩니다.
  • templates
    • 이 폴더는 사용자가 값을 입력하고 웹페이지에 예상 출력을 보여주는 HTML 템플릿 home.html, after.html을 포함하고 있습니다.

 

예시코드

모델 훈련

iris.py에서는 iris 데이터를 받고, SVC(Support Vector Classification) 모델을 학습합니다.

import pandas as pd
import numpy as np
import pickle

df = pd.read_csv('iris.data')

X = np.array(df.iloc[:, 0:4])
y = np.array(df.iloc[:, 4:])

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

from sklearn.svm import SVC
sv = SVC(kernel='linear').fit(X_train,y_train)


pickle.dump(sv, open('iri.pkl', 'wb'))

학습이 끝나면 pickle을 사용하여 모델(iris.pkl)을 저장합니다.

 

Flask API

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

model = pickle.load(open('iri.pkl', 'rb'))

app = Flask(__name__)

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

@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)
    return render_template('after.html', data=pred)

if __name__ == "__main__":
    app.run(debug=True)
  • 이 py에서는 Flask(__name__)을 호출하여 플라스크 앱을 초기화하고 pickle로 저장했던 모델을 불러옵니다.
  • @app.route ('/')
    • 플라스크 앱의 루트 디렉토리를 초기화한 후, 이 루트 디렉토리에서 자신을 호출할 함수(main)를 정의합니다.
  • @app.route('/predict', methods=['POST'])
    • request.form['']을 사용하여 HTML 페이지에서 데이터를 가져오고, model.predict()를 통해 클래스를 예측하고, HTML 페이지로 내보내는 함수(home)를 정의합니다. 
    • 예측값에 따라 어떤 텍스트와 이미지를 내보낼지가 after.html에 설정되어 있습니다.

(templates 내 html 파일에 대한 설명은 제가 식견이 부족하여ㅎ 생략하겠습니다. 궁금하신 분들은 아래 참고의 깃헙에서 직접 확인해주세요.)

 

Flask 실행

cmd 창을 열고, 위 파일과 폴더들이 저장된 경로로 이동합니다. 저는 iris 폴더를 만들어서 거기에 flask 실행을 위한 py 파일과 html 들을 넣었습니다. 

먼저 iris.py를 실행해 모델을 만들고, app.py를 실행해 웹페이지를 띄웁니다. 그럼 맨 밑줄 Running on 다음에 URL이 하나 나오는데요, 이걸 브라우저 주소창에 써서 접근할 수 있습니다.(저는 크롬을 이용했습니다.) 이때 python app.py 명령어에 대한 quit은 하지 마시고 웹페이지에 들어가셔야 합니다. 명령어를 종료하고 접근하는 것은 불가능하더라구요. 누구에겐 당연한 걸 수도 있겠지만.. 저와 같은 실수를 하지 않기를 바라는 마음에 남깁니다ㅠㅠ

 

이렇게 주소를 붙여넣으면

다음과 같은 화면을 보실 수 있습니다. 여기서 입력하는 네 개 값이 위에 app.py 파일에서 봤던 data = request.form[''] 에 대한 내용입니다.

 

네 값으로 1.5, 3, 4, 1을 입력하고 predict!를 눌렀더니 versicolor라는 예측 결과가 나오는 것을 확인할 수 있었습니다.

 

지금까지 플라스크를 이용하여 머신러닝 모델을 배포하는 방법을 러프하게ㅎㅎ 알아보았습니다. 데이터 분석을 하고 모델을 생성하는 것까지는 경험해봤지만 이후 모델을 어떻게 배포하는지는 잘 몰랐는데요, 플라스크를 이용한 모델 배포를 시도함으로써 대략적으로는 그 과정을 알게 되어 재밌었던 시간이었습니다. 모델 배포는 머신러닝이 실제로 사용되기 위한 중요한 과정이니 앞으로 더 공부하고 적용하는 연습을 해야할 것 같습니다.(역시 공부에 끝은 없다..)

 

 

참고

Do it! 점프 투 플라스크, 박응용

https://medium.datadriveninvestor.com/deployment-of-machine-learning-project-using-flask-bf6e5a750319

 

Deployment of Machine learning project using Flask

machine-learning project in production.

medium.datadriveninvestor.com

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

 

bharatc9530/Machine-Learning

Data Visualization, EDA , Model Building and Deployment etc.. - bharatc9530/Machine-Learning

github.com