Arquitetura

O TensorFlow Serving é um sistema de atendimento flexível e de alto desempenho para modelos de aprendizado de máquina, 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 imediata com os modelos do TensorFlow, mas pode ser facilmente estendido para atender a outros tipos de modelos.

Conceitos chave

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

Servíveis

Servables são a abstração central no TensorFlow Serving. Servables 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 Servable 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. Servables podem ser de qualquer tipo e interface, permitindo flexibilidade e melhorias futuras como:

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

Servables não gerenciam seu próprio ciclo de vida.

Os serviços típicos incluem o seguinte:

  • a TensorFlow SavedModelBundle ( tensorflow::Session )
  • uma tabela de pesquisa para incorporar ou pesquisas de vocabulário

Versões que podem ser veiculadas

O TensorFlow Serving pode lidar com uma ou mais versões de um servidor 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 servível seja carregada simultaneamente, dando suporte à implementação e experimentação graduais. No momento do serviço, os clientes podem solicitar a versão mais recente ou um ID de versão específico, para um modelo específico.

Streams que podem ser veiculados

Um fluxo que pode ser servido é a sequência de versões de um que pode ser servido, classificada 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 servível

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

Carregadores

Os carregadores gerenciam o ciclo de vida de um serviço. A API do Loader permite uma infraestrutura comum independente de algoritmos de aprendizado específicos, dados ou casos de uso de produtos envolvidos. Especificamente, os carregadores 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 Origem fornece zero ou mais fluxos que podem ser servidos. Para cada fluxo que pode ser servido, uma Origem fornece uma instância do Carregador para cada versão disponibilizada para ser carregada. (Na verdade, um Source é encadeado com zero ou mais SourceAdapters, e o último item na cadeia emite os Loaders.)

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

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

Versões Aspiradas

As versões aspiradas representam o conjunto de versões servidas que devem ser carregadas e prontas. As origens comunicam esse conjunto de versões que podem ser veiculadas para um único fluxo que pode ser veiculado por vez. Quando uma Origem fornece uma nova lista de versões desejadas ao Gerenciador, ela substitui a lista anterior para esse fluxo que pode ser servido. O Gerenciador descarrega todas as versões carregadas anteriormente que não aparecem mais na lista.

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

Gerentes

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

  • carregando Servables
  • servindo Servables
  • descarregando Servables

Os gerentes ouvem as fontes e rastreiam todas as versões. O gerente tenta atender às solicitações das fontes, mas pode se recusar a carregar uma versão desejada se, digamos, os recursos necessários não estiverem disponíveis. Os gerentes também podem adiar um "descarregamento". Por exemplo, um gerente 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 sempre carregada.

Os gerenciadores de serviço do TensorFlow fornecem uma interface simples e estreita -- GetServableHandle() -- para os clientes acessarem instâncias servidas carregadas.

Essencial

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

  • ciclo da vida
  • Métricas

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

Vida de um Servivel

diagrama de arquitetura de serviço tf

Em termos gerais:

  1. As origens criam Loaders para Versões Servíveis.
  2. Os carregadores são enviados como Versões Aspiradas ao Gerente, 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 Origem usa um retorno de chamada para notificar o Gerente da Versão Aspirada.
  3. O Gerente 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 previamente carregada ou carregar a nova versão.
  4. Se o Gerenciador determinar que é seguro, ele fornece ao Loader os recursos necessários e informa ao Loader para carregar a nova versão.
  5. Os clientes solicitam ao Gerente o Servable, especificando uma versão explicitamente ou apenas solicitando a versão mais recente. O Manager retorna um identificador para o Servable.

Por exemplo, digamos que uma fonte represente 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 Origem 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 Origem notifica o Gerenciador Dinâmico da Versão Aspirada.
  3. O Gerenciador Dinâmico aplica a Política de Versão e decide carregar a nova versão.
  4. O Gerenciador Dinâmico informa ao Carregador 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 Gerenciador Dinâmico 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 que pode ser servido.

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 (evite deixar zero versões carregadas; normalmente carregue uma nova versão antes de descarregar uma antiga) e a Política de Preservação de Recursos (evite ter duas versões carregadas simultaneamente, exigindo o dobro dos recursos; descarregue 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 são baixos, a Política de preservação de disponibilidade garantirá que a nova versão seja carregada e esteja pronta antes de descarregar a antiga. Para uso sofisticado do TensorFlow Serving, por exemplo, gerenciamento de versões em várias instâncias de servidor, a política de preservação de recursos requer o mínimo de recursos (sem buffer extra para carregar novas versões).

Fonte

Novas fontes podem suportar novos sistemas de arquivos, ofertas de nuvem e back-ends 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 uma fonte simples. As origens estão intimamente relacionadas aos carregadores para algoritmos específicos e serviços de hospedagem de dados.

Consulte o documento de origem personalizada para obter mais informações sobre como criar uma origem personalizada.

Carregadores

Os carregadores são o ponto de extensão para adicionar algoritmos e back-ends de dados. O 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 que pode ser servido. Prevemos a criação de Loaders para tabelas de pesquisa e algoritmos adicionais.

Consulte o documento Custom Servable para saber como criar um custom servable.

Dosador

O lote de várias 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 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 algoritmo podem processar com mais eficiência. Consulte o Guia de lotes para obter mais informações.