La exposición de modelos es una de las últimas fases en el ciclo de vida de la mayoría de los proyectos de aprendizaje automático en los cuales se construyen modelos de ML. Cuando se finaliza el desarrollo del modelo, generalmente se desea poder ofrecer este servicio a los usuarios finales mediante una interfaz fácil de utilizar.
Una manera común de hacer esto es mediante una API RESTful. Una API RESTful es una interfaz de programación de aplicaciones que permite a los desarrolladores acceder a los recursos a través de solicitudes HTTP estándar. Permite exponer los modelos de ML de manera controlada y segura, ya que los usuarios sólo pueden acceder a los recursos que se les permiten mediante los verbos GET, POST, PUT o DELETE.
Para construir una API RESTful para exponer modelos de ML, se utilizan frameworks web como FastAPI, que proporcionan herramientas para construir servidores web y serializers que permiten la integración con modelos de aprendizaje automático. Esto permite que los usuarios puedan enviar solicitudes de predicción a través de una interfaz API y recibir respuestas clasificadas o regresadas por el modelo.
Para crear una API RESTful que exponga modelos se deben seguir ciertos pasos:
- Definir y entrenar el modelo: en primer lugar, es necesario definir el modelo de machine learning y entrenarlo con los datos que se van a utilizar.
- Preparar un script de predicción: después de entrenar el modelo, se debe preparar un script de predicción que permita utilizarlo para hacer predicciones.
- Crear una aplicación web: para exponer el modelo a través de una API RESTful es necesario crear una aplicación web que pueda manejar las solicitudes y respuestas a través de HTTP.
- Definir las rutas: en la aplicación web se deben definir las rutas que permitan acceder a las funcionalidades del modelo.
- Implementar la lógica de negocio: una vez definidas las rutas, se debe implementar la lógica de negocio que permita utilizar el modelo de predicción.
- Exponer la API: finalmente, se debe exponer la API para que pueda ser utilizada por otros sistemas o aplicaciones.
Para esto, en FastAPI la creación de una API RESTful es muy sencilla. Se pueden utilizar los decoradores especiales para especificar el tipo de solicitud HTTP y la ruta correspondiente:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
En este caso, se utilizan los decoradores @app.get para especificar la ruta y el tipo de solicitud HTTP (GET). La ruta puede incluir variables, como en el caso de /items/{item_id}. También se pueden especificar parámetros adicionales, como en el caso de q. Luego, se puede implementar la lógica de negocio utilizando funciones asincrónicas (async def). En este caso, se devuelve un diccionario con la información correspondiente.
Por supuesto, esto es solo un ejemplo muy básico. En la práctica, se debe pensar cuidadosamente en la estructura de la aplicación web y en cómo se van a exponer las funcionalidades del modelo de machine learning a través de la API RESTful.
Supongamos que tenemos un modelo de ML que predice el precio de una casa en función de sus características. Queremos crear una API RESTful usando FastAPI para que los usuarios puedan enviar los datos de entrada al modelo y recibir la predicción del precio como respuesta. Aquí hay un ejemplo de cómo podríamos crear la API RESTful:
- Definir los datos de entrada y salida: Primero, debemos definir los datos de entrada que necesitamos para hacer una predicción. En este caso, necesitamos información sobre la casa, como el número de habitaciones, el tamaño del lote y la ubicación. La salida de nuestro modelo será un número que representa el precio estimado de la casa. Podemos definir estos datos como una clase en Python:
class HouseInput(BaseModel):
bedrooms: int
lot_size: float
location: str
class HouseOutput(BaseModel):
price: float
- Crear la ruta de la API: Luego, creamos una ruta para nuestra API. En este caso, vamos a usar el método POST para enviar los datos de entrada como JSON y obtener la respuesta como JSON.
@app.post("/predict", response_model=HouseOutput)
async def predict_price(house: HouseInput):
# llama a la función del modelo para predecir el precio
price = predict(house)
# devuelve la respuesta como JSON
return {"price": price}
- Escribir la función del modelo: Finalmente, escribimos la función del modelo que toma los datos de entrada, los procesa y devuelve el precio estimado.
def predict(house: HouseInput) -> float:
# procesa los datos de entrada y hace una predicción usando el modelo
# por ejemplo:
return 50000 + house.bedrooms * 10000 + house.lot_size * 5000
Con esto, hemos creado una API RESTful simple para exponer nuestro modelo de predicción de precios de la casa. Los usuarios pueden enviar los datos de entrada a través de la API y recibir la respuesta como JSON en un formato fácil de leer y procesar.
Un ejemplo básico de cómo crear un servicio API RESTful utilizando FastAPI y PyTorch:
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
import torch
app = FastAPI()
class InputData(BaseModel):
input1: float
input2: float
class OutputData(BaseModel):
result: float
class MyModel(torch.nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.linear1 = torch.nn.Linear(2, 1)
def forward(self, x1, x2):
x = torch.cat((x1, x2), dim=1)
x = self.linear1(x)
return x
model = MyModel()
model.load_state_dict(torch.load("model_weights.pth", map_location=torch.device('cpu')))
@app.post("/predict")
def predict(input_data: InputData):
input1 = input_data.input1
input2 = input_data.input2
with torch.no_grad():
prediction = model(torch.tensor([[input1]], dtype=torch.float32), torch.tensor([[input2]], dtype=torch.float32))
output_data = OutputData(result=prediction.numpy()[0][0])
return output_data
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Nota que este es un ejemplo muy básico y que debes ajustarlo y personalizarlo para adaptarse a tu propio modelo. En el ejemplo, hemos definido la clase InputData y OutputData utilizando BaseModel de Pydantic. También hemos definido una clase de modelo simple MyModel que tiene una capa lineal. Después de cargar los pesos del modelo, definimos la ruta /predict que toma la entrada de datos y ejecuta el modelo para obtener la predicción. El resultado se devuelve a través de la respuesta de API. Luego, podemos ejecutar nuestro servicio API RESTful utilizando Uvicorn. ¡Espero que esto te ayude a comenzar con FastAPI y PyTorch para crear tu propio servicio API RESTful!
-
Introducción a FastApi y Deploy de modelos de Machine Learning.
-
Preparación de datos y entrenamiento de modelos de Machine Learning.
-
Selección de modelos y validación de resultados.
-
Selección de métricas para evaluar modelos.
-
Creación de una API RESTful para la exposición de modelos.
-
Configuración de ambiente de desarrollo y producción.
-
Creación y configuración de base de datos para almacenamiento de datos.
-
Pruebas de integración para validar la API.
-
Gestión de paquetes y dependencias con herramientas como Pipenv.
-
Integración con herramientas de automatización de procesos de CI/CD para despliegue continuo de cambios en producción.