6 · Un endpoint de predicción con FastAPI
Un modelo solo se vuelve un servicio cuando algo puede llamarlo por HTTP. FastAPI convierte tu `.joblib` cargado en un endpoint `/predict` con un esquema de petición tipado — y validar las características entrantes antes de predecir es lo que separa una API robusta de una frágil.
FastAPI envuelve tu modelo cargado en un endpoint HTTP `/predict`: un modelo de petición de Pydantic VERIFICA EL TIPO del JSON entrante, el modelo se carga UNA VEZ al arrancar (no por petición), y VALIDAS el vector de características (longitud correcta, finito, en rango) ANTES de llamar a `model.predict` — convirtiendo entrada basura en un error claro en lugar de una predicción incorrecta.
Sin esto:
Sin una capa de serving tu modelo no puede ser llamado por nada; sin validación de entrada, una petición malformada o tumba al worker o — peor — devuelve silenciosamente una predicción segura y sin sentido.
Tienes un artefacto .joblib reproducible y puedes empaquetarlo en Docker. Pero un modelo en un archivo todavía no puede hacer nada por un usuario — algo tiene que llamarlo. La forma estándar es exponerlo por HTTP como un servicio web, y la herramienta moderna de Python para eso es FastAPI.
FastAPI te da tres cosas que importan para el serving de modelos:
1. Un esquema de petición tipado (Pydantic). Declaras la forma de la petición entrante como una clase de Python. Pydantic entonces rechaza automáticamente cualquier petición que no coincida — tipos incorrectos, campos faltantes — antes de que tu código siquiera corra, devolviendo un error 422 claro e incluso auto-generando documentación OpenAPI. Una petición como {"features": [1.2, -0.4]} se valida contra tu esquema gratis.
2. Cargar el modelo UNA VEZ al arrancar. Cargas el .joblib cuando la app inicia — no en cada petición. Cargar es lento (leer y deserializar el archivo); las peticiones deben ser rápidas. Así que el modelo se vuelve un objeto a nivel de módulo que el manejador de peticiones reutiliza. Cargar por petición haría cada predicción lenta y desperdiciaría memoria.
3. Una ruta /predict. Una función decorada con @app.post("/predict") recibe la petición validada, ejecuta el modelo y devuelve JSON. Este es el endpoint de predicción real que los clientes golpean.
Pero el JSON tipado no basta — valida también las CARACTERÍSTICAS. Pydantic verifica que features sea una lista de números. No sabe que tu modelo espera exactamente, digamos, 4 características, ni que deben ser finitas y dentro de un rango sensato. Una petición con el número incorrecto de características, o con NaN/inf, o un valor descabelladamente fuera de rango, pasará de largo a Pydantic y llegará a model.predict — donde o lanza un error críptico de forma o, peor, devuelve una predicción segura pero sin sentido. Así que antes de llamar a model.predict, verificas explícitamente: longitud correcta, todas finitas, dentro de los límites esperados — y lanzas un error claro si no. La celda ejecutable de abajo implementa exactamente esta compuerta de validación sobre un modelo de juguete cargado, mostrando una petición válida que tiene éxito y una inválida que es rechazada limpiamente.
La app de FastAPI en sí no corre en el navegador (necesita un servidor), así que es solo para leer; la lógica pura de predicción-y-validación sí es ejecutable abajo.
Un `app.py` de FastAPI: cargar el modelo joblib una vez al arrancar, un esquema de petición/respuesta de Pydantic, y una ruta `/predict` que valida el vector de características antes de llamar al modelo.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Por qué importa un esquema de petición tipado (Pydantic) para una API de serving de modelos?
- FastAPI expone el modelo por HTTP: un esquema de petición de Pydantic verifica el tipo del JSON, y una ruta `/predict` ejecuta el modelo y devuelve JSON.
- Carga el modelo `.joblib` UNA VEZ al arrancar como un objeto a nivel de módulo, nunca por petición — cargar es lento y las peticiones deben ser rápidas.
- Pydantic protege la forma del JSON, pero TÚ debes validar el vector de características (longitud, finito, en rango) justo antes de `model.predict` — o arriesgas un crash o una predicción basura pero segura.
Casi todo modelo de ML en línea se sirve detrás de un endpoint `/predict` de FastAPI (o similar) con un esquema tipado y una compuerta de validación de entrada — es la forma estándar de un servicio de inferencia en tiempo real.
Si lo quitas: Tu modelo seguiría siendo un archivo que no se puede llamar, o lo servirías sin verificaciones de entrada — dejando que peticiones malformadas tumben workers o extraigan predicciones silenciosas y sin sentido.