Спекулятывна дэкадавання, ранній выход і квантавання: швыдшая дэкадавання мадэляў LLM
Як спекулятывна дэкадавання і ранній выход скарачаюць час выканання мадэляў LLM, калі прыйнятця чэрнавіка прыносіць корысць, і як яны поў’язаны з квантаванням і пагінаванням кешу KV.
Крыніцы: **Foundations of LLM Inference Optimization: Speculative Decoding and Early Exit | Part 3D**
Працэс аналізу LLM адзейнаеся ў двух фазах. Фаза падготавкі паралельна пераробляе весь запіт і можа утрымваць GPU у працэ. Фаза дэкодавання выдае по аднам токену за раз, і кожны токен залежыць ад пярэдньага, таму апаратная частка большасцю часу чакае. Самэй гэтай последовайной залежнасці інтэрактыўная затрымка застаецца вялікай, нават калі колькасць FLOPs на паперы выглядае значным.
Prefill phase:
Input: [token_1, token_2, ..., token_512] → all 512 tokens processed in parallel
Matrix shape: [batch, 512, 4096]
GPU utilization: high — large matrix, full Tensor Core throughput
Decode phase (one step):
Input: [token_513] → one token processed
Matrix shape: [batch, 1, 4096]
GPU utilization: low - tiny matrix, most CUDA cores idle
Чаму дэкадаванне знаходзіцца на крытычнай дорозе
На кожным кроку дэкадавання мадэль выконвае запыткі да растучага кэша KV. Роба на кожны крок зростае з дужынай кантэкста, і для чату нельга свабодна агрупаваць запыткі, таму што паказнікі задзейснення лімітуе тое, як дазго запытка можа чакаць на адпаведны адказ. Арыметыка паказвае, як мало рэсурса чыпа фактычна вікорыстоўваецца на адзін крок:
One attention head, decode step:
Query Q: [8, 1, 128] → 8 × 128 = 1,024 elements
Keys K: [8, 2048, 128] → 8 × 2048 × 128 = 2M elements
Values V: [8, 2048, 128] → same
Matrix multiply (QKᵀ) per head:
Shape: [8, 1, 128] × [8, 128, 2048] → [8, 1, 2048]
FLOPs: 8 × 1 × 128 × 2048 ≈ 2.1M FLOPs per head
For 32 heads: ≈ 67M FLOPs per layer
For 32 layers: ≈ 2.1B FLOPs total per decode step
A100 peak at BF16: ~312 TFLOPS = 312 × 10¹² FLOPs/sec
Time to execute 2.1B FLOPs at 100% utilization:
2.1 × 10⁹ / 312 × 10¹² ≈ 0.0067 ms
Actual observed decode latency per step: ~10–30ms
Effective compute utilization: < 0.1%
Эфектывнае выкарыстоўванне менш 0,1% означае, што працэс дэкодавання обмежваецца працэю памяці і колькасцю крокаў, а не сувесной вычысковай моцю. Існуе два спосабы яго атакаваць: аднакоўваць больш прыйнятных токенаў за кожны дорогі крок або выканаць менш працы за кожны крок. Спекулятывнае дэкодаванне выконвае першы варыант, а раннія выходзь з працэсу — другі.
Спекулятывнае дэкодаванне: прапозыцыя, а потым перакананне
Маленькія модэлі-прапозыцыі прымаюць кілька можлівых токенаў на будучыню. Цэльны модэль пераглядае ўсе іх за адну паралельную процэсу прабірання, заставляе найдужэйшы спакойны прыметнік і пераранжоўвае токены пасля першай адмовы. Кожны прыняты токен-прапозыцыя — гэта токен, за які вы не заплатылі за цэлы крок цэльнага модэля.
Without speculative decoding:
Generate 5 tokens: 5 × 30ms = 150ms
With speculative decoding (K=4):
Draft 4 tokens: 4 × 1.5ms = 6ms
1 target verification pass: ~35ms (slightly longer than decode,
processes K+1=5 positions)
Expected accepted tokens per round:
(1 - 0.80^5) / (1 - 0.80) ≈ 3.36 tokens
Time per round: 6ms + 35ms = 41ms
Time per token: 41ms / 3.36 ≈ 12.2ms
Speedup: 30ms → 12.2ms ≈ 2.5×
Спяшчэнне завісіць абсалютна ад таго, як часта ўзгоднае праект і цэль. Тэкст з простым, нізкім энтропіям прымае дзялёныя версіі; нечаканы токен скорачвае цікл. Чырвоныя пункты — гэта концэптуальны варыянт ціклу (рэальныя рэалізацыі таксама керуюць кэшам KV у обох мадэлях):
import torch
import torch.nn.functional as F
def speculative_decode(target_model, draft_model, input_ids,
max_new_tokens, K=4, temperature=1.0):
"""
Conceptual speculative decoding loop.
Real implementations handle KV cache management across both models.
"""
generated = input_ids.clone()
while generated.shape[1] - input_ids.shape[1] < max_new_tokens:
# --- Draft phase ---
draft_tokens = []
draft_probs = []
draft_input = generated.clone()
for _ in range(K):
with torch.no_grad():
draft_logits = draft_model(draft_input).logits[:, -1, :]
q = F.softmax(draft_logits / temperature, dim=-1)
token = torch.multinomial(q, num_samples=1)
draft_tokens.append(token)
draft_probs.append(q)
draft_input = torch.cat([draft_input, token], dim=1)
# --- Verify phase: one target forward pass over all K+1 positions ---
verify_input = torch.cat([generated] + draft_tokens, dim=1)
with torch.no_grad():
target_logits = target_model(verify_input).logits
# target_logits[:, -K-1:, :] covers all K draft positions + bonus
# --- Accept/reject ---
accepted = 0
for i in range(K):
p = F.softmax(target_logits[:, -(K+1)+i, :] / temperature, dim=-1)
q = draft_probs[i]
token = draft_tokens[i]
# Acceptance probability
accept_prob = torch.min(
torch.ones_like(p.gather(1, token)),
p.gather(1, token) / (q.gather(1, token) + 1e-9)
)
if torch.rand(1) < accept_prob:
generated = torch.cat([generated, token], dim=1)
accepted += 1
else:
# Sample corrected token and stop this round
corrected_dist = F.relu(p - q)
corrected_dist = corrected_dist / corrected_dist.sum(dim=-1, keepdim=True)
corrected_token = torch.multinomial(corrected_dist, num_samples=1)
generated = torch.cat([generated, corrected_token], dim=1)
break
else:
# All K accepted - take bonus token
bonus_logits = target_logits[:, -1, :]
p_bonus = F.softmax(bonus_logits / temperature, dim=-1)
bonus_token = torch.multinomial(p_bonus, num_samples=1)
generated = torch.cat([generated, bonus_token], dim=1)
return generated
Калі ўмога, выберыце праект з той жа групы, напрыклад, адсталяваны чы або квантаваны «маленькі брат», і пераканаўце рэштаўку на сваём трафіце, а не на прыкладах з публічных блогаў.
Калі праекты адхіляюцца
Калі распад праекта адхіляецца ад распаду цэльвога праекта, рэштаўка зменшыцца, і вы заплатыце за праект практычна нічога. Пастарайцеся стацыонарна сочыць за рэштаўкай і перайдзіце на звычную дэкодаванне, калі яна знізіцца.
Швыракі контроль з целымі цыфрамі: заўважкаймо, што цэльвы крок коштае 10 мс, а праект пропануе 5 токенаў, з якіх у сярэднем прыймаецца ад 3 (60%). Кошт за прыйняты токен зменшыцца па адносу да крокаў з аднім токенам, нават пасля додатковых вітрачэнняў праекта, як толькі рэштаўка застанецца высокай. Калі рэштаўка знізіцца да аднаго токена, такі падход будзе нерацыональны. Самэ гэта чутлівасць ўскладнюе аналіз на прыкладах з рэальных сітуацыях.
Ранні выхід: пры простых токенах прыпініце працу на глыбокіх шарах
Дзеяныя архітэктуры дазваляюць токэну пакінуць сетка на проміжным слое, калі рэгламентна доверыльна гэтыя значэння ў высокім рангу, што дапамагае заўсёды захаваць вычысловы рэсурсы для знакоў паводзка, артыкуліў і іншых прыемлівых токэнаў.
Layer distribution of exits:Exit at layers 1–8 (very easy tokens like punctuation, articles): 15%
Exit at layers 9–16 (medium tokens, common continuations): 35%
Exit at layers 17–24 (harder tokens, named entities, numbers): 30%
Exit at layers 25–32 (full computation required): 20%Weighted average layers executed:
0.15 × 6 + 0.35 × 12 + 0.30 × 20 + 0.20 × 32
= 0.90 + 4.20 + 6.00 + 6.40
= 17.5 layers averageSpeedup vs always running 32 layers:
32 / 17.5 ≈ 1.83×
У працэздатнасці аднароднага дэкадавання ранні выхід з працэсу змінюе рэзультаты, калі ён прыпіняе обработку шароў, як і было запланавана. Ён жэртвуе якасцю зарады швальнасці і сільна залежыць ад таго, насколькі правільна настроена доверлівасць, таму неабходна прызначыць дзеякі дыяпазон паклонення точнасці і яго змерыць.
Складанне з квантывацыяй, групавым обработкам і кэшам KV
Аднароднае дэкадавання змінюе цыкл пропанавання токенав за дапамою дадзення другой мадэлі; ранні выхід змінюе глыбіню обработкі ўнутрь адной мадэлі. Яны сталкнуцца з супакоўкамі, схожымі за характарам, але рознымі па спосабе, і аба падходы іноды можна складваць з квантывацыяй, неперывным групавым обработкам і пагінаванням кэша KV:
Combined stack example:
Target: 7B model, BF16, FlashAttention, PagedAttention
→ Model: ~14 GB, memory-efficient attention, paged KV cache
Draft: 70M model, INT4, FlashAttention
→ Model: ~35 MB, near-zero memory overhead
Speculative decode:
→ with K=4, α=0.80
→ ~2.5× token generation speedup on long outputs
Full stack speedup vs FP32 no-optimization baseline:
- Quantization: 2–2.3× throughput
- FlashAttention: 20–40% attention latency reduction
- Speculative decoding: 2–2.5× decode speedup (on eligible requests)
Combined: 5–8× improvement in end-to-end tokens/second
Стакаванне дапамагае ў кераванні процэсам. Дзейства, якія выконваюцца пад час стварэння праекта, вплываюць на прынятыя зачынанні непаўзлівага планавальніка групавання задач, а паслаблы планавальнік фрагментуе групы задач, што пагубна для ўтылізацыі рэсурсаў. Палітыкі вывядзення з кэша KV трэба налаштаваць, каб дугі чаты не спрачывалі занадто большых рэсурсаў. Кэшаванне запытанняў на этапы падготавкі таксонамів таксама мае значэнне, інакш вы «вылечыце» проблему дэкадавання, але будзееце марна выкорыстоўваць рэсурсы падготавкі. А стакаванне з раннім выходам і агрэсіўным квантаваннем можа быстра прычыніць паўстанне галюцынацый. Кохэраны дызайн аператыў служэння лепшы, чым проста перанесены з іншага даследжэння элемент, які вжываецца у ключовых частках працы.
Калі кожная тэхніка ўзмацнівае эфектыўнасць
Спекулятывнае дэкадаванне дапамагае, калі ступень зусімнай згоднасці праекта высока і целевыя крокі значна вплываюць на затрымкі. Яно не ўзмацнівае эфектыўнасць, калі праекты рэдка супадаюць або додатковы час на ўтворэння праекта паглотвае всі перавагі. Ранні выход дапамагае, калі багато токенав лёгкія да апрацоўкі і бюджэт на точнасць дазволяе гэта; яны не ўзмацніваюць эфектыўнасць у віпадку складных токенав або калі рэвалюэйція ўпевненасці паслаба пракалібрувана.
Конкрэтны прыклад: мадэль размерам 7 мільярда элементаў, якая выконвае функцыю чату з адпаведзямі дыяварацый 50–150 токенаў. Прыпыленне запыту сістэмы, якая можа обрабатваць 2 тысячы токенаў, ёсць трыудзелным працэсам, але ён выконваецца рэдка за кожны раунд, тады як саме крокі дэкадавання ствараюць затрымкі, якія бачаюць корыстнікі. Зменшэнне колькісці крокаў дэкадавання за дапамогою спекулятывнага прыйнятця рашэння або зменшэнне працы за кожны крок за дапамогою ранньага выходу — гэта тое, што насправды відчуваюць корыстнікі.
Чы гэта мае значэнне для маленькіх модэляў, якія працуюць на самым прыстрое? Зазвычай менш, чым для вялікіх модэляў. Чы можа працэс запускацца на CPU? Інодзе; трэба гэта пераканацца. Як прыорытэты: спачатку выправіце працэсы групавання дадзеных і кэшавання, потым дадзіце спекулятывнае дэкадаванне, а ў разе, калі ваша архітэктура дазволяе, — ранні выход.
Інтэграцыя ў практычную працу LLM
- Абліковыя показнікі затрымкі p95 і якосці пры рабоце без будзь-яых змян.
- Размясціце працэвыканы мадэль і цэль на аднам жоўце. Выкарыстоўванне працэвыканых модэляў на разных хостах стварае перашкоды ў сецыі, якія могу знішчыць усе прыбыткі, а две модэлі плюс кэш KV могу заповніць памяць устройства, якая легка раней магла размясціць толькі адну мадэль.
- Запісвайце гістаграмы прыйнятных рэзультатаў, сярэжную дужыну прыйнятых тэкстаў, пакісці выкарыстоўвання якасці, ступень выкарыстоўвання GPU і паздзейненне p95.
- Сачыце за балансам CPU і GPU, калі працэвыканыя модэлі запускаюцца на разных прыстроях.
- Прабавайце методы A/B для пераканання ў якасці на тэстовых наборах. Перш чым запусціць ўсеўказовы варыянт, працаваце з фіксаванымі запросамі на тэстах па фактам, кодаванні і сітуаціях адхілення, і пораўняйце шчыльнасць токенаў, калі налаштавана спекулятывная дэкадаванне для точнага падабення распаду. Для раннега выявлення проблем сачыце за шчыльнасцю успехоў у заданнях з оцэнкай і людскімі прыярытэтамі, якія ў вас ёсць.
- Размясціце кожную оптымізацыю пад флагам функцыі з можласцю выключэння і пераходу на стандартную дэкадаванню, і рэпетыруйце процэс адвярнення змян.
- Параксенавайце усё пасля змяны токэнізатора або настройкі файн-цюнінгу.
Правільна рэалізаваная спекулятывная дэкадэрка должна падабяцца да целевага распаду, але пераканаўцеся ў гэтым за дапамогою парных тэстаў, а не прымікайце да яе без пераканання. Частыя прычыны пахыбак — выкарыстоўванне несвязанага праекта, ігнараванне таго, як тэмпература вялічыць шансы на адзначэнне, або прызнанне успеху на адзначэннях праўільнасці працы без пераканання ў якасці, і кожна з гэтых прычын можа быць вымерана.
Команды платформы должны контролаваць гэтыя оптымізацыі на слою выдачы, каб кожная команда прыладоў не стварала свой сабестой праекта. Коордынавацыя з адпаведнымі адпаведальнымі за выдачу заместа змяны коду прыладоў, адкрыцце заголовкаў або атрыбутаў для атласавання, якія паказваюць, чы была выкарыстоўвана спекулятывная дэкадэрка або раннія выход, а таксама пазначэнне токэнаў па оптымізацыі, каб фінансавыя аддзелы моглі бачыць рызыкты.
Залішаны вузькі канал
Калі працэс дэкодавання стане быстрэйшы, корыстнікі можаць яшчэ чакаць на вызовы інструментаў, запошук даных чыстае адрасаванне маркдауна на боку кліента. Іншыя ліміты можаць стаць пропускная здатнасць памяці, сетка чыстае кліента, а не колькасць FLOPs, таму трэба працаваць ад пачатку да канца і аналізаваць працу прыемніка, перш чым прыменяць усе методы з нарадчых матэрыялаў. Спекуляўнае дэкодаванне таксама не заменяе якіснага запошуку даных чыстае хорашых запрошэнняў; яно толькі зменшыць вартасць наступных токенав, калі мадэль вялікі час ведае, што хочаць сказаць.
Парадны дэкодаванне — гэта структурны налог аўтарэгрэсіўнага генеравання. Спекуляўнае дэкодаванне чыстае ранні выхід зменшаюць гэты налог у умовах, якія можна змерыць, таму іх трэба впрыснуць як і будзь-якую функцыю для прыемніка: з метрыкамі, флагамі, можлівасцю адката чыстае чыстае вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вялікі час вял
- Оптымізацыя працэса адгукнення LLM: прадзейнаванне даных, дэкадаванне і корпаратыўныя рашэнні на аднойчынных моцных сістэмах: Проблемы, якія створаюць ускладнення прадзейнавання даных, такія як прадзейнаванне пры запуску або дэкадаванне, а таксама методы, якія дапамагаюць — непаўзова групаванне дадзеных, FlashAttention, квантызацыя, PagedAttention, спекулятывнае дэкадаванне, прадзейнаванне даных па часткам і розпыленая выдача рашэнняў.
- Непаўзова групаванне дадзеных і прадзейнаванне пры запуску па часткам у vLLM і SGLang: Статычныя групы дадзеных для LLM змушваюць GPU скаржыцца на непатрэбную працу з заполненням прастору. Раскладка на рэвэліях і прадзейнаванне пры запуску па часткам дапамагаюць падтрымваць павольны прыток дакументаў для дэкадавання, пакуль новыя запіты ўжо працуюць.