Что PagedAttention меняет в выделении памяти KV для LLM?

Автоматический перевод

Эта статья была автоматически переведена с оригинальной английской версии.

PagedAttention позволяет кэшу аттеншна запроса занимать отдельные блоки памяти фиксированного размера вместо одного большого непрерывного участка. Таблица блоков сопоставляет логические позиции токенов запроса с физическими блоками. Это снижает необходимость заранее резервировать память под максимально возможную длину последовательности запроса.

Главное преимущество — более гибкое выделение памяти KV для параллельных запросов. Объём данных ключей и значений, необходимый для каждого сохранённого токена, при этом не уменьшается.

Расчёт неиспользуемого места в блоках

Рассмотрим условную реализацию с блоками на 16 токенов. Последовательности из 35 токенов нужны три блока, вмещающие 48 токенов. Тринадцать позиций в последнем блоке не используются: около 27% выделенных позиций для этой короткой последовательности.

Частично заполненным может быть только последний блок. По мере роста последовательностей неиспользуемое место составляет всё меньшую долю выделенной памяти. Фактический размер блока и поддерживаемые схемы размещения зависят от рантайма, бэкенда аттеншна и версии.

Статья о PagedAttention описывает устройство сопоставления и выделения памяти. Дополнительные блоки выделяются по мере роста последовательности и освобождаются после завершения запроса, вместо того чтобы резервировать большой непрерывный участок для каждого запроса.

Для совместного использования недостаточно выделения памяти

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

В первой публикации о vLLM сообщалось о 60–80% неиспользуемой памяти в прежних подходах к выделению, выбранных для сравнения, и о менее 4% в измеренных нагрузках PagedAttention. Приведённый выше расчёт для короткой последовательности показывает, почему значение менее 4% не является универсальной верхней границей. Сравнения с большим ростом throughput также учитывают различия во всём рантайме, поэтому их результаты нельзя объяснять только выделением памяти.

Измеряйте число выделенных блоков, занятых позиций токенов, вытеснений из кэша или приостановок запросов, а также число запросов, которые можно обрабатывать одновременно. Сравнивайте одинаковые длины и точность кэша. Если сами данные KV уже превышают объём памяти, выделение по блокам не заставит эти данные исчезнуть; также могут потребоваться меньшее число KV-голов, поддерживаемая квантизация кэша или меньшая нагрузка.

Инженерное руководство: PagedAttention содержит пример таблицы блоков.