# SGLang speculative decoding: как проверить ускорение ответа

Источник: https://modelium.tech/zhurnal/sglang-speculative-decoding/

Если локальный сервер SGLang отвечает медленно, speculative decoding может сократить время генерации: он предлагает несколько следующих фрагментов ответа и проверяет их основной моделью. Начните с режима NGRAM без второй модели, если у вас подходящий NVIDIA CUDA GPU, и сравните его с обычным запуском на одинаковых запросах. Ускорение не гарантировано; сначала убедитесь, что ответы остаются пригодными для вашей задачи.

**Уровень: инженерный, не домашний рецепт.** Инструкция сверена с документацией SGLang на Git-ревизии `1e86143` от 7 октября 2026 года. Modelium **не запускал** SGLang, Qwen и GPU и не измерял ускорение. Ниже — воспроизводимый план проверки на вашем стенде, а не гарантированный результат. [s1](#src-s1) [s2](#src-s2)

## Что именно может ускориться?

Допустим, ваш локальный помощник отвечает на десять однотипных технических вопросов. *Speculative decoding* — предварительное предложение следующих частей ответа (токенов) с последующей проверкой основной моделью. Если предложения подходят и их проверка обходится дешевле обычного пошагового вывода, ответ может прийти быстрее; дополнительные вычисления могут, наоборот, ухудшить время. SGLang поддерживает несколько способов предложения токенов; конкретный выигрыш авторы предлагают проверять на своей модели и нагрузке [s1](#src-s1).

Задача здесь — **сравнить задержку и пригодность ответа**, а не заявить, что модель стала умнее. Сначала проверьте базовый [запуск SGLang](/zhurnal/sglang/). Ускорение выдачи ответа не равно [кешированию общего начала запроса](/zhurnal/sglang-radix-cache/): не меняйте одновременно кеш, модель и число клиентов [s1](#src-s1) [s2](#src-s2).

## Какой режим взять для первой проверки?

Для первого опыта выберите **NGRAM**: он использует повторяющиеся фрагменты из кеша ранее сгенерированных токенов и **не загружает вторую модель**. Это не «меньшая draft-модель»: при неповторяющихся ответах предложений может быть мало. Режим на этой ревизии работает только с CUDA, не поддерживает DP attention (`--attn-dp-size > 1`) и отключает overlap scheduler и mixed chunked prefill. Значит, не стоит переносить этот шаблон на Mac или CPU либо объявлять его универсально более быстрым [s1](#src-s1).

Если у вас **уже есть подходящая меньшая модель**, SGLang предлагает отдельный режим `STANDALONE` с `--speculative-draft-model-path`. В документации дана пара `Qwen/Qwen2.5-7B-Instruct` (основная) и `Qwen/Qwen2.5-1.5B-Instruct` (вспомогательная) и отдельные параметры глубины и проверки. Это пример авторов, **не** тест Modelium и не разрешение брать любую случайную пару. Для EAGLE-3, MTP и других режимов нужны свои условия и конфигурации: не подменяйте название алгоритма в команде NGRAM без изучения его раздела документации [s1](#src-s1).

## Что подготовить и как сравнить два запуска?

Нужны Linux, совместимый NVIDIA GPU и среда SGLang с подходящим драйвером CUDA; актуальный закреплённый quickstart ориентирован на CUDA 13, а установочная инструкция описывает Python 3.10+ и отдельные варианты окружения. Для конкретного GPU, размера контекста и нагрузки универсальный минимум оперативной/видеопамяти **не установлен этим примером**. Оставьте место для самой модели и служебных буферов, фиксируйте версии драйвера, SGLang и весов. Загрузка пакета и модели требует доступных источников сети либо предварительно подготовленных локальных файлов; после локальной подготовки проверяйте сетевые обращения отдельно, а не обещайте офлайн по одному адресу `127.0.0.1` [s2](#src-s2) [s3](#src-s3).

- В подготовленном окружении и терминале GPU-компьютера запустите контроль: `python3 -m sglang.launch_server --model Qwen/Qwen2.5-7B-Instruct --host 127.0.0.1 --port 30000`. **Дождитесь сообщения о готовности**, затем из второго терминала отправьте запрос на `http://127.0.0.1:30000/v1/chat/completions`. Используйте модель, реально доступную на вашей машине; имя Qwen здесь взято из раздела NGRAM в документации, но её веса и наличие памяти Modelium не проверял [s1](#src-s1) [s2](#src-s2).

- Для маленького собственного теста задайте вход: «Запись: Марина просит прислать счёт до пятницы. Кратко укажи действие и срок, не добавляя даты». В теле POST укажите `{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"Запись: Марина просит прислать счёт до пятницы. Кратко укажи действие и срок, не добавляя даты"}],"temperature":0,"max_tokens":80}`. Заголовок — `Content-Type: application/json`. Проверьте статус HTTP и поле `choices[0].message.content`; ответ должен передавать просьбу о счёте и срок «до пятницы», **без выдуманной календарной даты**. Это критерий редакции, не вымышленный ответ модели [s2](#src-s2) [s4](#src-s4).

- Остановите первый сервер (`Ctrl+C`). На том же компьютере запустите **вторую** серию с той же основной моделью: `python3 -m sglang.launch_server --model Qwen/Qwen2.5-7B-Instruct --host 127.0.0.1 --port 30000 --speculative-algorithm NGRAM --speculative-num-draft-tokens 16 --speculative-ngram-max-bfs-breadth 10 --mem-fraction-static 0.7 --cuda-graph-max-bs-decode 8 --log-level warning`. Параметры NGRAM взяты из примера SGLang; локальный `--host` добавлен, чтобы не слушать внешнюю сеть. Если памяти не хватает, остановитесь и уменьшите нагрузку/параметры по документации, а не считайте эту команду минимальной конфигурацией [s1](#src-s1) [s3](#src-s3).

- Повторите **тот же набор** контрольных вопросов в обоих режимах: одинаковые модель, параметры ответа, длина входа, число одновременных клиентов и состояние прогрева. Запишите число успешных запросов, полную задержку, время до первого токена и скорость вывода, а также проверьте факты и пропуски в каждом тексте. Один пример выше учит проверке содержания, но не заменяет серию измерений: сравнивать скорость по одному случайному ответу нельзя. Нулевой сетевой доступ проверяйте лишь после загрузки компонентов и только если действительно нужен офлайн-контур; сам факт локального HTTP-запроса его не доказывает [s1](#src-s1) [s2](#src-s2).

## Что делать, если ускорения нет или сервер не стартует?

При ошибке CUDA или нехватке памяти сначала вернитесь к обычной модели: если она не стартует, сравнение режимов невозможно. Документация предупреждает, что спекуляция добавляет служебные буферы и CUDA-графы; можно уменьшить `--mem-fraction-static` и `--cuda-graph-max-bs-decode`, но проверяйте реальный расход, а не выводите требование GPU из размера весов [s1](#src-s1) [s3](#src-s3). Если обычный ответ есть, но NGRAM медленнее, не включайте его для этой нагрузки: проверьте долю повторяющихся фрагментов, прогрев и одинаковый порядок запросов. Для проверки именно пары моделей отдельно изучите STANDALONE и её дополнительные затраты памяти; это **следующий эксперимент**, а не ещё один флаг первого запуска [s1](#src-s1).

Сервер, привязанный к `127.0.0.1`, не открыт удалённым компьютерам по этому адресу, но это не аудит безопасности локальных процессов. Не отправляйте рабочие документы в незащищённый тестовый endpoint. Главный следующий шаг — [подтвердить обычный ответ SGLang](/zhurnal/sglang/) и только затем воспроизвести две серии измерений на своих данных [s2](#src-s2) [s4](#src-s4).

## Источники

1. [SGLang Speculative Decoding — закреплённая документация](https://raw.githubusercontent.com/sgl-project/sglang/1e86143bf06d40082de878f05b8782b043f61ad2/docs/docs/advanced_features/speculative_decoding.mdx) — получено 2026-10-07
2. [SGLang Quickstart — Linux, запуск и тестовый ответ](https://raw.githubusercontent.com/sgl-project/sglang/1e86143bf06d40082de878f05b8782b043f61ad2/docs/docs/get-started/quickstart.mdx) — получено 2026-10-07
3. [SGLang Installation — подготовка CUDA и Python](https://raw.githubusercontent.com/sgl-project/sglang/1e86143bf06d40082de878f05b8782b043f61ad2/docs/docs/get-started/install.mdx) — получено 2026-10-07
4. [SGLang OpenAI-compatible API — локальный запрос](https://raw.githubusercontent.com/sgl-project/sglang/1e86143bf06d40082de878f05b8782b043f61ad2/docs/docs/basic_usage/openai_api_completions.mdx) — получено 2026-10-07
