<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Federico "SpeederX" Piana</title>
    <description>The latest articles on DEV Community by Federico "SpeederX" Piana (@speederxlab).</description>
    <link>https://dev.to/speederxlab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3991282%2F0fa5680f-2ec3-4880-baff-3ca2a6345dd4.png</url>
      <title>DEV Community: Federico "SpeederX" Piana</title>
      <link>https://dev.to/speederxlab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/speederxlab"/>
    <language>en</language>
    <item>
      <title>What secretly eats your local LLMs' speed as your context fills up - Part 3</title>
      <dc:creator>Federico "SpeederX" Piana</dc:creator>
      <pubDate>Tue, 21 Jul 2026 16:09:32 +0000</pubDate>
      <link>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-3-392i</link>
      <guid>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-3-392i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnquipvmjwitn6jp1rufi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnquipvmjwitn6jp1rufi.png" alt="a llama sitting on a chair token spilling from the gpu laying down on bed" width="800" height="585"&gt;&lt;/a&gt;&lt;br&gt;
It’s been 3 weeks since the first article of this series.&lt;/p&gt;

&lt;p&gt;A lot has changed for me.&lt;/p&gt;

&lt;p&gt;In the first article there was a lot of excitement, because I found evidence, data and something new.&lt;/p&gt;

&lt;p&gt;The whole thing seemed a lucky coincidence.&lt;/p&gt;

&lt;p&gt;Over time I had the chance to revise my way to identify that situation - not only that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you prevent - or at least recognize - when a model will degrade for a given context?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My answer: there's no rule, no magic formula - it has to be grounded in data. You cannot predict it. **It’s a sum of different&lt;/p&gt;

&lt;p&gt;signals you read from your hardware.**&lt;/p&gt;

&lt;p&gt;You start to see shared memory going up.&lt;/p&gt;

&lt;p&gt;The ram usage growing also. Generation takes a heavy hit - at least 50%. These numbers are measured across real runs, over and over with different models and contexts.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/SpeederX/calibr" rel="noopener noreferrer"&gt;calibr&lt;/a&gt;, I’ve defined how you can tackle the issue - the strategy differs from the one provided here, since the one below is the logic I’ve used to narrow down the cliff token range.&lt;/p&gt;

&lt;p&gt;First you run a baseline with llama.cpp.&lt;/p&gt;

&lt;p&gt;You get the numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check for VRAM shared memory:

&lt;ul&gt;
&lt;li&gt;shared memory usage = shared memory peak - shared memory baseline. where peak is the highest value you save during the model run and, baseline is VRAM usage before starting the run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check RAM delta:

&lt;ul&gt;
&lt;li&gt;ram delta usage = ram peak usage - ram baseline. this is important because it shows as the shared memory grows, it’s going into the ram.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check eval tok/sec

&lt;ul&gt;
&lt;li&gt;A baseline run shows what the model's eval speed can be - say, 17 tok/sec.&lt;/li&gt;
&lt;li&gt;A long run - deep prefill, or filling the KV cache directly - shows how it evolves over time: the same model might drop to 2 tok/sec (real numbers again: Gemma 4 12B, at a deep prefill).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These points show you why a shallow check, might be a false-positive result.&lt;/p&gt;

&lt;p&gt;To be clear: &lt;em&gt;test only the baseline and you get happy results with high evals&lt;/em&gt;. &lt;strong&gt;Dig deeper with prefill and KV fill, and you get the real picture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's no way to prevent this. There are workarounds to squeeze more into memory, but they usually cost precision or eval speed.&lt;/p&gt;

&lt;p&gt;The blanket is a fixed size - you can't stretch it. Pull it up to your shoulders and your feet stick out.&lt;/p&gt;

&lt;p&gt;You can quantize the KV cache from f16 (llama.cpp's default) down to q8_0: it halves the cache footprint with near-lossless quality - PPL within run-to-run noise, mean precision above 99.8% against the bf16 baseline; the only measurable dip is in the worst 0.1% of token positions &lt;a href="https://anbeeld.com/articles/kv-cache-quantization-benchmarks-for-long-context" rel="noopener noreferrer"&gt;source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This might fit more into VRAM, but it doesn't solve the issue.&lt;/p&gt;

&lt;p&gt;To identify the cliff precisely, you can approach it this way: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use the numbers from VRAM shared memory and RAM delta. &lt;/li&gt;
&lt;li&gt;setup at least 3 runs, with different context - for instance 16k, 32k, 65k. Two points give you a slope; a third is what tells you the slope is real and not just noise from that one run. The delta between consecutive runs tells you how much VRAM roughly 1,000 tokens of context allocate. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From here, you extrapolate: take your last two clean points, keep that slope, and project forward until you hit your card's total VRAM. &lt;/p&gt;

&lt;p&gt;model total load in vram + (  *  / 1024 ) = vram total usage theoretical &lt;/p&gt;

&lt;p&gt;Now you can see your hypothesis getting shaped and run some more numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;baseline vram usage&lt;/li&gt;
&lt;li&gt;system vram reserved&lt;/li&gt;
&lt;li&gt;theorical total vram&lt;/li&gt;
&lt;li&gt;avalable vram = theorical total vram - baseline vram usage - system vram reserved&lt;/li&gt;
&lt;li&gt;model total load in vram + (  *  / 1024 ) = vram total usage theorical&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Does it seems overkill?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Think about the architectures of LLMs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have now hybrid models, which don’t scale with a simple formula memory usage, so you cannot make up a different formula for each different model.&lt;/p&gt;

&lt;p&gt;Why not just use a formula to compute it?&lt;/p&gt;

&lt;p&gt;Because a formula doesn't account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buffer allocation&lt;/li&gt;
&lt;li&gt;real available vram&lt;/li&gt;
&lt;li&gt;real reserved vram&lt;/li&gt;
&lt;li&gt;shared memory vram&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;all things that only show up when you actually run the model on your PC.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different architecture implies different attention strategies and layers, which don’t grow in the same way of a full attention or supposedly predictable architecture.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llamacpp</category>
      <category>locallm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>What secretly eats your local LLMs' speed as your context fills up - Part 2</title>
      <dc:creator>Federico "SpeederX" Piana</dc:creator>
      <pubDate>Sat, 04 Jul 2026 17:21:10 +0000</pubDate>
      <link>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-2-12lb</link>
      <guid>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-2-12lb</guid>
      <description>&lt;p&gt;So, we left in the previous chapter with some data and insights.&lt;/p&gt;

&lt;p&gt;This time we talk about the story behind this.&lt;br&gt;
I was serving my model through &lt;strong&gt;llama-server.exe&lt;/strong&gt; locally. While chatting, I've noticed a sudden drop of performance.&lt;/p&gt;

&lt;p&gt;My idea was initially that other applications that were open were causing the issue.&lt;br&gt;
I closed everything, started the task manager and put it side by side with the browser page.&lt;br&gt;
I noticed my &lt;strong&gt;VRAM&lt;/strong&gt; was stable and… so was the &lt;strong&gt;RAM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At this point by searching on &lt;strong&gt;Google&lt;/strong&gt; and &lt;strong&gt;Reddit&lt;/strong&gt; users were saying it was pretty common for the generation speed to drop as the context was filling. Not being satisfied with this first answer, even though it seemed &lt;em&gt;reasonable&lt;/em&gt;, I decided to dig deeper.&lt;/p&gt;

&lt;p&gt;My first impression was that the model itself was the bottleneck with its architecture and higher context. Still it felt like speculation and I decided to find out the answer by comparing other models.&lt;br&gt;
Since I had &lt;strong&gt;30 GBs&lt;/strong&gt; of models just sitting on my hard drive -** who doesn't, am I right? lol** - I decided to build a &lt;em&gt;PowerShell script&lt;/em&gt; that would take all the models I had and run them against different configurations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;br&gt;
Simple. To answer 2 questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's the best model to run in my machine?&lt;/li&gt;
&lt;li&gt;What's the best configuration for each model?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;very naive I was. I couldn't imagine how complex things were going to be.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with a simple PowerShell script indeed. 4 steps: scan the folder for models ( &lt;strong&gt;.gguf files&lt;/strong&gt; ), build a plan to test them out with various configs, run &lt;strong&gt;llama-server.exe&lt;/strong&gt; with the specific configuration and generate a &lt;strong&gt;log&lt;/strong&gt;. There was a log with all the stats gathered from &lt;strong&gt;nvidia-smi&lt;/strong&gt;, a very useful command that you can use within the prompt to track the status of the &lt;strong&gt;GPU&lt;/strong&gt; and work load of processes. On Windows you cannot see each process unfortunately, we will leave more details about this for another day lol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This PowerShell script gave me some insight!&lt;/strong&gt;&lt;br&gt;
Little models didn't have a dramatic drop in performance, even with high context.&lt;br&gt;
&lt;strong&gt;Suspicious&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I soon realized one of the things I didn't notice initially in the task manager itself, was the &lt;strong&gt;shared memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As the &lt;strong&gt;context size&lt;/strong&gt; was increased ( from &lt;strong&gt;16k&lt;/strong&gt; to &lt;strong&gt;32k&lt;/strong&gt; ), so did the &lt;strong&gt;shared memory&lt;/strong&gt;.&lt;br&gt;
That fact as stated in the first part means you end up storing a portion of tokens of the &lt;strong&gt;LLM&lt;/strong&gt; in &lt;strong&gt;RAM&lt;/strong&gt; which is going to slow you down.&lt;br&gt;
From my tests on this empirical use-case I've decided to setup a rule for my PowerShell script. &lt;strong&gt;shared_memory growing more than &amp;gt; 500MB&lt;/strong&gt; meant the model for my configuration was not safe to run as &lt;strong&gt;KV&lt;/strong&gt; cache would spill.&lt;/p&gt;

&lt;p&gt;If a model exceeds &lt;strong&gt;500MB&lt;/strong&gt; in &lt;strong&gt;shared_memory&lt;/strong&gt;, mark that configuration as &lt;em&gt;not safe&lt;/em&gt;. I did download plenty of different models.&lt;br&gt;
Running the script against a bigger sample of models led me to another pattern: a lot of models were labelled as &lt;em&gt;not safe&lt;/em&gt;. Too many of them.&lt;/p&gt;

&lt;p&gt;The rule was working - but it was also flagging wrong cases, which was a thing. But... there are some kind of models - &lt;strong&gt;MoE&lt;/strong&gt; - that usually are spread between &lt;strong&gt;GPU&lt;/strong&gt; and &lt;strong&gt;RAM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In that case I was misinterpreting the &lt;strong&gt;shared_memory&lt;/strong&gt; as a happy path solution to my problem. The logs were just filled with models labelled as &lt;em&gt;not safe&lt;/em&gt; running fine on my pc throughput wise.&lt;br&gt;
&lt;strong&gt;MoE&lt;/strong&gt; sometimes had &lt;strong&gt;8-10GB&lt;/strong&gt; &lt;strong&gt;RAM&lt;/strong&gt; and they ended up with increased &lt;strong&gt;shared_memory&lt;/strong&gt;. What was missing was not only that, also &lt;strong&gt;llama-server.exe&lt;/strong&gt; process was allocating some part to the &lt;strong&gt;shared_memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naive again, lol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The pieces allocated from &lt;strong&gt;llama-server.exe&lt;/strong&gt; were affecting the results, even though they are meant to be on the &lt;strong&gt;CPU&lt;/strong&gt;. These pieces were not going to grow as the model was used, meaning you had a fixed amount of memory just assigned and giving you false-positive results.&lt;br&gt;
Relying on a single gate rule against memory increase was coming from a hands-on approach. It was data-driven, but not precise enough. It was a "sort of", rather than saying: when the model reaches &lt;strong&gt;70k&lt;/strong&gt; it breaks into ram and we have this huge problem.&lt;/p&gt;

&lt;p&gt;My approach has been:&lt;br&gt;
Take a model that's close to the edge - &lt;strong&gt;0.5-1GB&lt;/strong&gt; from the maximum dedicated &lt;strong&gt;VRAM&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;How&lt;/strong&gt;? Load it just with default configs. Look at eval, shared_memory usage &lt;strong&gt;RAM&lt;/strong&gt; and &lt;strong&gt;VRAM&lt;/strong&gt;.&lt;br&gt;
Fill the context with some random document or copy and paste. No drop in performance?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ok. That's a good candidate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take the candidate, look at the logs of &lt;strong&gt;llama-server.exe&lt;/strong&gt;, identify the context size of the default config and... double it!&lt;br&gt;
Repeat the previous step until you notice a severe - &lt;strong&gt;BOOM!&lt;/strong&gt; - drop from &lt;strong&gt;32 tok/sec&lt;/strong&gt; to &lt;strong&gt;16 tok/sec&lt;/strong&gt;.&lt;br&gt;
In my case, the candidate was &lt;strong&gt;Qwen 3.5 9B&lt;/strong&gt; with &lt;strong&gt;Q4_K_M&lt;/strong&gt; quantization and a default context of &lt;strong&gt;16k&lt;/strong&gt;. I noticed it was not using plenty of &lt;strong&gt;VRAM&lt;/strong&gt; and for this reason it seemed conservative, so I decided to increase it. &lt;strong&gt;I hit the drop of performance close to 90ish k&lt;/strong&gt;, but as mentioned above completely unaware of what was happening at first.&lt;/p&gt;

&lt;p&gt;In the next part we will see a hands-on approach and formulas to derive exactly when and where the spill happens.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*sorry, I just couldn't help myself from posting llama-server eating gpus&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>locallm</category>
      <category>llamacpp</category>
    </item>
    <item>
      <title>What secretly eats your local LLMs' speed as your context fills up - Part 1</title>
      <dc:creator>Federico "SpeederX" Piana</dc:creator>
      <pubDate>Thu, 25 Jun 2026 13:49:24 +0000</pubDate>
      <link>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-1-13o0</link>
      <guid>https://dev.to/speederxlab/what-secretly-eats-your-local-llms-speed-as-your-context-fills-up-part-1-13o0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdl7sfdzacwavbutem3ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdl7sfdzacwavbutem3ui.png" alt=" " width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you ever notice that sometimes while you use a model locally, you run into a sudden drop in performance?&lt;/p&gt;

&lt;p&gt;Today I want to talk about that.&lt;/p&gt;

&lt;p&gt;I'm building an open source tool that aims to help determine the best configuration for a local llm for a given machine, and I scratched my head about this issue, because it seems simple but it's really tricky.&lt;/p&gt;

&lt;p&gt;First of all you have to determine the allocation that the model takes in your VRAM budget. For ease of explanation, I'm going to use &lt;strong&gt;Qwen 3.5 9B Q4_K_M&lt;/strong&gt; which is the model I've been using to battle test this specific problem.  My hardware specification: I have a &lt;strong&gt;RTX 2070 with 8GB VRAM&lt;/strong&gt;, &lt;strong&gt;24GB of RAM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I loaded Qwen, it sat on my VRAM but I had a really restricted 16k to 32k context max, also leaving some memory free. I asked myself: but why does this happen? &lt;/p&gt;

&lt;p&gt;These apps we use to run local models try to make them "work" with the current conditions we have on our computer. The heavy lifting would be determining the best configuration and then scale down from that. &lt;/p&gt;

&lt;p&gt;The problem is users are humans, and humans forget things. Imagine you are playing Skyrim or GTA, or watching a Youtube video. You're locking down VRAM with that. RAM that the next Qwen is really eager to use to be faster and have more context for your next prompts. &lt;strong&gt;GRRRRR&lt;/strong&gt;! &lt;/p&gt;

&lt;p&gt;As you load Qwen in VRAM, the VRAM usage bumps up to 6.8GB with full offload of those holy layers. Then you unleash the kv preallocation - llama.cpp does preallocate the memory as you start it - which is roughly &lt;strong&gt;22MB per 1k token&lt;/strong&gt; - from my empirical tests. &lt;/p&gt;

&lt;p&gt;So if you choose &lt;strong&gt;16k&lt;/strong&gt; you get &lt;strong&gt;352MB&lt;/strong&gt; of VRAM &lt;strong&gt;32k&lt;/strong&gt; is &lt;strong&gt;704MB&lt;/strong&gt; and so on. &lt;/p&gt;

&lt;p&gt;Doing some math &lt;strong&gt;8GB&lt;/strong&gt; is &lt;strong&gt;8192MB&lt;/strong&gt;, let's say you're aware that youtube podcast you're listening in the background is using &lt;strong&gt;500-800 MB&lt;/strong&gt; of the gpu, so you close it.&lt;/p&gt;

&lt;p&gt;System reserves &lt;strong&gt;0.5 to 1GB&lt;/strong&gt; - we're talking windows now - so to be safe..  you have &lt;strong&gt;7000MB&lt;/strong&gt; available?&lt;/p&gt;

&lt;p&gt;Qwen uses &lt;strong&gt;6.8GB&lt;/strong&gt;, so it's fine. You load &lt;strong&gt;131k&lt;/strong&gt; of context and start using the chat interface and everything is fine!&lt;/p&gt;

&lt;p&gt;It works! You bypassed that ugly problem and now you can use the model with its full context.&lt;/p&gt;

&lt;p&gt;You start using it seriously, the context goes up to &lt;strong&gt;30, 40, 50k&lt;/strong&gt;. At some point you reach 60k and it starts to feel a bit slower. &lt;strong&gt;70k&lt;/strong&gt; even slower, but not a normal slower a really strong drawdown in generation and also during prompt processing. you reach &lt;strong&gt;90k&lt;/strong&gt; and you're down from &lt;strong&gt;32 tok/sec&lt;/strong&gt; to &lt;strong&gt;16 tok/sec&lt;/strong&gt;, and prompt processing takes an even harder hit considering the initial &lt;strong&gt;488 tok/sec&lt;/strong&gt; to &lt;strong&gt;41.01 tok/sec&lt;/strong&gt; - and prompt processing takes an even harder hit, considering the initial &lt;strong&gt;488 tok/sec&lt;/strong&gt; to &lt;strong&gt;41.01 tok/sec&lt;/strong&gt;. You start a new chat, it feels great again, at &lt;strong&gt;80-90k&lt;/strong&gt; you have the same problem.  What's happening? Why does it work fine until it doesn't?&lt;/p&gt;

&lt;p&gt;That's the KV cache spilling from the VRAM to the RAM. Once the context grows, at some point the prompts and responses will be moved from GPU to RAM. For that reason, most applications use constrained context to completely avoid this kind of issue. Windows is magic sometimes because it doesn't go out of memory, it uses shared memory to manage critical situations.&lt;/p&gt;

&lt;p&gt;The first part of the memory which is in VRAM will respond really fast, just once you reach some specific amount of context the eval will drastically fall and you end up using your model with about &lt;strong&gt;50% less speed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the next part I will share how I started to notice this, what was not working and in part 3 I will share the fixes I put in place to manage that.&lt;/p&gt;

&lt;p&gt;These are the runs used to build the chart above&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qwen 3.5 9B with 131k context&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Used KV&lt;/th&gt;
&lt;th&gt;Eval t/s&lt;/th&gt;
&lt;th&gt;Delta from 8k&lt;/th&gt;
&lt;th&gt;Prompt t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8k&lt;/td&gt;
&lt;td&gt;42.30&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;488.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65k&lt;/td&gt;
&lt;td&gt;32.51&lt;/td&gt;
&lt;td&gt;−23.1%&lt;/td&gt;
&lt;td&gt;87.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90k&lt;/td&gt;
&lt;td&gt;16.61&lt;/td&gt;
&lt;td&gt;−60.7%&lt;/td&gt;
&lt;td&gt;41.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105k&lt;/td&gt;
&lt;td&gt;15.66&lt;/td&gt;
&lt;td&gt;−63.0%&lt;/td&gt;
&lt;td&gt;36.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;120k&lt;/td&gt;
&lt;td&gt;14.81&lt;/td&gt;
&lt;td&gt;−65.0%&lt;/td&gt;
&lt;td&gt;45.13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Qwen 3.5 2B with 131k context&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Used KV&lt;/th&gt;
&lt;th&gt;Eval t/s&lt;/th&gt;
&lt;th&gt;Delta from 8k&lt;/th&gt;
&lt;th&gt;Prompt t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8k&lt;/td&gt;
&lt;td&gt;103.49&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;3902.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65k&lt;/td&gt;
&lt;td&gt;72.62&lt;/td&gt;
&lt;td&gt;−29.8%&lt;/td&gt;
&lt;td&gt;3011.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90k&lt;/td&gt;
&lt;td&gt;67.49&lt;/td&gt;
&lt;td&gt;−34.8%&lt;/td&gt;
&lt;td&gt;2702.58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105k&lt;/td&gt;
&lt;td&gt;64.87&lt;/td&gt;
&lt;td&gt;−37.3%&lt;/td&gt;
&lt;td&gt;2498.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;120k&lt;/td&gt;
&lt;td&gt;60.82&lt;/td&gt;
&lt;td&gt;−41.2%&lt;/td&gt;
&lt;td&gt;2326.17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The data in the image - the green line in the chart- is from a control test on generation speed with a model - Qwen 3.5 2B Q4_K_M - that I knew would stay entirely in VRAM at the same context.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>llamacpp</category>
      <category>locallm</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
