English translation is not available yet. Showing Russian content.

Как вы измеряете эффективность 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. Как проводить бенчмаркинг

  1. Выберите baseline — обычная генерация target-моделью с теми же гиперпараметрами (batch size, max tokens).
  2. Подготовьте датасет — репрезентативные запросы (длина, тематика).
  3. Warm-up — выполните несколько итераций для прогрева GPU.
  4. Замеряйте — для каждой метрики не менее 100 запросов, считайте среднее и стандартное отклонение.
  5. Статистическая значимость — используйте 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 (опционально).

Шаги:

  1. Загрузите обе модели.
  2. Реализуйте функцию speculative_generate:
    • Draft генерирует k=5 токенов.
    • Target вычисляет логиты для всех кандидатов и принимает/отвергает по правилу rejection sampling.
  3. Замерьте baseline TPS (только target).
  4. Замерьте ETPS, MOR, acceptance rate для speculative.
  5. Постройте график зависимости 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Квантование моделей

Навигация