La máquina se congeló en vez de ir más despacio
El modelo más su caché de contexto superaron la RAM, y el kernel empezó a paginar los pesos en cada token. Que quepa en memoria, o baje un tamaño — no hay ajuste intermedio.

Seis pasos para tener un LLM propio respondiendo desde su propio hardware — la aritmética que predice sus tokens por segundo antes de comprar la máquina, qué modelo cabe en 4, 8, 16 o 32 GB, la autenticación que Ollama no trae de serie, y una lista honesta de las tareas que no encajan. Probado en Debian 12.
Dimensionar
Ancho de banda, no núcleos
Instalar
Ollama
Medir
Sus propios tokens/s
Proteger
TLS + un token
Conectar
Una sola base URL
Acotarlo
Contexto, RAM, disco
Casi todo lo que se ha escrito sobre ejecutar modelos de lenguaje en local habla de tarjetas gráficas, lo cual no sirve de mucho si lo que tiene es una máquina virtual. El modelo mental útil es más simple de lo que sugiere el discurso sobre GPU, y cabe en una frase: para producir un solo token, un modelo denso tiene que leer de memoria cada uno de sus pesos. No algunos: todos, una vez por token.
Ese único hecho resuelve toda la cuestión del rendimiento. La velocidad de generación no la decide cuántos núcleos alquile; la decide con qué rapidez puede la máquina hacer fluir el modelo desde la RAM. Lo cual le da un techo que puede calcular en el reverso de un sobre antes de gastarse nada:
tokens per second ≈ memory bandwidth (GB/s) ÷ model size (GB)
Un modelo de 8B cuantizado ocupa unos 5 GB. En un host virtualizado donde realísticamente se puede alcanzar un caudal en torno a 20 GB/s, el techo está cerca de cuatro tokens por segundo, y la cifra que se observará en la práctica será quizá entre la mitad y dos tercios de eso. Aproximadamente tres palabras por segundo. Tómelo como un hecho sobre la carga de trabajo y no como una decepción: es lento para una ventana de chat y perfectamente adecuado para una tarea que clasifica un documento y devuelve una línea de JSON.
Los núcleos siguen importando, solo que no por la razón que la gente supone. Más hilos ayudan hasta que saturan la ruta de memoria, algo que en estas máquinas ocurre pronto — a menudo entre cuatro y ocho hilos. Pasado ese punto, los núcleos de más están ociosos mientras todo espera a la RAM. Por eso una máquina de dieciséis núcleos no es cuatro veces más rápida que una de cuatro núcleos generando texto, y por eso pagar por núcleos con la esperanza de ganar velocidad es la forma más habitual de comprar el nivel equivocado.
Leer es rápido, escribir es lento. Cada petición tiene dos fases, y no se comportan nada parecido. Procesar el prompt — el prefill — es una operación matricial limitada por cómputo sobre toda la entrada a la vez, y corre muchas veces más rápido que la generación. Producir la respuesta es la parte limitada por memoria descrita antes, un token cada vez. Así que entregarle al modelo un documento de dos mil palabras y pedirle tres frases de vuelta es una carga de trabajo cómoda, mientras que pedirle un ensayo de dos mil palabras no lo es. Diseñe sus prompts en torno a esa asimetría, y una máquina de CPU se siente mucho mejor de lo que sugiere su tasa de tokens.
| Nivel | Memoria | El modelo más grande que resulta cómodo | Orden de magnitud | Para qué sirve |
|---|---|---|---|---|
| Sentinel · $3.90 | 4 GB | 3B en Q4 (~2 GB) | una frase por segundo | Clasificación, etiquetado, enrutamiento, embeddings |
| Garrison · $7.90 | 8 GB | 8B en Q4 (~5 GB) | unas pocas palabras por segundo | El valor por defecto. Resúmenes, extracción de JSON, respuestas de RAG |
| Ravelin · $16.90 | 16 GB | 14B en Q4 (~9 GB) | aproximadamente la mitad de lo anterior | Razonamiento más difícil, contexto largo, pipelines por lotes |
| Bulwark · $32.90 | 32 GB | 32B en Q4 (~20 GB) | menos de una palabra por segundo | Calidad antes que velocidad. Solo trabajo asíncrono |
| Citadel · $62.90 | 64 GB | 70B en Q4 (~40 GB) | minutos por respuesta | Cabe. No es interactivo. Trabajos nocturnos |
Los tamaños de modelo son las habituales cuantizaciones Q4_K_M, que cambian una cantidad pequeña y por lo general imperceptible de calidad por menos de la mitad de memoria. La columna de velocidad es un orden de magnitud derivado de la división de arriba, no un benchmark — la idea del paso 03 es que usted mida su propia máquina en lugar de fiarse de una tabla, incluida esta.
La versión honesta de esta sección vale más que una entusiasta, porque la forma más rápida de abandonar un modelo autoalojado es ponerlo a hacer justo la tarea en la que peor rinde y concluir que toda la idea era una tontería.
Cabe con holgura. Cualquier cosa cuya salida sea corta y cuyo valor esté en el criterio y no en la prosa. Clasificar un mensaje entre un puñado de categorías. Decidir si un ticket de soporte es urgente. Extraer cinco campos de una factura como JSON. Resumir un hilo en tres frases. Etiquetar un documento. Reescribir la descripción de un producto. Traducir una cadena corta. Detectar si dos registros describen a la misma persona. Tachar nombres de un párrafo antes de que vaya a ningún otro sitio. Cada una de esas tareas consume una entrada larga y produce una salida corta, que es exactamente la asimetría que una CPU maneja bien.
Cabe, con paciencia. Trabajo sin ningún humano esperando la respuesta. Lotes nocturnos, workers de colas, una pasada nocturna sobre los documentos del día, un informe programado. Si nada depende de esperar la respuesta, una tasa de tokens que sería intolerable en una ventana de chat deja de importar por completo — un trabajo que corre durante seis minutos a las tres de la madrugada es sencillamente un trabajo que se hizo.
No cabe. Un asistente interactivo que a la gente realmente le guste usar: a estas velocidades el cursor se arrastra y la experiencia es peor que no tener asistente. Generación de textos largos —escríbeme dos mil palabras— donde toda la salida es la parte lenta. Agentes de programación que iteran sobre un repositorio grande, donde tanto el contexto como el nivel de calidad exigido superan lo que un modelo pequeño puede sostener. Cualquier cosa que necesite un contexto de cien mil tokens, donde solo la caché ya desborda la máquina. Y los modelos de imagen o vídeo, que son una disciplina completamente distinta y sí necesitan de verdad una GPU.
Si su carga de trabajo vive en ese último grupo, la respuesta sensata no es comprar una máquina de CPU más grande — es un híbrido. Mantenga un modelo local para el grueso de las llamadas y enrute el puñado que necesita razonamiento de vanguardia hacia una API alojada en la nube, que es exactamente la forma que describe la guía sobre ejecutar un agente de IA 24/7 para la parte del runtime. Esa guía dejó deliberadamente el modelo en sí fuera de alcance. Esta es la mitad que faltaba.
Trabaje hacia atrás desde la tarea. Decida qué tiene que hacer el modelo, elija el tamaño más pequeño que lo haga, consulte lo que ocupa ese tamaño en Q4_K_M, y después añada los gastos extra:
RAM needed = model file + KV cache + ~2 GB for the system
3B Q4_K_M ≈ 2.0 GB KV cache at 8k context ≈ 0.5–1 GB
8B Q4_K_M ≈ 4.9 GB KV cache at 32k context ≈ 2–4 GB
14B Q4_K_M ≈ 9.0 GB
32B Q4_K_M ≈ 20.0 GB
70B Q4_K_M ≈ 40.0 GB
La caché clave-valor es el gasto extra que la gente olvida. Cada token que ya forma parte de la conversación se mantiene en memoria para que el modelo no tenga que recalcularlo, y ese almacén crece con el contexto que se permita. Duplicar el contexto lo duplica aproximadamente a él también. Un modelo que cabe con un contexto de 4k puede dejar de caber en 32k, y fallará en la décima petición y no en la primera, lo que lo hace parecer un misterio en vez de un error de cálculo.
Aquí no hay degradación elegante. Cuando el total supera la RAM, el kernel no se ralentiza con educación: empieza a paginar los pesos del modelo hacia y desde el disco, en cada token. Una generación de cuatro segundos se convierte en cuatro minutos, el load average sube a decenas, y todo lo demás en la máquina —la base de datos, el servidor web, su sesión SSH— sufre con ello. Caber en memoria no es una optimización. Es el requisito.
En el panel: Order → VPS → el nivel que haya señalado la aritmética, imagen Debian 12. No se requiere ninguna dirección de correo para abrir la cuenta, no se pide ningún documento de identidad en ningún momento, y la factura se salda en Monero, Bitcoin, Lightning o cualquiera de los otros activos admitidos — lo cual importa más aquí que en un servidor web corriente, por las razones que expone la guía pilar sobre alojamiento VPS anónimo, y que el capítulo de privacidad más abajo aplica específicamente a los prompts.
Refuerce primero la máquina — SSH solo por clave, un firewall que no permita nada que usted no haya pedido, actualizaciones de seguridad desatendidas. La checklist de la primera hora lleva alrededor de una hora, y esta es una máquina que dentro de poco va a guardar cada pregunta que usted le haga.
A continuación instale el runner. Ollama es llama.cpp con un registro de modelos, una API REST y una unidad systemd envolviéndolo todo, y el instalador de una línea configura los tres a la vez:
apt update && apt install -y curl
curl -fsSL https://ollama.com/install.sh | sh
systemctl status ollama --no-pager
ss -ltnp | grep 11434
# → 127.0.0.1:11434 — loopback only. Leave it that way.
Esa última línea es la que hay que leer dos veces. Recién instalado, el servicio escucha en la interfaz de loopback, que es exactamente lo correcto, y el error más habitual de los próximos diez minutos es poner OLLAMA_HOST en 0.0.0.0 porque algo en otra máquina no podía alcanzarlo. El paso 04 explica cómo alcanzarlo correctamente; no hay ninguna versión de esto en la que el puerto 11434 dé directamente a internet.
Merece la pena fijar ahora dos ajustes en vez de descubrirlos más tarde. Los modelos se guardan por defecto bajo /usr/share/ollama y pesan mucho, así que apunte eso a donde tenga sitio. Y el valor por defecto mantiene un modelo residente en RAM durante cinco minutos después de la última petición, lo cual es generoso en una máquina que también hace otras cosas:
systemctl edit ollama
[Service]
Environment="OLLAMA_MODELS=/var/lib/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
systemctl daemon-reload && systemctl restart ollama
Tanto las peticiones en paralelo como tener varios modelos cargados a la vez multiplican el uso de memoria, y en una máquina dimensionada para sostener exactamente un modelo no sobra ni un gigabyte para una segunda copia. Serializar la cola no es una limitación de este hardware; es la única configuración que no se cae.
Descargue un modelo. Cualquiera de los modelos instruct de clase 8B actuales sirve para una primera medición — son lo bastante parecidos en tamaño como para que el tiempo le hable del hardware y no del modelo:
ollama pull llama3.1:8b # ~4.9 GB at Q4_K_M
ollama list
ollama ps # nothing resident yet
Ahora ejecute una generación con los tiempos activados. El número que importa es la tasa de generación — tokens producidos por segundo, una vez leído el prompt:
ollama run llama3.1:8b --verbose "Reply with exactly one sentence about the Baltic Sea."
total duration: 14.2s
load duration: 3.1s
prompt eval count: 24 token(s)
prompt eval rate: 92.11 tokens/s ← reading: fast
eval count: 38 token(s)
eval rate: 3.42 tokens/s ← writing: the real ceiling
Dos líneas, dos mundos distintos. La lectura corrió a unos noventa y tantos tokens por segundo; la escritura, a tres y medio. Esa proporción es la asimetría del capítulo de la aritmética, medida en su propio hardware, y es el dato más útil que va a recoger hoy. Dice: déle a esta máquina entradas largas y pídale salidas cortas.
La misma medición a través de la API, que es lo que realmente quiere si piensa automatizar la comparación entre dos o tres tamaños de modelo:
apt install -y jq
curl -s http://127.0.0.1:11434/api/generate -d '{
"model": "llama3.1:8b",
"prompt": "List three Nordic capitals.",
"stream": false
}' | jq '{
tokens: .eval_count,
seconds: (.eval_duration / 1000000000),
rate: (.eval_count / (.eval_duration / 1000000000))
}'
Mida el tamaño de abajo y el de arriba, y pare ahí. Descargue un 3B y un 14B, pase el mismo prompt por cada uno, y anote las tres velocidades. Ahora sabe exactamente cuánto cuesta el cambio en esta máquina — normalmente algo cercano a duplicar en cada dirección — y puede elegir por tarea en lugar de por opinión. Después elimine los modelos que no vaya a conservar, porque cada uno ocupa varios gigabytes.
Un matiz sobre la primera ejecución de cualquier modelo: la load duration de esa salida es el tiempo empleado en leer los pesos desde disco hacia RAM. Solo se paga cuando el modelo no está ya residente, que es justo lo que controla OLLAMA_KEEP_ALIVE. No la incluya al comparar velocidades, y no se alarme por ella — en NVMe son segundos, y ocurre una sola vez.
Esta es la parte de la guía que evita que pase algo malo, así que se dice sin rodeos: la API de Ollama no tiene contraseña, ni token, ni modelo de usuarios, ni sistema de permisos. Cualquier cosa que pueda abrir una conexión TCP al puerto 11434 puede generar texto en su CPU, enumerar los modelos que ha descargado, descargar otros nuevos y borrar los que usa. No hay ningún ajuste que activar, porque no hay ningún mecanismo que activar.
El puerto 11434 se escanea de forma continua, por el motivo obvio: un runner de modelos abierto es cómputo gratuito que pertenece a otra persona. El síntoma no es una alerta. Es una máquina que se siente lenta durante quince días y una gráfica de ancho de banda que no corresponde a nada que usted haya hecho. Mantenga el servicio en loopback, y ponga delante algo que pregunte quién llama.
Si nada fuera de esta máquina necesita el modelo, deténgase aquí — ya ha terminado. Loopback más un firewall es una respuesta completa, y un agente, una plataforma de automatización o una aplicación web que corra en el mismo VPS llega al modelo por 127.0.0.1 sin nada de lo que sigue. Continúe solo si algo en otra máquina tiene que llamarlo.
El proxy, y el token. Genere un token largo y aleatorio, apunte un registro A hacia la máquina, y deje que Caddy se encargue tanto del certificado como de la puerta:
openssl rand -hex 32 # → the bearer token, store it in a password manager
apt install -y caddy
/etc/caddy/Caddyfile
llm.example.com {
@unauthorised not header Authorization "Bearer PASTE_THE_HEX_TOKEN_HERE"
respond @unauthorised "unauthorised" 401
reverse_proxy 127.0.0.1:11434 {
# Generation is slow by nature — do not let the proxy give up first.
transport http {
read_timeout 10m
}
}
}
systemctl reload caddy
ufw allow 80,443/tcp
ufw status # 11434 must appear nowhere
Hay una pequeña elegancia en elegir un token bearer en vez de autenticación básica. Ollama expone una API compatible con OpenAI, todo cliente de OpenAI envía su clave exactamente como esa cabecera, así que el token que acaba de generar se convierte en la clave de API que sus aplicaciones ya saben cómo llevar. Nada necesita una cabecera personalizada, y rotar el acceso es una línea en el Caddyfile y una variable de entorno en quien llama.
Verifíquelo desde una máquina que no sea el servidor. La primera llamada debería ser rechazada y la segunda debería responder:
curl -s -o /dev/null -w '%{http_code}\n' https://llm.example.com/api/tags
# → 401
curl -s https://llm.example.com/api/tags -H "Authorization: Bearer THE_TOKEN" | jq '.models[].name'
# → the list of models you pulled
Si el modelo lo van a llamar agentes en lugar de usted, la cuestión de la exposición merece el tratamiento más completo de la guía sobre alojar un servidor MCP remoto — el mismo razonamiento sobre TLS, tokens y qué debe ser alcanzable desde dónde, aplicado a un servicio que entrega herramientas en lugar de tokens.
Ollama expone una superficie compatible con OpenAI en /v1 junto a su propia API. Esa es toda la historia de la integración: cualquier cosa construida para OpenAI —los SDK oficiales, los wrappers de frameworks, los nodos de automatización— funciona cambiando la base URL y la clave, y nada más cambia.
curl -s https://llm.example.com/v1/chat/completions \
-H "Authorization: Bearer THE_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "llama3.1:8b",
"messages": [{"role":"user","content":"Reply with the word OK."}]
}' | jq -r '.choices[0].message.content'
Desde Python, las únicas líneas que difieren de una configuración alojada en la nube son las dos de arriba:
from openai import OpenAI
client = OpenAI(
base_url="https://llm.example.com/v1",
api_key="THE_TOKEN",
)
r = client.chat.completions.create(
model="llama3.1:8b",
messages=[{"role": "user", "content": "Classify: 'the invoice is overdue'"}],
)
print(r.choices[0].message.content)
Pida JSON, y obtenga JSON. La función más útil para automatización, con diferencia, es la salida restringida. Ollama puede forzar que la respuesta sea JSON válido en lugar de confiar en que el modelo se comporte, lo cual convierte a un modelo pequeño de narrador poco fiable en un parser de confianza — y es la diferencia entre un flujo de trabajo que corre sin supervisión y uno que se rompe cada cuarenta elementos:
curl -s http://127.0.0.1:11434/api/generate -d '{
"model": "llama3.1:8b",
"prompt": "Extract the total and the currency: Invoice 4021, 1 249,90 EUR due 30 days.",
"format": "json",
"stream": false
}' | jq -r .response
# → {"total": 1249.90, "currency": "EUR"}
En una plataforma de automatización se aplica lo mismo: n8n trae un nodo específico para Ollama, y su nodo de OpenAI acepta una base URL personalizada, así que un flujo de trabajo existente pasa a inferencia local editando una sola credencial. La guía de autoalojar n8n cubre el propio motor de automatización; ejecute los dos en máquinas separadas si puede, porque un motor que en reposo consume 700 MB y un modelo que pide cinco gigabytes son malos vecinos en una máquina de ocho gigabytes.
Y el endpoint de embeddings, que es donde esta máquina se gana el sueldo. Los modelos de embeddings son dos órdenes de magnitud más pequeños que los modelos de generación, y hacen una pasada por fragmento sin nada que generar, así que una CPU los procesa a una velocidad que se siente instantánea:
ollama pull nomic-embed-text # ~275 MB
curl -s http://127.0.0.1:11434/api/embed -d '{
"model": "nomic-embed-text",
"input": ["the first chunk of a document", "the second chunk"]
}' | jq '.embeddings | length'
Limite el contexto. La longitud de contexto es el dial principal sobre el uso de memoria, y el valor por defecto es más generoso de lo que le conviene a una máquina pequeña. Fíjelo globalmente a lo que realmente necesite su prompt más largo y realista — la mayoría del trabajo de clasificación y extracción va cómodo dentro de cuatro mil tokens — y súbalo por petición en la rara llamada que necesite más:
Environment="OLLAMA_CONTEXT_LENGTH=4096"
curl -s http://127.0.0.1:11434/api/generate -d '{
"model": "llama3.1:8b",
"prompt": "…a long document…",
"options": { "num_ctx": 16384 },
"stream": false
}'
Decida cuánto tiempo permanece el modelo en memoria. Un modelo residente responde de forma instantánea, pero mantiene varios gigabytes secuestrados. En una máquina dedicada a la inferencia, manténgalo cargado para siempre; en una compartida, deje que se descargue al cabo de un rato. El valor también viaja por petición, así que un lote nocturno puede fijar el modelo durante su ejecución y liberarlo al terminar:
OLLAMA_KEEP_ALIVE=-1 # resident until the service restarts
OLLAMA_KEEP_ALIVE=30m # a sensible default on a shared box
OLLAMA_KEEP_ALIVE=0 # unload immediately after each request
ollama ps # what is resident right now, and how much it holds
Serialice la cola. Dos peticiones simultáneas contra un modelo no van al doble de rápido; compiten por la misma ruta de memoria saturada y cada una se vuelve más lenta, y si Ollama decide cargar una segunda copia para atenderlas, la máquina se queda sin RAM. En esta clase de hardware, una petición a la vez, con una cola delante, es a la vez la configuración más rápida y la única segura — por eso OLLAMA_NUM_PARALLEL y OLLAMA_MAX_LOADED_MODELS se fijaron en uno allá en el paso 02.
Vigile el disco. Comparar cuatro modelos deja cuatro modelos atrás, y a cinco gigabytes cada uno eso es un disco que se va llenando en silencio mientras nada se queja. Convierta la limpieza en parte de la comparación, no en una tarea para más adelante:
ollama list
du -sh /var/lib/ollama/models
ollama rm mistral:7b qwen2.5:14b
Por último, haga copia de seguridad de lo que no es reproducible. Los pesos del modelo no lo son — un pull los recupera. Lo que merece un repositorio es la configuración, el Caddyfile, el token, los prompts que fue puliendo durante tres semanas y, si construyó uno, el índice vectorial detrás de su recuperación. La guía de copias de seguridad cifradas cubre la mecánica; la lista de qué incluir para esta máquina es corta y merece la pena anotarla.
Todo lo anterior ha sido sobre generación, que es la parte que una CPU hace despacio. La recuperación de información es la otra mitad de la mayoría de los sistemas útiles, y invierte el panorama por completo — por eso el nivel más barato de esta página puede hacer algo genuinamente valioso aunque nunca genere en él ni un solo token.
Un modelo de embeddings convierte un fragmento de texto en un vector. Se mide en cientos de megabytes en vez de gigabytes, hace exactamente una pasada hacia delante por fragmento, y no hay ningún bucle token a token que dependa del ancho de banda de memoria. En la misma máquina donde un modelo de 8B escribe tres palabras por segundo, un modelo de embeddings recorrerá una biblioteca de documentos a una velocidad que se siente como copiar archivos.
Su forma. Divida sus documentos en fragmentos de unas pocas centenas de palabras. Genere el embedding de cada fragmento una vez y guarde el vector. En el momento de la pregunta, genere el embedding de la pregunta, encuentre el puñado de fragmentos más cercanos, y entrégueselos a un modelo junto con la pregunta. El almacenamiento no necesita nada exótico: una base de datos SQLite con una extensión vectorial basta para decenas de miles de fragmentos en un solo VPS, y PostgreSQL con pgvector le cubre bastante más allá de eso. Una base de datos vectorial dedicada es algo razonable de querer más adelante, y una dependencia innecesaria el primer día.
Por qué esto importa más que la velocidad. Fíjese en lo que toca cada mitad. El paso de generación ve una pregunta y unos pocos párrafos. El paso de embeddings ve <em>cada documento que usted posee</em> — todo el archivo, cada contrato, cada nota, cada mensaje, pasado por el modelo un fragmento cada vez. Si ese paso se ejecuta contra un endpoint alojado en la nube, todo su corpus ha sido transmitido a un tercero para ser indexado. Si se ejecuta en su propia máquina, nada de eso se ha movido.
Eso da un híbrido genuinamente bueno para quien no esté dispuesto a renunciar a la calidad de vanguardia: indexe en local, recupere en local, y envíe solo la pregunta y los tres fragmentos recuperados a un modelo alojado en la nube cuando la respuesta tenga que ser excelente. El corpus se queda en casa; solo viaja una porción fina de él, y únicamente bajo demanda.
Dos vecinos de este sitio hacen concreto el patrón. Un SearXNG autoalojado le da a la capa de recuperación un front-end privado para la web abierta en lugar de un corpus; un almacén de documentos autoalojado le da el corpus. Los dos, más el modelo, caben en niveles que cuestan menos al mes que un solo asiento alojado en la nube.
La gente razona sobre la privacidad de los modelos como si el riesgo estuviera en la salida. No es así. La salida es texto genérico; otras mil personas recibieron algo parecido. El artefacto revelador es la entrada — y un año de entradas es un retrato asombrosamente completo de una organización.
Piense en lo que realmente contiene un registro de peticiones. El contrato que pegó para que se lo resumieran. El correo del cliente que pidió clasificar, con el cliente incluido dentro. La carta médica, la cifra del salario, la carta de dimisión que estaba redactando, el código de un repositorio que no es público. Y luego los metadatos alrededor: qué preguntas, en qué orden, a qué hora, desde qué dirección, a lo largo de cuántos meses. Nadie firma un documento que diga «esta es nuestra estrategia» — pero la secuencia de preguntas es ese documento, ensamblado honestamente, por usted, una llamada cada vez.
Capa uno — lo que guarda el endpoint. Los proveedores serios publican políticas serias, y los buenos de verdad no entrenan con el tráfico de la API de negocio. Eso no es la misma promesa que no retenerlo. Las peticiones normalmente se almacenan durante un periodo para vigilancia de abusos, son accesibles por el personal bajo condiciones definidas, y pueden ser requeridas por un proceso legal — que es exactamente la forma correcta de operar una gran plataforma, y exactamente el sitio equivocado para un texto que usted no le enviaría por correo a un desconocido. Un modelo en su propia máquina no tiene ese registro a menos que usted mismo lo escriba.
Capa dos — la identidad a la que se asocia el registro. La retención por sí sola es solo la mitad de la exposición. La otra mitad es la clave a la que se asocia: una cuenta, el nombre de una empresa, una dirección de facturación, una tarjeta. Esa asociación es lo que convierte «alguien preguntó sobre adquirir a un competidor» en «esta empresa preguntó, ese martes». Quitar el modelo de la ecuación elimina la retención; quitar la identidad de la máquina elimina la asociación. Un VPS abierto sin dirección de correo ni documento de identidad, en una jurisdicción nórdica, pagado en Monero, es la segunda mitad del mismo movimiento.
Capa tres — los registros que usted mismo escribe. Alojar el modelo usted mismo desplaza el riesgo en lugar de eliminarlo, y conviene tener claro dónde acaba cayendo. Es probable que su aplicación registre sus propios prompts. Su proxy inverso registra cada línea de petición. Una sesión de depuración de hace dos meses dejó una salida detallada en el journal. El modelo en sí no guarda nada entre llamadas, pero la maquinaria que lo rodea puede guardarlo todo — así que decida deliberadamente qué se anota, fije una retención sobre ello, y exija a ese registro el mismo estándar que no estaba dispuesto a aceptarle a otro.
Nada de eso convierte un modelo local en una garantía de privacidad por sí solo. Lo convierte en la única arquitectura en la que la garantía depende de usted: el texto se queda en el hardware que alquila, bajo una jurisdicción que eligió, detrás de un token que emitió usted mismo, y no responde ante nada más.
El modelo más su caché de contexto superaron la RAM, y el kernel empezó a paginar los pesos en cada token. Que quepa en memoria, o baje un tamaño — no hay ajuste intermedio.
OLLAMA_HOST se puso en 0.0.0.0 para que funcionara un cliente. La API no tiene ninguna autenticación, y el puerto 11434 se escanea. Loopback más un proxy que comprueba un token.
Se eligió un modelo de 32B para un asistente interactivo. Ajuste el tamaño a la interacción: lo interactivo pide algo pequeño, la calidad pide algo asíncrono.
Una conversación que crece hace crecer también la caché, y todo el historial se vuelve a leer en cada turno. Limite el contexto y empiece uno nuevo en lugar de seguir añadiendo para siempre.
El modelo se queda residente después de la última llamada, por diseño. Ajuste OLLAMA_KEEP_ALIVE a lo que le convenga a la máquina, y consulte ollama ps antes de culpar a cualquier otra cosa.
Cuatro candidatos a cinco gigabytes cada uno, ninguno eliminado. Convierta ollama rm en parte de la comparación, y revise el directorio de modelos cuando salten las alertas de disco.
Diez preguntas que deciden si un modelo solo-CPU es la herramienta adecuada para lo que usted tiene en mente.
Sí, con un matiz honesto sobre la velocidad. Un modelo cuantizado funciona perfectamente bien en CPUs de servidor corrientes — los pesos están en RAM, la aritmética está bien al alcance, y nada del proceso necesita tarjeta gráfica. Lo que compra una GPU es ancho de banda de memoria, y el ancho de banda es lo que fija la velocidad de generación. Así que una máquina solo-CPU responderá, correcta y completamente, a algo entre unas pocas y unas pocas decenas de palabras por segundo según el modelo. Eso es lento para una ventana de chat y perfectamente adecuado para el trabajo que la mayoría de la gente automatiza en realidad: clasificar un mensaje, extraer JSON estructurado de un documento, resumir una página, generar embeddings de texto para buscar, reescribir un párrafo. La pregunta nunca es «si puede» — es «a qué velocidad, y si esa velocidad importa para esta tarea».
Haga la cuenta en lugar de fiarse del benchmark de cualquiera, incluido el nuestro. Un modelo denso lee cada uno de sus pesos desde memoria para producir un token, así que el techo es aproximadamente el ancho de banda de memoria dividido entre el tamaño del modelo. Un modelo de 3B cuantizado a unos 2 GB, en una máquina con 20 GB/s efectivos, tiene un techo cercano a 10 tokens por segundo; un 7B de 4,4 GB ronda 4,5; un 32B de 20 GB está por debajo de 1. Las cifras reales quedan por debajo del techo — cuente con un 50 a 70 por ciento — y varían según el host, los vecinos y el número de hilos. Procesar el prompt es un asunto completamente distinto: depende de cómputo, va muchas veces más rápido, y por eso resumir un documento largo es cómodo mientras que chatear con un modelo grande no lo es.
Un modelo instruct de clase 8B en Q4_K_M, que ocupa entre 4,5 y 5 GB y deja sitio para el sistema operativo y la caché de contexto. Ese tamaño es el punto óptimo actual: lo bastante bueno para seguir instrucciones con fiabilidad, producir JSON válido cuando se le pide, resumir, clasificar y reescribir; lo bastante pequeño para seguir siendo ágil. Por debajo, un modelo de 3B es realmente útil para clasificar, etiquetar y enrutar, y es aproximadamente el doble de rápido. Por encima, un 14B es notablemente mejor en razonamiento de varios pasos y ronda la mitad de velocidad, lo cual es un buen cambio para trabajo por lotes y uno malo para cualquier cosa interactiva. Empiece por 8B, mida, y luego muévase en la dirección que indique la medición.
El tamaño del archivo cuantizado, más la caché de contexto, más sitio para el sistema — y el total tiene que caber, porque el modo de fallo no es la lentitud sino el colapso. Cuando el modelo no cabe, el kernel empieza a intercambiar los pesos del modelo con el disco, y una generación que debería tardar cuatro segundos tarda cuatro minutos mientras el load average sube a decenas. Como regla práctica en Q4_K_M: un modelo de 3B ocupa unos 2 GB, un 8B unos 5 GB, un 14B unos 9 GB, un 32B unos 20 GB, un 70B unos 40 GB. Añada dos gigabytes para Debian y sus servicios, y de uno a cuatro más para la caché clave-valor según el contexto que permita. Después compre el nivel por encima de la respuesta, no el que coincide exactamente con ella.
Ollama es llama.cpp, con un registro de modelos, una API REST y un servicio systemd envolviéndolo todo. Use Ollama salvo que tenga una razón concreta para no hacerlo: un solo comando de instalación, ollama pull en vez de andar buscando archivos GGUF, un endpoint compatible con OpenAI, y valores por defecto razonables para el número de hilos y la memoria. Recurra a llama.cpp directamente cuando quiera un flag que Ollama no expone, cuando quiera fijar una build exacta por reproducibilidad, o cuando vaya a ejecutar un solo modelo con una sola configuración para siempre y prefiera no tener un daemon gestionando nada. Ambos ejecutan los mismos pesos a la misma velocidad; la diferencia está enteramente en la operación.
No, y fingir lo contrario le hace perder la tarde. Un modelo de vanguardia detrás de una API es más grande que cualquier cosa que quepa en una máquina virtual, y será mejor en razonamiento difícil, contexto largo y código. En lo que un modelo local pequeño es realmente competitivo es en el enorme término medio del trabajo real: decidir a cuál de seis categorías pertenece un correo, extraer cinco campos de una factura, resumir un hilo de soporte, reescribir una descripción, etiquetar un documento, juzgar si dos registros describen a la misma persona. Para ese tipo de tareas, la diferencia entre un 8B y un modelo de vanguardia es pequeña, la diferencia de coste es total, y la diferencia de privacidad es absoluta. La postura productiva no es «sustituir la API», sino «dejar de enviarle el noventa por ciento que nunca tuvo que salir».
No — ninguna en absoluto, y este es el hecho operativo más importante de toda esta guía. No hay contraseña, ni token, ni modelo de usuarios. Cualquiera que pueda abrir una conexión TCP al puerto 11434 puede generar texto, listar sus modelos, descargar otros nuevos y borrar los existentes. Ese puerto se escanea de forma rutinaria, y las instancias sin proteger acaban siendo encontradas y usadas como cómputo gratuito por desconocidos, lo que se manifiesta primero como un load average misterioso y después como una factura de ancho de banda. Mantenga Ollama vinculado a 127.0.0.1, ponga un proxy inverso delante, termine ahí el TLS y exija un token bearer o un certificado de cliente en el proxy. Si nada fuera de la máquina necesita el modelo, no lo exponga en absoluto.
Sí, y normalmente solo hace falta un campo. Ollama expone una API compatible con OpenAI en /v1, así que cualquier cliente que le deje fijar una base URL —los SDK de OpenAI, LangChain, el nodo OpenAI de n8n, la mayoría de frameworks de agentes— hablará con ella apuntando a https://su-host/v1 y enviando cualquier cadena no vacía como clave. n8n también trae un nodo dedicado para Ollama. El patrón que funciona bien en la práctica es uno híbrido: enrute las llamadas masivas, aburridas y de alto volumen hacia el modelo local, y reserve la API alojada en la nube para el puñado de pasos que de verdad necesitan razonamiento de vanguardia, con un fallback si el modelo local se niega a producir JSON válido.
Son lo mejor en relación calidad-precio de toda esta página. Los modelos de embeddings son diminutos — decenas a cientos de megabytes en vez de gigabytes — y hacen una sola pasada hacia delante por fragmento sin generación token a token, así que una CPU los devora con gusto. Eso significa que toda la mitad de recuperación de un sistema RAG — indexar sus documentos, generar el embedding de la consulta, encontrar los fragmentos más cercanos — corre cómodamente en el nivel más barato, y es además la mitad que toca cada documento que usted posee. Aunque decida que el paso de generación debe ir en una API alojada en la nube, mover el paso de embeddings a su propia máquina mantiene su corpus fuera del ordenador de otro.
Tres razones, en orden ascendente de importancia. El coste tiene una forma: una API es más barata hasta que deja de serlo, y un flujo de trabajo que clasifica cincuenta mil mensajes al mes tiene una factura que crece, mientras que un VPS de $7.90 no. La disponibilidad: sin límite de peticiones, sin que se retire el modelo sobre el que construyó, sin caídas en la página de estado de otro. Y la que lo decide — sus prompts son el texto más revelador que produce. No las respuestas, las preguntas. Qué preguntó, sobre quién, qué día, en qué orden. Un endpoint alojado en la nube lo ve todo, asociado a una identidad de facturación. Un modelo corriendo en una máquina que alquiló sin documento de identidad, en una jurisdicción nórdica, pagada en Monero, ve el mismo texto y no se lo cuenta a nadie.
Garrison (4 vCPU, 8 GB, 240 GB NVMe, $7.90/mes) ejecuta un modelo de 8B con sitio de sobra para la caché de contexto y el sistema — el nivel por el que debería empezar la mayoría. Ravelin duplica la memoria para 14B y contextos largos. Sin correo al registrarse, sin documento de identidad, y sin factura por token.
Última revisión · 2026-08-24 · Fuentes · Documentación de Ollama y referencia de la API, documentación de llama.cpp, documentación del proxy inverso Caddy, fichas de modelo publicadas para las builds cuantizadas mencionadas · Cadencia · anual
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
Host an MCP server with no ID — the privacy stack, crypto-paid.
Saca el agente de tu portátil — dimensionamiento, systemd, secretos, límites de gasto.
Docker Compose, PostgreSQL, webhooks que funcionan — automatización que le pertenece.