[인공지능] TensorFlow Serving - Docker Container 실행 하기, REST API
- 인공지능
- 2022. 3. 15. 17:56
참조
소개
- Docker를 이용하여 TensorFlow Serving 실행하는 방법을 정리합니다.
Docker를 이용한 TensorFlow Serving 실행
- 모델을 SavedModel 포맷으로 저장한 이후에 이를 TensorFlow Serving에서 로드해서 API 서버로 만들 수 있습니다.
- 보통 TensorFlow Serving은 Docker를 이용해서 실행합니다.
- Docker를 이용해서 TensorFlow Serving을 실행하는 방법은 다음과 같습니다.
TensorFlow Serving 이미지 다운로드
- 먼저 docker hub에서 TensorFlow Serving 이미지를 다운로드 받습니다.
docker pull tensorflow/serving
TensorFlow Serving 컨테이너 실행
- 앞서 docker hub에서 TensorFlow Serving 이미지를 다운로드 받았습니다.
- 다음으로 TensorFlow Serving 컨테이너를 실행합니다.
docker run -t --rm -p 8500:8500 -p 8501:8501 \
-v "C:/src/test_data/save_model/tensorflow/Xception:/models/model" \
tensorflow/serving \
--model_name=mnist-model
- 각각의 명령어 인자값에 대한 설명은 다음과 같습니다.
- -p : 서버에서 데이터를 주고 받는데 사용할 포트를 지정합니다. (위 예시의 경우, 8501 포트)
- -v : 불러올 모델이 SavedModel 포맷으로 저장된 전체 경로(full path)를 의미합니다. (위 예시의 경우, C:/src/test_data/save_model/tensorflow/Xception 경로에서 모델 파일을 불러 옵니다.), :뒤에는 모델을 실행할 REST API URL을 의미합니다. (위 예시의 경우, models/mnist_model)
TensorFlow Serving 서버 실행 화면
- TensroFlow Serving 서버가 정상적으로 실행 되었다면, 다음과 같이 8501 포트로 REST API 서버가 구성되었다는 로그를 확인할 수 있습니다.
2022-03-14 02:13:03.418553: I tensorflow_serving/model_servers/server.cc:89] Building single TensorFlow model file config: model_name: mnist-model model_base_path: /models/model
2022-03-14 02:13:03.418740: I tensorflow_serving/model_servers/server_core.cc:465] Adding/updating models.
2022-03-14 02:13:03.418771: I tensorflow_serving/model_servers/server_core.cc:591] (Re-)adding model: mnist-model
2022-03-14 02:13:03.575600: I tensorflow_serving/core/basic_manager.cc:740] Successfully reserved resources to load servable {name: mnist-model version: 1}
2022-03-14 02:13:03.575652: I tensorflow_serving/core/loader_harness.cc:66] Approving load for servable version {name: mnist-model version: 1}
2022-03-14 02:13:03.575665: I tensorflow_serving/core/loader_harness.cc:74] Loading servable version {name: mnist-model version: 1}
2022-03-14 02:13:03.578387: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:38] Reading SavedModel from: /models/model/1
2022-03-14 02:13:03.630984: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:90] Reading meta graph with tags { serve }
2022-03-14 02:13:03.631036: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:132] Reading SavedModel debug info (if present) from: /models/model/1
2022-03-14 02:13:03.632147: I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-03-14 02:13:03.764954: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-03-14 02:13:03.784500: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 3600010000 Hz
2022-03-14 02:13:07.343446: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/model/1
2022-03-14 02:13:07.445745: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 3867359 microseconds.
2022-03-14 02:13:07.456866: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/model/1/assets.extra/tf_serving_warmup_requests
2022-03-14 02:13:07.525380: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: mnist-model version: 1}
2022-03-14 02:13:07.528142: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-03-14 02:13:07.528241: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-03-14 02:13:07.528698: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...
2022-03-14 02:13:07.532548: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501
POST Request를 통한 이미지 데이터 전송 및 예측 결과 검증
- 앞서 Docker를 이용하여 TensroFlow Serving 컨테이너를 정상적으로 실행 완료 하였습니다.
- 이제 TensorFlow Serving을 실행할 때 지정한 아래 URL(models/model)로 Input Data를 전송한 후, 해당 Input Data에 대한 예측 결과값을 반환받을 수 있습니다.
import tensorflow as tf
import os
import matplotlib.pyplot as plt
import requests
import json
import numpy as np
from PIL import Image
mnist = tf.keras.datasets.mnist
def change_rgb(train):
temp = []
for x in train:
x = x.reshape(28,28)
image = Image.fromarray(x.astype('uint8'), 'L') #greyscale image
image = image.convert('RGB')
#image = Image.fromarray(x.astype('uint8'), 'RGB') #color monochrome image
image = np.array(image) #convert image to numpy array
temp.append(image)
return np.array(temp)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_test = x_test[:5]
x_test = x_test.astype('float32')
x_test = x_test.reshape(-1, 28, 28, 1)
x_test = change_rgb(x_test)
# image resize
x_test = tf.image.resize(x_test, [299,299])
x_test = x_test / 255
test_images = x_test[0:5].numpy()
data = json.dumps({"signature_name": "serving_default", "instances": test_images.tolist()})
print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))
import requests
headers = {"content-type": "application/json"}
json_response = requests.post('http://localhost:8501/v1/models/mnist-model:predict', data=data, headers=headers)
pred = json.loads(json_response.text)['predictions']
for i in range(5):
print('실제 값 : {} / 예측 값 : {}'.format(y_test[i], np.argmax(pred[i])))
실행 결과
- 정상적으로 TensorFlow Serving 과 REST API로 통신하여 Inference 된 것을 확인할 수 있습니다.
실제 값 : 7 / 예측 값 : 7
실제 값 : 2 / 예측 값 : 2
실제 값 : 1 / 예측 값 : 1
실제 값 : 0 / 예측 값 : 0
실제 값 : 4 / 예측 값 : 4
728x90
'인공지능' 카테고리의 다른 글
[인공지능] gRPC 메타데이터 input, ouput 정보 가져오기 (0) | 2022.03.16 |
---|---|
[인공지능] TensorFlow Serving - Docker Container 실행 하기, gRPC (0) | 2022.03.15 |
[인공지능] 텐서플로우 서빙이란?(TensorFlow Serving) (0) | 2022.03.14 |
[인공지능] TensorFlow Could not load library cudnn_cnn_infer64_8.dll. Error code 126 에러 해결 (7) | 2022.02.23 |
[인공지능] 케라스 학습 기술 - 배치 정규화 (0) | 2022.02.17 |
이 글을 공유하기