이 튜토리얼에서는 TensorFlow Serving 구성요소를 사용하여 훈련된 TensorFlow 모델을 내보내고 표준 tensorflow_model_server를 사용하여 이를 제공하는 방법을 보여줍니다. TensorFlow Serving에 이미 익숙하고 서버 내부 작동 방식에 대해 자세히 알고 싶다면 TensorFlow Serving 고급 튜토리얼을 참조하세요.
이 튜토리얼에서는 손으로 쓴 숫자를 분류하는 간단한 Softmax 회귀 모델을 사용합니다. 이는 Fashion MNIST 데이터 세트를 사용한 이미지 분류에 대한 TensorFlow 튜토리얼 에서 소개된 것과 매우 유사합니다.
이 튜토리얼의 코드는 두 부분으로 구성됩니다.
모델을 학습하고 내보내는 Python 파일 mnist_saved_model.py .
Apt를 사용하여 설치하거나 C++ 파일( main.cc )에서 컴파일할 수 있는 ModelServer 바이너리입니다. TensorFlow Serving ModelServer는 새로 내보낸 모델을 검색하고 이를 제공하기 위해 gRPC 서비스를 실행합니다.
시작하기 전에 먼저 Docker를 설치하세요 .
TensorFlow 모델 학습 및 내보내기
훈련 단계의 경우 TensorFlow 그래프는 TensorFlow 세션 sess
에서 시작되며, 입력 텐서(이미지)는 x
이고 출력 텐서(Softmax 점수)는 y
입니다.
그런 다음 TensorFlow의 SavedModelBuilder 모듈을 사용하여 모델을 내보냅니다. SavedModelBuilder
학습된 모델의 "스냅샷"을 안정적인 스토리지에 저장하므로 나중에 추론을 위해 로드할 수 있습니다.
SavedModel 형식에 대한 자세한 내용은 SavedModel README.md 문서를 참조하세요.
mnist_saved_model.py 에서 다음은 모델을 디스크에 저장하는 일반적인 프로세스를 설명하는 짧은 코드 조각입니다.
export_path_base = sys.argv[-1]
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images':
prediction_signature,
tf.compat.v1.saved_model.signature_constants
.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
classification_signature,
},
main_op=tf.compat.v1.tables_initializer(),
strip_default_attrs=True)
builder.save()
SavedModelBuilder.__init__
다음 인수를 사용합니다.
-
export_path
내보내기 디렉터리의 경로입니다.
SavedModelBuilder
디렉토리가 존재하지 않는 경우 디렉토리를 생성합니다. 이 예에서는 명령줄 인수와 FLAGS.model_version
연결하여 내보내기 디렉터리를 얻습니다. FLAGS.model_version
모델 버전 을 지정합니다. 동일한 모델의 최신 버전을 내보낼 때는 더 큰 정수 값을 지정해야 합니다. 각 버전은 지정된 경로 아래의 다른 하위 디렉터리로 내보내집니다.
다음 인수와 함께 SavedModelBuilder.add_meta_graph_and_variables()
사용하여 빌더에 메타 그래프와 변수를 추가할 수 있습니다.
sess
내보내려는 훈련된 모델을 보유하는 TensorFlow 세션입니다.tags
메타 그래프를 저장할 태그 세트입니다. 이 경우 서빙에 그래프를 사용하려고 하므로 사전 정의된 SavedModel 태그 상수의serve
태그를 사용합니다. 자세한 내용은 tag_constants.py 및 관련 TensorFlow API 문서를 참조하세요.signature_def_map
서명 에 대한 사용자 제공 키의 맵을 tensorflow::SignatureDef에 지정하여 메타 그래프에 추가합니다. 서명은 내보내는 모델 유형과 추론을 실행할 때 바인딩할 입력/출력 텐서를 지정합니다.특수 서명 키
serving_default
기본 제공 서명을 지정합니다. 기본 제공 서명 def 키는 서명과 관련된 다른 상수와 함께 SavedModel 서명 상수의 일부로 정의됩니다. 자세한 내용은 sign_constants.py 및 관련 TensorFlow API 문서를 참조하세요.또한 서명 def를 쉽게 구축할 수 있도록 SavedModel API는 서명 def utils ..를 제공합니다. 특히 원본 mnist_saved_model.py 파일에서는
signature_def_utils.build_signature_def()
사용하여predict_signature
및classification_signature
구축합니다.predict_signature
정의 방법에 대한 예로 util은 다음 인수를 사용합니다.inputs={'images': tensor_info_x}
입력 텐서 정보를 지정합니다.outputs={'scores': tensor_info_y}
점수 텐서 정보를 지정합니다.method_name
추론에 사용되는 방법입니다. 예측 요청의 경우tensorflow/serving/predict
로 설정되어야 합니다. 다른 메소드 이름은 Signature_constants.py 및 관련 TensorFlow API 문서를 참조하세요.
tensor_info_x
와 tensor_info_y
여기에 정의된 tensorflow::TensorInfo
프로토콜 버퍼의 구조를 가지고 있습니다. 텐서 정보를 쉽게 구축하기 위해 TensorFlow SavedModel API는 관련 TensorFlow API 문서 와 함께 utils.py 도 제공합니다.
또한 images
와 scores
텐서 별칭 이름입니다. 원하는 고유 문자열이면 무엇이든 될 수 있으며 나중에 예측 요청을 보낼 때 텐서 바인딩을 위해 참조하는 텐서 x
및 y
의 논리적 이름이 됩니다.
예를 들어, x
'long_tensor_name_foo'라는 이름의 텐서를 참조하고 y
'generated_tensor_name_bar'라는 이름의 텐서를 참조하는 경우 builder
텐서 논리 이름을 실제 이름 매핑('images' -> 'long_tensor_name_foo') 및 ('scores)에 저장합니다. ' -> 'generated_tensor_name_bar'). 이를 통해 사용자는 추론을 실행할 때 논리적 이름으로 이러한 텐서를 참조할 수 있습니다.
실행해 봅시다!
먼저, 아직 복제하지 않았다면 이 저장소를 로컬 머신에 복제하세요.
git clone https://github.com/tensorflow/serving.git
cd serving
내보내기 디렉터리가 이미 있으면 지우십시오.
rm -rf /tmp/mnist
이제 모델을 훈련시켜 보겠습니다.
tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
/tmp/mnist
결과는 다음과 같습니다.
Training model...
...
Done training!
Exporting trained model to models/mnist
Done exporting!
이제 내보내기 디렉터리를 살펴보겠습니다.
$ ls /tmp/mnist
1
위에서 언급한 대로 모델의 각 버전을 내보내기 위한 하위 디렉터리가 생성됩니다. FLAGS.model_version
의 기본값은 1이므로 해당 하위 디렉터리 1
이 생성됩니다.
$ ls /tmp/mnist/1
saved_model.pb variables
각 버전 하위 디렉터리에는 다음 파일이 포함되어 있습니다.
saved_model.pb
직렬화된 tensorflow::SavedModel입니다. 여기에는 모델에 대한 하나 이상의 그래프 정의와 서명과 같은 모델의 메타데이터가 포함됩니다.variables
그래프의 직렬화된 변수를 보유하는 파일입니다.
그러면 TensorFlow 모델이 내보내지고 로드될 준비가 되었습니다!
표준 TensorFlow ModelServer를 사용하여 내보낸 모델 로드
Docker 제공 이미지를 사용하여 제공할 모델을 쉽게 로드합니다.
docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &
서버 테스트
제공된 mnist_client 유틸리티를 사용하여 서버를 테스트할 수 있습니다. 클라이언트는 MNIST 테스트 데이터를 다운로드하여 서버에 요청으로 보내고 추론 오류율을 계산합니다.
tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
--num_tests=1000 --server=127.0.0.1:8500
다음과 같이 출력되어야 합니다.
...
Inference error rate: 11.13%
훈련된 Softmax 모델의 정확도는 약 90%로 예상되며 처음 1000개의 테스트 이미지에 대해 11%의 추론 오류율을 얻습니다. 이는 서버가 훈련된 모델을 성공적으로 로드하고 실행한다는 것을 확인시켜줍니다!