Динамическое сжатие KV-кэша на основе фреймворка vLLM

Мотивация

Изучив недавние академические статьи за последний год в области разреженности KV (H2O, SnapKV, PyramidKV), мы применяем разреженность KV к разным слоям модели. Используя стратегию сокращения, мы удаляем KV-пары с низкими оценками, сохраняя при этом те, которые имеют более высокие оценки и расположены ближе. Такой подход снижает использование памяти, а также вычислительные и I/O накладные расходы, что в конечном итоге приводит к ускорению вывода.

Эксперименты

Базовые модели и настройки: Все эксперименты с KV-Compress мы проводили с использованием нашей интеграции vLLM, ответвлённой от версии v0.6.2, работающей в режиме cuda graph с размером блоков 16. Для всех экспериментов на RTX 4090/Llama-3.1-8B-Instruct мы использовали загрузку GPU по умолчанию 0.9 и установили maxmodel-length равным 32k. Мы оценивали наше сжатие на Llama-3.1-8B-Instruct, сравнивая производительность со следующими базовыми методами, представленными в предыдущих работах:

  • vLLM-0.6.2
  • Novita AI, сжатие Pyramid KV Cache на основе фреймворка vLLM

MMLU Pro и LongBench: Мы контролируем разные коэффициенты сжатия KV-кэша, устанавливая разные длины скользящего окна на разных слоях. В эксперименте мы в основном устанавливали три разные длины скользящего окна: 1024, 1280 и 1536, и проводили перекрёстные тесты на разном количестве слоёв.
MMLU Pro
В тесте MMLU Pro разные слои разреженности KV и разная длина скользящего окна показывают разную производительность. С учётом коэффициента ускорения общая точность может быть гарантирована на уровне выше 98%.

vllm-0.6.2 Novita AI
Слои разреженности KV полный скользящее окно=1536
22 0.4517 0.4496
26 0.4517 0.4476
31 0.4517 0.4476

LongBench
В тесте LongBench мы выбрали скользящее окно 1024 для тестирования производительности и обнаружили, что потеря точности составила около 1.03%.

vllm base VS Novita AI

Бенчмарки пропускной способности: В реальных LLM-приложениях длина ввода/вывода 5000/500 является наиболее часто встречающейся конфигурацией, и показатель TTFT должен быть менее 2 с. На основе этих условий мы провели сравнительное тестирование производительности пакетной обработки, которое показало ускорение вывода в 1.5 раза для vLLM.

Пропускная способность vllm-0.6.2 Novita AI
Слои разреженности KV полный скользящее окно=1536
22 1 1.26
26 1 1.34
31 1 1.44

Основные изменения

Изменённые файлы в основном включают:

  • Flash attention — разреженная оценка на основе Flash attention с обеспечением потери производительности ядра менее 1%.
  • Paged attention и reshape_and_cache — разреженная оценка на основе Paged attention и синхронизация разреженной оценки на этапах prefill и decode.
  • Block_manager и другие функции, связанные с управлением памятью и подготовкой тензоров.

Заключение

Novita AI также поддерживает тензорный параллелизм, позволяющий запускать такие модели, как Llama3-70B, на нескольких GPU. В настоящее время по ряду причин мы не открываем код, но надеемся внести свой вклад в сообщество технологиями и идеями и приветствуем технический обмен со всеми. Обратите внимание: следующие функции пока не поддерживаются в vLLM-0.6.2:

  • Chunked-prefill
  • Prefix caching
  • FlashInfer и другие бэкенды, не основанные на FlashAttention
  • Спрекативное декодирование

Novita AI — это облачная AI-платформа, которая предоставляет разработчикам простой способ развёртывания AI-моделей через наш простой API, а также предлагает доступные и надёжные GPU-облака для создания и масштабирования.

Рекомендуемое чтение

  1. Как разреженность KV достигает ускорения vLLM в 1.5 раза
  2. Разблокируйте Llama 3–8b для Zero-Shot чата: советы и техники экспертов
  3. Используйте Clipboard Conqueror с ключом API Novita AI для повышения продуктивности разработчика