SignatureDefs w SavedModel do obsługi TensorFlow

Cel

Ten dokument zawiera przykłady zamierzonego użycia SignatureDefs w SavedModel, które są mapowane na interfejsy API TensorFlow Serving.

Przegląd

SignatureDef definiuje podpis obliczeń obsługiwanych na wykresie TensorFlow. Celem SignatureDefs jest zapewnienie ogólnej obsługi identyfikacji danych wejściowych i wyjściowych funkcji i można je określić podczas budowania SavedModel .

Tło

TF-Exporter i SessionBundle używały podpisów , które mają podobną koncepcję, ale wymagały od użytkowników rozróżnienia między podpisami nazwanymi i domyślnymi, aby mogły zostać poprawnie pobrane po załadowaniu. Dla tych, którzy wcześniej korzystali z TF-Exporter/SessionBundle, Signatures w TF-Exporter zostaną zastąpione przez SignatureDefs w SavedModel.

Struktura SignatureDef

SignatureDef wymaga specyfikacji:

  • inputs jako mapa ciągu do TensorInfo.
  • outputs jako mapę ciągu do TensorInfo.
  • method_name (która odpowiada nazwie metody obsługiwanej w narzędziu/systemie ładującym).

Należy pamiętać, że sam TensorInfo wymaga podania nazwy, typu i kształtu tensora. Chociaż informacje o tensorze są już obecne na wykresie, przydatne jest jawne zdefiniowanie TensorInfo jako części SignatureDef, ponieważ narzędzia mogą następnie sprawdzać poprawność podpisu itp. bez konieczności czytania definicji wykresu.

Aby ułatwić ponowne użycie i udostępnianie między narzędziami i systemami, powszechnie używane stałe związane z SignatureDefs, które będą obsługiwane w obsłudze TensorFlow, są zdefiniowane jako stałe. Swoiście:

Ponadto SavedModel udostępnia narzędzie pomagające w tworzeniu definicji podpisu.

Przykładowe konstrukcje

TensorFlow Serving zapewnia interfejsy API wysokiego poziomu do wykonywania wnioskowań. Aby włączyć te interfejsy API, modele muszą zawierać jeden lub więcej SignatureDefs, które definiują dokładne węzły TensorFlow do użycia na potrzeby danych wejściowych i wyjściowych. Poniżej znajdują się przykłady konkretnych SignatureDefs obsługiwanych przez TensorFlow Serving dla każdego interfejsu API.

Należy pamiętać, że udostępnianie TensorFlow zależy od kluczy każdego TensorInfo (na wejściach i wyjściach SignatureDef), a także od nazwy metody SignatureDef. Rzeczywista zawartość TensorInfo jest specyficzna dla Twojego wykresu.

Klasyfikacja PodpisDef

Klasyfikacja SignatureDefs obsługuje wywołania strukturalne do interfejsu API klasyfikacji TensorFlow Serving. Przepisują one, że musi istnieć tensor inputs i że istnieją dwa opcjonalne tensory wyjściowe: classes i scores , z których co najmniej jeden musi być obecny.

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"
  }
}

Przewiduj podpisDef

Funkcja Predict SignatureDefs obsługuje wywołania interfejsu Predict API TensorFlow Serving. Sygnatury te umożliwiają elastyczną obsługę dowolnej liczby tensorów wejściowych i wyjściowych. W poniższym przykładzie podpis my_prediction_signature ma pojedyncze logiczne wejściowe images Tensora, które są mapowane na rzeczywisty Tensor na wykresie x:0 .

Predict SignatureDefs umożliwiają przenośność między modelami. Oznacza to, że możesz zamieniać różne SavedModels, prawdopodobnie z różnymi podstawowymi nazwami Tensora (np. zamiast x:0 być może masz nowy alternatywny model z Tensorem z:0 ), podczas gdy Twoi klienci mogą pozostać online, ciągle odpytując stare i nowe wersje tego modelu bez zmian po stronie klienta.

Predict SignatureDefs umożliwia także dodanie opcjonalnych dodatkowych tensorów do wyników, o które można jawnie zapytać. Załóżmy, że oprócz klucza wyjściowego znajdującego się poniżej scores chcesz także pobrać warstwę zbiorczą do debugowania lub do innych celów. W takim przypadku po prostu dodałbyś dodatkowy Tensor z kluczem podobnym do pool i odpowiednią wartością.

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"
  }
}

Podpis regresjiDef

Regresja SignatureDefs obsługuje wywołania strukturalne do interfejsu API regresji TensorFlow Serving. Przepisują one, że musi istnieć dokładnie jeden tensor inputs i jeden tensor outputs .

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"
  }
}