Sobes.tech
Назад к вопросам
Middle — Senior
8

Расскажите про PagedAttention в vLLM.

Компании, где спрашивали
ВТБВТБ

Ответ от нейросети

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.

  1. У последовательности есть не один непрерывный буфер, а список блоков.
  2. Каждый блок имеет фиксированный размер, здесь это block_size.
  3. Когда текущий блок заполняется, выделяется новый свободный блок.
  4. При добавлении нового токена его KV-представление кладётся в текущую страницу.
  5. Таким образом память используется более гибко, чем при выделении одного большого массива под весь контекст.

Ключевые моменты:

  • PagedAttention решает проблему фрагментации KV-cache при инференсе LLM.
  • Хранение в страницах позволяет динамически управлять памятью для запросов разной длины.
  • Подход увеличивает количество одновременно обслуживаемых запросов на GPU.
  • Особенно полезен для длинных контекстов, streaming-генерации и изменяющегося batch size.
  • Идея похожа на виртуальную память: есть логические ссылки на блоки, а не обязательное непрерывное размещение.
  • В vLLM это одна из ключевых причин высокой пропускной способности системы.