파이썬(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')
|
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)이라는 중요한 파트를 분리해서 진행해보았습니다.
데이터 숙제를 한다는 것이 정말 힘든일이라는 것을 느끼고 있습니다. 중요한 변수를 간과하거나, 지식 부족의약식화된 알고리즘 검증, 잠재적으로 장애가 될 만한 데이터에 대한 소홀함 등으로 인해 엉뚱한 결과값을 도출하는 사례가 많은 것 같습니다.
다음 마지막 포스팅에서 현실에서 매순간 새롭게 발생되는 정보(데이터)를 일정한 주기형태로 다시 알고리즘
을 사용해서 재 학습 후 새로운 모델을 사용한 서비스를 구성하는 형태의 예제를 추가하겠습니다.
다음 포스팅에서 마무리 해보도록 하겠습니다. 감사합니다.
소스코드 다운로드 :
'빅데이터 & 분석 > Machine Learning' 카테고리의 다른 글
Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(2) (8) | 2019.06.18 |
---|---|
파이썬(Python) - Scikit Learn 의사결정트리(Decision Tree) 시각화 예제 (8) | 2018.12.14 |
파이썬(Python) - 머신러닝 프로젝트(최종) - 나이브 베이즈 스팸 필터링 (26) | 2018.09.23 |
파이썬(Python) - 머신러닝 프로젝트(4) - mLab 호스팅 활용 MongoDB 연동 (4) | 2018.09.09 |
파이썬(Python) - 머신러닝 프로젝트(3) - 문자열 가공 및 TXT 및 CSV 저장 (9) | 2018.07.27 |