클라우드를 활용한 머신러닝 모델 Serving API 개발 6 : Flask 기반 감성분석 API 개발

임동윤·2022년 10월 13일
0
post-thumbnail
post-custom-banner

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):
        # preprocess raw text
        model_input = self._clean_text(text)
        # vectorizing cleaned 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):
        # process predictions to predicted label and output format
        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):
        # do above processes
        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__)

# assign model handler as global variable [2 LINES]
ml_handler = MLModelHandler()
dl_handler = DLModelHandler()

@app.route("/predict", methods=["POST"])
def predict():
    # handle request and body
    body = request.get_json()
    text = body.get('text', '')
    text = [text] if isinstance(text, str) else text
    do_fast = body.get('do_fast', True)

    # model inference [2 LINES]
    if do_fast:
        predictions = ml_handler.handle(text)
    else:
        predictions = dl_handler.handle(text)


    # response
    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 번호
  1. 터미널에서 확인
  1. python을 이용해서 확인

profile
AI Tensorflow Python
post-custom-banner

0개의 댓글