파이썬(Python) Flask - ML & DL RESTFul API
지난 포스팅에 이어서 Flask 머신러닝 서비스 프로젝트를 완성해보겠습니다.
이번 내용의 핵심은 머신러닝 학습 서비스를 모듈화 한 후 플라스크에서 요청 시 재 학습(Retrain) 또는
학습 결과를 리턴해주는 부분을 수정 할 예정입니다.
이번 예제를 읽기 전에 반드시 지난 포스팅을 참고하시기를 부탁드립니다. (지난 포스팅)
아울러, 문서 맨 하단에 예제 소스를 항상 첨부해드립니다.
자세한 동작 환경은 소스코드를 직접 다운로드 받으셔서 차근차근 분석해보시면 쉽게 이해하실 수 있습니다.
그러면 하단에서 간단하게 예제를 작성해보겠습니다.
Flask 관련 포스팅 : Flask 관련
파이썬(Python) Flask - ML & DL REST API Architecture
개발에 들어가기 전 가장 중요한 부분을 짚어보겠습니다.
지난 시간에 언급드렸지다시피 백엔드 파트에서 가장 중요한 모델 재 학습(Retrain)입니다.
모델을 재 생성한다는 것은 지속적으로 생성되는 새로운 데이터셋을 기반으로 기존 모델을 강화시키고
안정적이고 높은 스코어 및 변화하는 사용자 요구에 적합한 서비스를 제공하기 위해서는 필수적인 작업이라
생각됩니다.
모델 재 생성은 여러 스케쥴러를 통해서 실행 할 수 있으나, 이번 예제에서는 Rest API로 별도로 분리해서
사용자가 언제든지 요청 할 경우 기존 모델 백업 후 새로운 모델을 생성하는 방향으로 진행했습니다.
아래 아키텍쳐 다이어그램을 참고하시면 보다 쉽게 이해하실 수 있습니다.
그 후 사용자는 브라우저를 통한 Request 후 생성된 Model을 통해서 인터렉티브한 서비스를 제공
하실 수 있습니다.
아키텍처 다이어그램(참고)
파이썬(Python) Flask - ML & DL REST API 소스코드
다운 받으신 소스코드를 실행하기 위해서는 기본적으로 개발 및 실행 환경 설정은 가상환경을 이용해서 진행
해 주시면 됩니다.
지난 시간에 이미 환경설정 및 관련 아키텍쳐에 대해서는 상세하게 설명드렸습니다. 변경된 소스코드로
위주로 설명드리겠습니다.
그럼 아래 소스를 살펴보겠습니다.
기본 패키지 설치 및 다운로드 파일(필수)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
import flask
from flask import Flask, request, render_template
from sklearn.externals import joblib
import numpy as np
from scipy import misc
from ml.model import export_model
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
# 메인 페이지 라우팅
@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', ml_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', ml_label=label)
# 데이터 모델 재학습
@app.route('/retrain', methods=['POST'])
def make_model():
if request.method == 'POST':
# 모델 재 생성
export_model('R')
return render_template('index.html', md_label='모델 재생성 완료')
# 데이터 모델 재학습(RestApi)
class RestMl(Resource):
def get(self):
export_model('R')
return {'result': True, 'modelName': 'model.pkl'}
# Rest 등록
api.add_resource(RestMl, '/retrainModel')
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 |
- 6번 라인 : 별도로 분리된 모델 학습 파일(model.py)를 패키지 형태로 임포트 합니다.
- 50번 라인 : 추가 된 메소드 입니다. 모델 재 학습을 위해서 Rest API(/retreain) 수신 시 export_method를
호출 후 model.py에 있는 메소드를 실행합니다.
그 이후 새로운 모델을 사용해서 ML & DL 서비스를 제공합니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import os
import time
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
from pathlib import Path
def export_model(mode=None):
# Google 주소 숫자 인식 모델 생성
# Path 설정
ml_dir = str(Path(__file__).parent)
md_dir = str(Path(__file__).parent.parent)
# 로드 mat 파일
train_data = scipy.io.loadmat(ml_dir + '/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)
# 모델 저장(첫 학습, 재 학습 구분)
if not mode:
joblib.dump(clf, md_dir + '/model/model.pkl')
else:
if os.path.isfile(md_dir + '/model/model.pkl'):
os.rename(md_dir + '/model/model.pkl', md_dir + f'/model/model_{time.time()}.pkl')
joblib.dump(clf, md_dir + '/model/model.pkl')
if __name__ == "__main__":
export_model()
|
cs |
- 11번 라인 : 패키지 형태의 모듈 서비스를 제공하기 위해서 함수 형태로 변환합니다.
- 39~44라인 : 학습 완료 된 모델을 추출합니다. 기존 모델을 지우지 않고 datetime을 붙인 후 백업합니다.
환경에 따라서 기능 추가가 필요한 부분입니다.
Flask Rest API의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) Flask - ML & DL REST API 테스트
아래 이미지로 총 2단계의 완성 된 실행 환경을 GIF 이미지로 확인하실 수 있습니다.
실행 화면 - Flask 서버 기동
실행 화면(model.py) - 학습 재 학습 결과 확인
Flask 공식 Reference : Flask 관련
마무리
2회의 포스팅에 걸쳐서 플라스크 프레임워크를 활용해서 머신러닝, 딥러닝 서비스를 Rest API 형태로 서버를
구성하는 예제를 작성해보았습니다.
현재 다양한 네이버 클로바, 구글 딥러닝 VM, 아마존 AWS Rest 기계학습 서비스, 삼성 브라이틱스 등
대표 기업들이 클라우드 환경에서 웹 GUI 기반 다양한 알고리즘을 활용한 빅데이터 분석 및 기계학습
서비스를 제공 하고 있습니다.
이번 예제에서는 모델 재 학습(Retrain)이라는 중요한 부분을 기능 추가 후 테스트까지 완료했습니다.
개인적으로 요즘 분석 기반 프로젝트를 진행하면서 대용량 인프라 기반 및 많은 양의 데이터가 존재
한다면 딥러닝을 사용할 경우 좋은 결과 값 도출을 확인했습니다.
다만, 제가 경험한 바운더리안에서는 거의 국내에서 현업에서 발생되는 데이터는 텍스트 타입 데이터가
대부분이었고 이 때는 머신러닝 알고리즘을 활용하는 것이 비즈니스 서비스에 더 도움이 되는 경우가
많았습니다.
데이터 타입이 영상, 이미지 자료등의 멀티미디어 자료라면 두말 할거 없어 딥러닝이라 생각됩니다.
불확실성을 확실성으로 개선시키는 작업은 힘들지만, 자가 발전에 큰 활력소가 되고 있는 것 같습니다.
다음 예제에서도 좋은 정보를 공유하도록 하겠습니다. 꼭 예제 파일 다운로드 후 직접 실행하시는 것을
추천 드립니다.
감사합니다.
소스코드 다운로드 :
FLASK-ML & DL-EXAMPLE(2).zip다운로드
'빅데이터 & 분석 > Machine Learning' 카테고리의 다른 글
Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(1) (16) | 2019.06.12 |
---|---|
파이썬(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 |
파이썬(Python) Flask - ML & DL RESTFul API
지난 포스팅에 이어서 Flask 머신러닝 서비스 프로젝트를 완성해보겠습니다.
이번 내용의 핵심은 머신러닝 학습 서비스를 모듈화 한 후 플라스크에서 요청 시 재 학습(Retrain) 또는
학습 결과를 리턴해주는 부분을 수정 할 예정입니다.
이번 예제를 읽기 전에 반드시 지난 포스팅을 참고하시기를 부탁드립니다. (지난 포스팅)
아울러, 문서 맨 하단에 예제 소스를 항상 첨부해드립니다.
자세한 동작 환경은 소스코드를 직접 다운로드 받으셔서 차근차근 분석해보시면 쉽게 이해하실 수 있습니다.
그러면 하단에서 간단하게 예제를 작성해보겠습니다.
Flask 관련 포스팅 : Flask 관련
파이썬(Python) Flask - ML & DL REST API Architecture
개발에 들어가기 전 가장 중요한 부분을 짚어보겠습니다.
지난 시간에 언급드렸지다시피 백엔드 파트에서 가장 중요한 모델 재 학습(Retrain)입니다.
모델을 재 생성한다는 것은 지속적으로 생성되는 새로운 데이터셋을 기반으로 기존 모델을 강화시키고
안정적이고 높은 스코어 및 변화하는 사용자 요구에 적합한 서비스를 제공하기 위해서는 필수적인 작업이라
생각됩니다.
모델 재 생성은 여러 스케쥴러를 통해서 실행 할 수 있으나, 이번 예제에서는 Rest API로 별도로 분리해서
사용자가 언제든지 요청 할 경우 기존 모델 백업 후 새로운 모델을 생성하는 방향으로 진행했습니다.
아래 아키텍쳐 다이어그램을 참고하시면 보다 쉽게 이해하실 수 있습니다.
그 후 사용자는 브라우저를 통한 Request 후 생성된 Model을 통해서 인터렉티브한 서비스를 제공
하실 수 있습니다.
아키텍처 다이어그램(참고)
파이썬(Python) Flask - ML & DL REST API 소스코드
다운 받으신 소스코드를 실행하기 위해서는 기본적으로 개발 및 실행 환경 설정은 가상환경을 이용해서 진행
해 주시면 됩니다.
지난 시간에 이미 환경설정 및 관련 아키텍쳐에 대해서는 상세하게 설명드렸습니다. 변경된 소스코드로
위주로 설명드리겠습니다.
그럼 아래 소스를 살펴보겠습니다.
기본 패키지 설치 및 다운로드 파일(필수)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
import flask
from flask import Flask, request, render_template
from sklearn.externals import joblib
import numpy as np
from scipy import misc
from ml.model import export_model
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
# 메인 페이지 라우팅
@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', ml_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', ml_label=label)
# 데이터 모델 재학습
@app.route('/retrain', methods=['POST'])
def make_model():
if request.method == 'POST':
# 모델 재 생성
export_model('R')
return render_template('index.html', md_label='모델 재생성 완료')
# 데이터 모델 재학습(RestApi)
class RestMl(Resource):
def get(self):
export_model('R')
return {'result': True, 'modelName': 'model.pkl'}
# Rest 등록
api.add_resource(RestMl, '/retrainModel')
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 |
- 6번 라인 : 별도로 분리된 모델 학습 파일(model.py)를 패키지 형태로 임포트 합니다.
- 50번 라인 : 추가 된 메소드 입니다. 모델 재 학습을 위해서 Rest API(/retreain) 수신 시 export_method를
호출 후 model.py에 있는 메소드를 실행합니다.
그 이후 새로운 모델을 사용해서 ML & DL 서비스를 제공합니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import os
import time
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
from pathlib import Path
def export_model(mode=None):
# Google 주소 숫자 인식 모델 생성
# Path 설정
ml_dir = str(Path(__file__).parent)
md_dir = str(Path(__file__).parent.parent)
# 로드 mat 파일
train_data = scipy.io.loadmat(ml_dir + '/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)
# 모델 저장(첫 학습, 재 학습 구분)
if not mode:
joblib.dump(clf, md_dir + '/model/model.pkl')
else:
if os.path.isfile(md_dir + '/model/model.pkl'):
os.rename(md_dir + '/model/model.pkl', md_dir + f'/model/model_{time.time()}.pkl')
joblib.dump(clf, md_dir + '/model/model.pkl')
if __name__ == "__main__":
export_model()
|
cs |
- 11번 라인 : 패키지 형태의 모듈 서비스를 제공하기 위해서 함수 형태로 변환합니다.
- 39~44라인 : 학습 완료 된 모델을 추출합니다. 기존 모델을 지우지 않고 datetime을 붙인 후 백업합니다.
환경에 따라서 기능 추가가 필요한 부분입니다.
Flask Rest API의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) Flask - ML & DL REST API 테스트
아래 이미지로 총 2단계의 완성 된 실행 환경을 GIF 이미지로 확인하실 수 있습니다.
실행 화면 - Flask 서버 기동
실행 화면(model.py) - 학습 재 학습 결과 확인
Flask 공식 Reference : Flask 관련
마무리
2회의 포스팅에 걸쳐서 플라스크 프레임워크를 활용해서 머신러닝, 딥러닝 서비스를 Rest API 형태로 서버를
구성하는 예제를 작성해보았습니다.
현재 다양한 네이버 클로바, 구글 딥러닝 VM, 아마존 AWS Rest 기계학습 서비스, 삼성 브라이틱스 등
대표 기업들이 클라우드 환경에서 웹 GUI 기반 다양한 알고리즘을 활용한 빅데이터 분석 및 기계학습
서비스를 제공 하고 있습니다.
이번 예제에서는 모델 재 학습(Retrain)이라는 중요한 부분을 기능 추가 후 테스트까지 완료했습니다.
개인적으로 요즘 분석 기반 프로젝트를 진행하면서 대용량 인프라 기반 및 많은 양의 데이터가 존재
한다면 딥러닝을 사용할 경우 좋은 결과 값 도출을 확인했습니다.
다만, 제가 경험한 바운더리안에서는 거의 국내에서 현업에서 발생되는 데이터는 텍스트 타입 데이터가
대부분이었고 이 때는 머신러닝 알고리즘을 활용하는 것이 비즈니스 서비스에 더 도움이 되는 경우가
많았습니다.
데이터 타입이 영상, 이미지 자료등의 멀티미디어 자료라면 두말 할거 없어 딥러닝이라 생각됩니다.
불확실성을 확실성으로 개선시키는 작업은 힘들지만, 자가 발전에 큰 활력소가 되고 있는 것 같습니다.
다음 예제에서도 좋은 정보를 공유하도록 하겠습니다. 꼭 예제 파일 다운로드 후 직접 실행하시는 것을
추천 드립니다.
감사합니다.
소스코드 다운로드 :
FLASK-ML & DL-EXAMPLE(2).zip다운로드
'빅데이터 & 분석 > Machine Learning' 카테고리의 다른 글
Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(1) (16) | 2019.06.12 |
---|---|
파이썬(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 |