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 generador de perfiles de TensorBoard, que es posible que ya use para perfilar el entrenamiento del modelo , para rastrear solicitudes de inferencia que nos ayuden a depurar y mejorar el rendimiento de la inferencia.

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

Visión general

En un nivel alto, apuntaremos la herramienta de generació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 over 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ó a través de pip )
  • Docker (que usaremos para descargar y ejecutar la publicación de TF>= imagen 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 .

Descarga la fuente de TensorFlow Serving.

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 el modelo 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 generador de perfiles 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. Use 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 la fecha límite para asegurarse de que la solicitud de perfil no se agote 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 a partir de entonces.

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 con éxito. Actualizar". 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 el visor de seguimiento de The Profiler, como se ve en la siguiente sección.

Analizar el seguimiento de la solicitud de inferencia

Rastreo de solicitud de inferencia

Ahora puede ver fácilmente qué cálculo se está 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 exacta de inicio y la duración de la pared.

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

Podemos hacer zoom para ver qué sucede dentro de SessionRun.

Rastreo de solicitud de inferencia ampliado

En el segundo subproceso, vemos una llamada ExecutorState::Process inicial 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 agrega núcleos en secuencia. Finalmente, el Ejecutor señala que su cálculo se realiza llamando a DoneCallback y se puede cerrar la Sesión.

Próximos pasos

Si bien este es un ejemplo simple, puede usar el mismo proceso para crear perfiles de modelos mucho más complejos, lo que le permite 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 funciones de TensorBoard's Profiler y TensorFlow Serving Performance Guide para obtener más información sobre cómo optimizar el rendimiento de la inferencia.