[Docker] Tensorflow serving

도룩·2023년 11월 21일
0
post-thumbnail

목적

Docker의 Tensorflow serving을 이용해 Tensorflow 모델을 배포할 수 있다.

Code

tensorflow 모델을 training 후 save 까지 했다고 가정.

  • 주의점
    1. 저장할 때 HDF5 (.h5) 형식 말고 SavedModel 형식으로 저장해야 한다.
    2. version이 명시되어 있어야 한다. - v1, version1 형태가 아닌 숫자로. (아래 그림에서는 1이 버전이다.)
    3. 만약 여러 개의 버전이 있으면 가장 높은 버전의 모델이 자동으로 배포된다.

1. Docker pull image

$ docker pull tensorflow/serving

2. Docker run

$ docker run -p 8501:8501 --name EfficientNetB0 -v C:\Users\Code\checkpoint\EfficientNetB0:/models/EfficientNetB0 -e MODEL_NAME=EfficientNetB0 -t tensorflow/serving
  • -p: REST endpoint port를 지정.
  • --name: 실행할 컨테이너의 이름을 지정.
  • -v: 폴더에 있는 모델을 컨테이너의 /models/EfficientNetB0 경로에 연결한다.
  • -e MODEL_NAME: 모델 이름. 컨테이너의 /models 경로에서 여기에 입력한 모델의 이름을 찾아서 최신 버전을 배포.
  • -t: 실행할 도커 이미지 이름

정상적으로 실행되었다면 Docker-desktop에서 아래와 같이 container가 실행되고 있는 것을 볼 수 있다.

3. Post

정상적으로 predict 할 수 있는지 확인해보자.

from PIL import Image
import numpy as np
import requests
import json
import matplotlib.pyplot as plt

def preprocess_image_for_post(img_path:str, resize_shape:tuple = (256, 128)):
	# Preprocess: (?, ?, 3) -> (1, 128, 256, 3)
    img = Image.open(img_path)
    img = img.resize(resize_shape)
    img = np.expand_dims(img, axis = 0)
    assert img.shape == (1, resize_shape[1], resize_shape[0], 3)
	
    # numpy -> json
    json_data = {"instances" : img.tolist()}
    data = json.dumps(json_data)

    return data

def predict(model_name, model_version, img_path, resize_shape):
    model_url = f"http://localhost:8501/v{model_version}/models/{model_name}:predict"
    data = preprocess_image_for_post(img_path, resize_shape)
    
    #Post
    res = requests.post(model_url, data = data)
    response = json.loads(res.content)

    return response
MODEL_NAME = "EfficientNetB0"
MODEL_VERSION = 1
IMG_PATH = "./test.jpg"
RESIZE_SHAPE = (256, 128) # (W, H)

predict(model_name = MODEL_NAME, model_version = MODEL_VERSION, img_path = IMG_PATH, resize_shape = RESIZE_SHAPE)
## OutPut: {'predictions': [[0.291641146, 0.708358884]]}

0개의 댓글

관련 채용 정보