Como exportar um SavedModel para previsão

Para implantar modelos treinados no AI Platform Prediction e usá-los para exibir previsões, primeiro é necessário exportá-los no formato SavedModel do TensorFlow.

Nesta página, você vê algumas considerações importantes para criar o SavedModel. Para informações mais detalhadas sobre como exportar para um SavedModel, leia o guia do TensorFlow para SavedModels e o guia do TensorFlow para salvar modelos Keras (ambos em inglês). Para mais detalhes sobre como implantar o SavedModel no AI Platform Prediction e exibir previsões, consulte o guia sobre como implantar modelos. Para informações gerais sobre o processo de previsão, consulte esta página.

Rotinas de previsão personalizadas

Outra maneira de implantar um SavedModel é criar e implantar uma rotina de previsão personalizada. Ela combina um SavedModel (ou um modelo treinado salvo de outra maneira) com outros artefatos de treinamento e com o código Python fornecido para personalizar a forma como o AI Platform Prediction processa solicitações de previsão. Por exemplo, é possível usar essa flexibilidade para pré-processar a entrada de predição antes que o modelo a faça.

Para mais informações, leia o guia sobre rotinas de predição personalizadas.

Noções básicas sobre grafos de treinamento e de exibição

Após treinar e exportar seu modelo como um SavedModel, há algumas etapas importantes a serem seguidas antes de receber previsões.

Há algumas diferenças importantes entre um gráfico de treinamento e um gráfico de serviço. Os gráficos de treinamento contêm recursos que não são apropriados para o serviço, como:

  • leitores de arquivos;
  • filas de entrada;
  • camadas de saída;
  • funções de perda;
  • otimizadores.

O processo de veicular previsões e o de treinamento tem necessidades diferentes. Portanto, é recomendável exportar um gráfico separado especificamente para veicular as previsões.

Noções básicas sobre o SavedModel

Um SavedModel é o formato recomendado do TensorFlow para salvar modelos. Ele é obrigatório na implantação de modelos treinados do TensorFlow no AI Platform Prediction. Exportar o modelo treinado como SavedModel salva o grafo de treinamento com os recursos, variáveis e metadados dele em um formato que o AI Platform Prediction pode consumir e restaurar para previsões.

Depois de exportá-lo, você terá um diretório SavedModel com o conteúdo a seguir:

Ao implantar o SavedModel no AI Platform Prediction, é necessário incluir o diretório completo, não apenas o arquivo de buffer de protocolo SavedModel que contém o grafo e os metadados dele. Geralmente, esse arquivo tem uma extensão .pb ou .pbtxt.

Com o SavedModel, você salva várias versões de um grafo que compartilha os mesmos recursos e variáveis (ou checkpoints). Por exemplo, desenvolva duas versões do mesmo grafo: uma para ser executada em CPUs e outra em GPUs.

Saiba mais sobre a estrutura de um diretório SavedModel (em inglês).

Como exportar de várias APIs TensorFlow

Há várias maneiras de exportar SavedModels do código de treinamento do TensorFlow. Na lista a seguir, você verá algumas maneiras diferentes que funcionam para várias APIs TensorFlow:

Compatibilidade com o AI Explanations

Se você quiser usar o AI Explanations com seu modelo, saiba mais sobre outros requisitos adicionais para o SavedModel.

Verificar e ajustar o tamanho do modelo

O SavedModel precisará ter até 500 MB se você quiser implantá-lo em uma versão de modelo que usa um tipo de máquina legado MLS1. Esse tamanho poderá ser de até 10 GB se você usar um tipo de máquina N1 do Compute Engine. Saiba mais sobre os tipos de máquinas para previsão on-line.

Esse limite de tamanho inclui todos os recursos e variáveis no diretório SavedModel, e não apenas o arquivo de buffer de protocolo do SavedModel em si (ou seja, saved_model.pb ou saved_model.pbtxt).

Para verificar o tamanho do modelo durante o desenvolvimento, exporte um SavedModel e verifique o tamanho do arquivo do diretório.

Se o SavedModel exceder o limite de 500 MB:

Seguindo essas etapas, é possível deixar o SavedModel abaixo do limite de 500 MB e diminuir a latência das previsões. Os benefícios são melhor desempenho e não ter que solicitar e aguardar um aumento de cota.

Se você ainda precisar de mais cota, consulte Como solicitar um aumento de cota.

Criar o melhor gráfico de predição possível

O treinamento produz vários pontos de verificação que não são usados para veicular previsões. Faça o upload de um diretório livre desses artefatos, contendo apenas o modelo a ser implantado.

Por exemplo, se você for exportar resumos durante o processo de treinamento para visualização no TensorBoard, tenha certeza de que eles não estão incluídos no seu SavedModel. Esses resumos do TensorBoard não são necessários para um grafo de previsão.

Como reduzir a precisão para diminuir o tamanho do arquivo

Reduzir a precisão das variáveis e dos dados de entrada é uma compensação que reduz significativamente o tamanho do seu modelo, ainda que isso diminua também a precisão da previsão. Os dados de alta precisão são armazenados de modo menos econômico do que dados de baixa precisão. Os dados de baixa precisão são uma fonte de ruído. No entanto, uma rede neural pode "ignorar" esse ruído e ainda produzir previsões bastante precisas.

Se o uso desses métodos resultar em uma perda da acurácia de predição muito grande para seu caso de uso, tente solicitar um aumento de cota.

  • Reduza o tamanho do arquivo diminuindo o tamanho dos pesos. O padrão são números de ponto flutuante, difíceis de armazenar com eficiência. Esses pesos são os maiores contribuintes para o tamanho geral do arquivo do modelo.

  • Subdivida os dados contínuos para reduzir o tamanho do modelo em até 75% sem sacrificar uma quantidade significativa de acurácia.

  • Use variáveis menos precisas. Por exemplo, altere o tipo de dados dtype (em inglês) de int64 para int32.

  • Reduza o tamanho de outros atributos de entrada na pasta assets do diretório do SavedModel. Por exemplo, use tamanhos de vocabulário menores em dados de texto.

  • Leia sobre técnicas para otimizar os modelos do TensorFlow para serviço e conheça exemplos de aplicação delas. As técnicas vinculadas serão aplicadas somente se você estiver usando o TensorFlow 1.

Ferramentas para inspecionar SavedModels e grafos

O TensorFlow fornece uma interface de linha de comando que pode ser usada para verificar aspectos do SavedModel, como formatação de entrada e SignatureDefs. Saiba mais sobre a CLI do SavedModel (em inglês).

É possível usar a ferramenta Graph Transform no TensorFlow para otimizar o modelo de implantação (páginas em inglês). Embora a explicação sobre o uso dessa ferramenta seja voltada à implantação em dispositivos móveis, também é possível usá-las para otimizar modelos para implantação em dispositivos não móveis.

Como criar funções de entrada de serviço

Se você exportar o SavedModel usando tf.keras.Model.save, não será necessário especificar uma função de entrada de exibição.

Do contrário, defina uma função de entrada de exibição ao exportar o SavedModel. É possível fazer isso nos seguintes momentos do processo geral de treinamento:

  • Durante a etapa final do processo de treinamento
  • Como um processo separado após a conclusão do treinamento

Nos exemplos a seguir, você verá como fazer isso para um Estimator treinado. Veja mais informações sobre funções de entrada de exibição para o Estimator.

Criar grafos de exibição durante o treinamento

Essa etapa normalmente ocorre no final do processo de treinamento, mas ainda está vinculada a ele.

  1. Defina uma função de entrada de serviço. Na sua função, verifique se a dimensão mais externa dos seus atributos é None. Isso corresponde ao tamanho do lote e é demonstrado abaixo ao definir o valor dos itens no seu dict de atributos usando tf.placeholder. O código de exemplo a seguir vem da nossa amostra do Censo (em inglês):

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Exporte um SavedModel do Estimator usando tf.estimator.Estimator.export_saved_model (em inglês), transmitindo no caminho para o modelo como o parâmetro export_dir_base e o nome da função de entrada de exibição como serving_input_fn. No exemplo do Censo, o tipo de Estimator usado é tf.estimator.DNNLinearCombinedClassifier (em inglês).

Criar o grafo de serviço separadamente do treinamento

Se você já treinou seu modelo, pode conseguir previsões sem fazer outro treinamento. Este processo é muito semelhante à criação de um gráfico de serviço durante o treinamento. A principal diferença é que você cria o grafo de exibição em um script em Python separado que será executado após o fim do treinamento. A ideia básica é criar o Estimator com o mesmo model_dir usado no treinamento e, em seguida, chamar o tf.estimator.Estimator.export_saved_model conforme descrito na seção anterior.

  1. Defina uma função de entrada de exibição no script em Python, da mesma forma que ela foi definida no treinamento:

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Ao criar o Estimator, configure o parâmetro model_dir para ser o mesmo usado no treinamento. Isso disponibiliza os checkpoints do modelo salvo anteriormente para o Estimator.

  3. Por fim, use o Estimator para chamar tf.estimator.Estimator.export_saved_model (em inglês) transmitindo o caminho para o modelo como o parâmetro export_dir_base e o nome da função de entrada de exibição como o parâmetro serving_input_fn.

Assinaturas e tags do TensorFlow

Se você exportar um SavedModel do tf.keras ou de um Estimator do TensorFlow (em inglês), o gráfico exportado estará pronto para ser veiculado por padrão.

Em outros casos, ao criar um grafo de previsão do TensorFlow, é preciso especificar os valores corretos para as tags e as assinaturas do grafo. O TensorFlow fornece constantes para esses valores, usados nas finalidades a seguir:

  • Selecionar um gráfico no SavedModel para disponibilizar predições.
  • Indicar que você está criando uma assinatura de predição para o gráfico.

As assinaturas definem as entradas e saídas do grafo. Ao criar uma assinatura do grafo de previsão, é preciso especificar uma constante de assinatura válida como o parâmetro method_name em build_signature_def (em inglês). Para a previsão, a melhor opção costuma ser PREDICT_METHOD_NAME.

Você precisa usar uma tag para especificar qual grafo no seu SavedModel é usado para fornecer previsões. Em add_meta_graph_and_variables, adicione tag_constants.SERVING à lista de tags.

Veja um exemplo de como criar um gráfico de predição usando as constantes corretas de tags e assinaturas.

A seguir