AirLLM: большие языковые модели на слабой видеокарте

Написано

в

Обычно для запуска большой языковой модели на 70 миллиардов параметров нужно несколько десятков гигабайт видеопамяти. AirLLM подходит к этой задаче спокойнее и предлагает другой путь: такую модель можно запустить на видеокарте всего с 4 ГБ памяти, причём без квантизации, дистилляции и обрезки. В этой заметке я постараюсь без спешки рассказать, как устроен AirLLM, как им пользоваться, и поделюсь своим небольшим проектом AirLLM-experiments, который делает работу с этой библиотекой немного удобнее.

Что такое AirLLM

AirLLM — открытая библиотека для инференса больших языковых моделей, которую написал Gavin Li. Её идея проста и вместе с тем изящна: вместо того чтобы держать в видеопамяти все веса модели сразу, библиотека загружает на GPU только один слой за раз. Веса хранятся на диске в виде порезанных на слои шардов, а во время генерации каждый слой по очереди подгружается, отрабатывает и выгружается.

Отсюда следует, что объём нужной видеопамяти зависит не от общего размера модели, а от размера одного её слоя. Именно поэтому модель на 70B укладывается в 4 ГБ, DeepSeek-V3 на 671B помещается примерно в 12 ГБ, а Qwen3-235B — примерно в 3 ГБ. А вот размер самой модели ограничивает в первую очередь место на диске, а не возможности видеокарты.

За такую экономию памяти приходится платить скоростью: каждый слой читается с диска при генерации каждого токена, поэтому вывод идёт медленно, примерно в секунды на токен. Так что AirLLM — это скорее не про быстрый интерактивный чат, а про возможность и вовсе запустить модель, которая иначе не поместилась бы в железо.

Установка

Библиотека ставится из PyPI обычной командой:

pip install airllm

При первом запуске модель скачается из Hugging Face и будет разложена на слои. Процесс это небыстрый и занимает немало места на диске, поэтому свободное место стоит подготовить заранее. При желании можно включить сжатие 4bit или 8bit — тогда к весам применится блочная квантизация, которая ускоряет загрузку слоёв с диска примерно в три раза, а точность теряется совсем немного.

Базовый пример

Работать с AirLLM можно почти так же, как с обычной моделью из transformers. Достаточно один раз указать идентификатор модели на Hugging Face, а дальше всё будет знакомо:

from airllm import AutoModel

MAX_LENGTH = 128
model = AutoModel.from_pretrained("Qwen/Qwen3-32B")

input_text = ['What is the capital of United States?']

input_tokens = model.tokenizer(
    input_text,
    return_tensors="pt",
    return_attention_mask=False,
    truncation=True,
    max_length=MAX_LENGTH,
    padding=False)

generation_output = model.generate(
    input_tokens['input_ids'].cuda(),
    max_new_tokens=20,
    use_cache=True,
    return_dict_in_generate=True)

print(model.tokenizer.decode(generation_output.sequences[0]))

Класс AutoModel сам определяет тип модели, поэтому одну и ту же строку можно использовать и для Llama, и для Qwen, и для DeepSeek. А если взять модель вроде DeepSeek-V3 на 671B параметров, она тоже поместится примерно в 12 ГБ видеопамяти — во многом именно этим проект и привлекателен.

Запуск на macOS

AirLLM работает не только на CUDA, но и на Apple Silicon. На macOS он использует бэкенд MLX, поэтому понадобятся установленные mlx и torch, и поддерживаются только чипы Apple. Есть и небольшое ограничение: реализация MLX поддерживает лишь Llama-подобные архитектуры, так что Qwen и похожие модели на макбуке таким способом не запустить.

Пример использования

AirLLM-experiments — это две небольшие интерактивные консольные утилиты для запуска больших языковых моделей локально. Они избавляют от необходимости каждый раз писать один и тот же код для загрузки модели и организации чата.

Первый инструмент, airllm-lib-usage.py, запускает библиотеку AirLLM прямо в текущем процессе Python. Он показывает нумерованный список моделей из общего каталога, при необходимости сам доустанавливает недостающие зависимости и открывает сессию чата. На macOS используется рантайм MLX, на остальных платформах — torch.

Второй инструмент, airllm-openai-server-client.py, помогает работать с сервером airllm-openai-server, который запускается в Docker и предоставляет OpenAI-совместимый API. При первом запуске утилита спрашивает настройки, собирает образ, поднимает контейнер и открывает потоковый чат уже к работающему серверу. При повторных запусках она находит существующий контейнер и просто переиспользует его, а кеш моделей хранит в отдельном Docker-томе, чтобы не скачивать модель заново.

Список доступных моделей вынесен в общий модуль model_catalog.py, поэтому оба инструмента работают с одним и тем же набором. Команды чата тоже общие: /help, /clear, /exit. Исходный код и инструкции лежат в репозитории:

https://github.com/zefir1990/AirLLM-experiments

На что обратить внимание

Первый ответ может готовиться несколько минут: сначала AirLLM скачивает модель и режет её на слои, и только потом начинает генерацию. Дальше скорость, впрочем, тоже остаётся невысокой — это осознанный компромисс ради экономии памяти. Для gated-моделей вроде meta-llama нужно принять условия на Hugging Face и передать токен доступа. А кеш скачанных моделей и шардов лучше не удалять, иначе всё придётся загружать заново.

Ссылки

https://github.com/lyogavin/airllm
https://github.com/mkamranr/airllm-openai-server
https://github.com/zefir1990/AirLLM-experiments
https://pypi.org/project/airllm/
https://huggingface.co/

Источники

https://github.com/lyogavin/airllm
https://github.com/zefir1990/AirLLM-experiments

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

DemensDeum
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.