Solicitudes de inferencia de perfiles con TensorBoard

Después de implementar TensorFlow Serving y emitir solicitudes de su cliente, es posible que observe que las solicitudes tardan más de lo esperado o que no está logrando el rendimiento que le hubiera gustado.

En esta guía, usaremos el Profiler de TensorBoard, que quizás ya use para perfilar el entrenamiento del modelo , para rastrear las solicitudes de inferencia y ayudarnos a depurar y mejorar el rendimiento de la inferencia.

Debe utilizar esta guía junto con las mejores prácticas indicadas en la Guía de rendimiento para optimizar su modelo, sus solicitudes y su instancia de TensorFlow Serving.

Descripción general

En un nivel alto, apuntaremos la herramienta de creación de perfiles de TensorBoard al servidor gRPC de TensorFlow Serving. Cuando enviamos una solicitud de inferencia a Tensorflow Serving, también usaremos simultáneamente la interfaz de usuario de TensorBoard para pedirle que capture los rastros de esta solicitud. Detrás de escena, TensorBoard hablará con TensorFlow Serving a través de gRPC y le pedirá que proporcione un seguimiento detallado de la vida útil de la solicitud de inferencia. Luego, TensorBoard visualizará la actividad de cada subproceso en cada dispositivo informático (código en ejecución integrado con profiler::TraceMe ) durante el transcurso de la vida útil de la solicitud en la interfaz de usuario de TensorBoard para que la consumamos.

Requisitos previos

  • Tensorflow>=2.0.0
  • TensorBoard (debe instalarse si TF se instaló mediante pip )
  • Docker (que usaremos para descargar y ejecutar la imagen TF server>=2.1.0)

Implementar modelo con TensorFlow Serving

Para este ejemplo, usaremos Docker, la forma recomendada de implementar Tensorflow Serving, para alojar un modelo de juguete que calcula f(x) = x / 2 + 2 que se encuentra en el repositorio de Tensorflow Serving Github .

Descargue la fuente de servicio de TensorFlow.

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

Inicie TensorFlow Serving a través de Docker e implemente el 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

En otra terminal, consulte el modelo para asegurarse de que se implemente correctamente

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 el perfilador de TensorBoard

En otra terminal, inicie la herramienta TensorBoard en su máquina, proporcionando un directorio para guardar los eventos de seguimiento de inferencia en:

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

Navegue a http://localhost:6006/ para ver la interfaz de usuario de TensorBoard. Utilice el menú desplegable en la parte superior para navegar a la pestaña Perfil. Haga clic en Capturar perfil y proporcione la dirección del servidor gRPC de Tensorflow Serving.

Herramienta de creación de perfiles

Tan pronto como presione "Capturar", TensorBoard comenzará a enviar solicitudes de perfil al servidor modelo. En el cuadro de diálogo anterior, puede establecer tanto la fecha límite para cada solicitud como la cantidad total de veces que Tensorboard volverá a intentarlo si no se recopilan eventos de seguimiento. Si está perfilando un modelo costoso, es posible que desee aumentar el plazo para garantizar que la solicitud de perfil no expire antes de que se complete la solicitud de inferencia.

Enviar y perfilar una solicitud de inferencia

Presione Capturar en la interfaz de usuario de TensorBoard y envíe una solicitud de inferencia a TF Serving rápidamente después.

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

Debería ver el mensaje "Capturar perfil correctamente. Actualice". Las tostadas aparecen en la parte inferior de la pantalla. Esto significa que TensorBoard pudo recuperar eventos de seguimiento de TensorFlow Serving y los guardó en su logdir . Actualice la página para visualizar la solicitud de inferencia con Trace Viewer de The Profiler, como se ve en la siguiente sección.

Analizar el seguimiento de la solicitud de inferencia

Seguimiento de solicitud de inferencia

Ahora puede ver fácilmente qué cálculos se están realizando como resultado de su solicitud de inferencia. Puede hacer zoom y hacer clic en cualquiera de los rectángulos (eventos de seguimiento) para obtener más información, como la hora de inicio exacta y la duración del muro.

En un nivel alto, vemos dos subprocesos que pertenecen al tiempo de ejecución de TensorFlow y un tercero que pertenece al servidor REST, manejando la recepción de la solicitud HTTP y creando una sesión de TensorFlow.

Podemos acercarnos para ver lo que sucede dentro de SessionRun.

Seguimiento de solicitud de inferencia ampliado

En el segundo hilo, vemos una llamada inicial a ExecutorState::Process en la que no se ejecutan operaciones de TensorFlow pero se ejecutan pasos de inicialización.

En el primer hilo, vemos la llamada para leer la primera variable, y una vez que la segunda variable también está disponible, ejecuta la multiplicación y suma núcleos en secuencia. Finalmente, el Ejecutor indica que su cálculo se realiza llamando a DoneCallback y la sesión se puede cerrar.

Próximos pasos

Si bien este es un ejemplo simple, puede usar el mismo proceso para perfilar modelos mucho más complejos, lo que le permitirá identificar operaciones lentas o cuellos de botella en la arquitectura de su modelo para mejorar su rendimiento.

Consulte la Guía de TensorBoard Profiler para obtener un tutorial más completo sobre las características de TensorBoard's Profiler y TensorFlow Serving Performance Guide para obtener más información sobre cómo optimizar el rendimiento de inferencia.