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.
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
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.
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.