TensorFlow 제공을 위한 저장된 모델의 SignatureDefs

목적

이 문서에서는 TensorFlow Serving의 API에 매핑되는 SavedModel의 SignatureDef 사용 의도에 대한 예를 제공합니다.

개요

SignatureDef는 TensorFlow 그래프에서 지원되는 계산의 서명을 정의합니다. SignatureDef는 함수의 입력과 출력을 식별하기 위한 일반적인 지원을 제공하는 것을 목표로 하며 SavedModel 을 구축할 때 지정할 수 있습니다.

배경

TF-ExporterSessionBundle은 개념적으로 유사한 서명을 사용했지만 사용자가 로드 시 올바르게 검색되도록 명명된 서명과 기본 서명을 구별해야 했습니다. 이전에 TF-Exporter/SessionBundle을 사용한 사용자의 경우 TF-Exporter의 Signatures SavedModel의 SignatureDefs 로 대체됩니다.

SignatureDef 구조

SignatureDef에는 다음 사양이 필요합니다.

  • TensorInfo에 대한 문자열 맵으로 inputs .
  • TensorInfo에 대한 문자열 맵으로 outputs .
  • method_name (로딩 도구/시스템에서 지원되는 메서드 이름에 해당)

TensorInfo 자체에는 이름, dtype 및 텐서 형태의 지정이 필요합니다. 텐서 정보가 이미 그래프에 존재하는 동안 도구가 그래프 정의를 읽지 않고도 서명 유효성 검사 등을 수행할 수 있으므로 SignatureDef의 일부로 TensorInfo를 명시적으로 정의하는 것이 유용합니다.

도구와 시스템 전반에서 쉽게 재사용하고 공유할 수 있도록 TensorFlow Serving에서 지원될 SignatureDef와 관련하여 일반적으로 사용되는 상수를 상수로 정의합니다. 구체적으로:

또한 SavedModel은 서명 정의를 구축하는 데 도움이 되는 유틸리티를 제공합니다.

샘플 구조

TensorFlow Serving은 추론 수행을 위한 높은 수준의 API를 제공합니다. 이러한 API를 활성화하려면 모델에 입력 및 출력에 사용할 정확한 TensorFlow 노드를 정의하는 하나 이상의 SignatureDef가 포함되어야 합니다. TensorFlow Serving이 각 API에 대해 지원하는 특정 SignatureDef의 예는 아래를 참조하세요.

TensorFlow Serving은 각 TensorInfo의 키(SignatureDef의 입력 및 출력에 있음)와 SignatureDef의 method_name에 따라 달라집니다. TensorInfo의 실제 내용은 그래프에 따라 다릅니다.

분류 SignatureDef

Classification SignatureDef는 TensorFlow Serving의 Classification API에 대한 구조화된 호출을 지원합니다. 이는 inputs Tensor가 있어야 하고 두 개의 선택적 출력 Tensor인 classesscores 있어야 하며 그 중 적어도 하나가 있어야 한다고 규정합니다.

signature_def: {
  key  : "my_classification_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "tf_example:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "classes"
      value: {
        name: "index_to_string:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "TopKV2:0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/classify"
  }
}

SignatureDef 예측

Predict SignatureDefs는 TensorFlow Serving의 Predict API에 대한 호출을 지원합니다. 이러한 서명을 사용하면 임의로 많은 입력 및 출력 Tensor를 유연하게 지원할 수 있습니다. 아래 예의 경우 my_prediction_signature 시그니처에는 그래프 x:0 의 실제 Tensor에 매핑되는 단일 논리 입력 Tensor images 있습니다.

SignatureDef 예측은 모델 간 이식성을 지원합니다. 즉, 다른 기본 Tensor 이름을 사용하여 다른 SavedModel을 교체할 수 있으며(예 x:0 대신 Tensor z:0 을 사용하는 새로운 대체 모델이 있을 수 있음) 클라이언트는 온라인 상태를 유지하면서 기존 및 새 모델을 지속적으로 쿼리할 수 있습니다. 클라이언트측 변경이 없는 이 모델의 버전입니다.

Predict SignatureDefs를 사용하면 명시적으로 쿼리할 수 있는 선택적 추가 Tensor를 출력에 추가할 수도 있습니다. 아래의 scores 출력 키 외에도 디버깅이나 다른 목적을 위해 풀링 레이어를 가져오고 싶다고 가정해 보겠습니다. 이 경우 pool 과 같은 키와 적절한 값을 사용하여 추가 Tensor를 추가하기만 하면 됩니다.

signature_def: {
  key  : "my_prediction_signature"
  value: {
    inputs: {
      key  : "images"
      value: {
        name: "x:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "y:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/predict"
  }
}

회귀 서명 정의

Regression SignatureDef는 TensorFlow Serving의 Regression API에 대한 구조화된 호출을 지원합니다. 이는 정확히 하나 inputs Tensor와 하나의 outputs Tensor가 있어야 함을 규정합니다.

signature_def: {
  key  : "my_regression_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "x_input_examples_tensor_0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "outputs"
      value: {
        name: "y_outputs_0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/regress"
  }
}