Flask 기반 감성분석 API 개발
네이버 영화리뷰 감성분석 개요
- 네이버 영화리뷰 데이터로 학습한 ML/DL 모델을 활용해 감성분석 API 개발
- 나이브베이지안 모델과 딥러닝 모델로 학습한 두 개의 모델을 서빙하며 0은 부정을 1은 긍정을 의미
감성분석 API 개발 방향
- AWS EC2와 Python Flask 기반 모델 학습 및 추론을 요청/응답하는 API 서버 개발
API 정의
- key : value 형태의 json 포맷으로 요청을 받아 text index 별로 key : value로 결과를 저장한 json 포맷으로 결과를 반환
- POST 방식으로 predict 요청
do_fast를 true로 할 경우, 빠른 추론속도가 가능한 머신러닝 모델로 추론하도록 함,
false의 경우, 추론속도는 비교적 느리지만 정확도가 높은 딥러닝 모델로 추론하도록 함
Add Deep Learning model handelr
- 사전 학습한 딥러닝 모델을 활용하여 머신러닝 모델 handler와 동일한 입력에 대해 동일한 결과를 반환하는 handler 개발
- 사전 학습한 모델은 Hugging Face에서 제공하는 외부 저장소에서 불러옴
import torch
def initialize(self, ):
from transformers import AutoTokenizer, AutoModelForSequenceClassification
self.model_name_or_path = 'sackoh/bert-base-multilingual-cased-nsmc'
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path)
self.model = AutoModelForSequenceClassification.from_pretrained(self.model_name_or_path)
self.model.to('cpu')
pass
def preprocess(self, text):
model_input = self._clean_text(text)
model_input = self.tokenizer(text,return_tensors = 'pt', padding = True)
return model_input
def inference(self, model_input):
with torch.no_grad():
model_output = self.model(**model_input)[0].cpu()
model_output = 1.0/ (1.0 + torch.exp(-model_output))
model_output = model_output.numpy().astype(dloat)
return model_output
def postprocess(self, model_output):
predicted_probabilities = model_output.max(axis = 1)
predicted_ids = model_output.argmax(axis = 1)
predicted_labels = [self.id2label[id_] for id_ in predicted_ids]
return predicted_labels, predicted_probabilities
def handle(self, data):
model_input = self.preprocess(data)
model_output = self.inference(model_input)
return self.postprocess(model_output)
Unit test model handlers
- 개발한 model handler가 원했던 대로 동작하는지 test
Flask API 개발 & 배포
- Model을 전역변수로 불러오고 요청된 텍스트에 대해 예측 결과를 반환하는 코드 입력
from flask import Flask, request, json
from model import MLModelHandler, DLModelHandler
app = Flask(__name__)
ml_handler = MLModelHandler()
dl_handler = DLModelHandler()
@app.route("/predict", methods=["POST"])
def predict():
body = request.get_json()
text = body.get('text', '')
text = [text] if isinstance(text, str) else text
do_fast = body.get('do_fast', True)
if do_fast:
predictions = ml_handler.handle(text)
else:
predictions = dl_handler.handle(text)
result = json.dumps({str(i): {'text': t, 'label': l, 'confidence': c}
for i, (t, l, c) in enumerate(zip(text, predictions[0], predictions[1]))})
return result
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
Test API on remote
- 원격에서 서버로 API에 요청하여 테스트 수행
- host: EC2 인스턴스 생성시에 받은 퍼블릭 IP 주소
- port: EC2 인스턴스 생성 시에 설정했던 port 번호
- 터미널에서 확인
- python을 이용해서 확인