PYTHON으로 딥러닝하기

Tensorflow serving(Rest API) with Docker

euni_joa 2020. 12. 8. 18:45
반응형

Tensorflow serving 하기

TensorFlow Serving을 사용하면 동일한 서버 아키텍처와 API를 유지하면서 새로운 알고리즘과 실험을 쉽게 배포 할 수 있습니다. TensorFlow Serving은 TensorFlow 모델과의 즉각적인 통합을 제공하지만 다른 유형의 모델 및 데이터를 제공하도록 쉽게 확장 할 수 있습니다.(출처: tensorflow.org)

 

참조

Train and serve a TensorFlow model with TensorFlow Serving | TFX

TensorFlow Serving with Docker | TFX

모델 저장

# >> 추후 모델 업데이트를 위해 version별로 모델 저장함
## tensorflow version 2.3.1
model_path='models'
model_name='my_model'
model.save(f'{model_path}/{model_name}/1')

저장된 모델 확인

## model format check
for root, dirs, files in os.walk(os.path.join(model_path, model_name)):
    indent = '    ' * root.count(os.sep)
    print('{}{}/'.format(indent, os.path.basename(root)))
    for filename in files:
        print('{}{}'.format(indent + '    ', filename))

## output format ex)
# 1/
#             .DS_Store
#             saved_model.pb
#             variables/
#                 variables.data-00000-of-00001
#                 variables.index
#             assets/
## ex
$ export model_path='models'
$ export model_name='my_model'

## model input, output shape check
$ saved_model_cli show --dir ${model_path}/${model_name}/1 --tag_set serve \
                       --signature_def serving_default

Serving with Docker

TensorFlow Serving을 시작하는 가장 쉬운 방법 중 하나는 Docker를 사용하는 것 입니다. (출처: tensorflow.org)

Docker 설치하기

(on MacOS)

큐베플로우 설치 on MacOS

(others)

https://www.tensorflow.org/tfx/serving/docker#install_docker

## !!도커 설치가 선행되어야함!! ##

## tensorflow에서 제공하는 이미지 가장 최신버전으로 다운로드(현재 기준 2.3.0)
$ docker pull tensorflow/serving
# image 생성 체크
$ docker image ls
# image 삭제
$ docker image rm <IMAGE ID>
# ex
$ export container_name='serving_base'

## tensorflow/serving container 띄우기
$ docker run -d --name ${container_name} -it --rm \
        -p 8500:8500 \
        -p 8501:8501 \
        -v "$(pwd)/${model_path}/${model_name}:/${model_path}/${model_name}" \
        -e MODEL_NAME=${model_name} \
                tensorflow/serving &

# container 생성 체크
$ docker container ls

# container 삭제
# issue: Bind for x.x.x.x:port# failed: port is already allocated.
$ docker rm -f <NAMES>

docker container ls

모델 실행 (REST API)

rest api port: 8501

import json
import numpy
import requests
data = json.dumps({"signature_name": "serving_default",
                   "instances": x.numpy().tolist()})  # json dumps를 위해 list로 변경 (shape 확인 필수)
headers = {"content-type": "application/json"}
json_response = requests.post(f'http://localhost:8501/v1/{model_path}/{model_name}:predict',
                              data=data, headers=headers)
predictions = numpy.array(json.loads(json_response.text)["predictions"])
print(predictions)
반응형