DeepLearning/Service

Tensorflow 2.0을 활용한 딥러닝 모델 서빙하기

seokhyun2 2020. 1. 24. 16:11

Tensorflow 2.0에서는 케라스와 통합하고 eager execution (즉시실행)을 지원하게 되면서 훨씬 쉬워졌습니다.

딥러닝을 서비스에 실제로 적용하는 사례가 점점 많아짐에 따라, 서빙을 잘하는 방법에 대해서도 많은 시도를 하고 있습니다.

 

그래서 딥러닝 모델 서빙에 대하여 제일 쉬운 방법부터 시작해서 하나하나 소개해보려고 합니다.

 

오늘 소개드리는 방법은 텐서플로우에서 제공하는 텐서플로우 서빙과 도커를 활용하는 방법입니다.

 

서빙을 하려면 모델부터 있어야겠죠?

아래의 소스코드를 활용해서 간단한 모델을 한번 만들어보도록 하겠습니다.

"""
example of train mnist dataset with Tensorflow 2.0
"""

import tensorflow as tf


"""
load mnist dataset from tensorflow
"""
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# divide with 255 to make pixels between 0 and 1
x_train, x_test = x_train / 255.0, x_test / 255.0

"""
build model and set optimizer
"""
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

"""
train
"""
model.fit(x_train, y_train, epochs=5)

"""
evaluate
"""
model.evaluate(x_test, y_test, verbose=2)

"""
export saved model
"""
tf.saved_model.save(model, 'mnist/1')

텐서플로우를 활용하여 mnist 예제 데이터를 다운 받아서 활용했습니다.

서빙에 대한 설명이 목표이므로, 모델에 대한 설명은 생략하겠습니다.

텐서플로우 서빙을 이용하기 위해서는, saved model 형식으로 모델을 저장해주어야 합니다.

tf.saved_model.save() 함수를 활용하면 간단하게 저장할 수 있습니다.

주의해야할 점은 서빙의 경우엔 자동으로 디렉토리 내에서 최신 버전을 불러와서 서빙을 하도록 되어있어, 버전에 대한 디렉토리가 꼭 존재해야 하여 'mnist/1'과 같이 저장할 위치를 설정해주었습니다.

 

이제 모델을 만들어 주었으니, 서빙을 바로 해보도록 하겠습니다. 

도커를 활용할 것이므로, 도커를 먼저 설치해야 합니다. 아래의 링크에서 주어진대로 설치하면 쉽게 설치할 수 있습니다.

https://docs.docker.com/install/

 

Docker Engine overview

Docker Engine is an open source containerization technology for building and containerizing your applications. Docker Engine acts as a client-server application with: A server with a long-running daemon process dockerd....

docs.docker.com

 

설치가 끝났으면 아래의 명령어를 실행만 해주면, 도커로 서빙이 끝이 납니다.

docker run -p 8501:8501 --mount type=bind,source=$PWD/mnist,target=/models/mnist -e MODEL_NAME=mnist -td tensorflow/serving:2.1.0-rc1

-p 는 서빙에 활용할 포트를 지정하는 것입니다.

컨테이너 내부에 /models 라는 디렉토리에 우리가 서빙할 모델이 위치하도록 해주면 되며, --mount 옵션을 활용합니다.

텐서플로우 서빙에 필요한 모델 명을 지정해주고, 어떤 도커 이미지를 활용하여 서빙할지 정해주면 끝입니다.

 

그러면 이제, 서빙한 모델에 파이썬3 코드를 활용하여 인퍼런스를 요청해보겠습니다.

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

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

address = 'http://localhost:8501/v1/models/mnist:predict'
data = json.dumps({'instances':pixels.tolist()})

result = requests.post(address, data=data)
predictions = json.loads(str(result.content, 'utf-8'))['predictions']

for prediction in predictions:
  print(np.argmax(prediction))

test_image.jpg 라는 이미지 파일을 읽어서 requests 라이브러리를 활용하여 쉽게 post 요청을 하면 됩니다.

전달할 데이터는 list 형식이여야 하며, 모델의 인풋과 모양이 같아야 합니다. 여기서는 28*28이겠죠?

 

오늘은 tensorflow 2.0을 활용할 때 모델을 서빙하는 가장 간단한 방법에 대해서 알아보았습니다.

모델을  saved model 형식으로만 저장하고, 도커 설치 후에 명령어 한줄만 실행해주면 바로 모델 서빙이 시작됩니다.

간단하게 한번 모두 실행해보시길 바랍니다~

 

소스코드는 아래 깃헙에 업로드되어있습니다.

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

 

hsh2438/mnist_serving_tf2.0

mnist serving example using Tensorflow 2.0. Contribute to hsh2438/mnist_serving_tf2.0 development by creating an account on GitHub.

github.com