기본 콘텐츠로 건너뛰기

Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(1)

Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(1)

파이썬(Python) Flask - ML & DL RESTFul API

최근에 프로젝트를 진행하느라 오랜만에 포스팅 하는 것 같습니다. 최근에 Pytyhon Flask 기반으로

ML & DL RESTful API 서비스를 현업에서 개발 및 테스트를 완료 했습니다.

진행 기간 동안 현재 웹 기술과 별개로 기계학습 결과 및 데이터 전처리 과정을 Server에서 결과값을 제공하는

백그라운드 기술은 많은 노하우를 필요로 한다는 것을 다시 한 번 느끼게 되었습니다.

물론 하둡 & 스파크 맵리듀스 기반으로 한 대용량 데이터 처리 기술은 과거부터 지금까지 빠른 업데이트를

기반으로 데이터의 양과 처리속도가 비약적으로 발전하고 있습니다.

프로젝트 시작 전 RDMBS, NoSQL에서 가치있는 데이터를 전처리 후 사용자가 정의한 알고리즘을 선별해서

만족도가 높은 스코어 및 결과(분류, 회귀, 클러스터링)등을 제공하는 RESTful API 기반으로한 아키텍처를

정의했고 그때 많은 외국 포럼 및 현행 서비스 시스템 분석을 통해서 Flask를 사용하기로 결정했습니다.

Flask는 매우 경량화된 웹 프레임워크로 요즘에는 주로 머신러닝 및 딥러닝 학습 결과로 추출 한 Model

엑세스를 통해서 파이썬의 강력한 기계학습 관련 패키지 등을 통해서 매우 빠르게 개발 할 수 있습니다.

본 포스팅은 2부로 나눠서 포스팅할 예정입니다. 문서 맨 하단에 예제 소스를 항상 첨부해드립니다.

자세한 동작 환경은 소스코드를 직접 다운로드 받으셔서 차근차근 분석해보시면 쉽게 이해하실 수 있습니다.

그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.

Flask 관련 포스팅 : Flask 관련

파이썬(Python) Flask - ML & DL REST API Architecture

개발에 들어가기 전 가장 중요한 부분을 짚어보겠습니다.

아래 그림을 참조하시면 일반적으로 프론트 개발은 일반 웹 개발과 마찬가지로 적절한 프레임워크를

선정했으며, Django, Flask 등에서 제공하는 Jinja2 템플릿 코딩을 통해서 매우 쉽게 개발이 가능합니다.

백엔드 파트에서 가장 중요한 모델 재 학습(Retrain)입니다. 모델을 재 생성한다는 것은 새로운 데이터에

대해서 강화 된 새로운 모델을 추출하는 것이고 모델을 통해서 엑세스 해서 결과 값을 제공해야

웹 환경에서 사용자에게 빠른 결과값을 응답할 수 있습니다.

모델은 사용자가 정의한 대로 일정 시간(일, 주, 월, 년) 및 데이터가 생성되는 주기에 따라서 파이썬으로

가정하면 적합한 스케쥴러 패키지(APScheduler 등)를 활용해서 사용자가 정의한 간격으로 재 생성 해주는

방향으로 개발을 진행했습니다.

모델은 Scikit-learn, tensorflow 등에서 주로 pickle, ckpt 형식으로 저장하는 메소드를 쉽게 확인하실 수

있습니다.

즉, 데이터 전처리 -> 학습 -> 모델 추출 -> 모델 재 생성 -> 서비스 단계로 진행 하면 될 것같습니다.

그 후 사용자는 브라우저를 통한 Request 후 생성된 Model을 통해서 인터렉티브한 서비스를 제공

하실 수 있습니다.

아키텍처 다이어그램1(참고)

아키텍처 다이어그램2(참고)

파이썬(Python) Flask - ML & DL REST API 소스코드

다운 받으신 소스코드를 실행하기 위해서는 기본적으로 개발 및 실행 환경 설정은 가상환경을 이용해서 진행

해 주시면 됩니다.

Anaconda(아나콘다), Miniconda(미니콘다), venv(파이썬 기본 내장) 등 원하시는 가상환경을 지원하는

플랫폼을 설치 후 활용해 주세요.

파일을 다운 받으신 후 내부에 requirements.txt 파일을 확인 하시고 필요한 부분만 설치하셔도 됩니다.

아래 예제는 Scikit-learn의 RandomForest Classification을 활용한 Google House Number Predictor

를 기반으로 웹에서 업로드한 이미지에 표시된 숫자를 예측하는 서비스를 제공하는 웹 서버로 가정합니다.

학습에 필요한 extra 32x32.mat 데이터셋 파일을 첨부파일 용량 관계로 별도의 링크를 통해서

다운로드 후 model.py와 같은 폴더로 이동 후에 model.py를 실행하시면 모델 생성 및 결과 값을 확인

하실 수 있습니다.

이해가 잘 안되신다면, 다운받으신 소스코드 내부의 주석 부분과 폴더 구조를 살펴보시면 됩니다.

최종적으로 생성 된 model.pkl 파일을 통해서 Flask에서 서비스하는 구조입니다.

그럼 소스코드를 살펴보겠습니다.

기본 패키지 설치 및 다운로드 파일(필수)

1. 학습에 필요한 Dataset 파일 다운로드 : 링크

2. 필수 패키지 설치 : pip install -r requirements.txt

소스 코드

main.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import flask from flask import Flask, request, render_template from sklearn.externals import joblib import numpy as np from scipy import misc 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__' : # 모델 로드 # ml/model.py 선 실행 후 생성 model = joblib.load( './model/model.pkl' ) # Flask 서비스 스타트 app.run(host = '0.0.0.0' , port = 8000 , debug = True) cs

- 11~14번 라인 : 기본 URL 요청 시 기본 index.html로 이동(렌더링)

- 18 번 라인 : 핵심 메소드 입니다. 클라이언트에서 숫자 이미지 파일이 업로드 되면 이미지 알파값 제거 등 편집 후

문자열 변환 -> 숫자 예측 그 후 예측 숫자 값을 index.html로 리턴 후 렌더링 합니다.

- 48 번 라인 : 서버 시작 시 기존 학습 모델을 로드합니다. 또는 클라이언트 요청 시에 로드 가능하나 이 부분은 다양한 테스트를 통해서 서버 퍼포먼스 부분을 측정 후 결정해야 할 것 같습니다.(Model 크기, 용량, 서버 사양 등)

- 50 번 라인 : Flask 서버 기동

model.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import scipy.io from sklearn.utils import shuffle from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.externals import joblib # Google 주소 숫자 인식 모델 생성 # 로드 mat 파일 train_data = scipy.io.loadmat( 'extra_32x32.mat' ) # 학습 데이터, 훈련 데이터 X = train_data[ 'X' ] y = train_data[ 'y' ] # 매트릭스 1D 변환 X = X.reshape(X.shape[ 0 ] * X.shape[ 1 ] * X.shape[ 2 ], X.shape[ 3 ]).T y = y.reshape(y.shape[ 0 ], ) # 셔플(섞기) X, y = shuffle(X, y, random_state = 42 ) # 학습 훈련 데이터 분리 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0. 05 , random_state = 42 ) # 랜덤 포레스트 객체 생성 및 학습 clf = RandomForestClassifier() clf.fit(X_train, y_train) # 모델 저장 joblib.dump(clf, '../model/model.pkl' ) Colored by Color Scripter cs

- 10~28번 라인 : 일반적인 Scikit-learn의 랜덤포레스트 분류 예제 소스 입니다. 자세한 설명은 생략합니다.

- 31 번 라인 : 학습 완료 된 모델을 추출합니다. 당연히 파이프라인, GridSearch, Hyper Parameter 등을 통해서

스코어 검증 후 서비스 적합한 모델을 추출하셔야겠죠?

Flask Rest API의 추가적인 상세 설명은 이 곳을 참고해 주세요.

파이썬(Python) Flask - ML & DL REST API 테스트

아래 이미지로 총 3단계의 실행 환경을 GIF 이미지로 확인하실 수 있습니다. 상단 내용이 이해가 잘 안되시면

작동 화면을 참고하셔서 환경 설정을 진행하시는 것을 추천드립니다.

실행 화면 - 패키지 설치

실행 화면(model.py) - 학습 모델 추출

실행 화면 - 이미지 업로드 후 예측 데이터 수신

Flask 공식 Reference : Flask 관련

마무리

이번 포스팅에서는 플라스크 프레임워크를 활용해서 머신러닝, 딥러닝 서비스를 Rest API 형태로 서버를

구성하는 예제를 작성해보았습니다.

현재 네이버 클로바, 구글 딥러닝 VM, 아마존 AWS Rest 기계학습 서비스 등 대표 기업들이 클라우드 환경에서

다양한 알고리즘을 활용한 기계학습 파트를 사용자 편의성의 GUI 형태로 데이터 전처리 Feature 추출,

필터링, 학습, 모델 추출 등을 테스트 할 수 있는 서비스를 제공하고 있습니다.

또한, 최근에 사용하고 있는 삼성 빅데이터 분석 플랫폼인 브라이틱스도 정말 잘 만들었다는 생각이 듭니다.

웹에서 학습 모델을 테스트 할 수 있는 서비스는 서비스 사양, 서비 구성 형태, 데이터의 양, 클러스터링 등

다양한 기술적 요소와, 환경적 요소를 고려해야 좋은 성능의 응답속도를 보장 할 수 있는 것 같습니다.

이번 예제에서는 모델 재 학습(Retrain)이라는 중요한 파트를 분리해서 진행해보았습니다.

데이터 숙제를 한다는 것이 정말 힘든일이라는 것을 느끼고 있습니다. 중요한 변수를 간과하거나, 지식 부족의약식화된 알고리즘 검증, 잠재적으로 장애가 될 만한 데이터에 대한 소홀함 등으로 인해 엉뚱한 결과값을 도출하는 사례가 많은 것 같습니다.

다음 마지막 포스팅에서 현실에서 매순간 새롭게 발생되는 정보(데이터)를 일정한 주기형태로 다시 알고리즘

을 사용해서 재 학습 후 새로운 모델을 사용한 서비스를 구성하는 형태의 예제를 추가하겠습니다.

다음 포스팅에서 마무리 해보도록 하겠습니다. 감사합니다. 소스코드 다운로드 : Flask-ML & DL-Example(1).zip

from http://niceman.tistory.com/192 by ccl(S)

댓글

이 블로그의 인기 게시물

[GCP] Flask로 TF 2.0 MNIST 모델 서빙하기

[GCP] Flask로 TF 2.0 MNIST 모델 서빙하기 Google Cloud Platform 우선 TensorFlow 2.0을 설치하자. 머신에 직접 설치하거나 도커를 다운받아 사용, 혹은 구글 colab을 활용( https://www.tensorflow.org/install)하면 되는데, TensorFlow에서 권장하는대로 머신에 VirtualEnv를 활용해서 설치하자 ( https://www.tensorflow.org/install/pip). 설치하는 김에 Flask도 같이 설치해보자. Compute Machine 하나를 생성(크게 부담 없는 예제라 g1 instance)하고, SSH를 연결하여 실행하면 된다. $ sudo apt update $ sudo apt install python3-dev python3-pip $ sudo pip3 install -U virtualenv # 굳이 system-wide로 flask를 설치할 필요는 없지만 그렇게 했다. $ sudo pip3 install flask $ sudo pip3 install flask-restful # virtualenv 환경에서 tensorflow 2.0 설치 $ virtualenv --system-site-packages -p python3 ./venv $ source ./venv/bin/activate # sh, bash, ksh, or zsh (venv) $ pip install --upgrade pip (venv) $ pip install --upgrade tensorflow 모든 환경이 마련되었으니, 우선 MNIST 모델을 TF 2.0으로 Training하여 모델을 Save 해 두자(tf_mnist_train.py). 대략 99% 이상 정확도가 나온다! import tensorflow as tf import numpy as np # 학습 데이터 load ((train_data, train_label), (eval_data, eval_label)) = tf....

스프링 프레임워크(Spring Framework)란?

스프링 프레임워크(Spring Framework)란? "코드로 배우느 스프링 웹 프로젝트"책을 개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다. '스프링 프레임워크'가 무엇인지 말 할 수 있고, 해당 프레임워크의 특징 및 장단점을 설명할 수 잇는 것을 목표로합니다. 1. 프레임워크란? 2. 스프링 프레임워크 "뼈대나 근간을 이루는 코드들의 묶음" Spring(Java의 웹 프레임워크), Django(Python의 웹 프레임워크), Flask(Python의 마이크로 웹 프레임워크), Ruby on rails(Ruby의 웹 프레임워크), .NET Framework, Node.js(Express.js 프레임워크) 등등. 프레임워 워크 종류 : 3. 개발 시간을 단축할 수 있다. 2. 일정한 품질이 보장된 결과물을 얻을 수 있다. 1. 실력이 부족한 개발자라 허다러도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다. 프레임워크를 사용하면 크게 다음 3가지의 장점 이 있습니다. 프레임워크 이용 한다는 의미 : 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발 한다. => 이러한 상황을 극복하기 위한 코드의 결과물이 '프레임워크' 입니다. 개발자는 각 개개인의 능력차이가 크고, 따라서 개발자 구성에 따라서 프로젝트의 결과 차이가 큽니다. 2. 스프링 프레임워크(Spring Framework) 자바 플랫폼을 위한 오픈 소스 애플리케이션 스프링의 다른 프레임워크와 가장 큰 차이점은 다른 프레임워크들의 포용 입니다. 이는 다시말해 기본 뼈대를 흔들지 않고, 여러 종류의 프레임워크를 혼용해서 사용할 수 있다는 점입니다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크 이다. 여러 프레임워크들 중 자바(JAV...

Dummy to resolve the flask problems

Dummy to resolve the flask problems This post is about flask problems that I struggled with. Hope you this is useful things when you taste it. Issue : How to deploy a flask application on Apache2 Resolve : As you know, flask is a micro framework. It can be handled on Apache2 using WSGI module. See the reference. Reference: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps Issue : Flask caused ERR_CONNECTION_ABORTED on POST Resolve : There are lots issues for this problem in principle. It caused when browser keep sending some buffer but server doesn't want to receive. My case is like this (submit.html) (submit.py) @bp.route('/submit', methods=["GET", "POST"]) def submit(): return render_template("submit.html") This kinda skel code to explain this. In flask case, this can be caused when it runs as develop server such as run...