es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Analizar el impacto del middleware prometheus-fastapi-instrumentator en el punto final /predict y cambiar a un middleware alternativo si tiene un impacto menor en el rendimiento.
    2. Implementar un contenedor separado para las métricas o un mecanismo de retraso en la generación de informes de métricas durante un alto uso.
    3. Considerar optimizar el propio modelo BERT para reducir su tiempo de inferencia y mejorar el rendimiento general del servicio de predicción.

    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.


    import uvicorn from fastapi import FastAPI from pydantic import BaseModel # Importar el modelo BERT y el tokenizador from transformers import AutoTokenizer, AutoModelForSequenceClassification # Inicializar el modelo y el tokenizador bert_tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') bert_model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased') # Definir el esquema de entrada de predicción class PredictionInput(BaseModel): text: str # Inicializar la aplicación app = FastAPI() # Definir el punto final de predicción @app.post("/predict") async def predict(input: PredictionInput): # Preprocesar el texto de entrada inputs = bert_tokenizer(input.text, padding=True, truncation=True, return_tensors="pt") # Realizar la inferencia del modelo outputs = bert_model(**inputs) predictions = outputs.logits.argmax(dim=-1) # Devolver la etiqueta predicha return {"label": predictions.item()} # Ejecutar la aplicación utilizando el servidor Uvicorn if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)

    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.

Comments are closed.