지난 시간까지 3번과정인 Serving Model의 load trained model까지 했음.
이번엔 그 다음 과정인 Define inference를 실습해보겠다.
class ModelHandler(BaseHandler):
def __init__(self):
pass
# 1. 정의된 양식으로 데이터가 입력됐는지 확인
def initialize(self, **kwargs):
pass
# 2. 입력값에 대한 전처리 및 모델에 입력하기 위한 형태로 변환
def preprocess(self, data):
pass
# 3. 불러온 모델을 바탕으로 추론
def inference(self, data):
pass
# 4. 모델 반환값의 후처리 작업
def postprocess(self, data):
pass
# 5. 결과 반환
def handle(self, data):
pass
handle()
: 요청 정보를 받은 후, 위 일련의 과정(1~4)을 실행하여 응답을 반환해줌. 실제로 api에서는 handle만 call함.
def handle(self, data):
# do above processes
model_input = self.preprocess(data)
model_output = self.inference(model_input)
return self.postprocess(model_output)
initialize()
def initialize(self, ):
# De-serializing model and loading vectorizer
import joblib
self.model = joblib.load('model/ml_model.pkl')
self.vectorizer = joblib.load('model/ml_vectorizer.pkl')
preprocess()
def preprocess(self, text):
# cleansing raw text
model_input = self.clean_text(text)
# vectorizing cleaned text
model_input = self.vectorizer.transform(model_input)
return model_input
inference()
def inference(self, model_input):
# get predictions from model as probabilities
model_output = self.model.predict_proba(model_input)
return model_output
postprocess()
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
class MLModelHandler(ModelHandler):
def __init__(self):
super().__init__()
self.initialize()
def initialize(self, ):
# De-serializing model and loading vectorizer
import joblib
self.model = joblib.load('model/ml_model.pkl')
self.vectorizer = joblib.load('model/ml_vectorizer.pkl')
def preprocess(self, text):
# cleansing raw text
model_input = self.clean_text(text)
# vectorizing cleaned text
model_input = self.vectorizer.transform(model_input)
return model_input
def inference(self, model_input):
# get predictions from model as probabilities
model_output = self.model.predict_proba(model_input)
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)
완성된 model handler가 잘 수행되는지 테스트 해보자.
위에서 작성한 코드를 save하고 exit()
한 후 아래 코드를 작성.
(pytorch) ubuntu@ip-172-31-47-106:~/kdt-ai-aws$ python
Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:56:21)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from model import MLModelHandler # 전역변수로 모델을 불러온다.
>>> ml_handler = MLModelHandler()
>>> ml_handler
<model.MLModelHandler object at 0x7f31853a6d60>
>>> text = ['정말 재미있는 영화입니다.', '정말 재미가 없습니다.']
>>> text
['정말 재미있는 영화입니다.', '정말 재미가 없습니다.']
>>> result = ml_handler.handle(text)
>>> result
(['positive', 'negative'], array([0.98683823, 0.79660478]))
``
그 결과 첫번째 text는 긍정, 두번째 text는 부정으로 잘 예측했다.