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)
(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>
모델 실행 (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)
반응형