Saltar al contenido principal

08 · Fundamentos de ML y LLMs

Servir modelos

Ejecutar un modelo en tus propias máquinas o a través de un proveedor, qué define de verdad el costo y cómo compartir un modelo de forma segura.

11 minCaso de estudio: Adapta (se abre en una ventana nueva) · docket (se abre en una ventana nueva)

Un modelo entrenado es un archivo grande de números, sus pesos. Para usarlo, una aplicación necesita un servidor de : un programa que carga los pesos en memoria, recibe solicitudes y genera respuestas con la rapidez y el costo necesarios para que sea útil. Es sobre todo un problema clásico de infraestructura (capacidad, muchos usuarios a la vez, aislamiento, autenticación) con algunas particularidades propias.

Esta lección cubre cinco decisiones: si correr los modelos tú mismo o usar un servicio hospedado, cómo hacer que un modelo quepa en memoria, qué hace el motor que lo ejecuta, qué ofrece la API común cuando muchos clientes comparten un servidor y qué determina el costo y la velocidad. Adapta es el ejemplo del lado del servidor; docket, el del lado del cliente.

Correrlo tú mismo o usar una API hospedada

API hospedada Servidor propio
Modelos los más capaces del mercado modelos de pesos abiertos
Costo por token hardware y operación, fijo
Datos salen hacia el proveedor quedan en tu infraestructura
Operación casi ninguna tuya: GPUs, actualizaciones, monitoreo
Personalización lo que ofrezca el proveedor total, incluidos tus propios adapters

No es una elección binaria: muchos equipos usan un modelo hospedado para las tareas difíciles y uno local para el trabajo de alto volumen o sensible.

Hacer que el modelo quepa

El tamaño de un modelo se cuenta en parámetros, los números individuales que aprendió. A 16 bits cada uno, un modelo de 7 mil millones de parámetros necesita unos 14 GB de memoria solo para los pesos. La guarda cada número con menos precisión, por ejemplo 4 bits en lugar de 16, como una foto comprimida que conserva casi toda la imagen en un archivo más pequeño. El modelo usa menos memoria y corre más rápido, a cambio de una pérdida de calidad que depende del modelo, del método y de la tarea.

Dos formatos de archivo aparecen seguido. , el que usa el popular motor llama.cpp, es un solo archivo con los pesos (a menudo cuantizados) y todo lo necesario para usarlos. es el formato habitual en el ecosistema de Hugging Face, normalmente en precisión completa o media.

Qué hace el motor

Generar texto tiene dos fases. Primero el motor lee todo el de una vez (prefill). Después escribe la respuesta un a la vez, es decir, una palabra o un pedazo de palabra (decode). Para no reprocesar el prompt en cada paso, guarda notas de lo que ya leyó: la KV cache. Esas notas crecen con el largo del contexto y con la cantidad de solicitudes en curso, por eso los contextos largos y los muchos usuarios simultáneos compiten por la misma memoria.

  1. Promptla solicitud completa
  2. Prefilllo lee todo de una vez
  3. KV cachenotas de todo lo leído
  4. Decodeescribe un token

cada token nuevo se suma a las notas y el decode vuelve a correr

El prompt se lee una vez; la respuesta sale token a token. Las notas del medio son las que llenan la memoria.

Un modelo base, muchos comportamientos

Un adapter es un archivo pequeño que se aplica sobre un modelo base para cambiar su comportamiento, un poco como un lente sobre una cámara. Así un mismo modelo base puede ofrecer muchos comportamientos, eligiendo el adapter en cada solicitud. Cuánto cuesta depende del motor. En el backend llama.cpp de Adapta, cada combinación de base y adapter es una copia completa en memoria. En vLLM, varios adapters comparten un mismo modelo base cargado y pueden atenderse en el mismo lote, hasta un límite configurado.

En Adapta

  • Backend llama.cppuna copia completa por combinación
    • Base + adapter A
    • Base + adapter B
    • Base + adapter C
  • Backend vLLMuna base, adapters a demanda
    • Base compartida
    • Adapters A, B y C
Tres endpoints con fine-tuning cuestan tres modelos completos con llama.cpp, pero una base más tres archivos pequeños con vLLM. Fuente: Operations Runbook

La API compatible con OpenAI

El formato de solicitudes de chat completions de OpenAI se volvió el idioma común entre aplicaciones y modelos; la mayoría de los servidores y proveedores lo aceptan. Puedes cambiar de proveedor cambiando una dirección y un nombre de modelo. Pero "compatible" no significa "equivalente". El soporte de herramientas, , streaming (enviar la respuesta a medida que se escribe) o el reporte de tokens en caché varía entre servidores.

Compartir un servidor

Cuando varios equipos o clientes comparten un servidor, un esquema llamado , cada llamada tiene que responder dos preguntas: quién llama y a qué puede acceder. (docket, en cambio, es software beta para un solo operador, sin tenants ni cuotas, según su README).

En conjunto, una solicitud de chat a Adapta pasa por estos pasos:

En Adapta

  1. Revisar la llavedebe coincidir con el endpoint pedido
  2. Armar el promptsuma los documentos del proyecto, si hay, recortados para que quepan
  3. Generaruna solicitud a la vez por modelo
  4. Contar y responderse registran los tokens y sale la respuesta
El camino de servicio de un modelo autohospedado: primero el control de acceso, después el motor. Con llama.cpp, cada modelo cargado atiende una solicitud a la vez. Fuente: Architecture

Qué determina el costo y la velocidad

  • Largo de la respuesta. El prompt se lee en paralelo, pero la respuesta se escribe token a token. Las respuestas largas dominan la espera, y los proveedores suelen cobrar más por los tokens de salida.
  • Tamaño del contexto. Más contexto significa más trabajo en el prefill y una KV cache más grande.
  • Batching (procesar en lotes). Agrupar solicitudes aprovecha mejor la GPU, pero una solicitud individual puede esperar más.
  • Caché de prompts. Muchos servicios reutilizan a menor precio un inicio de prompt idéntico y estable, como las instrucciones de sistema y las definiciones de herramientas.
  • Tamaño del modelo. El factor más grande. De ahí el : enviar cada tarea al modelo más pequeño que la resuelva bien.

El routing y los se ven a fondo en Contexto, routing y costo.

En la práctica

La decisión central es qué tráfico justifica correr tu propia inferencia.

  • Datos que no pueden salir de tu infraestructura vuelven el autohospedaje un requisito, no una opción.
  • Un volumen alto y constante paga la capacidad fija; el tráfico en ráfagas suele salir más barato por token en una API hospedada.
  • Alguien tiene que operarlo: las GPUs, las actualizaciones de modelos y la seguridad del endpoint. Un servidor sin auditar expuesto a la red es un riesgo mayor que una API hospedada.
  • Mide latencia y calidad con tu propio tráfico antes de comprometerte. Los números genéricos rara vez se trasladan.

Para profundizar

La documentación de Adapta profundiza en el lado del servidor, y la de docket en el del cliente (en inglés):

  • Learning the system explica GGUF, la cuantización y por qué un modelo cargado atiende las solicitudes una por una, con analogías cotidianas.
  • Architecture muestra los contenedores de Adapta y sigue una solicitud de chat desde la revisión de la llave hasta la respuesta.
  • Operations runbook da los tamaños de memoria por modelo y configura el backend opcional con vLLM para muchos adapters.
  • Models, gateways, and coding harnesses muestra cómo docket registra un endpoint compatible con OpenAI y enumera lo que esa compatibilidad no cubre.

Para llevar

  • Servir un modelo es trabajo de infraestructura: memoria, concurrencia, autenticación y costo, con la KV cache como recurso central.
  • La cuantización cambia algo de calidad por memoria y velocidad; evalúa en condiciones parecidas a las de servicio.
  • La API compatible con OpenAI facilita cambiar de proveedor, pero no garantiza las mismas funciones.
  • Los adapters permiten que un modelo base tenga muchos comportamientos; el costo depende de si el motor comparte la base entre adapters.
  • El largo de la respuesta y el tamaño del modelo dominan la latencia; el routing y la caché son las palancas principales.

Comprueba lo aprendido

¿Por qué los contextos largos y los muchos usuarios simultáneos compiten en un mismo servidor?

Ambos hacen crecer la KV cache: guarda notas de cada token de contexto, para cada solicitud en curso. Los dos consumen la misma memoria.

¿Por qué el backend llama.cpp de Adapta escala mal con muchos endpoints con fine-tuning?

Cada combinación de base y adapter es una copia completa en memoria, y solo unas pocas caben a la vez. vLLM permite que varios adapters compartan un mismo modelo base cargado.

¿Qué significa que un servidor sea "compatible con OpenAI" y qué no garantiza?

Acepta el mismo formato de solicitud y respuesta de chat completions, así que un cliente puede cambiar de servidor cambiando la dirección y el nombre del modelo. No garantiza el mismo soporte de herramientas, salida estructurada, streaming o reporte de uso.