SignatureDefs in SavedModel per TensorFlow Serving

Obbiettivo

Questo documento fornisce esempi per l'utilizzo previsto di SignatureDefs in SavedModel che mappano alle API di TensorFlow Serving.

Panoramica

Una SignatureDef definisce la firma di un calcolo supportato in un grafico TensorFlow. SignatureDef mira a fornire un supporto generico per identificare input e output di una funzione e può essere specificato durante la creazione di un SavedModel .

Sfondo

TF-Exporter e SessionBundle utilizzavano firme concettualmente simili ma richiedevano agli utenti di distinguere tra firme denominate e predefinite affinché potessero essere recuperate correttamente al momento del caricamento. Per coloro che in precedenza utilizzavano TF-Exporter/SessionBundle, Signatures in TF-Exporter verranno sostituite da SignatureDefs in SavedModel.

Struttura SignatureDef

Una SignatureDef richiede la specifica di:

  • inputs come mappa di stringhe su TensorInfo.
  • outputs come mappa di stringhe su TensorInfo.
  • method_name (che corrisponde al nome di un metodo supportato nello strumento/sistema di caricamento).

Si noti che TensorInfo stesso richiede la specifica di nome, dtype e forma del tensore. Sebbene le informazioni sul tensore siano già presenti nel grafico, è utile definire esplicitamente TensorInfo come parte di SignatureDef poiché gli strumenti possono quindi eseguire la convalida della firma, ecc. senza dover leggere la definizione del grafico.

Per facilitare il riutilizzo e la condivisione tra strumenti e sistemi, le costanti di uso comune relative a SignatureDef che saranno supportate in TensorFlow Serving sono definite come costanti. Nello specifico:

Inoltre, SavedModel fornisce un'utilità per aiutare a creare un file def.

Strutture campione

TensorFlow Serving fornisce API di alto livello per eseguire l'inferenza. Per abilitare queste API, i modelli devono includere uno o più SignatureDef che definiscono gli esatti nodi TensorFlow da utilizzare per input e output. Di seguito sono riportati esempi delle SignatureDef specifiche supportate da TensorFlow Serving per ciascuna API.

Tieni presente che TensorFlow Serving dipende dalle chiavi di ciascun TensorInfo (negli input e output di SignatureDef), nonché dal nome_metodo di SignatureDef. Il contenuto effettivo di TensorInfo è specifico per il tuo grafico.

Classificazione FirmaDef

Le Classification SignatureDef supportano le chiamate strutturate all'API di classificazione di TensorFlow Serving. Questi prescrivono che ci deve essere un Tensore inputs e che ci sono due Tensori di output opzionali: classes e scores , almeno uno dei quali deve essere presente.

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

Prevedi SignatureDef

Predict SignatureDefs supporta le chiamate all'API Predict di TensorFlow Serving. Queste firme consentono di supportare in modo flessibile molti tensori di input e output in modo arbitrario. Per l'esempio seguente, la firma my_prediction_signature ha un singolo input logico images del tensore mappate sul tensore effettivo nel grafico x:0 .

Predict SignatureDefs consente la portabilità tra modelli. Ciò significa che puoi scambiare diversi SavedModels, possibilmente con diversi nomi di Tensor sottostanti (ad esempio invece di x:0 forse hai un nuovo modello alternativo con un Tensor z:0 ), mentre i tuoi clienti possono rimanere online interrogando continuamente il vecchio e il nuovo versioni di questo modello senza modifiche sul lato client.

Predict SignatureDefs consente inoltre di aggiungere ulteriori tensori facoltativi agli output, che è possibile interrogare esplicitamente. Diciamo che oltre alla chiave di output sotto scores , vuoi anche recuperare un livello di pooling per il debug o altri scopi. In tal caso, aggiungeresti semplicemente un ulteriore Tensore con una chiave come pool e un valore appropriato.

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

Firma di regressioneDef

Le Regression SignatureDef supportano chiamate strutturate all'API di regressione di TensorFlow Serving. Questi prescrivono che ci deve essere esattamente un tensore inputs e uno di 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"
  }
}