호기심 많은 분석가

[Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (2) 본문

Coding/Machine Learning & Python

[Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (2)

DA Hun 2021. 5. 4. 16:38

포스팅 개요

 머신러닝 서비스들을 만들다 보면 이걸 웹이나 앱에서 어떻게 바로 적용할 수 있을까 궁금했습니다. 그러던 중 Flask라는 웹 프레임워크를 알게 되어 공부하고 사용한 경험을 기록한 포스팅입니다.  

 2021.05.03 - [Machine Learning] - [Machine Learning] Sklearn으로 학습한 model 저장 및 재사용 방법에서 저장한 model을 가지고 작업하겠습니다.

 

2021.05.04 - [Machine Learning] - [Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (1)에 이어 이번 포스팅에서는 ML model을 적용시켜보겠습니다.


포스팅 본문

 플라스크(Flask)는 파이썬으로 작성된 마이크로 웹 프레임워크의 하나로, Werkzeug 툴킷과 Jinja2 템플릿 엔진에 기반을 둔다.

더보기

 그렇다면 웹 프레임워크란 무엇일까?

 웹 프레임워크란 웹 프레임워크(web framework, WF) 또는 웹 애플리케이션 프레임워크(web application framework, WAF)는 동적인 웹 페이지나, 웹 애플리케이션, 웹 서비스 개발 보조용으로 만들어지는 애플리케이션 프레임워크의 일종이다. 웹 페이지를 개발하는 과정에서 겪는 어려움을 줄이는 것이 주목적으로 통상 데이터베이스 연동, 템플릿 형태의 표준, 세션 관리, 코드 재사용 등의 기능을 포함하고 있다.

 

 또, 애플리케이션 프레임워크는 무엇인가? 

 애플리케이션 프레임워크는 소프트웨어 개발자가 응용 소프트웨어의 표준 구조를 구현하기 위해 사용하는 소프트웨어 프레임워크로 구성된다. 즉, 프로그래밍에서 특정 운영 체제를 위한 응용 프로그램 표준 구조를 구현하는 클래스와 라이브러리 모임이다. 간단하게 프레임워크라고도 부른다.

 

 프레임워크는 목적에 따라 효율적으로 구조를 짜 놓는 개발 방식이라고 이해할 수 있습니다.

참조 : https://www.castingn.com/sourcing/kkultip_detail/110

 

 플라스크는 특별한 도구나 라이브러리가 필요 없기 때문에 마이크로 프레임워크라 부른다. 데이터베이스 추상화 계층, 양식 유효성 확인, 기타 기존의 서드파티 라이브러리가 공통 기능을 제공하는 구성 요소가 없다. 그러나 플라스크는 플라스크 자체에서 구현된 것처럼 애플리케이션 기능을 추가할 수 있는 확장 기능을 지원한다. 확장 기능은 객체 관계 매퍼, 양식 유효성 확인, 업로드 관리, 다양한 개방형 인증 기술, 여러 공통 프레임워크 관련 도구들을 위해 존재한다. 

 

 파이썬으로 웹 개발을 할 때 많이 쓰이는 프레임워크로는 Django(장고)도 있는 데 Django는 너무 무겁고 기능이 많아서 복잡하다. 내가 필요한 기능만 최대한 라이트 하게 개발을 할 때는 Flask처럼 가벼운 프레임워크가 도움이 된다.

 

 설명은 이만하고 예제를 통해 이해해보겠습니다.


Flask로 웹 서버에 ML model 적용

Flask-ML&DL-Example.zip
3.76MB

import flask
from flask import Flask, request, render_template
from sklearn.externals import joblib
 
app = Flask(__name__)
 
 
# 메인 페이지 라우팅
@app.route("/")
@app.route("/index")
def index():
    return flask.render_template('index.html')
 
 
# 데이터 예측 처리
@app.route('/predict', methods=['POST'])
def make_prediction():
    if request.method == 'POST':
 
        # 업로드 파일 처리 분기
        file = request.files['image']
        if not file: return render_template('index.html', label="No Files")
 
        # 이미지 픽셀 정보 읽기
        # 알파 채널 값 제거 후 1차원 Reshape
        img = misc.imread(file)
        img = img[:, :, :3]
        img = img.reshape(1, -1)
 
        # 입력 받은 이미지 예측
        prediction = model.predict(img)
 
        # 예측 값을 1차원 배열로부터 확인 가능한 문자열로 변환
        label = str(np.squeeze(prediction))
 
        # 숫자가 10일 경우 0으로 처리
        if label == '10': label = '0'
 
        # 결과 리턴
        return render_template('index.html', label=label)
 
 
if __name__ == '__main__':
    # 모델 로드
    model = joblib.load('./model/model.dat')
    # Flask 서비스 스타트
    app.run(host='0.0.0.0', port=8000, debug=True)

 함수 작동 과정

  1. main 파일이므로 model폴더의 model.dat이라는 model을 로드하면서 웹 서비스를 시작한다.
  2. 기본 URL 요청 시 기본 index.html로 이동한다(렌더링) -> 웹 페이지가 render_template에 짜둔 html 코드대로 변함
  3. 'POST'를 method로 사용하는 action='/predict'인 함수를 작동시키면 이미지 파일을 받아서 model에 맞는 형식으로 변환한 뒤 model로 예측하여 그 값을 label이란 변수로 다시 index.html로 전해줌
  4. index.html에서는 그 label을 입력 받아서 표시해줌
더보기

렌더링을 하는 이유?

  1. 웹 브라우저는 HTML을 읽어 해석하기 때문에 다양한 기능을 추가하기 위해서는 모든 컨텐츠를 HTML 형태로 만들어서 전달해야한다.
  2. 하지만 이렇게 긴 HTML 코드 블럭을 어플리케이션 코드 내에 삽입하기엔 가독성이 너무 떨어져서, Flask에서는 보여지는 부분과 처리하는 부분을 나누기 위해 템플릿이라는 기능을 사용
  3. 템플릿에 사용하는 파일들은 'templates' 디렉토리에 저장되며 일반적으로 .html 파일을 사용하고, css 같은 파일들은 'static' 디렉토리에 저장됨. 
  4. 어플리케이션 상에서 이러한 html 파일들을 렌더링할 수 있도록 Flask에서는 'render_template'을 제공한다.
  5. 이것을 Jinja2 템플릿 엔진을 사용하여 html 문서 내에 코드 조각들을 삽입하여 웹 페이지를 동적으로 생성함.

 위의 과정을 실행해보면서 model을 load하여 data에 적용해보는 법, render_template의 사용, method, action, parameter의 중요성 등을 배울 수 있었습니다. 예전에 웹 페이지를 개발해보면서 배웠던 HTML의 문법이 많은 도움이 되었습니다. render_template를 더 잘 사용하기 위해서는 HTML도 더 공부해야겠습니다.

 

 앞으로도 이와 비슷한 방법으로 ML 서비스를 웹이나 앱에 게시할 수 있을 듯합니다. 좋은 경험이었습니다. 이 글을 보신 여러분께도 유용한 글이었길 바라겠습니다. 궁금한 점 있으시면 언제든 함께 나눠주세요. :)