기본 콘텐츠로 건너뛰기

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)

댓글

이 블로그의 인기 게시물

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고...

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고... Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 1997년, 초창기 아마존에 입사한다고 상상해보세요. 그 당시 누구도 e-commerce 산업이, 아마존이라는 회사가 지금처럼 성장하리라고는 생각하지 못했을 것입니다. 하지만, 그 당시 아마존을 선택한 사람들은 e-commerce 산업을 개척했고, 아마존을 세계적인 회사로 성장시켰습니다. 2016년 '아시아의 아마존'으로 성장하고 있는 쿠팡, 당신에게 매력적인 선택이 아닐까요? Global Operation Technology: eCommerce에서 주문을 한 뒤 벌어지는 상황에 대해서 호기심을 가져보신 적이 있나요? Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 매일 최첨단 소프트웨어 기술을 이용해 고객의 주문을 받고 상품을 어느 창고에서 출고 시킬지, 포장을 하나의 박스 또는 여러 개로 나눌 것인지, 어떤 배송 루트를 선택하고 어떻게 고객에게 배송 상태를 보여줄지 결정하는 시스템과 서비스를 개발 합니다. What Global Operations Technology does: CS and C-Returns System 적극적 고객서비스를 바탕으로 고객의 목소리를 통해 끊임없이 고객 에게 서비스를 제공하고 Andon 메커니즘을 통해 고객의 목소리를 회사 전체와 공유합니다. 그리고 고객 문제 해결과 구매 이후 벌어질 수 있는 고객 문제를 사전에 예방하기 위한 시스템 개발을 통해 미래의 상황을 예측 합니다. Tranportation System TSP (Traveling Salesman Problem) 와 같은 CS 최적화 관리 문제를 다룹니다.배송 물품의 실시간 추적, 3P 하드웨어와 소프트웨어를 통합, 각 배송 루트에 할당되는 물량 예측하고 T...

스프링 프레임워크(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...

Flask 18. jQuery와 ajax

Flask 18. jQuery와 ajax 현재 우리는 api를 만들고 있다. api를 사용하기 위해서는 ajax를 사용해야한다. 그리고 ajax를 편하게 쓸 수 있도록 도와주는 것이 jquery라이브러리이다. ajax는 비동기로 서버에 요청할 수 있다. 브라우저에 XMLHttpRequest객체가 있어서 이것을 사용해서 서버에 데이터를 요청할 수 있다. 기존에는 웹에 접근할 때 주소에다가 서버의 주소를 씀으로써 데이터(페이지)를 요청할 수 있고, form을 만드는 방법이 있다. 이러한 방법들은 페이지 이동이 일어나서 서버에서 무조건 응답으로 웹페이지를 만들어서 응답해야하는 단점이 있었다 그러나 api를 사용하면 리소스 중심으로 데이터의 이동만 일어난다. 클라이언트는 데이터만 받기 때문에 데이터로 웹을 만들어야한다. 화면은 이미 만들어져있는 상태에서 비동기로 화면을 전환하지 않고, 서버에 데이터 요청을 한 후 그 데이터를 기반으로 웹에 그 데이터를 반영하는 것이다. 이것들은 백그라운드에서 일어난다. 이것을 위해서는 자바스크립트를 이용해야하고 jquery를 이용할 것이다. jquery는 여러 셀렉터를 사용할 수 있어서 편하다. 자바스크립트 작업을 좀더 생산성 좋게 작업할 수 있도록 해준다. 가장 큰 특징은 ajax요청을 아주 쉽게 할 수 있다. 정리 비동기 요청을 위해서 ajax를 사용할 것이고, 그러나 순수자바스크립트는 어렵기 때문에 jquery를 사용할 것이다. 공유하기 글 요소 저작자표시 from http://ohdowon064.tistory.com/134 by ccl(A) rewrite - 2020-03-24 10:54:10