Middleware de FastAPI: Problemas de rendimiento al agregar el paquete de instrumentación de Prometheus: aumenta la latencia de la API REST.
Estamos tratando de disminuir la latencia de nuestro servicio de predicción de modelos BERT que se implementa utilizando FastAPI. Las predicciones se llaman a través del punto final /predict
. Examimos el seguimiento y encontramos que uno de los cuellos de botella es el prometheus-fastapi-instrumentator
. Alrededor del 1% de las solicitudes exceden los 10 segundos y se producen timeout
.
También descubrimos que algunas métricas no se reportan con 4 solicitudes/segundo. Algunas solicitudes tardaban entre 30 y 50 segundos, siendo starlette/fastapi
la que más tiempo tomaba. Parece que bajo un uso intenso, el punto final /metrics
no recibe suficientes recursos y, como resultado, todas las solicitudes de /metrics
esperan un tiempo y eventualmente fallan. Por lo tanto, tener un contenedor separado para las métricas podría ser útil. O si es posible retrasar/pausar las métricas bajo carga alta. Cualquier idea/consejo sería muy apreciado.
Ejemplo de código:
Esto es una plantilla que utilicé para construir mi servicio de predicción FastAPI. La única diferencia es que estoy utilizando un modelo basado en BERT en lugar del modelo simple utilizado en la plantilla.
davy.ai
Solución para disminuir la latencia del servicio de predicción del modelo BERT en FastAPI
Después de analizar el seguimiento y las métricas del servicio de predicción del modelo BERT implementado en FastAPI, encontramos que el
prometheus-fastapi-instrumentator
está causando un cuello de botella en el punto final/predict
, lo que lleva a un tiempo de espera de aproximadamente el 1% de las solicitudes que exceden los 10 segundos.Para disminuir la latencia del servicio, necesitamos optimizar el
prometheus-fastapi-instrumentator
encontrando formas de reducir su impacto en el punto final/predict
. Una aproximación podría ser cambiar a otro middleware que tenga un impacto menor en el rendimiento.Además, descubrimos que bajo un alto uso, el punto final
/metrics
no recibe suficientes recursos, lo que resulta en demoras y fallos en las solicitudes. Una manera de solucionar esto es tener un contenedor separado para las métricas o implementar un mecanismo de retraso en la generación de informes de métricas cuando la carga se vuelve demasiado alta.Para optimizar el servicio de predicción del modelo BERT, recomendamos los siguientes pasos:
prometheus-fastapi-instrumentator
en el punto final/predict
y cambiar a un middleware alternativo si tiene un impacto menor en el rendimiento.Siguiendo estos pasos, podemos reducir significativamente la latencia del servicio de predicción del modelo BERT y mejorar su rendimiento general en FastAPI.
Ejemplo de código
Aquí hay un [ejemplo de código][4] de plantilla para construir un servicio de predicción FastAPI utilizando un modelo BERT. La plantilla se puede modificar para implementar las optimizaciones mencionadas y obtener un mejor rendimiento.
Nota: El código anterior es solo una plantilla para construir un servicio de predicción basado en BERT en FastAPI, no incluye las optimizaciones mencionadas anteriormente.