0%

Docker로 모델 서빙서버 생성하기

Docker로 훈련된 모델을 서빙하는 방법에 대해서 정리합니다.


모델 서빙서버 생성하기

1. S3 버킷에서 모델 파일 다운 받기
AWS에 접속한 상태에서 아래의 코드를 입력하면 로컬에 다운받을 수 있다.

1
aws s3 cp s3://'버킷 이름'/'파일 이름' '다운받을 로컬 디렉토리 경로'

2. tar 묶음 해제하기
모델을 다운받은 디렉토리로 이동하여 아래의 코드를 입력하면 간단하게 해제할 수 있다.

1
tar xvf '파일 이름.tar'

3.도커에서 사용할 이미지 다운받기
서빙서버를 생성하기 위해서는 아래의 이미지를 다운받아야 한다.

1
docker pull tensorflow/serving

위 이미지는 텐서플로우측에서 서빙을 위해 제공하는 이미지이다. 이 이미지를 사용하면 간단하게 서빙서버를 만들 수 있다.

4. 도커에 서빙서버 생성하기
커맨드라인에서 아래의 코드를 입력하여 다운받은 모델을 서빙할 서버를 생성한다.

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

이제 모델 서빙서버가 만들어졌다. 아래의 코드를 입력하면 현재 서빙서버가 작동되고 있음을 확인할 수 있다.

1
docker ps # 현재 실행중인 컨테이너만 보여준다.

예제로 모델 서빙서버 테스트하기

이제 서빙서버에 있는 모델이 잘 작동하는지 확인해보자. 커맨드라인에서 Python을 실행한 후 아래의 라이브러리들을 다운로드한다.

1
2
3
4
import json
import requests
import numpy as np
from tensorflow.keras import datasets, layers, models

위 모델은 MNIST 데이터를 학습하였다. 따라서 테스트는 텐서플로우 측에서 제공하는 MNIST 데이터셋으로 진행할 것이다. 아래의 코들르 입력하여 MNIST 데이터들을 가져오자.

1
2
3
4
5
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images / 255.0
test_images.shape
(10000, 28, 28, 1)

테스트셋은 10000개나 들어있다. 따라서 시각적으로 확인해보기 위해 앞의 2개의 이미지만 분리하여 예측해볼 것이다. 아래의 코드를 입력하여 이미지 2개를 분리하자.

1
2
temp = test_images[0:2,:,:,:]
answer = test_labels[0:2]

이제 이미지 2개인 temp를 서빙서버에 보내고 예측값을 받아오자.

1
2
3
4
address = 'http://localhost:8501/v1/models/mnist:predict'
data = json.dumps({'instances':temp.tolist()})
result = requests.post(address, data=data)
predictions = json.loads(str(result.content, 'utf-8'))['predictions']

우리가 보낸 이미지의 예측값이 predictions에 저장되었다. 아래의 코드를 입력하면 값들을 확인할 수 있다.

1
2
3
4
np.argmax(predictions[0])
7
np.argmax(predictions[1])
2

모델은 첫 번째 이미지를 7이라고 예측했고, 두 번째 이미지를 2라고 예측하였다. 아까 미리 저장해두었던 정답을 확인해보자.

1
2
answer
array([7, 2], dtype=uint8)

모델의 예측이 정확히 맞았다.