{"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\/pt\/2026\/10\/08\/airllm-experiments\/","title":{"rendered":"AirLLM: modelos de linguagem grande em uma placa gr\u00e1fica fraca"},"content":{"rendered":"<p>Normalmente, a execu\u00e7\u00e3o de um modelo de linguagem grande com 70 bilh\u00f5es de par\u00e2metros requer v\u00e1rias dezenas de gigabytes de mem\u00f3ria de v\u00eddeo. AirLLM aborda esse problema com mais calma e oferece uma maneira diferente: tal modelo pode ser executado em uma placa de v\u00eddeo com apenas 4 GB de mem\u00f3ria, e sem quantiza\u00e7\u00e3o, destila\u00e7\u00e3o e corte. Nesta nota tentarei contar sem pressa como funciona o AirLLM, como us\u00e1-lo, e compartilharei meu pequeno projeto AirLLM-experiments, o que torna o trabalho com esta biblioteca um pouco mais conveniente.<\/p>\n<h2>O que \u00e9 AirLLM<\/h2>\n<p>AirLLM \u00e9 uma biblioteca de c\u00f3digo aberto para infer\u00eancia de modelos de linguagem grande, escrita por Gavin Li. Sua ideia \u00e9 simples e elegante: em vez de armazenar todos os pesos do modelo na mem\u00f3ria de v\u00eddeo de uma s\u00f3 vez, a biblioteca carrega apenas uma camada por vez na GPU. Os pesos s\u00e3o armazenados no disco na forma de fragmentos cortados em camadas e, durante a gera\u00e7\u00e3o, cada camada \u00e9 carregada, processada e descarregada por vez.<\/p>\n<p>Conclui-se que a quantidade de mem\u00f3ria de v\u00eddeo necess\u00e1ria n\u00e3o depende do tamanho geral do modelo, mas do tamanho de uma de suas camadas. \u00c9 por isso que o modelo 70B cabe em 4 GB, o DeepSeek-V3 no 671B cabe em cerca de 12 GB e o Qwen3-235B cabe em cerca de 3 GB. Mas o tamanho do modelo em si \u00e9 limitado principalmente pelo espa\u00e7o em disco, e n\u00e3o pelos recursos da placa de v\u00eddeo.<\/p>\n<p>Essas economias de mem\u00f3ria t\u00eam o custo da velocidade: cada camada \u00e9 lida do disco quando cada token \u00e9 gerado, portanto a sa\u00edda \u00e9 lenta, cerca de segundos por token. Portanto, AirLLM tem menos a ver com um bate-papo interativo r\u00e1pido e mais com a capacidade de lan\u00e7ar um modelo que de outra forma n\u00e3o caberia no hardware.<\/p>\n<h2>Instala\u00e7\u00e3o<\/h2>\n<p>A biblioteca \u00e9 instalada a partir do PyPI usando o comando usual:<\/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>Quando voc\u00ea iniciar pela primeira vez, o modelo ser\u00e1 baixado do Hugging Face e ser\u00e1 decomposto em camadas. Este processo \u00e9 lento e ocupa muito espa\u00e7o em disco, portanto voc\u00ea deve preparar o espa\u00e7o livre com anteced\u00eancia. Se desejar, voc\u00ea pode ativar a compacta\u00e7\u00e3o de 4 ou 8 bits &#8211; ent\u00e3o a quantiza\u00e7\u00e3o de bloco ser\u00e1 aplicada aos pesos, o que acelera o carregamento das camadas do disco em cerca de tr\u00eas vezes, e a precis\u00e3o \u00e9 perdida um pouco.<\/p>\n<h2>Exemplo b\u00e1sico<\/h2>\n<p>Voc\u00ea pode trabalhar com AirLLM quase da mesma maneira que com um modelo normal de transformadores. Basta inserir o ID do modelo uma vez no Hugging Face e tudo ficar\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>A pr\u00f3pria classe AutoModel determina o tipo de modelo, portanto a mesma linha pode ser usada para Llama, Qwen e DeepSeek. E se voc\u00ea pegar um modelo como o DeepSeek-V3 com par\u00e2metros de 671B, ele tamb\u00e9m caber\u00e1 em cerca de 12 GB de mem\u00f3ria de v\u00eddeo &#8211; isso \u00e9 em grande parte o que torna o projeto atraente.<\/p>\n<h2>Iniciar no macOS<\/h2>\n<p>AirLLM roda n\u00e3o apenas em CUDA, mas tamb\u00e9m em Apple Silicon. No macOS, ele usa o backend MLX, portanto, precisar\u00e1 do mlx e do torch instalados e oferece suporte apenas a chips Apple. H\u00e1 tamb\u00e9m uma pequena limita\u00e7\u00e3o: a implementa\u00e7\u00e3o do MLX suporta apenas arquiteturas do tipo Llama, portanto, o Qwen e modelos semelhantes n\u00e3o podem ser iniciados em um MacBook dessa forma.<\/p>\n<h2>Usar exemplo<\/h2>\n<p>Os experimentos AirLLM s\u00e3o dois pequenos utilit\u00e1rios de console interativos para executar localmente grandes modelos de linguagem. Eles eliminam a necessidade de escrever sempre o mesmo c\u00f3digo para carregar o modelo e organizar o chat.<\/p>\n<p>A primeira ferramenta, airllm-lib-usage.py, executa a biblioteca AirLLM diretamente no processo Python atual. Mostra uma lista numerada de modelos do cat\u00e1logo geral, se necess\u00e1rio instala depend\u00eancias faltantes e abre uma sess\u00e3o de chat. O tempo de execu\u00e7\u00e3o MLX \u00e9 usado no macOS, o torch \u00e9 usado em outras plataformas.<\/p>\n<p>A segunda ferramenta, airllm-openai-server-client.py, ajuda voc\u00ea a trabalhar com o servidor airllm-openai-server, que roda em Docker e fornece uma API compat\u00edvel com OpenAI. Ao inici\u00e1-lo pela primeira vez, o utilit\u00e1rio solicita configura\u00e7\u00f5es, coleta a imagem, pega o cont\u00eainer e abre um chat de streaming para o servidor em execu\u00e7\u00e3o. Quando iniciado repetidamente, ele encontra um cont\u00eainer existente e simplesmente o reutiliza e armazena o cache do modelo em um volume Docker separado para n\u00e3o baixar o modelo novamente.<\/p>\n<p>A lista de modelos dispon\u00edveis est\u00e1 inclu\u00edda no m\u00f3dulo comum model_catalog.py, portanto ambas as ferramentas funcionam com o mesmo conjunto. Comandos de chat tamb\u00e9m s\u00e3o comuns: \/help, \/clear, \/exit. O c\u00f3digo fonte e as instru\u00e7\u00f5es est\u00e3o no reposit\u00f3rio:<\/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>No que prestar aten\u00e7\u00e3o<\/h2>\n<p>A primeira resposta pode levar v\u00e1rios minutos para ser preparada: primeiro, o AirLLM baixa o modelo e o corta em camadas, e s\u00f3 ent\u00e3o come\u00e7a a gerar. Al\u00e9m disso, a velocidade tamb\u00e9m permanece baixa &#8211; este \u00e9 um compromisso deliberado para economizar mem\u00f3ria. Para modelos fechados como o metal-lhama, voc\u00ea precisa aceitar os termos do Hugging Face e passar um token de acesso. \u00c9 melhor n\u00e3o excluir o cache dos modelos e fragmentos baixados, caso contr\u00e1rio, tudo ter\u00e1 que ser baixado novamente.<\/p>\n<h2>Links<\/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>Fontes<\/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, a execu\u00e7\u00e3o de um modelo de linguagem grande com 70 bilh\u00f5es de par\u00e2metros requer v\u00e1rias dezenas de gigabytes de mem\u00f3ria de v\u00eddeo. AirLLM aborda esse problema com mais calma e oferece uma maneira diferente: tal modelo pode ser executado em uma placa de v\u00eddeo com apenas 4 GB de mem\u00f3ria, e sem quantiza\u00e7\u00e3o, destila\u00e7\u00e3o [&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":"pt","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\/pt\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":2,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":194,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/192\/revisions\/194"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}