Перейти к содержанию

Оценка ускорения prefill с LMCache в vLLM

LMCache — расширяемый слой KV-кэша для инференса LLM, предназначенный для решения ключевых задач крупномасштабного развёртывания. В этом документе оценивается его влияние на производительность vLLM, прежде всего ускорение prefill и эффект при разных типах нагрузки.

Выводы

  1. LMCache существенно ускоряет prefill при высокой доле попаданий в кэш: в экспериментах с многоходовыми диалогами с длинным контекстом (20K токенов) входной TPS вырос до +355.3%, а TTFT снизился на -58.8%.

  2. Преимущества производительности сильно зависят от нагрузки: - Оптимальные сценарии: многоходовые диалоги с общими префиксами и повторяющимися шаблонами - Менее подходящие сценарии: случайные входы без повторного использования кэша

  3. Оптимизация размера блока: в проверенных конфигурациях лучший результат показал размер блока по умолчанию 256.

  4. Промахи кэша создают накладные расходы: без повторного использования кэша наблюдалось снижение производительности от -3% до -15%. Поэтому LMCache лучше всего подходит для нагрузок с предсказуемыми повторяющимися префиксами.

Технические сведения

Обзор LMCache

LMCache расширяет возможности KV-кэша vLLM следующим образом:

Компонент Описание
Выгрузка на CPU Расширяет ёмкость кэша за пределы VRAM GPU
Управление по блокам Эффективное хранение и получение кэша с настраиваемым размером блоков
Несколько бэкендов Поддержка локального хранилища, Redis и пользовательских бэкендов, например Mooncake
Распределённый KV-кэш Общий кэш нескольких экземпляров vLLM

Основные сценарии использования

  1. Низкая доля попаданий в кэш префиксов: смягчает ограничения GPU VRAM и проблемы вытеснения кэша
  2. Распределённое совместное использование кэша: позволяет нескольким экземплярам vLLM использовать общий кэш
  3. Разделение PD: поддерживает архитектуры с раздельным развёртыванием prefill и decode

Условия эксперимента

  • Модель: Qwen3-8B
  • Оборудование: NVIDIA RTX 4090 24GB
  • Версия vLLM: v0.10.1.1
  • Методика бенчмарка: Бенчмарк многоходового диалога
Команды обслуживания модели
# Standard vLLM serving
vllm serve Qwen/Qwen3-8B

# LMCache-enabled serving
##### lmcache_config.yaml
chunk_size: 256
local_cpu: true
max_local_cpu_size: 50
#####
LMCACHE_CONFIG_FILE=/root/lmcache_config.yaml vllm serve /root/Qwen3-8B \
--kv-transfer-config '{"kv_connector":"LMCacheConnectorV1", "kv_role":"kv_both"}'
Скрипты бенчмарка
# Multi-turn bench scripts
# Ref: https://github.com/vllm-project/vllm/tree/main/benchmarks/multi_turn

##### generate_multi_turn.json
{
    "filetype": "generate_conversations",
    "num_conversations": 24,
    "text_files": ["pg1184.txt"],
    "print_stats": false,
    "prompt_input": {
        "num_turns": {
            "distribution": "uniform",
            "min": 12,
            "max": 18
        },
        "common_prefix_num_tokens": {
            "distribution": "constant",
            "value": 500
        },
        "prefix_num_tokens": {
            "distribution": "lognormal",
            "average": 4000,
            "max": 20000
        },
        "num_tokens": {
            "distribution": "uniform",
            "min": 120,
            "max": 160
        }
    },
    "prompt_output": {
        "num_tokens": {
            "distribution": "uniform",
            "min": 80,
            "max": 120
        }
    }
}
#####

python benchmark_serving_multi_turn.py --model $MODEL_PATH --input-file generate_multi_turn.json --num-clients 10 --max-active-conversations 10

Результаты эксперимента

Производительность многоходового диалога

5K входных токенов

Конфигурация Входной TPS Общий TPS Среднее TTFT (ms) Среднее TPOT (ms)
Без LMCache 5849 5957 4350.48 48.47
С LMCache 9426 (+61.2%) 9592 2646.09 (-39.2%) 30.60 (-36.9%)

20K входных токенов

Конфигурация Входной TPS Общий TPS Среднее TTFT (ms) Среднее TPOT (ms)
Без LMCache 4312.17 4335.71 5070.52 33.91
С LMCache 7750.60 (+79.7%) 7792.92 2091.00 (-58.8%) 25.83 (-23.8%)

20K входных токенов + 1 выходной токен

Конфигурация Входной TPS Общий TPS Среднее TTFT (ms)
Без LMCache 7443.2 7443.6 4658.66
С LMCache 33887.9 (+355.3%) 33889.8 980.87

Настройка размера блока

Размер блока Входной TPS Прирост производительности Среднее TTFT (ms)
64 33820.3 +354.4% 985.28
256 33887.9 +355.3% 980.87
1024 31634.0 +325.0% 1055.69

Сценарии промаха кэша (случайный набор данных)

Скрипты бенчмарка
vllm bench serve --model Qwen/Qwen3-8B --endpoint-type openai-chat --endpoint /v1/chat/completions --dataset-name random --random-input-len 1024 --random-output-len 128 --num-prompts 100 --seed 40

1K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 579.86 561.44 -3.2%
Общий TPS 5212.32 5046.72 -3.2%
Среднее TTFT (ms) 8886.36 9242.72 +4.0%
Среднее TPOT (ms) 42.08 43.47 +3.3%

8K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 77.87 66.77 -14.3%
Общий TPS 5060.79 4338.96 -14.3%
Среднее TTFT (ms) 80610.70 92682.22 +15.0%
Среднее TPOT (ms) 43.33 42.27 -2.4%

20K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 22.97 21.77 -5.2%
Общий TPS 3698.09 3504.41 -5.2%
Среднее TTFT (ms) 277456.13 292811.62 +5.5%
Среднее TPOT (ms) 31.68 32.80 +3.5%

Сценарии полного попадания в KV-кэш VRAM

1K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 5954.33 5752.71 -3.3%
Общий TPS 53589.01 51802.45 -3.3%
Среднее TTFT (ms) 3052.08 3247.10 +6.4%
Среднее TPOT (ms) 38.40 39.04 +1.7%

8K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 3676.71 3656.30 -0.6%
Общий TPS 238986.41 237659.44 -0.6%
Среднее TTFT (ms) 5060.41 5326.37 +5.3%
Среднее TPOT (ms) 54.37 53.86 -1.0%

20K входных токенов

Метрика Без LMCache С LMCache Изменение
Выходной TPS 2213.12 1972.32 -10.9%
Общий TPS 356312.70 317543.74 -10.9%
Среднее TTFT (ms) 9649.76 10109.51 +4.8%
Среднее TPOT (ms) 87.10 94.26 +8.2%

Производительность удалённых хранилищ (TTFT для 20K токенов)

Бэкенд Промах кэша (s) Попадание в кэш (s) Ускорение
lmcache_server 0.739 0.324 2.28x
Redis 0.746 0.388 1.92x
Mooncake (TCP) 0.759 0.362 2.10x