Спекулативно декодиране на GX10: по-бърз изход от модела
Малък модел „чернова“ познава няколко думи напред, а големият ги проверява наведнъж. По документацията на vLLM изходът остава със същото разпределение, но се получава по-бързо — стига черновата да познава достатъчно често. Тук разбираш как работи, пускаш го в SGLang и vLLM и го измерваш на своята машина, вместо да вярваш на обещани кратности.
--speculative-draft-model (сега алгоритъмът се избира с --speculative-algorithm), старите vLLM ключове speculative_model и num_speculative_tokens на най-горно ниво (в документацията са заменени от speculative_config), примерите с Llama (изискват приемане на лиценз при теглене) и неподкрепената цифра „~40 GB“, както и --host 0.0.0.0. Добавихме: преглед на методите (отделна чернова, EAGLE, MTP, n-gram), изчисление на паметта, скрипт за честно измерване преди и след, ограниченията от документацията (версии на vLLM, паралелизъм) и честното „кога не помага“. Примерите с модели са от документацията на двата проекта.
01Какво ще научиш
- Как работи спекулативното декодиране: чернова предлага, голям модел проверява наведнъж.
- Защо помага на машина с обща памет като GB10 и кога не помага.
- Кои методи има в SGLang и vLLM и кой от тях е най-прост за начало.
- Как да пуснеш отделен черновен модел в SGLang и във vLLM.
- Как да измериш ускорението честно: еднакви заявки, преди и след, няколко пъти.
02Преди да започнеш
- Машина от класа NVIDIA GB10 (например ASUS Ascent GX10 или DGX Spark) с работеща среда за SGLang или vLLM за ARM64 и CUDA. Тяхното инсталиране не е част от урока — виж документацията им.
- Два модела от едно семейство: по подразбиране vLLM изисква черновата и големия модел да ползват един и същ речник на думите.
- Интернет за еднократното теглене на моделите. Проверѝ лиценза на всеки модел на страницата му, преди да го ползваш в работа.
- Две готови заявки, с които да мериш — по-долу има скрипт.
| Какво | Стойност |
|---|---|
| Памет | 128 GB LPDDR5x, обща за процесора и видеокартата (NVIDIA) |
| Честотна лента на паметта | 273 GB/s (NVIDIA) |
| Пример: голям модел + чернова (vLLM) | Qwen3-8B + Qwen3-0.6B — от документацията на vLLM |
| Пример: голям модел + чернова (SGLang) | Qwen2.5-7B-Instruct + Qwen2.5-1.5B-Instruct — от документацията на SGLang |
| Приблизителен размер на теглата в bf16 | около 2 байта на параметър: 8 милиарда ≈ 16 GB, 0,6 милиарда ≈ 1,2 GB — плюс кеш за контекста |
03Стъпки
-
Как работи
Две роли. Черновата (малък, бърз модел) предлага няколко следващи думи. Целевият модел (големият) проверява всички предложени думи с един проход. Приетите се запазват; на първата отхвърлена целевият модел слага собствената си дума и цикълът започва отново. Така големият модел определя изхода, а черновата само му спестява проходи.
Стъпка (измислен пример) Какво става Чернова предлага 5 думи „Столицата на България е Варна“ Целевият модел проверява Първите 4 са приети, 5-ата („Варна“) е отхвърлена Резултат от един проход 4 приети думи + 1 дума от целевия модел („София“) = 5 думи за цената на един проход през големия модел ✅Качеството не бива да страдаДокументацията на vLLM описва спекулативното вземане на проби като теоретично без загуба, до границите на числовата точност на хардуера. Изходът може леко да се различава от пуск до пуск и по други причини (например размер на партидата).Колко печелиш зависи от честотата на приемане: колко от предложените думи големият модел приема. Ако черновата често греши, проверките се пилеят и печалбата изчезва.
-
Избери метод
Този урок показва най-простия — отделен малък модел като чернова. Има и други, които обикновено изискват специално обучена глава или вградена поддръжка в модела.
Метод Какво му трябва Бележка (по документацията) Отделна чернова Малък модел със същия речник SGLang: STANDALONE; vLLM:draft_model. Най-лесен за началоEAGLE / EAGLE-3 Специално обучена „чернова-глава“ за твоя модел SGLang го препоръчва за най-добро съотношение скорост/качество, когато има такава глава MTP Модел с вграден многотокенов предиктор Само за модели, които го поддържат N-gram Нищо допълнително Без втори модел; в SGLang — само CUDA. Печалбата е скромна -
Измери базовата скорост (без чернова)
Първо стартирай сървъра без спекулативно декодиране (обикновената команда на SGLang или vLLM за същия голям модел), после пусни скрипта. Той праща три еднакви заявки при температура 0 и три при температура 0,7, отхвърля първия (загряващ) отговор и записва медианата на токени за секунда и текста на отговорите.
python · bench.pyimport json, os, statistics, sys, time from openai import OpenAI # SGLang слуша по подразбиране на порт 30000, vLLM — на 8000 BASE_URL = os.environ.get("LLM_BASE_URL", "http://127.0.0.1:8000/v1") LABEL = sys.argv[1] if len(sys.argv) > 1 else "run" PROMPTS = [ "Explain in five sentences how a hash table works.", "Write a Python function that merges two sorted lists, with comments.", "List ten steps for backing up a PostgreSQL database.", ] client = OpenAI(base_url=BASE_URL, api_key="EMPTY") model = client.models.list().data[0].id def ask(prompt, temperature): t0 = time.perf_counter() r = client.chat.completions.create( model=model, temperature=temperature, max_tokens=256, messages=[{"role": "user", "content": prompt}], ) dt = time.perf_counter() - t0 return r.usage.completion_tokens / dt, r.choices[0].message.content ask(PROMPTS[0], 0) # загряване — отговорът се отхвърля result = {} for temp in (0, 0.7): speeds, texts = [], [] for p in PROMPTS: tps, text = ask(p, temp) speeds.append(tps) texts.append(text) result[str(temp)] = {"median_tok_s": round(statistics.median(speeds), 1), "texts": texts} print(f"температура {temp}: медиана {result[str(temp)]['median_tok_s']} токена/с") with open(f"out_{LABEL}.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2)Пусни го така:
python bench.py without. Скоростта включва и прочитането на заявката, но тя е еднаква преди и след, затова сравнението е честно. ⚠️ Скриптът не е пускан от нас. -
SGLang: отделна чернова
Алгоритъмът се избира с
--speculative-algorithm STANDALONE, а черновата — с--speculative-draft-model-path. Примерът е от документацията на SGLang; ние добавихме само--hostи--port, за да не слуша сървърът към цялата мрежа.bash · на машинатаpython3 -m sglang.launch_server \ --model Qwen/Qwen2.5-7B-Instruct \ --speculative-algorithm STANDALONE \ --speculative-draft-model-path Qwen/Qwen2.5-1.5B-Instruct \ --speculative-num-steps 4 \ --speculative-eagle-topk 2 \ --speculative-num-draft-tokens 7 \ --mem-fraction-static 0.7 \ --cuda-graph-max-bs-decode 8 \ --host 127.0.0.1 --port 30000--speculative-num-steps— колко пъти черновата предлага последователно (дълбочина).--speculative-eagle-topk— колко кандидата разглежда на всяка стъпка.--speculative-num-draft-tokens— колко токена се проверяват наведнъж.- Документацията на SGLang (в раздела за EAGLE) съветва тези три параметъра да се задават заедно или изобщо да не се задават, за автоматична настройка. Подразбиращите се стойности за STANDALONE са 3, 1 и 4.
⚠️ОграничениеСпоред документацията на SGLang, STANDALONE към момента не поддържа DP attention (--attn-dp-sizeнад 1). Пусниbench.pyсLLM_BASE_URL=http://127.0.0.1:30000/v1. -
vLLM: отделна чернова
Всички настройки на спекулативното декодиране се подават в
--speculative-configкато JSON. Старите отделни флагове (--speculative-model,--num-speculative-tokens) са обявени за остарели.bash · на машинатаvllm serve Qwen/Qwen3-8B \ --host 127.0.0.1 --port 8000 \ --speculative-config '{"method": "draft_model", "model": "Qwen/Qwen3-0.6B", "num_speculative_tokens": 5}'Същото в Python, без сървър (по документацията на vLLM):
pythonfrom vllm import LLM, SamplingParams llm = LLM( model="Qwen/Qwen3-8B", tensor_parallel_size=1, speculative_config={ "method": "draft_model", "model": "Qwen/Qwen3-0.6B", "num_speculative_tokens": 5, }, ) out = llm.generate(["The future of AI is"], SamplingParams(temperature=0.8, top_p=0.95)) print(out[0].outputs[0].text)⚠️Версии и ограничения от документациятаСпоред vLLM, спекулативно декодиране с черновен модел не се поддържа във версии до 0.10.0, а паралелизмът по конвейер (pipeline parallelism) не се комбинира с него във версии до 0.15.0. Провери версията си. Друг речник между черновата и големия модел е възможен само с опциятаuse_heterogeneous_vocabи засега само при „greedy“ предлагане на чернова. -
Измери отново и сравни
Спри сървъра, пусни го със спекулативното декодиране и повтори
python bench.py with. Сравни двата файлаout_without.jsonиout_with.json.- Скорост: медианите при температура 0 и при 0,7. Повтори пуска няколко пъти — единичен пуск не е доказателство.
- Текст: при температура 0 отговорите трябва да са еднакви или почти еднакви. По документацията на vLLM малки разлики са възможни заради числова точност и размер на партидата.
- Честота на приемане: vLLM има страница за метрики на приемане по заявка — виж „Източници“. Ако честотата е ниска, пробвай друга чернова или друга дължина на предлагане.
Моите числа Без чернова С чернова Температура 0, токени/с — — Температура 0,7, токени/с — — Допълнителна памет — — -
Кога не помага
- Черновата често греши. Друго семейство, много по-слаб модел или различна задача намаляват приемането. По принцип по-висока температура също го намалява — затова мери и при твоята температура. ⚠️ Не сме го мерили на GB10.
- Кратки отговори. Малко токени — малко за печелене.
- Голямо едновременно натоварване. Допълнителният модел и проверките са допълнителна работа; при много паралелни заявки ползата може да се стопи. Мери при реалното си натоварване.
- Допълнителна памет. Черновата и нейният кеш заемат място в общата памет, която делят и системата, и големият модел.
Ако не видиш печалба в твоите числа — не го ползвай. Измереното е по-важно от обещаното.
04Проверка
- Черновата е от същото семейство като големия модел (общ речник).
- Имаш записани числа без и с чернова, от един и същ скрипт и същите заявки.
- Мерено е повече от веднъж и при двете температури.
- Сървърът слуша само на
127.0.0.1. - Знаеш колко допълнителна памет заема черновата.
Тест
1. Какво прави големият (целевият) модел с думите, предложени от черновата?
2. Защо черновата трябва да е от същото семейство като големия модел?
3. Как се измерва честно дали спекулативното декодиране помага?
4. Какво казва документацията на vLLM за качеството на изхода?
05Какво следва
06Източници
- SGLang: Speculative Decoding 🔒 локално — методи,
STANDALONE, параметри и ограничения. - vLLM: Speculative Decoding · Draft Models 🔒 локално —
--speculative-config, гаранции за качество, известни несъвместимости. - vLLM: метрики на приемане по заявка — как да видиш честотата на приемане.
- NVIDIA DGX Spark: хардуер — 128 GB обща памет, 273 GB/s.
- Chen и др.: Accelerating Large Language Model Decoding with Speculative Sampling — основната работа, на която се позовава vLLM.
- Qwen3-8B 🌐 глобален — страница на модела с лиценза му.