SignatureDefs em SavedModel para veiculação do TensorFlow

Objetivo

Este documento fornece exemplos para o uso pretendido de SignatureDefs em SavedModel que mapeia para APIs do TensorFlow Serving.

Visão geral

Um SignatureDef define a assinatura de um cálculo compatível com um gráfico do TensorFlow. SignatureDefs visam fornecer suporte genérico para identificar entradas e saídas de uma função e podem ser especificados ao construir um SavedModel .

Fundo

TF-Exporter e SessionBundle usaram assinaturas que são semelhantes em conceito, mas exigiam que os usuários distinguissem entre assinaturas nomeadas e padrão para que fossem recuperadas corretamente após um carregamento. Para aqueles que usaram anteriormente o TF-Exporter/SessionBundle, Signatures no TF-Exporter serão substituídas por SignatureDefs no SavedModel.

Estrutura SignatureDef

Um SignatureDef requer especificação de:

  • inputs como um mapa de string para TensorInfo.
  • outputs como um mapa de string para TensorInfo.
  • method_name (que corresponde a um nome de método suportado na ferramenta/sistema de carregamento).

Observe que o próprio TensorInfo requer especificação de nome, tipo e formato do tensor. Embora as informações do tensor já estejam presentes no gráfico, é útil ter explicitamente o TensorInfo definido como parte do SignatureDef, pois as ferramentas podem então realizar a validação da assinatura, etc., sem ter que ler a definição do gráfico.

Para facilitar a reutilização e o compartilhamento entre ferramentas e sistemas, as constantes comumente usadas relacionadas a SignatureDefs que terão suporte no TensorFlow Serving são definidas como constantes. Especificamente:

Além disso, SavedModel fornece um utilitário para ajudar a construir uma definição de assinatura.

Estruturas de amostra

O TensorFlow Serving fornece APIs de alto nível para realizar inferências. Para ativar essas APIs, os modelos devem incluir um ou mais SignatureDefs que definam os nós exatos do TensorFlow a serem usados ​​para entrada e saída. Veja abaixo exemplos de SignatureDefs específicos compatíveis com o TensorFlow Serving para cada API.

Observe que o TensorFlow Serving depende das chaves de cada TensorInfo (nas entradas e saídas do SignatureDef), bem como do method_name do SignatureDef. O conteúdo real do TensorInfo é específico do seu gráfico.

Classificação SignatureDef

Classification SignatureDefs oferece suporte a chamadas estruturadas para a API de classificação do TensorFlow Serving. Eles prescrevem que deve haver um Tensor inputs e que existem dois Tensores de saída opcionais: classes e scores , pelo menos um dos quais deve estar 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"
  }
}

Prever SignatureDef

Predict SignatureDefs oferece suporte a chamadas para a API Predict do TensorFlow Serving. Essas assinaturas permitem que você ofereça suporte flexível a muitos tensores de entrada e saída arbitrários. Para o exemplo abaixo, a assinatura my_prediction_signature possui uma única entrada lógica de images do Tensor que são mapeadas para o Tensor real em seu gráfico x:0 .

Predict SignatureDefs permite portabilidade entre modelos. Isso significa que você pode trocar SavedModels diferentes, possivelmente com diferentes nomes de Tensor subjacentes (por exemplo, em vez de x:0 talvez você tenha um novo modelo alternativo com um Tensor z:0 ), enquanto seus clientes podem permanecer online continuamente consultando o antigo e o novo versões deste modelo sem alterações no lado do cliente.

Predict SignatureDefs também permite adicionar tensores adicionais opcionais às saídas, que você pode consultar explicitamente. Digamos que, além da chave de saída abaixo de scores , você também queira buscar uma camada de pooling para depuração ou outros fins. Nesse caso, você simplesmente adicionaria um Tensor adicional com uma chave como pool e valor apropriado.

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

Assinatura de regressãoDef

Os SignatureDefs de regressão oferecem suporte a chamadas estruturadas para a API Regression do TensorFlow Serving. Eles prescrevem que deve haver exatamente um Tensor inputs e um 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"
  }
}