CS 2420 · Group 14 · Priced Trajectory Control

Thinking on a budget

AI models like the one behind "thinking mode" chatbots write out long chains of reasoning before they answer. That makes them more accurate, but it is expensive. When many people ask questions at the same time, the server runs out of room and most people get no answer at all. This page shows the problem, our fix, and what happened when we tested it.

2.6×more correct answers than a server where every question thinks, under heavy load (live GPU, hard math)
81% vs 61%correct on time vs "always answer instantly", when the server has room to think
0settings to hand-tune: the server's own load sets the price of thinking
The problem

Thinking costs about five times more than answering

Ask the model (Qwen3-4B) a math question and you can let it answer right away, or let it think first. Thinking writes thousands of extra words, called tokens. Every token the model is still working on takes up GPU memory.

Quick answer
670 tokens
Think, then answer
3,541 tokens

Average over 800 held-out MATH-500 and GSM8K questions.

And most of the time, thinking doesn't change the answer. When we answered each question both ways:

Both right. Thinking was wasted.
Thinking fixes it. This is where thinking pays.
Thinking breaks it. The model talks itself out of a right answer.
Both wrong. Too hard either way.

With one user, wasted thinking only costs time. With a crowd, it is worse. The GPU's memory fills with half-finished reasoning, the server starts throwing work away and redoing it, and new questions wait in line until they time out. On a live GPU, a server where every question thinks answered only 25% of hard questions correctly in time under heavy load, even though it gets 70% right when it does answer.

Our idea

Put a price on thinking, and let the crowd set it

Every request goes through the same three steps.

Step 1

Answer quickly first

Get a fast answer with no thinking. It is cheap, and right about 86% of the time.

Step 2

Think, and check in

Every 256 tokens, ask the thinking model for its current answer. When it agrees with the quick answer, stop: that answer is right 96% of the time.

Step 3

Let load set the price

A small optimizer re-solved every half second puts a price on thinking based on how full the server is. When it's busy, fewer questions get to think.

Two real questions, with the thinking model's answer at each check-in. A green chip is right, a red chip is wrong, and an orange underline means it matches the quick answer.

The price works like a dial. It doesn't stop each question at a fixed point. It decides how much thinking the whole server can afford right now.

Quiet serverThinking is cheap. Hard questions think until the check-in agrees.
Getting busyThe price rises. Some questions get the quick answer; the rest still think.
OverloadedThinking is expensive. Most questions get the quick answer, so nobody is left waiting.
Watch it

Six minutes, one traffic spike, two servers

Math questions arrive at one GPU: a quiet stretch, a rush at 2.25 questions per second, then quiet again. The left server lets every question think to the end. The right server uses our method. Each square is one question. Press Play, or drag the slider. Click any square to see its question and answers.

0:00
quietrushquiet again
quiet
waiting in line giving a quick answer thinking answered correctly answered wrong gave up after 60 s in line
Question detail
Click any square to see the question, the quick answer, and what the thinking said every 256 tokens.

The dial during the spike

How our server answered the questions that arrived in each 20-second window. During the rush it moves questions from thinking to quick answers. When the line clears, thinking comes back.

quick answer only quick, then think until it agrees think with a stop rule

Scoreboard over 8 replays

Correct answers in each phase, averaged over 8 different random streams of questions. The last column is the middle (median) wait from asking to getting an answer during the rush.

"Always quick" is fastest and nearly as accurate on these mostly easy questions. Our server gets slightly more right but makes people wait longer during the rush.

How this replay was made: each square is a real recorded Qwen3-4B answer (MATH-500 and GSM8K), timed by a simulator of a vLLM server on one A100 GPU slice. On the same loads, the simulator lands within about 2% of live server runs. The replay uses the earlier version of our method, which looks up its price in a table built in advance.

Real GPU results

On a real GPU with hard problems, it holds up

We then ran the newest version live: it re-solves the price every half second from what is actually on the server. Test: 300 hard competition math problems (MATH Level 5) the method had never seen, Qwen3-4B on one A100 GPU slice, each question gets 5 minutes, two runs per point. The score is the share of all incoming questions answered correctly within 5 minutes.

81% vs 61%When there is room to think (12 questions a minute), our server uses it and beats always-quick by 20 points.
65% vs 25%Under heavy load (39 a minute), thinking-heavy servers jam and drop questions. Ours moves to quick answers and keeps answering everyone.
About evenA simple hand-tuned rule ("answer X% quickly when busy") does about as well on average. Ours needs no tuning, and after a burst of traffic it recovered better: +11 points (early result, two runs).

Each cell is the share of all incoming questions answered correctly within 5 minutes, averaged over two runs. Gaps of a few points are within noise.

Where it's useful

Any reasoning model on a fixed number of GPUs, with traffic that comes in bursts

Today, users choose how much a model thinks ("reasoning effort", "thinking budget"). Nothing adjusts it from how busy the server is. Our method lets the server decide how much thinking it can afford right now, so a spike becomes slightly shorter answers instead of an outage.

Self-hosted models

Hospitals, banks, universities

They run models on their own GPUs for privacy and can't add hardware on demand. When everyone logs in at 9am, everyone still gets an answer.

Education

Homework and tutoring apps

Traffic jumps the night before an exam. Quick answers during the rush and deep thinking once it's quiet beats error pages for half the students.

AI providers

Chatbots and APIs

New GPUs take minutes to come online; spikes hit in seconds. Instead of "server busy" errors, everyone gets a slightly shorter answer.

Cost control

Budgets instead of load

The same price can come from a spending budget: spend thinking where it changes the answer, per customer tier.

Doesn't this give more wrong answers?

No method guarantees correct answers: thinking every time still gets 20–30% of hard problems wrong. Under heavy load the real choice is a quick answer or no answer. A thinking-first server got 70% right on what it answered but answered too few in time, so only 25% of all questions got a correct answer. Ours answered everyone and got 65% right. When there is room, ours thinks and scores at or above every other policy.

We trade a few points of accuracy for answering everyone, and only when the server is overloaded.

Where to be careful

  • High-stakes answers (medical, legal): label quick answers, offer a "think harder" retry, or reserve a thinking budget for important requests.
  • Waiting time: in the simulated spike, the typical wait was 47 s vs 9 s for always-quick.
  • Scope: tested on math with Qwen3 models on one GPU type. Coding and chat are untested.
What's new

Who gets to think, not just when to stop

Most research on reasoning models asks when one question should stop thinking. We ask how a busy server should share thinking across everyone. Seen that way, the server breaks because it runs out of memory, not compute. And the fix is deciding who gets to think, not trimming each answer.

What we add

  • Showing how serving collapses under load: the server stays accurate on what it answers but answers few questions in time. Scores that only count answered questions hide this.
  • A live price on thinking that keeps the server out of that collapse with no hand-tuning, and reacts to the backlog rather than the arrival rate.
  • Agreement with the quick answer as a stop signal: wrong only 3.9% of the time, versus about 21% for "the thinking stopped changing its mind."
  • A tested simulator (within about 2% of live runs) so others can try serving policies without a GPU.

What others already do

  • Switching to quick answers under load (LASER, JointThinking, AdaptThink).
  • Using an optimizer's prices to share a resource (standard operations research).
  • Compressing the model's memory. We tried it and it added nothing measurable.

Next: more runs of the traffic-burst test, since that is where the live price clearly beats a hand-tuned rule.