TensorFlow 모델 제공

이 튜토리얼에서는 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_signatureclassification_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_xtensor_info_y 유무의 구조 tensorflow::TensorInfo 프로토콜이 정의 된 버퍼 여기 . 쉽게 텐서 정보를 정기적으로 구축하기 위해, TensorFlow SavedModel의 API도 제공 utils.py 으로, 관련 TensorFlow API 문서 .

또한, 참고 imagesscores 텐서 별명이다. 그들은 당신이 원하는 독특한 어떤 문자열이 될 수 있으며, 그들은 텐서의 논리 이름이 될 것 xy 나중에 예측 요청을 보낼 때 바인딩 텐서에 대한 참조하는 것이.

예를 들어, 만약 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%의 추론 오류율을 얻습니다. 이것은 서버가 훈련된 모델을 성공적으로 로드하고 실행하는지 확인합니다!