AI & HPC

Cuánta vRAM Necesita tu Modelo de IA: Guía de Dimensionado

Antes de alquilar una GPU conviene saber cuánta memoria necesita de verdad el modelo que quieres servir. La cuenta no es complicada, pero casi nadie la hace completa: se calculan los pesos y se olvida el KV cache, y luego el modelo no arranca. Aquí está la aritmética entera, con las fórmulas para que la hagas con tu modelo.

calendar_today schedule 9 min

Por qué casi todo el mundo se queda corto

La pregunta llega siempre igual: «quiero servir un modelo de 70B, ¿me vale una tarjeta de 48 GB?». La respuesta honesta es «depende», pero no de nada misterioso: depende de con cuántos bits guardes los pesos y de cuánto contexto quieras atender a la vez. Son dos números que puedes calcular en treinta segundos, y la mayoría de los dimensionados fallidos vienen de haber calculado solo el primero.

La memoria que consume un modelo en inferencia tiene tres partidas: los pesos, el KV cache y el overhead del runtime. La primera es fija y fácil. La segunda crece con el contexto y con el número de peticiones simultáneas, y es la que sorprende. La tercera es pequeña pero no nula.

La parte fácil: los pesos

Los pesos ocupan número de parámetros × bytes por parámetro. Nada más. Un modelo de 8.000 millones de parámetros en precisión de 16 bits ocupa 8.000 millones × 2 bytes = 16 GB. La tabla sale sola:

Memoria de los pesos según la precisión. Solo pesos, sin KV cache ni overhead.
Modelo FP16 / BF16 FP8 / INT8 INT4
8B16 GB8 GB4 GB
13B26 GB13 GB6,5 GB
32B64 GB32 GB16 GB
70B140 GB70 GB35 GB

Ya se ve el primer corte: un 70B en FP16 no cabe en ninguna tarjeta de 96 GB. O lo cuantizas, o repartes el modelo entre varias GPU.

La cuantización cambia la ecuación

Cuantizar es guardar cada peso con menos bits. Pasar de FP16 a INT4 divide la memoria por cuatro y, en la mayoría de tareas de generación de texto, la pérdida de calidad es modesta si se usa un método moderno. No es gratis: la calidad cae más en razonamiento largo y en código que en conversación, y conviene medirlo con tu propio conjunto de evaluación antes de darlo por bueno.

Regla práctica: si el modelo cabe en FP8 dentro de tu presupuesto de memoria, quédate en FP8. Baja a INT4 solo cuando sea la única forma de que entre, o cuando necesites el hueco libre para atender más peticiones a la vez.

El KV cache, el coste que se olvida

Durante la generación, el modelo guarda las claves y los valores de atención de cada token que ya ha procesado, para no recalcularlos. Eso es el KV cache, y crece de forma lineal con la longitud del contexto y con el número de peticiones simultáneas. La fórmula es:

KV cache = 2 × capas × cabezas_kv × dim_cabeza × contexto × bytes × peticiones

El 2 son la clave y el valor. Con un Llama 3.1 de 70B —80 capas, 8 cabezas KV por atención agrupada, dimensión de cabeza 128— en FP16 y una sola petición:

  • 8.192 tokens de contexto: 2 × 80 × 8 × 128 × 8.192 × 2 = 2,5 GiB
  • 32.768 tokens: 10 GiB

Parece poco hasta que sirves a varios usuarios. Diez peticiones concurrentes de 32k contexto sobre ese mismo modelo son 100 GiB solo de KV cache, más que la tarjeta entera. Por eso el dimensionado de un servicio con concurrencia real no se parece en nada al de una prueba de laboratorio con una sola conversación.

Hay dos atajos legítimos: cuantizar también el KV cache a 8 bits, que lo reduce a la mitad, y limitar el contexto máximo por petición a lo que de verdad usas. Un límite de 8k en lugar de 128k ahorra más memoria que cualquier otra decisión de la lista.

Lo que no aparece en la cuenta

Al total hay que sumarle las activaciones intermedias, los búferes del runtime y la fragmentación del asignador de memoria. Con vLLM o TensorRT-LLM, reservar un 10-15 % extra sobre la suma de pesos y KV cache es una estimación razonable. Si el cálculo te deja justo en el límite de la tarjeta, no cabe.

Qué cabe en 24, 48 y 96 GB

Juntando las tres partidas, con 8k de contexto, una petición y un 15 % de overhead, esto es lo que entra en cada tamaño de instancia GPU:

Pesos + KV cache a 8k + 15 % de overhead. Con más concurrencia o más contexto, sube.
Instancia Entra cómodo Entra apurado
24 GB8B en FP8 (10 GB) · 13B en INT4 (9 GB)8B en FP16 (20 GB) · 13B en FP8 (16 GB) · 32B en INT4 (20 GB)
48 GB13B en FP16 (31 GB) · 32B en FP8 (39 GB)70B en INT4 (43 GB)
96 GB32B en FP16 (75 GB) · 70B en INT4 (43 GB)70B en FP8 (83 GB)

La columna «entra apurado» es exactamente donde se rompen los despliegues: el modelo carga, las primeras peticiones responden y al tercer usuario concurrente el servidor se queda sin memoria. Si tu caso está ahí, sube de tamaño.

Cuándo necesitas más de una tarjeta

Cuando el modelo no entra en una sola GPU ni cuantizado, hay que repartirlo. El reparto por tensores divide cada capa entre varias tarjetas y exige interconexión rápida entre ellas; el reparto por capas es más tolerante al ancho de banda pero deja GPUs esperando. En cualquiera de los dos casos ya no hablamos de una instancia sino de un servidor GPU dedicado con dos, cuatro u ocho tarjetas.

El otro motivo para dar el salto es la concurrencia. Un modelo pequeño atendiendo a cien usuarios a la vez consume más memoria en KV cache que un modelo grande atendiendo a uno, y ahí el cuello no son los pesos sino el número de peticiones que quieres mantener vivas.

Cómo medirlo tú mismo

La cuenta de servilleta sirve para elegir tamaño; para confirmar, mídelo. Carga el modelo con tu runtime, lanza la carga que esperas en producción y observa el consumo real:

nvidia-smi --query-gpu=memory.used,memory.total --format=csv -l 1

Los parámetros exactos de tu modelo —capas, cabezas KV, dimensión de cabeza— están en el config.json del repositorio del modelo, así que puedes sustituirlos en la fórmula de arriba en lugar de fiarte de una tabla genérica. La calculadora de tamaño de modelo de Hugging Face hace la parte de los pesos automáticamente.

Y si la tarjeta se comparte, asegúrate de que el reparto es por hardware y no por turnos: en una partición MIG la memoria que te asignan es tuya y nadie puede invadirla, mientras que en un reparto por software el consumo del vecino sí te afecta. Esa diferencia es la que hace que una instancia de 24 GB sea realmente de 24 GB.

Si todavía estás decidiendo si te conviene alojar el modelo o seguir pagando por token, la otra mitad de la cuenta está en LLM local vs API: ahí comparamos coste, latencia y privacidad. Esta guía te dice cuánta GPU necesitas; aquella, si merece la pena tenerla.

Preguntas frecuentes

¿Cuánta vRAM necesita Llama 3.1 de 70B? expand_more
Depende de la precisión. En FP16 los pesos solos ocupan 140 GB, así que no entra en una sola tarjeta de 96 GB. En FP8 son 70 GB y en INT4 unos 35 GB, a los que hay que sumar el KV cache —2,5 GiB con 8.192 tokens de contexto y una petición— y un 10-15 % de overhead del runtime. En la práctica, un 70B cuantizado a INT4 funciona con holgura en una instancia de 96 GB y entra apurado en una de 48 GB.
¿Qué es el KV cache y por qué importa tanto? expand_more
Es la memoria donde el modelo guarda las claves y valores de atención de los tokens ya procesados para no recalcularlos en cada paso. Crece de forma lineal con la longitud del contexto y con el número de peticiones simultáneas, de modo que diez usuarios con 32.000 tokens de contexto pueden consumir más memoria que los propios pesos del modelo. Es la partida que más dimensionados echa abajo.
¿Pierdo mucha calidad al cuantizar a INT4? expand_more
Menos de lo que mucha gente teme, pero no es gratis. Con métodos modernos la degradación en generación de texto conversacional suele ser pequeña, mientras que en razonamiento largo y en código se nota más. La recomendación es quedarse en FP8 si el presupuesto de memoria lo permite y bajar a INT4 solo cuando sea la única forma de que el modelo entre o de ganar espacio para más concurrencia.
¿Me basta con 24 GB de vRAM? expand_more
Para un modelo de 8B en FP8, para un 13B cuantizado o para generación de embeddings y RAG, sí con holgura. Para un 8B en FP16 o un 32B en INT4 entra, pero sin margen para concurrencia. Si vas a servir a varios usuarios a la vez con contextos largos, cuenta el KV cache antes de decidir: es lo que marca la diferencia entre una instancia de 24 GB y una de 48 GB.
¿Cómo calculo el KV cache de mi modelo concreto? expand_more
Con la fórmula 2 × capas × cabezas_kv × dimensión_de_cabeza × contexto × bytes × peticiones. Los tres primeros valores están en el config.json del repositorio del modelo: num_hidden_layers, num_key_value_heads y la dimensión de cabeza, que suele ser hidden_size dividido entre num_attention_heads. Los bytes son 2 en FP16 y 1 si cuantizas el propio KV cache a 8 bits.
IA GPU vRAM Inferencia LLM MIG

Dinos qué modelo quieres servir

Te decimos si te basta con 24 GB o necesitas la tarjeta entera, y lo probamos antes de que firmes nada. Sin permanencia.