이 튜토리얼에서는 TensorFlow Serving 구성 요소를 사용하여 훈련된 TensorFlow 모델을 내보내고 표준 tensorflow_model_server를 사용하여 제공하는 방법을 보여줍니다. 이미 TensorFlow 서빙을 잘 알고 있으며, 더 많은 서버 내부가 어떻게 작동하는지에 대해 알고 싶은 경우, 참조 고급 튜토리얼 봉사 TensorFlow을 .
이 튜토리얼은 손으로 쓴 숫자를 분류하는 간단한 Softmax 회귀 모델을 사용합니다. 그것은에 소개 된 것과 매우 유사하다 패션 MNIST 데이터 세트를 사용하여 이미지 분류에 TensorFlow 튜토리얼 .
이 자습서의 코드는 두 부분으로 구성됩니다.
파이썬 파일, mnist_saved_model.py , 그 기차와 수출 모델.
어느 아파트하여 설치 또는 C ++ 파일 (로부터 컴파일 할 수있는 바이너리 ModelServer main.cc ). TensorFlow 봉사 ModelServer의 발견하여 새로운 모델을 수출하고 실행 gRPC의 를 제공하기위한 서비스입니다.
시작하기 전에 먼저 도커를 설치합니다 .
TensorFlow 모델 학습 및 내보내기
트레이닝 단계를 들어, TensorFlow 그래프는 TensorFlow 세션에서 시작된다 sess
로 입력 텐서 (화상)과, x
와 같은 출력 텐서 (소프트 맥스 점수) 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
메타 그래프를 저장할와 태그의 집합입니다. 우리는 서빙의 그래프를 사용하려는 이후 이러한 경우에, 우리는 사용할serve
미리 SavedModel 태그 상수로부터 태그. 자세한 내용은 참조 tag_constants.py 및 관련 TensorFlow API 문서를 .signature_def_map
지정 tensorflow에 서명을 사용자가 제공하는 키 맵 :: SignatureDef 메타 그래프에 추가한다. 서명은 내보낼 모델 유형과 추론을 실행할 때 바인딩할 입력/출력 텐서를 지정합니다.특수 서명 키
serving_default
지정은 기본 서명을 제공. 기본 제공 서명 def 키는 서명과 관련된 다른 상수와 함께 SavedModel 서명 상수의 일부로 정의됩니다. 자세한 내용은 참조 signature_constants.py 및 관련 TensorFlow API 문서를 .또한, 쉽게 헬프 서명 인증 된 정의에의 SavedModel API를 제공 서명 데프 유틸을 원본에 구체적으로 .. mnist_saved_model.py의 파일, 우리가 사용하는
signature_def_utils.build_signature_def()
빌드에predict_signature
및classification_signature
.방법에 대한 예를 들어
predict_signature
정의되면, 폴더의 유틸리티는 다음 인수를 사용합니다 :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도 제공 utils.py 으로, 관련 TensorFlow API 문서 .
또한, 참고 images
와 scores
텐서 별명이다. 그들은 당신이 원하는 독특한 어떤 문자열이 될 수 있으며, 그들은 텐서의 논리 이름이 될 것 x
와 y
나중에 예측 요청을 보낼 때 바인딩 텐서에 대한 참조하는 것이.
예를 들어, 만약 x
이름을 'long_tensor_name_foo'와 텐서를 참조하고 y
'generated_tensor_name_bar'이름을 가진 텐서을 의미 builder
( '점수와 - 진짜 이름에 매핑을 텐서 논리적 이름을 저장 (>'long_tensor_name_foo ''이미지 ')합니다 ' -> '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%의 추론 오류율을 얻습니다. 이것은 서버가 훈련된 모델을 성공적으로 로드하고 실행하는지 확인합니다!