$ vi train.py
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
file = tf.keras.utils.get_file(
"grace_hopper.jpg",
"https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg")
img = tf.keras.preprocessing.image.load_img(file, target_size=[224, 224])
x = tf.keras.preprocessing.image.img_to_array(img)
x = tf.keras.applications.mobilenet.preprocess_input(
x[tf.newaxis,...])
#tf.keras.applications.vgg19.decode_predictions
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
print(labels_path)
pretrained_model = tf.keras.applications.MobileNet()
result_before_save = pretrained_model(x)
print()
decoded = imagenet_labels[np.argsort(result_before_save)[0,::-1][:5]+1]
print("저장 전 결과:\n", decoded)
tf.saved_model.save(pretrained_model, "./mobilenet/1/")
loaded = tf.saved_model.load("./mobilenet/1/")
print(list(loaded.signatures.keys())) # ["serving_default"]
infer = loaded.signatures["serving_default"]
print(infer.structured_outputs)
labeling = infer(tf.constant(x))[pretrained_model.output_names[0]]
decoded = imagenet_labels[np.argsort(labeling)[0,::-1][:5]+1]
print("저장과 불러오기 이후의 결과:\n", decoded)
$ python3 train.py
저장 전 결과:
['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']
저장과 불러오기 이후의 결과:
['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']
SavedModel은 파이썬에서 사용하기에 적합하지만, 일반적으로 프로덕션 환경에서는 추론을 위한 전용 서비스를 사용합니다.
이는 텐서플로 서빙을 사용한 SavedModel로 쉽게 구성할 수 있습니다.
tensorflow_model_server를 노트북이나 로컬 머신에 설치하는 방법을 포함한 텐서플로 서빙에 대한 자세한 내용은 TensorFlow Serving REST 튜토리얼을 참조하십시오.
mobilenet 모델을 배포하기 위해 모델 경로를 SavedModel 디렉토리로 설정합니다:
[root@www hopper]# ls
mobilenet train.py
[root@www hopper]# nohup tensorflow_model_server \
--rest_api_port=8501 \
--model_name=mobilenet \
--model_base_path="./mobilenet" >server.log 2>&1
[root@www hopper]#
이제 요청을 보냅니다.
$ vi test.py
# -*- coding: utf-8 -*-
import json
import numpy
import requests
import tensorflow as tf
file = tf.keras.utils.get_file(
"grace_hopper.jpg",
img = tf.keras.preprocessing.image.load_img(file, target_size=[224, 224])
x = tf.keras.preprocessing.image.img_to_array(img)
x = tf.keras.applications.mobilenet.preprocess_input(
x[tf.newaxis,...])
data = json.dumps({"signature_name": "serving_default",
"instances": x.tolist()})
headers = {"content-type": "application/json"}
data=data, headers=headers)
predictions = numpy.array(json.loads(json_response.text)["predictions"])
$ python3 test.poy
predictions의 결과는 파이썬에서와 같습니다.
SavedModel 포맷
SavedModel은 변수값과 상수를 포함하고 직렬화된 시그니처와 이를 실행하는 데 필요한 상태를 담은 디렉토리입니다.
[root@www hopper]# ls ./mobilenet/1/
assets saved_model.pb variables
[root@www hopper]#
saved_model.pb 파일은 각각 하나의 함수로 된 이름있는 시그니처 세트를 포함합니다.
variables 디렉토리에는 일반적인 훈련 체크포인트 파일이 있습니다
[root@www hopper]# ls ./mobilenet/1/variables/
variables.data-00000-of-00001 variables.index
[root@www hopper]#
assets 디렉토리에는 텐서플로 그래프(TensorFlow graph)에서 사용되는 파일들, 예를 들어 상수 테이블을 초기화하는 데 사용되는 텍스트 파일들이 있습니다. 이번 예제에서는 사용되지 않습니다.
SavedModel은 텐서플로 그래프에서 사용되지 않는 파일을 위해 assets.extra 디렉토리를 가질 수 있는데, 예를 들면 사용자가 SavedModel과 함께 사용할 파일입니다.
텐서플로 자체는 이 디렉토리를 사용하지 않습니다.