DeepLearning/Service

Tensorflow 2.0과 flask를 활용한 딥러닝 모델 서빙하기

seokhyun2 2020. 1. 28. 22:41

이전 포스팅에선 Tensorflow에서 제공하는 tensorflow-serving 모듈을 활용하여 딥러닝 모델을 서빙해보았습니다.

오늘은 flask를 활용하여 서빙을 해보도록 하겠습니다.

 

지난 포스팅이 궁금하시면 아래를 참조하시기 바랍니다.

https://seokhyun2.tistory.com/39

 

그 전에, 어떤 차이 점이 있는지 알고 넘어가면 좋겠죠?

tensorflow-serving 모듈을 활용할 경우에는 전처리가 불가능하다는 것이 제일 큰 문제점입니다.

mnist 데이터를 학습할 때, 불러온 픽셀 데이터를 0~1사이의 값으로 변환하기 위하여 255로 나눠서 학습하죠.

그래서 서버에 요청하기 전에 255를 나눠주어야만 합니다.

특히, 자연어 처리의 경우에는 텍스트 문장이 들어오면 해당 문장을 형태소 분석 그리고 각 형태소를 id로 변환해주는 것과 같은 여러가지 전처리 과정이 필요합니다.

flask를 활용하여 서빙을 처리할 경우, 이러한 과정을 서버에서 처리하여 인퍼런스하고 반환할 수 있습니다.

 

모델 학습은 지난 포스팅에서와 동일한 모델을 활용할 것이니 생략하도록 하겠습니다.

 

그러면 바로 flask 서버 소스코드로 넘어가보도록 하겠습니다.

# flask_server.py


import numpy as np
import tensorflow as tf
from flask import Flask, request


load = tf.saved_model.load('mnist/1')
load_inference = load.signatures["serving_default"]


app = Flask(__name__)
@app.route('/inference', methods=['POST'])
def inference():
    data = request.json
    result = load_inference(tf.constant(data['images'], dtype=tf.float32)/255.0)
    return str(np.argmax(result['dense_1'].numpy()))


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=2431, threaded=False)

flask를 활용하여 서빙을 할 경우 위와 같이 구현할 수 있습니다.

위의 소스코드를 실행하기 위해서는 python3 flask_server.py와 같이 실행하시면 됩니다.

 

위와 같이 서빙을 하실 때, saved_model 포맷이 아닌 체크포인트 포맷을 활용하셔도 무관합니다.

flask를 활용한 서빙의 경우에는 Tensorflow가 아닌 pytorch와 같은 라이브러리에도 쉽게 적용할 수 있습니다.

 

그러면 이제 서버에 요청을 보내봐야겠죠?

#flask_test.py


import json
import requests
import numpy as np
from PIL import Image


image = Image.open('test_image.jpg')
pixels = np.array(image)

headers = {'Content-Type':'application/json'}
address = "http://127.0.0.1:2431/inference"
data = {'images':pixels.tolist()}

result = requests.post(address, data=json.dumps(data), headers=headers)

print(str(result.content, encoding='utf-8'))

python3 flask_test.py 로 실행하시면 바로 테스트 되는 것을 확인할 수 있습니다.

 

소스코드를 보시면 눈치 빠르신 분들은 지난 포스팅과의 차이점을 하나 발견하실 수 있으실 거에요.

지난 포스팅에서는 픽셀을 읽어와서 바로 255로 나눠주고 인퍼런스를 요청하였지만 이번에는 그러지 않고 요청하였고 서버에서 255를 나눠주도록 구현되어 있다는 사실!

 

오늘은 flask와 Tensorflow를 활용한 딥러닝 모델을 서빙하는 방법에 대해서 알아보았습니다.

 

전체 소스코드는 아래 깃헙에 모두 올려두었습니다.

https://github.com/hsh2438/mnist_serving_tf2.0_flask.git

 

hsh2438/mnist_serving_tf2.0_flask

mnist serving example using Tensorflow 2.0 and flask - hsh2438/mnist_serving_tf2.0_flask

github.com

 

궁금하신 부분 있으시면 언제든지 댓글 환영입니다!