Writings

Thoughts and essays - the long-form.

AI Speed Benchmark Blind Spots

2026-08-26

I read a lot of articles complaining about AI speed benchmarks. The common refrain is that these benchmarks exist and are so commonly accepted that the only way to get traction with your model is for it to do well on those tests. So creators train their models to do well on those tests, in a process now known as "benchmaxxing". In theory there's nothing wrong with this - if there's a test, let's make sure we can do well on it. But in reality there's a real issue with this practice: spending time training a model to pass a benchmark means you're drifting the model away from what it should be good at instead. So the complaint is a valid one - the benchmarks are actually making models worse instead of better. But humans need to understand everything as a comparison, so the benchmarks are a necessary evil. There isn't really a good answer there.

Despite all this, that isn't even my problem. I have different issues to talk about. When models are benchmarked for speed, they are generally using the measurement of "tokens per second" (tok/s). The main problem I have is that almost all benchmarks on AI speed are on Token Generation (TG). When you see headlines like: "This model gets 50 tok/s!" unless qualified, these will always refer to TG tok/s. And TG is a big deal - this is the speed that a model outputs content back to the user. So it's not only a useful metric, but an important one.

My problem isn't that this exists, or that it is highlighted. I have two issues with this, and much like everything else on AI, my problems are with the practical implications:

Issue #1: TG benchmarks are also benchmaxxed.

You can tune a model to output at a higher speed than what it would do in any real-world scenario. If you turn the temperature of a model down to .2 or 0, it gets far less creative in its thinking, so it will spend less effort on its answers. And because it's generating far fewer tokens, it spits them out at a much higher rate. You can further increase this by limiting context size, limiting max output tokens, and increasing speculative decoding to a higher rate (5-7 or even higher in rare cases) to eke out every last token per second.

The problem I have is this isn't indicative of real world performance. When you turn the sampling and context settings back to a real world use case (temp in the .7 to 1 range, context size to over 128k, etc.) the tok/s for TG drops significantly. Similarly you can get much higher speeds out of a more heavily quantized model - a Q4 quant of a model will be inherently faster than a Q6, even though it will be less coherent. If the model needs four extra turns to get a script correct at Q4, it's irrelevant how fast it is. And this is fine if you know these things well, but the problem lies in the fact that people new to AI now have a skewed perception of the kind of responsiveness and speed they should expect from the models they are using.

When I first started setting up local AI inference, I read all the benchmarks and articles and I expected to get ~35 tok/s from my model. Then I ran it with all the recommended settings and was getting 8 tok/s. If you're learning AI for the first time, this is a real shock to the system.

I do understand that it's very difficult to get a practical measurement of TG tok/s because use cases will greatly affect the outcomes here. Chatting with an agent will get much lower TG than coding. Solving a problem will get lower TG than creating something new. Every use case is different, so yes this is subjective. But still - you can give more realistic expectations if you have show measurements for different use cases. Keep the "this is the max speed" baseline as we have today. But add a coding speed and a chat speed that can give people a better expectation of how responsive the model will be for their tasks.

Issue #2: TG is the wrong measurement in most cases.

Again, TG is important. But agentic is now the most common use case for AI. And something that's not often talked about in this context is the fact that most common AI agent harnesses pass a lot of tokens into the model in every turn. It's not uncommon for a typical interaction with an AI agent to have over 100,000 tokens sent in and under 1,000 returned. So the model has to process significantly more input tokens than output. This is known as Prompt Processing (PP) and has a completely different throughput than TG.

There are two misleading factors with not measuring PP as part of the baseline "speed" of a model. First is that the settings I referenced that increase TG can negatively impact PP. Speculative decoding materially increases TG but reduces PP throughput. And second, lowering context size to 8192 for a TG benchmark is irrelevant when most agents barely function with a context size less than 128k. (Yes, you can have context significantly smaller for coding-only, but actual agentic work requires a much higher window.)

The reality of this is that "wall time" (the amount of time from beginning to end of a turn) is made up much more of PP than TG in most agentic use cases. If you send in a prompt to an agent and it takes 20 seconds to respond, many cases would have that be 15 seconds for PP and 5 for TG. Mind you - PP and TG have individual dials you can tune (as well as cache reuse which can heavily impact wall time). So while wall time is the perceived response time, there are a lot of factors that go into it, and some that have zero to do with the model itself. So PP is still the more useful benchmark for agentic use.

I will concede two issues with my push for PP as a more impactful speed measurement:

First, inference providers can have a big impact on PP. Two of the most popular ones - llama.cpp and vLLM - each deal with throughput differently. Llama.cpp is often regarded as the "faster" provider because you can get higher TG speeds out of it in many cases. But vLLM has a significantly higher PP in most cases, most especially if you have parallel calls coming in. So people new to local AI will see the benchmarks that llama.cpp is "faster" and then see their wall time being much slower than it should be.

Second, some newer models are made to do heavy reasoning to get to the right answer in fewer turns. There's a stigma in the community around these models, calling them "overthinkers". I won't comment on whether this is good or bad, but it is an intentional shift in how some of these models behave. The newly released Qwen 3.8 27b from Alibaba can easily crack over 10,000 reasoning tokens before giving an answer. And Poolside's Laguna S 2.1 routinely burns over 40,000 reasoning tokens per turn. In these cases, yes TG is an impactful measurement of their responsiveness.

So where does this leave us? The solution is pretty simple: as with almost everything else - more information is better than less. The more input we have into any decision, the better decisions we can make. In an ideal world you'd see something like this for speed benchmarks:

Provider 	64k PP 		Chat TG 	Coding TG
Llama.cpp	300t/s		30t/s		70t/s
vLLM		1,200t/s	25t/s		60t/s

You might still have the issue of benchmaxxing, but it's a start. Having a rotating list of prompts to use for these could solve that as you can then use averages across them. It might not be fully apples-to-apples if you had to keep these revolving so model creators couldn't train for specific prompts, but I'd rather have slight drift in these numbers than know the models are going to be worse for it.

It's not a perfect solution by any means, but at least then we'd have a clearer picture of factors and tradeoffs to decide which model and which inference provider are right for our individual use cases.

I'm All For Abliterated Models

2026-08-24

I saw many articles on this topic in the last few years and with the recent updates to most of the frontier models moving in the direction of expanded guardrails, this discussion is as relevant as ever. Also, since all of the models on Hugging Face that I've published have been abliterated, I want to explain why.

To level set: in case you don't know, abliterated means uncensored. This can be done in many different ways with different focus points on what it's actually removing, but in general this is what it means. And to be more specific, it generally refers to reducing or removing the model's refusal to answer a prompt. You surgically go into a model and change how it will respond.

I'll start by saying I agree with guardrails for online models. It's not a popular opinion but this is a tool that can be misused badly, and most people don't realize just how easily and the extent this technology can be used for harm instead of good. With our litigious society today, companies have to protect themselves from liability, which means refusing to give information that can be used for nefarious purposes. So I get it from both angles.

There's an odd side effect here though - Anthropic has been adding more extensive guardrails to their products. And many other providers use Anthropic's data to train their models. Which means a large range of AI companies are unintentionally baking in refusals to their models through a domino effect from Anthropic. The community has been reporting this with newer releases of many models today. It's not a great situation when one company's decision is directly affecting a wide swath of ability across the board.

So on the one hand, I do agree guardrails are necessary in this day and age. On the other hand, I only use and create abliterated models. There's good rationale for this (see the references below):

  • Models can hide worthwhile information behind political alignment filters (to test this - ask any model from China about the events in Tiananmen Square) or give you information that is heavily leaning toward a political ideal.
  • Cybersecurity work has extensive false positives that can appear as hacking. Even trying to evaluate your own website can raise red flags.
  • Research can be flagged for keywords. I'm a big believer in mental health and learning as much as you can so you can better yourself and help those around you, especially trying to understand what people are going through. This is easily flagged for self-harm.
  • Some models will flag work you give to an agent as attempting to hack or spam when you're trying to automate parts of your life.
  • AI companies that are blocked by sites for scraping data can now refuse to allow you to work with those sites even if your intentions are valid.
  • AI can be very frustrating to work with, and I've seen a close friend get flagged for "harassment" when an online model burned an entire week's worth of tokens not doing what it was asked.

You can find this list in almost every article that argues for uncensored models. None of this is new. But there's another reason that you won't find talked about often - performance. When a model has guardrails baked in, it has to check every prompt against them before it can reply - and that layer adds real work and time. Remove those gates and the model has less to do before it answers you. It's surprising, but it can be noticeable over time.

To put it another way - I just want a friction-free way to get my personal work done.

I understand there's tradeoffs with this. Abliteration has downsides - the more you mess with the way a model was intended to function, the more you can lobotomize it. I've run evaluation suites and watched an abliterated model fail repeatedly at tasks that the original version completed easily. Hallucinations also grow with abliteration. There's a measurement for this called KL Divergence that shows how far a model has drifted from the original. I aim to keep it under .05 whenever I can. It's not a percentage - it's a reference number I use as a sanity check. But even a reading that low represents a real change in behavior, and the drift gets steep fast past that point. Much like quantization, larger models tend to survive this process much better than smaller ones - they will stay closer to their original state much more often than a 20B model.

Abliteration issues can be mitigated - you can set how narrow of refusal mechanisms you target. I recently switched my daily driver model from a fully abliterated one to one only partially affected and it's immediately noticeable how much more capable and coherent it is. And that's another aspect of this - you shouldn't assume that every model has hard refusals baked in and need extensive abliteration to function how you need. Oftentimes the most narrow updates make a model work exactly how you'd need.

Additionally there are new methods coming out that can change the behavior of a model to remove refusals without the "surgery" that happens when you abliterate a model. This is based on a concept called Jacobian Lens that was pioneered by Anthropic (their research paper is linked at the bottom). This method can shift the personality of a model to respond differently than its training without fear of lobotomy. I imagine as this space continues to mature we'll see more creativity. As with every other area of life - the more regulations someone puts on something, the more people will find a way to get around them.

So those are my thoughts on abliteration. I agree it's probably not great if everyone has ready-made access to how to build bombs or make crack (both of which I've seen online as tests). That's not what you want. But at the same time, I also don't need to be told I can't check my own app for security failures.

As long as I use the tools I have for good, I'll stick with my methods for now.

References