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)
댓글
댓글 쓰기