{"id":192,"date":"2026-10-08T18:42:58","date_gmt":"2026-10-08T14:42:58","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/10\/08\/airllm-experiments\/"},"modified":"2026-10-08T19:11:07","modified_gmt":"2026-10-08T15:11:07","slug":"airllm-experiments","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/es\/2026\/10\/08\/airllm-experiments\/","title":{"rendered":"AirLLM: modelos de lenguaje grandes en una tarjeta gr\u00e1fica d\u00e9bil"},"content":{"rendered":"<p>Normalmente, ejecutar un modelo de lenguaje grande con 70 mil millones de par\u00e1metros requiere varias decenas de gigabytes de memoria de video. AirLLM aborda este problema con m\u00e1s calma y ofrece una forma diferente: un modelo de este tipo se puede ejecutar en una tarjeta de video con solo 4 GB de memoria y sin cuantificaci\u00f3n, destilaci\u00f3n ni recorte. En esta nota intentar\u00e9 contarles sin prisas c\u00f3mo funciona AirLLM, c\u00f3mo usarlo y compartir\u00e9 mi peque\u00f1o proyecto AirLLM-experiments, que hace que trabajar con esta biblioteca sea un poco m\u00e1s conveniente.<\/p>\n<h2>Qu\u00e9 es AirLLM<\/h2>\n<p>AirLLM es una biblioteca de c\u00f3digo abierto para la inferencia de modelos de lenguajes grandes escrita por Gavin Li. Su idea es simple pero elegante: en lugar de almacenar todos los pesos del modelo en la memoria de video a la vez, la biblioteca carga solo una capa a la vez en la GPU. Los pesos se almacenan en el disco en forma de fragmentos cortados en capas y, durante la generaci\u00f3n, cada capa se carga, procesa y descarga por turno.<\/p>\n<p>De ello se deduce que la cantidad de memoria de v\u00eddeo necesaria no depende del tama\u00f1o total del modelo, sino del tama\u00f1o de una de sus capas. Es por eso que el modelo 70B cabe en 4 GB, el DeepSeek-V3 en el 671B cabe en unos 12 GB y el Qwen3-235B cabe en unos 3 GB. Pero el tama\u00f1o del modelo en s\u00ed est\u00e1 limitado principalmente por el espacio en disco y no por las capacidades de la tarjeta de video.<\/p>\n<p>Estos ahorros de memoria se obtienen a costa de la velocidad: cada capa se lee del disco cuando se genera cada token, por lo que la salida es lenta, aproximadamente segundos por token. Entonces, AirLLM se trata menos de un chat interactivo r\u00e1pido y m\u00e1s de la capacidad de incluso lanzar un modelo que de otro modo no encajar\u00eda en el hardware.<\/p>\n<h2>Instalaci\u00f3n<\/h2>\n<p>La biblioteca se instala desde PyPI usando el comando habitual:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>pip install airllm\n<\/code><\/pre>\n<\/div>\n<p>Cuando lo inicie por primera vez, el modelo se descargar\u00e1 de Hugging Face y se descompondr\u00e1 en capas. Este proceso es lento y ocupa mucho espacio en disco, por lo que debes preparar espacio libre con antelaci\u00f3n. Si lo desea, puede habilitar la compresi\u00f3n de 4 u 8 bits; luego se aplicar\u00e1 la cuantificaci\u00f3n de bloques a los pesos, lo que acelera la carga de capas desde el disco aproximadamente tres veces y la precisi\u00f3n se pierde bastante.<\/p>\n<h2>Ejemplo b\u00e1sico<\/h2>\n<p>Puede trabajar con AirLLM casi de la misma forma que con un modelo normal de Transformers. Basta con ingresar el ID del modelo una vez en Hugging Face, y luego todo le resultar\u00e1 familiar:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>from airllm import AutoModel\n\nMAX_LENGTH = 128\nmodel = AutoModel.from_pretrained(\"Qwen\/Qwen3-32B\")\n\ninput_text = ['What is the capital of United States?']\n\ninput_tokens = model.tokenizer(\n    input_text,\n    return_tensors=\"pt\",\n    return_attention_mask=False,\n    truncation=True,\n    max_length=MAX_LENGTH,\n    padding=False)\n\ngeneration_output = model.generate(\n    input_tokens['input_ids'].cuda(),\n    max_new_tokens=20,\n    use_cache=True,\n    return_dict_in_generate=True)\n\nprint(model.tokenizer.decode(generation_output.sequences[0]))\n<\/code><\/pre>\n<\/div>\n<p>La propia clase AutoModel determina el tipo de modelo, por lo que se puede utilizar la misma l\u00ednea para Llama, Qwen y DeepSeek. Y si tomamos un modelo como DeepSeek-V3 con par\u00e1metros 671B, tambi\u00e9n caben alrededor de 12 GB de memoria de video; esto es en gran medida lo que hace que el proyecto sea atractivo.<\/p>\n<h2>Iniciar en macOS<\/h2>\n<p>AirLLM no solo se ejecuta en CUDA, sino tambi\u00e9n en Apple Silicon. En macOS utiliza el backend MLX, por lo que necesitar\u00e1 instalar mlx y torch, y solo es compatible con chips Apple. Tambi\u00e9n hay una peque\u00f1a limitaci\u00f3n: la implementaci\u00f3n de MLX solo admite arquitecturas tipo Llama, por lo que Qwen y modelos similares no se pueden ejecutar en una MacBook de esta manera.<\/p>\n<h2>Ejemplo de uso<\/h2>\n<p>Los experimentos AirLLM son dos peque\u00f1as utilidades de consola interactiva para ejecutar modelos de lenguaje grandes localmente. Eliminan la necesidad de escribir el mismo c\u00f3digo cada vez para cargar el modelo y organizar el chat.<\/p>\n<p>La primera herramienta, airllm-lib-usage.py, ejecuta la biblioteca AirLLM directamente en el proceso actual de Python. Muestra una lista numerada de modelos del cat\u00e1logo general, si es necesario instala las dependencias faltantes y abre una sesi\u00f3n de chat. El tiempo de ejecuci\u00f3n de MLX se usa en macOS, torch se usa en otras plataformas.<\/p>\n<p>La segunda herramienta, airllm-openai-server-client.py, le ayuda a trabajar con el servidor airllm-openai-server, que se ejecuta en Docker y proporciona una API compatible con OpenAI. Cuando lo inicia por primera vez, la utilidad solicita configuraci\u00f3n, recopila la imagen, toma el contenedor y abre un chat de transmisi\u00f3n en vivo al servidor en ejecuci\u00f3n. Cuando se inicia repetidamente, encuentra un contenedor existente y simplemente lo reutiliza y almacena el cach\u00e9 del modelo en un volumen Docker separado para no descargar el modelo nuevamente.<\/p>\n<p>La lista de modelos disponibles est\u00e1 incluida en el m\u00f3dulo com\u00fan model_catalog.py, por lo que ambas herramientas funcionan con el mismo conjunto. Los comandos de chat tambi\u00e9n son comunes: \/help, \/clear, \/exit. El c\u00f3digo fuente y las instrucciones est\u00e1n en el repositorio:<\/p>\n<p><a href=\"https:\/\/github.com\/zefir1990\/AirLLM-experiments\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/zefir1990\/AirLLM-experiments<\/a><\/p>\n<h2>A qu\u00e9 prestar atenci\u00f3n<\/h2>\n<p>La primera respuesta puede tardar varios minutos en prepararse: primero, AirLLM descarga el modelo y lo corta en capas, y solo entonces comienza a generar. Adem\u00e1s, la velocidad tambi\u00e9n sigue siendo baja; se trata de un compromiso deliberado para ahorrar memoria. Para modelos cerrados como meta-llama, debes aceptar los t\u00e9rminos de Hugging Face y pasar un token de acceso. Es mejor no borrar el cach\u00e9 de los modelos y fragmentos descargados; de lo contrario, ser\u00e1 necesario descargar todo nuevamente.<\/p>\n<h2>Enlaces<\/h2>\n<p><a href=\"https:\/\/github.com\/lyogavin\/airllm\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/lyogavin\/airllm<\/a><br \/>\n<a href=\"https:\/\/github.com\/mkamranr\/airllm-openai-server\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/mkamranr\/airllm-openai-server<\/a><br \/>\n<a href=\"https:\/\/github.com\/zefir1990\/AirLLM-experiments\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/zefir1990\/AirLLM-experiments<\/a><br \/>\n<a href=\"https:\/\/pypi.org\/project\/airllm\/\" rel=\"noopener\" target=\"_blank\">https:\/\/pypi.org\/project\/airllm\/<\/a><br \/>\n<a href=\"https:\/\/huggingface.co\/\" rel=\"noopener\" target=\"_blank\">https:\/\/huggingface.co\/<\/a><\/p>\n<h2>Fuentes<\/h2>\n<p><a href=\"https:\/\/github.com\/lyogavin\/airllm\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/lyogavin\/airllm<\/a><br \/>\n<a href=\"https:\/\/github.com\/zefir1990\/AirLLM-experiments\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/zefir1990\/AirLLM-experiments<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalmente, ejecutar un modelo de lenguaje grande con 70 mil millones de par\u00e1metros requiere varias decenas de gigabytes de memoria de video. AirLLM aborda este problema con m\u00e1s calma y ofrece una forma diferente: un modelo de este tipo se puede ejecutar en una tarjeta de video con solo 4 GB de memoria y sin [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-192","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.6","language":"es","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":2,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":194,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/posts\/192\/revisions\/194"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}