Как вы измеряете эффективность speculative decoding?
Краткий тезис
Эффективность speculative decoding — техники ускорения инференса LLM за счёт маленькой draft-модели — измеряется не только приростом скорости, но и накладными расходами памяти и качеством генерации. Ключевые метрики: MOR (Memory Overhead Ratio) — отношение памяти KV cache к baseline, ETPS (Effective Tokens Per Second) — реальная скорость с учётом принятых токенов, и CRR (Cache Reuse Rate) — доля повторно используемого кэша в multi-agent сценариях. Пороговые значения: MOR < 1.5, ETPS > 1.5× baseline, CRR > 70%.
1. Что такое speculative decoding и зачем измерять эффективность
Speculative decoding — метод ускорения генерации, при котором маленькая быстрая модель (draft) генерирует несколько токенов-кандидатов, а большая целевая модель (target) проверяет их и принимает или отвергает. Это позволяет за один forward pass target-модели получить несколько токенов вместо одного, что даёт прирост скорости без потери качества (при правильной настройке).
Измерение эффективности необходимо, чтобы:
- понять, оправдывает ли ускорение дополнительные затраты памяти и вычислений;
- выбрать оптимальные draft-модель и гиперпараметры (число кандидатов, температуру);
- сравнить разные реализации (vLLM, TensorRT-LLM, собственные).
2. Основные метрики эффективности
| Метрика | Что измеряет | Единица | Порог |
|---|---|---|---|
| MOR | Накладные расходы памяти KV cache | безразмерный | < 1.5 |
| ETPS | Реальная скорость генерации с учётом принятых токенов | токен/с | > 1.5× baseline |
| CRR | Доля повторного использования KV cache в multi-agent | % | > 70% |
| Acceptance Rate | Доля принятых draft-токенов | % | > 60% (зависит от задачи) |
| Latency P50/P99 | Задержка генерации | мс | < baseline |
| Throughput | Количество запросов в единицу времени | запрос/с | > baseline |
Далее разберём каждую метрику подробно.
3. MOR (Memory Overhead Ratio)
MOR — отношение общего объёма памяти, занимаемой KV cache при speculative decoding, к памяти baseline (без speculative). KV cache хранит ключи и значения внимания для всех слоёв и токенов.
Формула
MOR = (KV_cache_draft + KV_cache_target + overhead) / KV_cache_baseline
KV_cache_draft— кэш draft-модели (обычно меньше, так как модель меньше).KV_cache_target— кэш target-модели (может быть больше из-за хранения нескольких кандидатов).- overhead — дополнительные буферы для хранения логитов, масок и т.д.
Порог < 1.5. Если MOR > 1.5, выигрыш в скорости может быть нивелирован нехваткой памяти (OOM, свопинг).
Как измерять
- Используйте torch.cuda.memory_allocated() до и после запуска speculative decoding.
- Замеряйте для типичной длины генерации (например, 256 токенов).
Пример кода (псевдо):
import torch
def measure_mor(draft_model, target_model, input_ids, max_new_tokens):
torch.cuda.reset_peak_memory_stats()
# baseline
with torch.no_grad():
baseline_mem = torch.cuda.memory_allocated()
target_model.generate(input_ids, max_new_tokens=max_new_tokens)
baseline_mem = torch.cuda.max_memory_allocated() - baseline_mem
# speculative
torch.cuda.reset_peak_memory_stats()
with torch.no_grad():
spec_mem = torch.cuda.memory_allocated()
speculative_generate(draft_model, target_model, input_ids, max_new_tokens)
spec_mem = torch.cuda.max_memory_allocated() - spec_mem
mor = spec_mem / baseline_mem
return mor
4. ETPS (Effective Tokens Per Second)
ETPS — количество токенов, реально принятых target-моделью, делённое на общее время генерации (wall-clock time). В отличие от raw TPS (количество сгенерированных draft-токенов), ETPS учитывает только те токены, которые вошли в финальный ответ.
Формула
ETPS = accepted_tokens / wallclock_time
accepted_tokens— токены, которые target-модель не отвергла (включая токены, сгенерированные самой target при отказе).wallclock_time— реальное время от начала генерации до получения полного ответа.
Порог > 1.5× baseline TPS. Baseline — обычная генерация target-моделью без speculative.
Почему ETPS, а не просто TPS:
- Draft-модель может генерировать много токенов, но если target отвергает их все, скорость падает.
- ETPS отражает реальную пользу для пользователя.
Пример:
- Baseline: target генерирует 100 токенов за 10 с → TPS = 10.
- Speculative: draft генерирует 200 токенов, target принимает 150, время 8 с → ETPS = 150/8 = 18.75 (1.875× baseline).
5. CRR (Cache Reuse Rate)
CRR — метрика для multi-agent сценариев, где несколько агентов (или запросов) используют общий KV cache. Например, при параллельной обработке нескольких диалогов или в speculative decoding с кэшированием.
Формула
CRR = (количество токенов, для которых KV cache был переиспользован) / (общее количество токенов в кэше)
Порог > 70%. Если CRR низкий, выгода от кэширования мала.
Когда применяется
- В системах с несколькими draft-моделями (например, ensemble speculative decoding).
- При обслуживании нескольких пользователей с общим prefix (prefix caching).
Как измерять
- Логировать hit/miss при обращении к KV cache.
- Использовать профилировщики (NVIDIA Nsight, PyTorch Profiler).
6. Дополнительные метрики
6.1 Acceptance Rate
Доля токенов, предложенных draft-моделью, которые были приняты target-моделью. Зависит от схожести моделей и температуры.
Формула
acceptance_rate = accepted_draft_tokens / total_draft_tokens
Порог > 60% (хорошо), > 80% (отлично). Если acceptance rate < 40%, speculative decoding может быть медленнее baseline.
6.2 Latency Percentiles (P50, P99)
Важны для пользовательского опыта. Speculative decoding может увеличить latency для коротких запросов из-за оверхеда на запуск draft-модели.
Измерение замеряйте время генерации для каждого запроса и стройте распределение.
6.3 Throughput
Количество запросов в секунду при параллельной обработке. Speculative decoding может увеличить throughput за счёт более эффективного использования GPU, но требует больше памяти.
7. Как проводить бенчмаркинг
- Выберите baseline — обычная генерация target-моделью с теми же гиперпараметрами (batch size, max tokens).
- Подготовьте датасет — репрезентативные запросы (длина, тематика).
- Warm-up — выполните несколько итераций для прогрева GPU.
- Замеряйте — для каждой метрики не менее 100 запросов, считайте среднее и стандартное отклонение.
- Статистическая значимость — используйте t-тест или bootstrap, чтобы убедиться, что разница не случайна.
Пример скрипта
import time
import numpy as np
def benchmark_speculative(draft, target, dataset, num_runs=100):
etps_list = []
for _ in range(num_runs):
for query in dataset:
start = time.time()
output = speculative_generate(draft, target, query)
elapsed = time.time() - start
etps = len(output) / elapsed
etps_list.append(etps)
return np.mean(etps_list), np.std(etps_list)
8. Trade-offs и подводные камни
- Скорость vs качество speculative decoding теоретически не меняет распределение target-модели, но на практике из-за аппроксимаций (например, использование той же температуры) возможны небольшие отклонения. Проверяйте через perplexity или BLEU.
- Память vs latency увеличение числа кандидатов (k) повышает acceptance rate, но растёт MOR. Оптимальное k обычно 3–5.
- Длина контекста для длинных контекстов KV cache доминирует, MOR может превысить порог. Используйте KV cache quantization или offloading.
- Multi-agent CRR важен, но его сложно измерить без специального логирования.
Пет-проект для закрепления
Задача Реализовать speculative decoding с двумя моделями (draft — TinyLlama-1.1B, target — Llama-2-7b) и измерить MOR, ETPS, acceptance rate.
Инструменты Python, PyTorch, Hugging Face Transformers, vLLM (опционально).
Шаги:
- Загрузите обе модели.
- Реализуйте функцию
speculative_generate:- Draft генерирует k=5 токенов.
- Target вычисляет логиты для всех кандидатов и принимает/отвергает по правилу rejection sampling.
- Замерьте baseline TPS (только target).
- Замерьте ETPS, MOR, acceptance rate для speculative.
- Постройте график зависимости ETPS от k (2, 3, 5, 10).
Ожидаемый результат ETPS > 1.5× baseline, MOR < 1.5, acceptance rate > 60%. Вы увидите, что при k > 5 MOR растёт быстрее, чем ETPS.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 160 | Архитектура speculative decoding |
| 162 | Оптимизация инференса LLM |
| 163 | Управление KV cache |
| 164 | Пакетная обработка (batch inference) |
| 165 | Модельный параллелизм |
| 166 | Квантование моделей |
Навигация
- Предыдущий: 160
- Следующий: 162
- Индекс: 00. Индекс разборов