Перейти к содержимому

Статья

LLM с турбонаддувом

Техническое описание: пейджинг KV в стиле ОС, обслуживание с практически нулевыми потерями, циклы отладки агента, генерация токенов рабочей станции и встроенное скрытое внимание.

  • 7 мин чтения
  • ИИ
  • LLM
  • MLOps
  • Производительность
  • GPU

TenthMatrix Техническое описание: как повысить эффективность обслуживания и агентов LLM с помощью PagedAttention, vLLM, Self-Debugging, PowerInfer, и EG-MLA. Компаньон: блог · грунтовка: Статья LLMs о Kubernetes · лаборатория: Корпоративная лаборатория искусственного интеллекта.

Крышка турбонаддува LLMs

Агентский дайджест.
  • Узкое место: Рост и фрагментация кэша KV, а не «модель медленная» в абстрактном смысле.
  • PagedAttention: Пейджинг блоков КВ в стиле ОС; настройте размер блока и иерархию кэша.
  • vLLM: обслуживание двигателя с практически нулевыми отходами КВ + непрерывное дозирование; посмотрите TTFT против токенов/ов.
  • Self-Debugging: ремонт программ с небольшим количеством попыток превосходит огромные наборы кандидатов; крышка патронов в изд.
  • PowerInfer: горячий/холодный сплит; Среднее значение 13,20 ток/с / пиковое значение 29,08 на RTX 4090 (цифры на бумаге/репо).
  • EG-MLA: KV-сжатие на уровне архитектуры (~91,6% по сравнению с MHA); повторная оценка перед заменой.

1. Почему кризис – это служение, а не обучение

Большие языковые модели изменили НЛП: чат, генерация, инструменты. Обучение стоит дорого один раз; обслуживание дорогое каждую секунду. Декодирование является авторегрессионным. Каждому новому токену нужны предыдущие ключи и значения. Память для этого KV-кеша пропорциональна слоям × головкам × скрытым × последовательности × пакета. Предварительное заполнение требует больших вычислительных ресурсов; декодирование требует большой пропускной способности памяти. Если вы выделяете непрерывный тензор KV максимальной длины для каждого запроса, большая его часть будет пуста до тех пор, пока последовательность фактически не вырастет — классическая внутренняя фрагментация. Параллельные запросы не могут украсть эти дыры. Размер партии уменьшается. Токены в секунду выпадают. GPU выглядят занятыми и все еще простаивают.

Это проблема, на которую PagedAttention и vLLM атаковали в 2023 году, а проблема PowerInfer и более поздних вариантов по-прежнему атакуется с разных сторон.

Смотреть: ментальная модель LLM

Контекстное видео: Введение в большие языковые модели. Объяснение TenthMatrix: как работают LLM и как их запускать в Kubernetes.

2. PagedAttention: подкачка кэша KV

Логические страницы PagedAttention и физические блоки GPU

Квон, Ли, Чжуан, Шэн, Чжэн, Ю, Гонсалес, Чжан и Стойка представили PagedAttention как алгоритм внимания, основанный на виртуальной памяти и подкачке ОС, и построили на его основе vLLM. [arXiv:2309.06180]. Идея:

  • Разделить КВ на блоки фиксированного размера (небольшое количество токенов на блок).
  • Держите таблица блоков от логических позиций токенов к физическим блокам GPU (возможно, несмежным).
  • Выделяйте/освобождайте блоки по мере роста или завершения последовательности — как выделение страниц, а не как malloc одного гигантского массива.
  • Совместное использование блоков (копирование при записи) для повторного использования префиксов, поиска лучей и параллельной выборки, чтобы не дублировать идентичные префиксы.

Реализация не означает «установку флага на BERT». Ядро внимания должно собирать разбросанные блоки. Планировщик должен знать, какие блоки свободны. Иерархия кэша имеет значение: резидентные блоки HBM, разгрузка CPU и одноранговые узлы NVLink. Размер буфера (блока) — это настоящий регулятор. Слишком маленький: больше поисков по таблицам и накладные расходы ядра. Слишком большой: потрачены впустую слоты внутри последнего частичного блока. Размер блока пары с max_model_len и фактическое соотношение запросов/завершений вашего трафика.

Упражняться: фрагментация профиля (неиспользуемые байты KV/зарезервированные байты KV) и токены/ы вместе. Графики памяти без пропускной способности — суета.

3. vLLM: обслуживающая система на базе пейджера

vLLM утверждает, что потери кэш-памяти KV практически нулевые, а также гибкое совместное использование внутри и между запросами. Оценки в статье показали примерно 2–4× пропускная способность по сравнению с тогдашними системами SOTA (FasterTransformer, Orca) с одинаковой задержкой, с большим выигрышем в длинных последовательностях и более сложным декодированием. Сегодня этот механизм также обеспечивает непрерывную пакетную обработку, предварительное заполнение по частям, кэширование префиксов и тензорное/конвейерное параллельное выполнение для multi-GPU.

Оперативный контрольный список:

  1. Набор gpu_memory_utilization достаточно высокий, чтобы удерживать веса + KV, и достаточно низкий, чтобы покинуть рабочее пространство CUDA.
  2. Включайте кэширование префиксов только после подтверждения оценок Eval и включения p95 TTFT. твой подсказывает.
  3. Разделите пулы с интенсивным предзаполнением и интенсивным декодированием, если смешанный трафик нарушает SLO (дезагрегированное обслуживание).
  4. Размещайте конечные точки, совместимые с OpenAI, за вашим шлюзом (сообщества TenthMatrix часто размещают это позади Шлюз WSL Proxy/API узоры).
from vllm import LLM, SamplingParams

llm = LLM(
    model="meta-llama/Llama-3.1-8B-Instruct",
    gpu_memory_utilization=0.90,
    max_model_len=8192,
    enable_prefix_caching=True,
)
params = SamplingParams(temperature=0.2, max_tokens=256)
outs = llm.generate(["Summarise PagedAttention for a platform engineer."], params)
print(outs[0].outputs[0].text)

Антипаттерн (это нет PagedAttention):

# Classifier forward pass — logits, not paged KV serving
import torch
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
out = model(torch.tensor([[1, 2, 3]]), attention_mask=torch.tensor([[1, 1, 1]]))
print(out.logits)

Смотреть: системы обслуживания в дикой природе

Контекстуальный разговор о служении. Каноническая запись: Блог vLLM (PagedAttention) · двигатель: vllm-проект/vllm.

4. Self-Debugging: больше качества на одного кандидата, а не больше кандидатов

Чен, Лин, Кляйн и др. показали, что обучение LLM отладке прогнозируемой программы с помощью демонстраций из нескольких кадров может соответствовать или превосходить базовые показатели, которые генерируют более чем в 10 раз больше кандидатов [arXiv:2304.05128]. Цикл таков: сгенерировать → выполнить или выполнить модульное тестирование → вернуть трассировки обратно → восстановить.

Производственный компромисс: каждое сообщение обратной связи представляет собой еще одно предварительное заполнение + декодирование (или длинное добавление контекста). Точность часто повышается с увеличением количества раундов; так же как и задержка и стоимость. Руководство TenthMatrix для агентов (см. также Muse Glimmer / местные агенты):

  • Жесткое ограничение количества раундов отладки (например, 2–4) на каждый вызов инструмента.
  • Бюджетируйте токены отдельно от видимого пользователю чата.
  • Эскалация до модели человека или специалиста вместо бесконечных повторов.
  • Журнал трассировки для оценки. Self-Debugging без телеметрии — это фольклор.

5. PowerInfer: генерация токенов с учетом местоположения

PowerInfer (SJTU IPADS/родственные репозитории) — это система генерации токенов, которая использует локальность активации: небольшой «горячий» нейрон, установленный на GPU, более холодные веса передаются или выполняются на CPU. Опубликованные рабочие точки включают 13,20 токенов/с в среднем и Пиковая скорость 29,08 токенов/с на одном NVIDIA RTX 4090 и до 11,69× по сравнению с llama.cpp с сохранением точности [PowerInfer на GitHub]. (Вилки, ориентированные на пользователя, такие как Tiiny-AI/PowerInfer, выполняют ту же работу.)

Масштабирование — это самая сложная часть. Один профиль местоположения 4090 не становится автоматически работоспособным развертыванием Kubernetes. Вам нужно:

  • Честные запросы/ограничения GPU и закрепление CPU с поддержкой NUMA, если работают эксперты по CPU.
  • Распределенный план, если модель больше не подходит: тензорная параллель, конвейерная параллель и экспертная параллель.
  • Разделение SLO: интерактивный чат, пакетное завершение и циклы инструментов агента.

Используйте PowerInfer (или llama.cpp, или MLX) на рабочих станциях и периферийных устройствах; используйте vLLM (или TensorRT-LLM или SGLang), когда вы заполняете GPU центра обработки данных одновременным трафиком в стиле OpenAI. Измерьте оба. Наш Корпоративная лаборатория искусственного интеллекта Позиция такая же, как и у Polyglot Benchmarks: доказательства, затем ADR.

6. EG-MLA: сосредоточьте внимание на архитектуре

Трюки с подачей не смогут исправить модель, чье KV по своей сути огромно. Отчеты EG-MLA (встраивание скрытого внимания с несколькими головками) уменьшение размера кэша KV более чем на 91,6% по сравнению с многоголовым вниманием (MHA) с незначительным ухудшением, дополнительной экономией по сравнению с MLA (до 59,9%) и улучшенной точностью рассуждения. Авторы утверждают, что внедрение стробирования вызывает неявные взаимодействия высокого порядка и демонстрирует масштабирование за пределами параметров 1B. [EG-MLA, arXiv].

Инженерное значение: это обучение / архитектура решение. Вы не можете переключить EG-MLA на случайный vLLM каждую ночь на Llama-3 и ожидать процентных ставок по бумаге. Если вы управляете предварительной тренировкой или продолжаете предварительную тренировку, EG-MLA является кандидатом на сокращение HBM, прежде чем покупать еще один GPU. Если вы обслуживаете только общедоступные веса, оставайтесь на вариантах PagedAttention + квантование + MLA, которые уже поддерживает механизм, и отслеживайте контрольные точки EG-MLA по мере их появления.

Четыре технические карты: vLLM, PowerInfer, Self-Debugging, EG-MLA.

7. Объединение штабеля без карго-культивирования

Слой Используйте, когда Осторожно
PagedAttention/vLLMПараллельная обработка API, длинный контекст, общие префиксыКэш префиксов vs корректность; OOM при высокой загрузке
PowerInferЕдиная ставка GPU/токена рабочей станцииНесоответствие местности; беспорядочное масштабирование
Self-DebuggingЦиклы кода/агента, которые могут выполнять тестыНеограниченные раунды; дополнительная стоимость предварительного заполнения
EG-MLAВы тренируете или настраиваете позвоночникНе служебный флаг; повторно запустить полную оценку

8. Масштабируемость в Kubernetes

Хорошо спроектированная распределенная архитектура повышает пропускную способность, а также увеличивает количество режимов сбоя: отстающие, передача кэша KV, перекос токенизатора и автомасштабирование, которые уничтожают «теплые» префиксы. Практический образец (в соответствии с нашим Ollama/vLLM в Kubernetes запись):

  • Выделенные пулы узлов GPU; никогда не комплектуйте модули декодирования случайными заданиями CPU.
  • Разделите предварительное заполнение и декодирование, если SLO TTFT и SLO токена/ов конфликтуют.
  • HPA по глубине очереди или занятости KV GPU, а не только CPU.
  • Продвигайте стопки порций через кольца (Ring Promoter), поэтому плохая сборка движка не может пропустить тест.

9. Заключение

Турбонаддув LLM — это не один алгоритм. Это подкачка KV-кэша (PagedAttention), обслуживающий механизм, который не тратит эти страницы впустую (vLLM), генерация с учетом локальности, когда аппаратным обеспечением является рабочая станция GPU (PowerInfer), циклы агентов, которые отлаживают, а не распыляют кандидатов (Self-Debugging), и — когда вы владеете весами — внимание, которое просто сохраняет меньше (EG-MLA). Каждый уровень меняет память, задержку и точность. Измерьте свой трафик. Опубликуйте ДОПОГ. Корабль.

Ссылки

Опубликовано TenthMatrix. Бумажные рисунки указаны как опубликованные первоначальными авторами; производственные показатели в вашем кластере будут отличаться.