Solicitações de inferência de perfil com TensorBoard

Depois de implantar o TensorFlow Serving e emitir solicitações do seu cliente, você pode perceber que as solicitações demoram mais do que o esperado ou que você não está alcançando a taxa de transferência desejada.

Neste guia, usaremos o Profiler do TensorBoard, que você já pode usar para criar perfis de treinamento de modelo , para rastrear solicitações de inferência para nos ajudar a depurar e melhorar o desempenho de inferência.

Você deve usar este guia em conjunto com as práticas recomendadas indicadas no Guia de desempenho para otimizar seu modelo, solicitações e instância de serviço do TensorFlow.

Visão geral

Em alto nível, apontaremos a ferramenta de criação de perfil do TensorBoard para o servidor gRPC do TensorFlow Serving. Quando enviamos uma solicitação de inferência para o Tensorflow Serving, também usaremos simultaneamente a IU do TensorBoard para solicitar a captura dos rastreamentos dessa solicitação. Nos bastidores, o TensorBoard conversará com o TensorFlow Serving sobre gRPC e solicitará que ele forneça um rastreamento detalhado do tempo de vida da solicitação de inferência. O TensorBoard então visualizará a atividade de cada thread em cada dispositivo de computação (executando o código integrado ao profiler::TraceMe ) ao longo da vida útil da solicitação na interface do usuário do TensorBoard para que possamos consumir.

Pré-requisitos

  • Tensorflow>=2.0.0
  • TensorBoard (deve ser instalado se o TF foi instalado via pip )
  • Docker (que usaremos para baixar e executar o serviço TF>=2.1.0 imagem)

Implantar modelo com a veiculação do TensorFlow

Para este exemplo, usaremos o Docker, a maneira recomendada de implantar o Tensorflow Serving, para hospedar um modelo de brinquedo que calcula f(x) = x / 2 + 2 encontrado no repositório Github do Tensorflow Serving .

Faça o download da fonte de veiculação do TensorFlow.

git clone https://github.com/tensorflow/serving /tmp/serving
cd /tmp/serving

Inicie o TensorFlow Serving via Docker e implante o modelo half_plus_two.

docker pull tensorflow/serving
MODELS_DIR="$(pwd)/tensorflow_serving/servables/tensorflow/testdata"
docker run -it --rm -p 8500:8500 -p 8501:8501 \
-v $MODELS_DIR/saved_model_half_plus_two_cpu:/models/half_plus_two \
-v /tmp/tensorboard:/tmp/tensorboard \
-e MODEL_NAME=half_plus_two \
tensorflow/serving

Em outro terminal, consulte o modelo para garantir que o modelo seja implantado corretamente

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict

# Returns => { "predictions": [2.5, 3.0, 4.5] }

Configurar o Profiler do TensorBoard

Em outro terminal, inicie a ferramenta TensorBoard em sua máquina, fornecendo um diretório para salvar os eventos de rastreamento de inferência para:

mkdir -p /tmp/tensorboard
tensorboard --logdir /tmp/tensorboard --port 6006

Navegue até http://localhost:6006/ para visualizar a IU do TensorBoard. Use o menu suspenso na parte superior para navegar até a guia Perfil. Clique em Capture Profile e forneça o endereço do servidor gRPC do Tensorflow Serving.

Ferramenta de criação de perfil

Assim que você pressionar "Capturar", o TensorBoard começará a enviar solicitações de perfil para o servidor de modelo. Na caixa de diálogo acima, você pode definir o prazo para cada solicitação e o número total de vezes que o Tensorboard tentará novamente se nenhum evento de rastreamento for coletado. Se você estiver criando o perfil de um modelo caro, convém aumentar o prazo para garantir que a solicitação de perfil não expire antes que a solicitação de inferência seja concluída.

Enviar e criar perfil de uma solicitação de inferência

Pressione Capturar na interface do usuário do TensorBoard e envie uma solicitação de inferência para o TF Serving rapidamente em seguida.

curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST \
http://localhost:8501/v1/models/half_plus_two:predict

Você deve ver um "Perfil de captura com sucesso. Atualize". brinde aparecem na parte inferior da tela. Isso significa que o TensorBoard conseguiu recuperar eventos de rastreamento do TensorFlow Serving e salvá-los em seu logdir . Atualize a página para visualizar a solicitação de inferência com o Visualizador de rastreamento do criador de perfil, conforme visto na próxima seção.

Analisar o rastreamento de solicitação de inferência

Rastreamento de solicitação de inferência

Agora você pode ver facilmente qual computação está ocorrendo como resultado de sua solicitação de inferência. Você pode ampliar e clicar em qualquer um dos retângulos (trace eventos) para obter mais informações, como hora exata de início e duração da parede.

Em alto nível, vemos dois threads pertencentes ao runtime do TensorFlow e um terceiro que pertence ao servidor REST, manipulando o recebimento da solicitação HTTP e criando uma sessão do TensorFlow.

Podemos ampliar para ver o que acontece dentro do SessionRun.

Rastreamento de solicitação de inferência ampliado

No segundo thread, vemos uma chamada inicial ExecutorState::Process na qual nenhuma operação do TensorFlow é executada, mas as etapas de inicialização são executadas.

Na primeira thread, vemos a chamada para ler a primeira variável, e uma vez que a segunda variável também está disponível, executa a multiplicação e adiciona kernels em sequência. Por fim, o Executor sinaliza que seu cálculo foi feito chamando o DoneCallback e a Sessão pode ser fechada.

Próximos passos

Embora este seja um exemplo simples, você pode usar o mesmo processo para criar perfis de modelos muito mais complexos, permitindo identificar operações lentas ou gargalos em sua arquitetura de modelo para melhorar seu desempenho.

Consulte o TensorBoard Profiler Guide para obter um tutorial mais completo sobre os recursos do TensorBoard Profiler e do TensorFlow Serving Performance Guide para saber mais sobre como otimizar o desempenho de inferência.