Arquitetura

O TensorFlow Serving é um sistema de atendimento flexível e de alto desempenho para modelos de machine learning, projetado para ambientes de produção. O TensorFlow Serving facilita a implantação de novos algoritmos e experimentos, mantendo a mesma arquitetura de servidor e APIs. O TensorFlow Serving oferece integração pronta para uso com modelos do TensorFlow, mas pode ser facilmente estendido para atender outros tipos de modelos.

Conceitos chave

Para entender a arquitetura do TensorFlow Serving, você precisa entender os seguintes conceitos-chave:

Serviços

Os servíveis são a abstração central no TensorFlow Serving. Servíveis são os objetos subjacentes que os clientes usam para realizar computação (por exemplo, uma pesquisa ou inferência).

O tamanho e a granularidade de um Servible são flexíveis. Um único Servable pode incluir qualquer coisa, desde um único fragmento de uma tabela de pesquisa até um único modelo e uma tupla de modelos de inferência. Os Servables podem ser de qualquer tipo e interface, possibilitando flexibilidade e melhorias futuras como:

  • resultados de streaming
  • APIs experimentais
  • modos de operação assíncronos

Os servíveis não gerenciam seu próprio ciclo de vida.

Os serviços típicos incluem o seguinte:

  • um TensorFlow SavedModelBundle ( tensorflow::Session )
  • uma tabela de pesquisa para incorporação ou pesquisas de vocabulário

Versões que podem ser servidas

O TensorFlow Serving pode lidar com uma ou mais versões de um serviço durante a vida útil de uma única instância de servidor. Isso permite que novas configurações de algoritmos, pesos e outros dados sejam carregados ao longo do tempo. As versões permitem que mais de uma versão de um serviço seja carregada simultaneamente, suportando implementação e experimentação graduais. No momento da veiculação, os clientes podem solicitar a versão mais recente ou um ID de versão específico, para um modelo específico.

Fluxos servíveis

Um fluxo de serviço é a sequência de versões de um serviço, classificadas por números de versão crescentes.

Modelos

O TensorFlow Serving representa um modelo como um ou mais serviços. Um modelo aprendido por máquina pode incluir um ou mais algoritmos (incluindo pesos aprendidos) e tabelas de pesquisa ou incorporação.

Você pode representar um modelo composto como um dos seguintes:

  • vários serviços independentes
  • único composto utilizável

Um serviço também pode corresponder a uma fração de um modelo. Por exemplo, uma tabela de pesquisa grande pode ser fragmentada em muitas instâncias do TensorFlow Serving.

Carregadores

Os carregadores gerenciam o ciclo de vida de um serviço. A API Loader permite infraestrutura comum independente de algoritmos de aprendizagem específicos, dados ou casos de uso de produtos envolvidos. Especificamente, os Loaders padronizam as APIs para carregar e descarregar um serviço.

Fontes

Fontes são módulos de plug-in que localizam e fornecem serviços. Cada Fonte fornece zero ou mais fluxos utilizáveis. Para cada fluxo utilizável, uma Fonte fornece uma instância do Loader para cada versão que disponibiliza para ser carregada. (Na verdade, um Source é encadeado com zero ou mais SourceAdapters, e o último item da cadeia emite os Loaders.)

A interface do TensorFlow Serving para fontes pode descobrir serviços de sistemas de armazenamento arbitrários. O TensorFlow Serving inclui implementações de origem de referência comuns. Por exemplo, as fontes podem acessar mecanismos como RPC e pesquisar um sistema de arquivos.

As fontes podem manter o estado compartilhado entre vários serviços ou versões. Isso é útil para serviços que usam atualizações delta (diff) entre versões.

Versões aspiradas

As versões aspiradas representam o conjunto de versões utilizáveis ​​que devem ser carregadas e prontas. As fontes comunicam esse conjunto de versões que podem ser servidas para um único fluxo que pode ser servido por vez. Quando uma Fonte fornece uma nova lista de versões aspiradas ao Gerenciador, ela substitui a lista anterior para aquele fluxo utilizável. O Manager descarrega todas as versões carregadas anteriormente que não aparecem mais na lista.

Consulte o tutorial avançado para ver como funciona o carregamento de versão na prática.

Gerentes

Os gerentes lidam com todo o ciclo de vida dos Servibles, incluindo:

  • carregando serviços
  • servindo serviços
  • descarregando serviços

Os gerentes ouvem as fontes e rastreiam todas as versões. O Gerenciador tenta atender às solicitações das Fontes, mas pode se recusar a carregar uma versão desejada se, por exemplo, os recursos necessários não estiverem disponíveis. Os gestores também podem adiar um “descarregamento”. Por exemplo, um Manager pode esperar para descarregar até que uma versão mais recente termine de carregar, com base em uma política para garantir que pelo menos uma versão seja carregada o tempo todo.

Os TensorFlow Serving Managers fornecem uma interface simples e estreita ( GetServableHandle() ) para que os clientes acessem instâncias utilizáveis ​​carregadas.

Essencial

Usando as APIs padrão do TensorFlow Serving, o TensorFlow Serving Core gerencia os seguintes aspectos dos serviços:

  • vida útil
  • Métricas

O TensorFlow Serving Core trata servíveis e carregadores como objetos opacos.

Vida de um servível

diagrama de arquitetura de serviço tf

Em geral:

  1. As fontes criam carregadores para versões que podem ser servidas.
  2. Os carregadores são enviados como versões aspiradas ao gerenciador, que os carrega e os atende às solicitações do cliente.

Em mais detalhes:

  1. Um plugin Source cria um Loader para uma versão específica. O Loader contém todos os metadados necessários para carregar o Servable.
  2. A Fonte usa um retorno de chamada para notificar o Gerente sobre a Versão Aspirada.
  3. O Gerenciador aplica a Política de Versão configurada para determinar a próxima ação a ser tomada, que pode ser descarregar uma versão carregada anteriormente ou carregar a nova versão.
  4. Se o Manager determinar que é seguro, ele fornecerá ao Loader os recursos necessários e instruirá o Loader a carregar a nova versão.
  5. Os clientes solicitam o Servable ao Gerente, especificando explicitamente uma versão ou apenas solicitando a versão mais recente. O Manager retorna um identificador para o Servable.

Por exemplo, digamos que uma fonte representa um gráfico do TensorFlow com pesos de modelo atualizados com frequência. Os pesos são armazenados em um arquivo em disco.

  1. A Fonte detecta uma nova versão dos pesos do modelo. Ele cria um Loader que contém um ponteiro para os dados do modelo no disco.
  2. A Fonte notifica o Gerente Dinâmico sobre a Versão Aspirada.
  3. O Dynamic Manager aplica a Política de Versão e decide carregar a nova versão.
  4. O Dynamic Manager informa ao Loader que há memória suficiente. O Loader instancia o gráfico do TensorFlow com os novos pesos.
  5. Um cliente solicita um identificador para a versão mais recente do modelo e o Dynamic Manager retorna um identificador para a nova versão do Servable.

Extensibilidade

O TensorFlow Serving fornece vários pontos de extensão onde você pode adicionar novas funcionalidades.

Política de Versão

As políticas de versão especificam a sequência de carregamento e descarregamento de versão em um único fluxo utilizável.

O TensorFlow Serving inclui duas políticas que acomodam a maioria dos casos de uso conhecidos. Estas são a Política de Preservação de Disponibilidade (evitar deixar zero versões carregadas; normalmente carregar uma nova versão antes de descarregar uma antiga) e a Política de Preservação de Recursos (evitar ter duas versões carregadas simultaneamente, exigindo assim o dobro dos recursos; descarregar uma versão antiga antes de carregar um novo). Para uso simples do TensorFlow Serving, onde a disponibilidade de serviço de um modelo é importante e os custos de recursos baixos, a Política de Preservação de Disponibilidade garantirá que a nova versão esteja carregada e pronta antes de descarregar a antiga. Para uso sofisticado do TensorFlow Serving, por exemplo, gerenciando versões em várias instâncias de servidor, a política de preservação de recursos requer menos recursos (sem buffer extra para carregar novas versões).

Fonte

Novas fontes poderiam suportar novos sistemas de arquivos, ofertas de nuvem e backends de algoritmos. O TensorFlow Serving fornece alguns blocos de construção comuns para facilitar e agilizar a criação de novas fontes. Por exemplo, o TensorFlow Serving inclui um utilitário para agrupar o comportamento de pesquisa em torno de uma fonte simples. As fontes estão intimamente relacionadas aos carregadores para algoritmos específicos e serviços de hospedagem de dados.

Consulte o documento Fonte personalizada para saber mais sobre como criar uma fonte personalizada.

Carregadores

Carregadores são o ponto de extensão para adicionar algoritmos e backends de dados. TensorFlow é um desses back-end de algoritmo. Por exemplo, você implementaria um novo Loader para carregar, fornecer acesso e descarregar uma instância de um novo tipo de modelo de aprendizado de máquina utilizável. Prevemos a criação de Loaders para tabelas de pesquisa e algoritmos adicionais.

Consulte o documento servível personalizado para saber como criar um servível personalizado.

Dosador

O agrupamento de múltiplas solicitações em uma única solicitação pode reduzir significativamente o custo de realização de inferência, especialmente na presença de aceleradores de hardware, como GPUs. O TensorFlow Serving inclui um widget de processamento em lote de solicitações que permite aos clientes agrupar facilmente suas inferências específicas de tipo entre solicitações em solicitações em lote que os sistemas de algoritmos podem processar com mais eficiência. Consulte o Guia de lotes para obter mais informações.