머신러닝

본문 바로가기
사이트 내 전체검색


머신러닝
머신러닝

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

페이지 정보

작성자 관리자 댓글 0건 조회 2,532회 작성일 20-08-07 12:05

본문

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

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

딥러닝을 서비스에 실제로 적용하는 사례가 점점 많아짐에 따라, 딥러닝 모델 서빙에 대하여 소개해보려고 합니다.


텐서플로우에서 제공하는 텐서플로우 서빙과 도커를 활용하는 방법이 있습니다.


서빙을 하려면 모델이 있어야 합니다.

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


# vi train.py

import tensorflow as tf


# mnist dataset 로딩

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()


# 255로 나누어 0~1의 값으로 변환

x_train, x_test = x_train / 255.0, x_test / 255.0


# 모델을 생성

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'])


# 학습

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


# 평가

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


# 모델 저장

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


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


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


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


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


# python3 train.py

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

도커를 활용할 것이므로, 도커를 먼저 설치해야 합니다. 


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

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 코드를 활용하여 인퍼런스를 요청해보겠습니다.

# pip3 install Pillow


# vi client_test.py
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

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입니다.

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

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.