Расскажите про PagedAttention в vLLM.
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
PagedAttention — это способ эффективно управлять KV-cache при инференсе LLM, уменьшая фрагментацию памяти и повышая утилизацию GPU. Основная идея похожа на виртуальную память: последовательности хранятся не сплошным куском, а страницами фиксированного размера. Это позволяет обслуживать больше запросов параллельно и лучше поддерживать длинный и динамический batch.
Определение:
PagedAttention — механизм в vLLM для хранения и доступа к ключам и значениям attention в виде страниц, а не непрерывных блоков памяти. Каждой последовательности выделяются блоки фиксированного размера, которые можно эффективно переиспользовать и маппить в адресное пространство модели. За счёт этого снижается перерасход памяти, упрощается работа с разной длиной контекстов и повышается throughput при генерации текста.
Пример использования:
Допустим, сервис одновременно обрабатывает 100 запросов: часть из них короткие, часть — длинные, а некоторые завершаются раньше остальных. Без paged-подхода KV-cache приходится выделять с запасом, из-за чего память быстро фрагментируется. С PagedAttention свободные страницы можно переиспользовать, а новые токены дописывать в существующие блоки без постоянного перевыделения больших массивов.
# Концептуальный псевдокод, отражающий идею PagedAttention
block_size = 16
class Sequence:
def __init__(self):
self.blocks = [] # ссылки на страницы KV-cache
def append_token(seq, token_kv, page_table, free_blocks):
if not seq.blocks or len(page_table[seq.blocks[-1]]) >= block_size:
seq.blocks.append(free_blocks.pop())
current_block = seq.blocks[-1]
page_table[current_block].append(token_kv)
Пояснение кода:
Код показывает идею страничного хранения KV-cache.
- У последовательности есть не один непрерывный буфер, а список блоков.
- Каждый блок имеет фиксированный размер, здесь это
block_size. - Когда текущий блок заполняется, выделяется новый свободный блок.
- При добавлении нового токена его KV-представление кладётся в текущую страницу.
- Таким образом память используется более гибко, чем при выделении одного большого массива под весь контекст.
Ключевые моменты:
- PagedAttention решает проблему фрагментации KV-cache при инференсе LLM.
- Хранение в страницах позволяет динамически управлять памятью для запросов разной длины.
- Подход увеличивает количество одновременно обслуживаемых запросов на GPU.
- Особенно полезен для длинных контекстов, streaming-генерации и изменяющегося batch size.
- Идея похожа на виртуальную память: есть логические ссылки на блоки, а не обязательное непрерывное размещение.
- В vLLM это одна из ключевых причин высокой пропускной способности системы.