<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>LLM on </title>
    <link>https://hiren.me/tags/llm/</link>
    <description>Recent content in LLM on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 25 Sep 2026 11:10:00 -0700</lastBuildDate>
    <atom:link href="https://hiren.me/tags/llm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Inference disaggregation (part 2): moving the cache</title>
      <link>https://hiren.me/posts/inference-disaggregation-part-2/</link>
      <pubDate>Fri, 25 Sep 2026 11:10:00 -0700</pubDate>
      <guid>https://hiren.me/posts/inference-disaggregation-part-2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hiren.me/posts/inference-disaggregation-part-1/&#34; &gt;Part 1&lt;/a&gt; showed why you&amp;rsquo;d split prefill and decode onto different GPUs: a long prefill on the same GPU makes everyone who is already decoding there wait. Splitting has a price, though. The KV cache that prefill builds has to move to the GPU that does decode. The &lt;a href=&#34;https://hiren.me/posts/watching-a-kv-cache-grow-part-3/&#34; &gt;offload post&lt;/a&gt; (part 3 of Watching a KV cache grow) predicted that moving a 32k-token cache would add about 3% to prefill over a 400 Gb/s link and about 12% over 100 Gb/s. This post measures the fastest case, within one machine, on real hardware.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inference disaggregation (part 1): why split prefill and decode</title>
      <link>https://hiren.me/posts/inference-disaggregation-part-1/</link>
      <pubDate>Fri, 25 Sep 2026 11:05:00 -0700</pubDate>
      <guid>https://hiren.me/posts/inference-disaggregation-part-1/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://hiren.me/posts/watching-a-kv-cache-grow/&#34; &gt;Watching a KV cache grow&lt;/a&gt; I looked at the two phases of LLM inference: prefill, which processes a whole prompt in one go, and decode, which produces one token at a time. They behave very differently. Prefill is one big burst of work that scales with the prompt. Decode is a long run of small steps, each one reading the whole KV cache.&lt;/p&gt;&#xA;&lt;p&gt;Disaggregated inference splits the work of serving a model across separate hardware. The most common form, and the one this series starts with, runs prefill and decode on different GPUs. Other forms split each layer&amp;rsquo;s attention and feed-forward parts onto different chips, or keep the KV cache in its own memory pool shared by many GPUs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Watching a KV cache grow (part 3): move it or rebuild it?</title>
      <link>https://hiren.me/posts/watching-a-kv-cache-grow-part-3/</link>
      <pubDate>Thu, 24 Sep 2026 15:54:50 -0700</pubDate>
      <guid>https://hiren.me/posts/watching-a-kv-cache-grow-part-3/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hiren.me/posts/watching-a-kv-cache-grow/&#34; &gt;Part 1&lt;/a&gt; showed what a KV cache is as bytes: 23,040 per token for SmolLM2-135M. &lt;a href=&#34;https://hiren.me/posts/watching-a-kv-cache-grow-part-2/&#34; &gt;Part 2&lt;/a&gt; showed that decode gets slower as the cache grows, because every step has to move it through memory.&lt;/p&gt;&#xA;&lt;p&gt;Where I&amp;rsquo;m heading with this series is disaggregated inference. The idea is to run prefill on one set of GPUs and decode on another, because the two phases want different things (parts 1 and 2 are really about that difference). The catch is that the cache prefill builds has to get from the prefill machine to the decode machine before decoding can start.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Watching a KV cache grow (part 2)</title>
      <link>https://hiren.me/posts/watching-a-kv-cache-grow-part-2/</link>
      <pubDate>Thu, 24 Sep 2026 12:20:56 -0700</pubDate>
      <guid>https://hiren.me/posts/watching-a-kv-cache-grow-part-2/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://hiren.me/posts/watching-a-kv-cache-grow/&#34; &gt;part 1&lt;/a&gt; I watched a KV cache fill up one token at a time on my laptop, and worked out that SmolLM2-135M&amp;rsquo;s cache costs 23,040 bytes per token. The post ended with a question: every decode step has to read the weights and the whole cache, so as the cache grows, does each step get slower in proportion to the extra bytes?&lt;/p&gt;&#xA;&lt;p&gt;The short answer is yes, in a straight line, but each step moves the cache through memory about 3 times rather than once. With a different cache class it&amp;rsquo;s closer to 7.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Watching a KV cache grow (part 1)</title>
      <link>https://hiren.me/posts/watching-a-kv-cache-grow/</link>
      <pubDate>Thu, 24 Sep 2026 11:12:06 -0700</pubDate>
      <guid>https://hiren.me/posts/watching-a-kv-cache-grow/</guid>
      <description>&lt;p&gt;Glenn Lockwood&amp;rsquo;s &lt;a href=&#34;https://blog.glennklockwood.com/2026/09/what-are-kv-caches-really.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;What are KV caches, really?&lt;/a&gt; explains prefill, decode, and why a KV cache exists, and then takes apart some vendor speedup claims for KV offload. It&amp;rsquo;s a good read and it got me curious.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m an infra person, not an ML person, so I wanted to see a KV cache for real, the way I&amp;rsquo;d look at any other buffer: what&amp;rsquo;s in it, how it grows, and how big it gets.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
