FastAPI: Marco API para servir productos de datos de aprendizaje automático
En estos días, la mayoría de los modelos de aprendizaje automático se sirven en producción como servicio. Este método desacopla las aplicaciones cliente de los modelos de aprendizaje automático a través de la interfaz de programación de aplicaciones (API).
En este artículo, lo guiaré a través del concepto de API, las capacidades innovadoras de FastAPI y serviré nuestro producto de datos de aprendizaje automático con FastAPI.
¿Qué es una API?
Una interfaz de programación de aplicaciones ( API ) es una interfaz de software para que dos o más aplicaciones se comuniquen entre sí.
La forma más fácil de entender qué es una API es pensar en ti mismo en un restaurante. Entras al restaurante, encuentras tu mesa y recibes un menú. En el menú, hay nombres, descripciones y costos de la comida. Eliges tu combinación y quieres dar una orden. Pero, ¿cómo se entregará su pedido al chef? El chef no puede venir al comedor y tú no puedes ir a la cocina. Necesita que alguien reciba su pedido y lo entregue a la cocina y luego, cuando la comida esté lista, la lleve a su mesa. ¡Sí, necesitas un camarero o una camarera!
La misma analogía se aplica a las aplicaciones. Para hacer que las aplicaciones se comuniquen entre sí o reciban sus solicitudes y publiquen sus resultados, las API sirven como intermediarios.
Ejemplos de API
Google Maps: Google Maps sirve varias API en la aplicación. Cuando busca una ciudad, área o vecindario, se rellena el clima, la calidad del aire e incluso durante el tiempo de covid, los últimos resultados de infección. De la misma forma, cuando buscas un sitio para comer Google Maps te muestra los restaurantes, cafeterías, sus menús, horarios e incluso si está disponible opciones de reserva online a través de aplicaciones de terceros.
Aplicaciones de viaje: Booking.com, Trivago, Expedia y otras le ofrecen experiencias de viaje de extremo a extremo en estos días. Al revisar sus aplicaciones, puede reservar un hotel, comprar boletos de avión, alquilar un automóvil o hacer una reserva en un evento de cata de vinos. Ninguno de estos elementos es propiedad ni está gestionado directamente por estas empresas. Reciben su solicitud y hacen conexiones con las otras aplicaciones que sirven esta información.
API rápida
FastAPI es un marco web para desarrollar API RESTful en Python. FastAPI está aumentando su base de usuarios todos los días. No solo los ingenieros de software, sino también los científicos de datos, los ingenieros de aprendizaje automático y los ingenieros de datos han comenzado a usar FastAPI. El movimiento fue revolucionario que empujó a todas las personas de datos a migrar de Flask y Django a FastAPI en un corto período de tiempo.
Capacidades de cambio de juego de FastAPI
Solicitudes síncronas vs asíncronas
Antes de entrar en definiciones técnicas, volvamos a nuestro ejemplo de restaurante.
¡Le das tu pedido al mesero y te dice que solo hay un cocinero en la cocina y ya tiene 5 pedidos en la cola ! Empiezas a esperar a que te entreguen tu pedido. Después de 30 minutos con una disculpa llega tu comida. Aprendes que una sola persona, por rápido que puede ser, no puede manejar 10 mesas al mismo tiempo. Esta es una solicitud sincrónica.
La próxima vez que quieras probar otro restaurante. Antes de dar tu pedido, le preguntas al mesero cuántos cocineros tienen. El mesero se ríe de usted y le dice que “Tenemos los 5 cocineros en la cocina y están esperando para servirle, señor. ¡No somos aficionados!” Das tu pedido y 10 minutos después te llega tu pedido. Miras a tu alrededor y ves que también se están sirviendo otras mesas. Esta es una solicitud asíncrona.
Una llamada a la API sincrónica es un patrón de diseño en el que el sitio de la llamada se bloquea mientras se espera que finalice el código llamado. Con una llamada de API asíncrona, el sitio de la llamada no se bloquea mientras se espera que finalice el código llamado, sino que se notifica al subproceso de llamada cuando llega la respuesta.
En condiciones de carga más pesada, puede ser más eficiente enviar varias llamadas asíncronas y verificar periódicamente el estado que esperar a que se complete cada llamada antes de enviar la siguiente.
from fastapi import FastAPI
app = FastAPI()
async def get_restaurant_working_hours():
# some operations
pass
@app.get("/")
async def get_resturant_reservation_details():
results = await restaurant_working_hours() # waits for the defined function
# some operations
return results
FastAPI admite validaciones de parámetros numéricos y de cadena.
Ejemplo de validación de cadenas
En el siguiente ejemplo, he agregado una restricción de cadena con una longitud mínima de 5 y máxima de 100 caracteres. Cuando llamo a este punto final a través de Postman y paso un texto con un tamaño de 3, arroja una excepción como se muestra a continuación.
from typing import Optional
from fastapi import FastAPI, Query
import uvicorn
app = FastAPI()
@app.get("/orders/")
async def read_orders(query: Optional[str] = Query(None, min_length=5, max_length=100)): #defining the constraints
results = {"order": [{"order_id": "Order_1"}, {"order_id": "Order_2"}]}
return results
if query:
results.update({"query": query})
if __name__ == "__main__":
uvicorn.run("parameter-validations:app")
Screenshot created by the author
En el siguiente ejemplo, agregué una restricción numérica con un valor mínimo de 1 y un máximo de 100. Cuando llamo a este punto final a través de Postman y paso 0, arroja una excepción como se muestra a continuación.
from typing import Optional
from fastapi import FastAPI, Query
import uvicorn
app = FastAPI()
@app.get("/orders/")
async def read_items(order_count: int = Query(gt=1, lt=100)): # defining the constraints
results = {"order_count": order_count}
return results
if __name__ == "__main__":
uvicorn.run("parameter-validations:app")
Screenshot created by the author
Pydantic es una biblioteca de Python utilizada para realizar la serialización y validación de datos.
FastAPI tiene integración con Pydantic . Esto asegura en tiempo de ejecución analizar, evaluar e informar al usuario a través del IDE sobre los errores relacionados con el tipo.
A continuación puede encontrar un mensaje de error de muestra;
fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that False is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/
La creación de productos de datos requiere que muchos equipos diferentes trabajen juntos; por ejemplo, ciencia de datos, aprendizaje automático, ingeniería de software, etc. En esta colaboración multifuncional, la alineación en el manejo de errores y la mensajería se vuelve crucial. FastAPI admite el manejo personalizado de errores con mensajes y códigos de estado.
from fastapi import FastAPI, HTTPException
import uvicorn
app = FastAPI()
cities = {1: "Berlin", 2: "Hamburg", 3: "München"}
@app.get("/cities/{city_id}")
async def read_city_id(city_id: int):
if city_id not in cities:
raise HTTPException(status_code=404, detail="City id is not found") # status code and error message is defined
results = {"city": cities[city_id]}
return results
if __name__ == "__main__":
uvicorn.run("error-message:app")
Screenshot created by the author
FastAPI apoya a los desarrolladores con puntos finales interactivos y fáciles de probar generados automáticamente en el navegador. Al seguir el enlace a continuación, será dirigido a las rutas que generó.
http://localhost:8000/docs
Screenshot created by the author
La documentación permite a los usuarios probar los puntos finales creados. Solo tienes que hacer clic en el botón "Pruébalo" .
Para probar las validaciones numéricas, pasé 0 al recuento de pedidos y la API devolvió el mensaje de error y el estado 422 automáticamente.
Modelo de aprendizaje automático en servicio con FastAPI
Como hemos aprendido los conceptos básicos de FastAPI, estamos listos para usarlo para servir a nuestros modelos de aprendizaje automático.
En este ejemplo, utilicé un conjunto de datos de automóviles usados para predecir el valor del automóvil. El conjunto de datos contiene características sobre los automóviles de la marca y cuántos kilómetros se recorrieron con el automóvil. Para simplificar el ejemplo, no compartiré los pasos de limpieza de datos, preparación de datos y creación de modelos, sino que mostraré todo en un archivo pickle.
El código de Python carga el archivo pickle, crea un punto final de predicción y devuelve el precio previsto del automóvil.
from fastapi import FastAPI
import joblib
import numpy as np
import pandas as pd
import uvicorn
# passing title, version and description parameters to the class object
app = FastAPI(
title="Car Price Prediction",
version="1.0",
description="Model type: Linear Regression",
)
# loading previously saved pickle file
model = joblib.load("./LinearRegressionModel.pkl")
# creating predict end point
@app.get("/api/predict")
async def predict(
name: str, company: str, year: int, kms_driven: float, fuel_type: str
):
result = model.predict(
pd.DataFrame(
columns=["name", "company", "year", "kms_driven", "fuel_type"],
data=np.array([name, company, year, kms_driven, fuel_type]).reshape(1, 5),
)
)[0]
return result
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
Screenshot created by the author
Screenshot created by the author
Conclusión
FastAPI ya se ha convertido en el marco de referencia para fines de servicio de API en el dominio de datos. Todos los días leo otro artículo más que los equipos de datos migraron a FastAPI y cuánto se benefician de este cambio. Espero ver más actualizaciones en los próximos meses y años.
¡Felicitaciones a Sebastián Ramírez , su equipo y todos los colaboradores!
Muchas gracias por leer
Para mi serie de productos de datos , puede consultar los enlaces a continuación;
Gerente de productos de datos: el trabajo más crucial del siglo XXI
Pensamiento de producto para equipos de datos
¿Le gustaría ver nuestro menú "Producto de datos"?
Revolución de productos de datos
Puedes encontrarme en Linkedin y Mentoring Club

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































