TensorFlow 모델 제공

이 튜토리얼에서는 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_signatureclassification_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_xtensor_info_y 여기에 정의된 tensorflow::TensorInfo 프로토콜 버퍼의 구조를 가지고 있습니다. 텐서 정보를 쉽게 구축하기 위해 TensorFlow SavedModel API는 관련 TensorFlow API 문서 와 함께 utils.py 도 제공합니다.

또한 imagesscores 텐서 별칭 이름입니다. 원하는 고유 문자열이면 무엇이든 될 수 있으며 나중에 예측 요청을 보낼 때 텐서 바인딩을 위해 참조하는 텐서 xy 의 논리적 이름이 됩니다.

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