Skip to content

Fix slow decodes "poisoning" sleep times when using power throttling#464

Open
omnomburp wants to merge 2 commits into
antirez:mainfrom
omnomburp:fix-power-throttle-decode-warmup
Open

Fix slow decodes "poisoning" sleep times when using power throttling#464
omnomburp wants to merge 2 commits into
antirez:mainfrom
omnomburp:fix-power-throttle-decode-warmup

Conversation

@omnomburp

Copy link
Copy Markdown

When using --power <number>, decode could slow down dramatically after prefill
(~0.11 tok/s observed) even though unthrottled decode was normal.

The throttle used the first decode timing samples immediately to seed its EMA and
sleep duration. If those first samples were cold/outliers, the resulting long
sleeps could keep the GPU cold and reinforce the slow decode loop.

This change skips sleeping for the first few decode evals, uses the fastest
warmup sample to seed the decode average, and caps later outlier samples relative
to the current average.

…average

Replace the decode power-throttle EMA plus warmup/outlier-cap heuristics
with the median of the last 16 token times kept in a fixed ring buffer.

A decode token can stall for reasons unrelated to steady-state work:
scheduler preemption, first-touch page faults, GPU clock ramps after the
throttle's own sleeps, or SSD expert streaming when enabled. Such
one-off stalls previously inflated the average and the sleeps applied to
the fast tokens that follow. The warmup only protected the first tokens
of a graph's lifetime, and the 4x cap still let a burst of slow tokens
ratchet the average up at every request. The median is unmoved by up to
7 slow samples out of 16, needs no warmup or tunables, and still adopts
a genuine sustained slowdown once it fills half the window. The window
is a power of two so the ring index is a mask; with an even count the
upper middle sample is used, erring toward slightly longer sleeps and
staying under the power target.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant