¿Qué hace a una API inteligente?

Jan 01 2023
He estado practicando Machine Learning durante casi 3 o 4 años. Durante el período, entrené muchos modelos, implementé muchas canalizaciones de datos y mucho más.

He estado practicando Machine Learning durante casi 3 o 4 años. Durante el período, entrené muchos modelos, implementé muchas canalizaciones de datos y mucho más. Nota: definitivamente recopilé y limpié muchos más datos que la cantidad de modelos que llegué a construir .

Uno de los aspectos cruciales de estar en el espectro de ML es poder hacer que sus pensamientos o implementaciones estén fácilmente disponibles para otros .

Déjame explicarte eso.

Podría ser explicarle a una persona no técnica cómo funciona un algoritmo en términos simples, cómo servir sus modelos en una API, o incluso documentar su trabajo para que alguien nuevo en sus proyectos pueda ponerse al día fácilmente con lo que ha hecho. lejos, y muchos más. En este artículo, nos centraremos en las API .

La API (interfaz de programación de aplicaciones) no es más que un medio que facilita la comunicación entre la fuente y el usuario final . Casi todas las aplicaciones que usamos en nuestra vida cotidiana se componen de cientos (si no, más) de API que realizan el trabajo pesado en el back-end para que pueda usar la aplicación con facilidad. Una API se comporta de manera de solicitud-respuesta . Esto podría oscilar entre unos pocos milisegundos y más de unos pocos minutos.

Foto de Balázs Kétyi en Unsplash

Imagina que vas a Starbucks y pides un Caramel Frappuccino con crema extra (Mi favorito personal ) justo antes de asistir a esa larga reunión.

¿Qué pasa después? Bien,

Probablemente esperará los próximos 4 a 5 minutos dentro de los cuales se realiza su pedido, luego se preparará en la cocina y el mesero le entregará su delicioso Frappuccino. En este caso, usted es el usuario final, la cocina se convierte en la fuente y el camarero que le trae el Frappuccino desde la cocina actúa como una API .

¿Suena lo suficientemente claro?

Ahora suponga que han pasado más de 30 minutos y aún no se le ha entregado su Frappuccino. ¿No perderías la paciencia? ¿O al menos no saldrías para asistir a esa reunión que tienes en 10 minutos sintiéndote muy decepcionado?

Foto de Christian Erfurt en Unsplash

Así es exactamente como se sentiría el usuario final de su aplicación si hay mucho retraso para devolver la respuesta. La latencia es clave cuando se trata de diseñar la aplicación perfecta.

Ahora supongamos que incluso con el mejor artista del café, preparar un Frappuccino de caramelo tomaría nada menos que 30 minutos. ¿Aún pedirías el Frappuccino o elegirías una opción alternativa que tenga un tiempo de preparación menor? En la mayoría de los casos, optará por la opción alternativa, ¿no es así?

Pero, ¿qué pasa si el barista dice, como cito: Solo ve a esa reunión, me aseguraré de que el Frappuccino esté en tu sala de conferencias antes de que llegues!

Suena como un trato interesante, ¿no?

¿Por qué no podemos crear una API que pueda comportarse de la misma manera?

Dejame explicar.

Puede crear una API que devolverá una respuesta instantáneamente cuando el usuario envíe una solicitud a una API. Pero el trabajo pesado se realiza en segundo plano ( esto puede o no llevar un tiempo ). Con una API de este tipo, puede asegurarse de que el tiempo de ejecución nunca afecte el tiempo total que se tarda en devolver una respuesta.

Celery y FastAPI proporcionan un mecanismo de mensajería optimizado. En este artículo, nos centraremos solo en FastAPI (gracias a Sebastián Ramírez por crear este GEM), que también es mi marco de API de Python favorito. Admite tareas en segundo plano que se alinean perfectamente con lo que discutimos ahora.

Si es nuevo en FastAPI, consulte este blog sobre FastAPI para comenzar a comprender lo que voy a explicar en este artículo.

Primeros pasos con FastAPI

De aquí en adelante, asumiré que sabe cómo construir una API básica usando FastAPI.

¿Deberíamos empezar?

Vamos a crear una API que devolverá "Hola mundo" después de 10 segundos.

from fastapi import FastAPI
import time

app = FastAPI()

@app.post("/myApp/timer")
def read_item():
    
    start = time.time() # start time
    time.sleep(10)
    end = time.time() # end time
    
    print(end - start) # print the time taken to return the response
    
    return {"response": "Hello world!"}

respuesta de swagger

Puede notar que la respuesta de la API se devuelve después de 10.0037 s y la declaración de impresión también es aproximadamente al mismo tiempo

respuesta de la terminal

A continuación se muestra el tiempo necesario para 10 llamadas API que hice

El tiempo medio empleado es de unos 10.002 s.

Ahora agreguemos la capacidad de asignación de tareas en segundo plano en la misma API. Para hacerlo, puede usar la función de tareas en segundo plano en FastAPI. Simplemente cree una función llamada return_response que imprima "¡Hola mundo!" al llamarlo. Invoque esa función usando el método BackgroundTasks dentro de la API y ¡listo!

from fastapi import BackgroundTasks, FastAPI
import time

app = FastAPI()

def return_response():
    start = time.time() # start time
    time.sleep(10)
    end = time.time() # end time
    
    print({
        "response": "Hello world!", 
        "time_taken": end - start
        })

@app.post("/myApp/timer")
def read_item(background_tasks: BackgroundTasks):
    start = time.time() # start time
    background_tasks.add_task(return_response) # background processing the function
    end = time.time() # end time
    
    return {
        "status": "processing in background",
        "time_taken": end - start
        }

respuesta de swagger

Mientras que la declaración de impresión se puede ver en la terminal después de 10 segundos

respuesta de la terminal

Puede ver aquí que el tiempo que tarda la API en devolver la respuesta se ha reducido de 10,002 s a solo 0,00034 s, mientras que la declaración de impresión se proporciona después de 10,0043 s.

La creación de una API de esta manera asegura que su respuesta se dé casi instantáneamente al mover el trabajo pesado para que suceda en segundo plano.

Recuerde, la función BackgroundTasks solo funcionaría mejor en los casos en que su aplicación pueda almacenar la respuesta de la API en una fuente externa (MySQL, DynamoDB, etc.) y no requiera que el usuario final la vea al momento de obtener la respuesta.

Espero que esto te ayude a reestructurar tu API con mucho menos tiempo de procesamiento. Nos vemos pronto con más artículos interesantes.