<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Krimler</title>
<link>https://krimler.github.io/</link>
<atom:link href="https://krimler.github.io/index.xml" rel="self" type="application/rss+xml"/>
<description>Notes and papers on mathematics, computer science, AI/ML, and security.</description>
<generator>quarto-1.9.38</generator>
<lastBuildDate>Mon, 08 Jun 2026 18:30:00 GMT</lastBuildDate>
<item>
  <title>Designing HTTP APIs that AI agents can actually use</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/agent-friendly-http-apis/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/agent-friendly-http-apis/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Mercury, Hendrick Goltzius (1611). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>An AI agent is now a common kind of HTTP API client. An HTTP API is the interface a service exposes for programs to call over the web. Agents read these interfaces in a way a human developer does not. A developer reads the documentation once, remembers it, and writes code. An agent works from the machine-readable description on every call, holds only a limited amount of text at a time, retries often, and chooses which operation to call by matching the description to its current goal. An API that was designed for a person to read can be hard for an agent to use well. This IETF draft collects the properties that make an API easy for an agent and assembles them into one reusable profile.</p>
<section id="machine-readable-signals-not-prose" class="level2">
<h2 class="anchored" data-anchor-id="machine-readable-signals-not-prose">Machine-readable signals, not prose</h2>
<p>An agent should not have to parse a paragraph of English to learn how to behave. The API should hand it structured, actionable signals instead. A rule expressed as a field the agent can read is worth more than the same rule buried in a sentence it has to interpret.</p>
</section>
<section id="the-description-is-the-contract" class="level2">
<h2 class="anchored" data-anchor-id="the-description-is-the-contract">The description is the contract</h2>
<p>For an agent, the API description is the thing it actually programs against. Two properties follow. Operation identifiers must be stable and meaningful, because the agent selects operations by their names and descriptions. The description of each operation should say plainly when to use it and what side effects it has. A side effect is a change the call makes to the world, such as charging a card or sending a message.</p>
</section>
<section id="consistency-and-predictability" class="level2">
<h2 class="anchored" data-anchor-id="consistency-and-predictability">Consistency and predictability</h2>
<p>The API should look the same everywhere. Naming, pagination, error formats, and authentication should follow one convention across every operation. An agent that learns the pattern once can then apply it everywhere, which saves the limited context it has to work with.</p>
</section>
<section id="respect-the-context-budget" class="level2">
<h2 class="anchored" data-anchor-id="respect-the-context-budget">Respect the context budget</h2>
<p>An agent can only hold so much text at a time. A response that dumps everything eats into that budget and crowds out the agent’s actual reasoning. The draft asks that responses be bounded by default, with controls for field selection or verbosity so the agent can ask for only what it needs.</p>
</section>
<section id="errors-the-agent-can-recover-from" class="level2">
<h2 class="anchored" data-anchor-id="errors-the-agent-can-recover-from">Errors the agent can recover from</h2>
<p>When a call fails, the failure should be machine-readable. The draft points to RFC 9457 Problem Details, a standard JSON format for HTTP errors. A good error says whether retrying is worthwhile and gives field-level feedback on what was invalid, so the agent can fix the request rather than guess.</p>
</section>
<section id="safe-writes" class="level2">
<h2 class="anchored" data-anchor-id="safe-writes">Safe writes</h2>
<p>Agents retry often, so a write operation must tolerate being repeated. The draft calls for idempotency keys, which let the agent mark a request so that sending it twice has the same effect as sending it once. It also calls for dry-run and preview modes, so an agent can check what a write would do before committing to it.</p>
</section>
<section id="tell-the-agent-when-to-slow-down" class="level2">
<h2 class="anchored" data-anchor-id="tell-the-agent-when-to-slow-down">Tell the agent when to slow down</h2>
<p>Rate limits should be expressed as machine-readable backoff hints. When the service wants the client to wait, it should say so in a form the agent can read directly, so the agent can throttle itself rather than hammer the endpoint and get blocked.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Agents are becoming a primary audience for APIs, and they have real constraints: a small context window, frequent retries, and selection by description. An API that ignores these makes agents slow, expensive, and error-prone to work with. The profile gives API designers a concrete checklist for serving autonomous clients while keeping security, reliability, and operational visibility intact.</p>
</section>
<section id="read-the-draft" class="level2">
<h2 class="anchored" data-anchor-id="read-the-draft">Read the draft</h2>
<p><a href="https://datatracker.ietf.org/doc/draft-gaikwad-agent-friendly-http-api-profile/">Design Considerations and Profile for HTTP APIs Consumed by AI Agents</a>.</p>


</section>

 ]]></description>
  <category>ai-agents</category>
  <category>http</category>
  <category>api-design</category>
  <category>ietf</category>
  <guid>https://krimler.github.io/posts/agent-friendly-http-apis/</guid>
  <pubDate>Mon, 08 Jun 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/agent-friendly-http-apis/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Counting Fibonacci primes: what a finite computation can and cannot add</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/fibonacci-prime-statistics/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/fibonacci-prime-statistics/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>The Great Wave off Kanagawa, Katsushika Hokusai (c.&nbsp;1831). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A Fibonacci prime is a Fibonacci number that is also prime. The Fibonacci numbers are the familiar sequence 1, 1, 2, 3, 5, 8, 13, and so on, where each term is the sum of the two before it. Most of them are not prime. As of June 2025 we know of 57 positions in the sequence where the Fibonacci number is prime or almost certainly prime. They are spread very far apart. The largest one that has been fully proven prime sits at position 201107. The largest one we believe is prime sits at position 11964299, a number with about 2.5 million digits, checked by a fast test that is right in practice but does not constitute a proof. Whether the list goes on forever is an open question. No one knows a rule that produces these positions.</p>
<p>This study takes a different stance. It treats the 57 positions as a small dataset and asks a plain question. Is there any hidden pattern in them, and if there is, where does it live? The mathematics needed to answer this is already in the literature. What the study adds is method. It puts an honest error bar on a prediction, it runs a battery of tests to tell a real pattern apart from a coincidence, and it ships code so anyone can rerun everything. The scripts are at <a href="https://github.com/krimler/k-bonacci">github.com/krimler/k-bonacci</a>.</p>
<section id="how-many-should-there-be" class="level2">
<h2 class="anchored" data-anchor-id="how-many-should-there-be">How many should there be</h2>
<p>There is a well-known way to guess how many Fibonacci primes lie below some cutoff. The Fibonacci numbers grow at a steady multiplicative rate, so a Fibonacci number deep in the sequence has a predictable size. A number of that size is prime with a chance that shrinks as the number grows, in the usual way primes thin out. A classical divisibility fact narrows the search further. A Fibonacci number can only be prime when its position is itself prime. Combining these gives a clean prediction. The number of Fibonacci primes up to a cutoff grows in step with the logarithm of that cutoff, times a fixed constant.</p>
<p>This is the Grantham and Granville heuristic <span class="citation" data-cites="grantham2024fibonacci">(Grantham and Granville 2024)</span>. Run it out to the current search depth and it predicts about 60 positions. We observe 57. The agreement is close.</p>
<p>There is a wrinkle worth airing. A quick fit of the constant comes out about 19% higher than the value the theory predicts. The study tracks the gap down. Fitting the constant against the Fibonacci data alone lands within 3% of the theoretical value. Pooling several related sequences gives a range that comfortably contains it. The apparent excess turns out to be a mix of a bookkeeping choice in the formula and ordinary small-sample noise. With only 57 points, the data cannot even tell the theoretical constant apart from a nearby look-alike value. Settling that would take far more data than the search has produced.</p>
</section>
<section id="predicting-the-next-one" class="level2">
<h2 class="anchored" data-anchor-id="predicting-the-next-one">Predicting the next one</h2>
<p>If the positions are spread out with no memory of each other, you can still say something useful about the next one. Look at the gaps between consecutive positions on a logarithmic scale. Those gaps behave like the waiting times in a process that has no memory, the same statistics that govern how long you wait for the next random arrival. Standard tests back this up.</p>
<p>That observation supports a prediction with an error bar, which the earlier work never attempted. From the data available up to a point, the method gives a 90% window for where the next position should fall. The position that was actually found next landed inside the window. Replaying this one step at a time across the whole list, the true position fell inside its predicted window about 87% of the time. For a method with a single tunable number, landing near the promised 90% is about as well as one can ask.</p>
</section>
<section id="looking-for-hidden-patterns" class="level2">
<h2 class="anchored" data-anchor-id="looking-for-hidden-patterns">Looking for hidden patterns</h2>
<p>The study then hunts for structure in the positions. It checks whether they favour certain remainders, whether neighbours influence each other, whether some special families of primes are over- or under-represented, and whether the leading digits follow the lopsided distribution that many natural datasets show. Every test comes back empty.</p>
<p>As a single overall check, the authors generated three thousand fake datasets from the no-pattern model and compared nine summary measurements. The real data looked unremarkable on all nine. The honest conclusion is stated plainly. At 57 points there is no pattern to find. The biases people detect in primes are measured across millions of cases. A list of 57 is far too short to see effects that faint.</p>
</section>
<section id="where-structure-does-live" class="level2">
<h2 class="anchored" data-anchor-id="where-structure-does-live">Where structure does live</h2>
<p>The positions of the primes carry no usable structure. The way primes divide these sequences is a different story, and here the picture is exact.</p>
<p>For the Fibonacci numbers, ask which is the first position a given prime divides. A classical result of Lagarias says that for two thirds of primes that first position is even <span class="citation" data-cites="lagarias1985lucas">(Lagarias 1985)</span>. The study confirms this to high precision across many primes. The finer details of this divisibility follow from a known proof built on a symmetry argument from algebra <span class="citation" data-cites="cubre2014divisibility">(Cubre and Rouse 2014)</span>.</p>
<p>The study then moves to relatives of the Fibonacci numbers built from longer recurrences, where each term sums the previous three, four, or more. These no longer have the clean divisibility property. Their behaviour is instead controlled by a symmetry group attached to the recurrence, and a classical theorem turns that symmetry into exact proportions for how the sequence repeats when reduced by a prime. The study confirms these proportions numerically for the three-term and four-term cases.</p>
<p>For the three-term case there is one quantity the study can only estimate. It measures it at about 0.40 and is careful to flag that the exact value is not known. The study also corrects a claim in an earlier draft that said these finer densities were computable for any length of recurrence. For the general case they are open, with a partial result under a standard unproven hypothesis as the best that is currently known <span class="citation" data-cites="jarviniemi2022density">(Järviniemi 2022)</span>.</p>
</section>
<section id="what-is-known-and-what-is-new" class="level2">
<h2 class="anchored" data-anchor-id="what-is-known-and-what-is-new">What is known and what is new</h2>
<p>The point of the study is the line it draws between the two. The count estimate, the matching constant, the two-thirds divisibility result, the symmetry-driven proportions, and the repetition structure of the longer sequences are established mathematics with citations. The new contributions are smaller and clearly marked. There is a prediction window with a measured success rate. There is a reusable battery of tests for telling structure apart from noise. There is a fully cited reproduction that anyone can run.</p>
</section>
<section id="reproducibility" class="level2">
<h2 class="anchored" data-anchor-id="reproducibility">Reproducibility</h2>
<p>Every result comes from self-contained Python scripts using standard scientific libraries. The input data are the published index lists for the Fibonacci, Lucas, and related sequences. The code is at <a href="https://github.com/krimler/k-bonacci">github.com/krimler/k-bonacci</a>.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p>The full paper, with the precise statements, the constants, and the proofs it draws on, is here: <a href="../../papers/fibonacci-primes.html">Fibonacci and k-bonacci prime statistics (PDF and details)</a>.</p>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<div id="refs" class="references csl-bib-body hanging-indent">
<div id="ref-cubre2014divisibility" class="csl-entry">
Cubre, Paul, and Jeremy Rouse. 2014. <span>“Divisibility Properties of the Fibonacci Entry Point.”</span> <em>Proceedings of the American Mathematical Society</em> 142 (11): 3771–85. <a href="https://arxiv.org/abs/1212.6221">https://arxiv.org/abs/1212.6221</a>.
</div>
<div id="ref-grantham2024fibonacci" class="csl-entry">
Grantham, Jon, and Andrew Granville. 2024. <em>Fibonacci Primes, Primes of the Form <img src="https://latex.codecogs.com/png.latex?2%5En-k">, and Beyond</em>. <a href="https://arxiv.org/abs/2307.07894">https://arxiv.org/abs/2307.07894</a>.
</div>
<div id="ref-jarviniemi2022density" class="csl-entry">
Järviniemi, Olli. 2022. <span>“Positive Lower Density for Prime Divisors of Generic Linear Recurrences.”</span> <em>Mathematical Proceedings of the Cambridge Philosophical Society</em>. <a href="https://arxiv.org/abs/2102.04042">https://arxiv.org/abs/2102.04042</a>.
</div>
<div id="ref-lagarias1985lucas" class="csl-entry">
Lagarias, Jeffrey C. 1985. <span>“The Set of Primes Dividing the Lucas Numbers Has Density 2/3.”</span> <em>Pacific Journal of Mathematics</em> 118 (2): 449–61.
</div>
</div>


</section>

 ]]></description>
  <category>number-theory</category>
  <category>primes</category>
  <category>statistics</category>
  <category>reproducibility</category>
  <guid>https://krimler.github.io/posts/fibonacci-prime-statistics/</guid>
  <pubDate>Sat, 06 Jun 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/fibonacci-prime-statistics/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Reading MRC and SRv6: resilient AI supercomputer networking</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/reviews/mrc-srv6/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/reviews/mrc-srv6/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Las Hilanderas (The Spinners), Diego Velázquez (c.&nbsp;1657). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A review of an external paper. The work is not mine. This post is a reader’s notes, in the spirit of an admiring colleague.</p>
<p><strong>Paper:</strong> Resilient AI Supercomputer Networking using MRC and SRv6. Araujo et al. Authors come from OpenAI, Microsoft, AMD, Broadcom, and NVIDIA. arXiv preprint 2605.04333, May 2026.</p>
<p><strong>Read the original:</strong> <a href="https://arxiv.org/abs/2605.04333">arXiv:2605.04333</a>. It is arXiv preprint 2605.04333v1 in cs.NI, dated 5 May 2026.</p>
<section id="what-the-paper-does" class="level2">
<h2 class="anchored" data-anchor-id="what-the-paper-does">What the paper does</h2>
<p>Large AI training jobs are synchronous. Every GPU waits for the slowest transfer in a step. So one bad link can stall the whole job. At 100,000 GPUs, network failures stop being rare. They become a daily event.</p>
<p>The paper offers a three-part answer.</p>
<p>First, a new transport called MRC, short for Multipath RC. It extends RoCEv2. It sprays each queue pair across many paths instead of pinning it to one. It balances load with ECN signals. It recovers losses with selective ACK and packet trimming. It turns off PFC and runs the fabric in best-effort lossy mode.</p>
<p>Second, a multi-plane Clos topology. Take an 800 Gb/s NIC and split it into 8 lanes of 100 Gb/s. Build 8 parallel planes from the same switches. Now a 100,000 GPU cluster needs only two switch tiers, not three. This lowers latency, lowers cost and power, and shrinks the blast radius of any one link.</p>
<p>Third, static source routing with SRv6. The endpoint writes the full path into each packet using uN micro-segments. Dynamic routing in the switches is turned off completely. So the endpoint owns failure handling, not the switch.</p>
<p>This runs in production at OpenAI and Microsoft. It has trained frontier models including ChatGPT and Codex. It is implemented on NVIDIA CX-8, AMD Pollara and Vulcano, and Broadcom Thor Ultra NICs. The spec is released openly through OCP.</p>
</section>
<section id="what-works-well" class="level2">
<h2 class="anchored" data-anchor-id="what-works-well">What works well</h2>
<p>The design choices are bold and well argued. Turning off dynamic routing sounds backwards at first. Turning off PFC sounds risky too. But the reasoning is clean. Two adaptive systems fighting each other add no value. MRC already routes around failures on its own. So let it do that job alone.</p>
<p>The blast-radius argument is concrete and convincing. Losing one T0-to-T1 link in an 800 Gb/s single plane cuts a node’s capacity by about 3 percent. The same loss in a 100 Gb/s plane costs only about 0.4 percent. So the job barely notices a link flap. The team even leaves flapping links in service and repairs them later.</p>
<p>The observability insight is elegant. With static source routing, a probe takes the exact same path a data packet would take. So a Clustermapper probe gives ground truth on the forwarding plane. Switch telemetry cannot match this. This is why they can run a relaxed repair posture and still feel safe.</p>
<p>The multi-vendor breadth is a real systems achievement. The same protocol works across three NIC vendors and several switch platforms. That is strong evidence the design generalizes.</p>
<p>The honesty is refreshing. The team flags the single points of failure that remain. They flag the cases where their load-balancing rule does not behave well.</p>
</section>
<section id="a-few-friendly-suggestions" class="level2">
<h2 class="anchored" data-anchor-id="a-few-friendly-suggestions">A few friendly suggestions</h2>
<p>The MRC versus RoCE comparison is uneven, and that is the thing I would fix first. MRC’s headline results come from 42,000 to 75,000 GPU jobs. The head-to-head against RoCE runs on tiny testbeds of 16 and 64 GPUs, called Cluster C and Cluster D. The authors say plainly they have no large deployment for a direct comparison.</p>
<p>That gap matters for two reasons. The RoCE baseline is configured by the authors, as a single plane with DCQCN. The authors also call DCQCN very hard to tune. So a skeptic could read the comparison as a gentle strawman. Even a partial at-scale A or B test would make the case airtight.</p>
<p>There is no at-scale before-and-after. The paper shows MRC works well at scale. It shows RoCE struggles on small testbeds. It never shows the old approach at the same scale. So the size of the win is asserted, not measured. The strongest possible number would be the job-interruption rate before MRC and after MRC at a fixed scale.</p>
<p>Clustermapper’s own cost deserves a paragraph. Every node runs an agent. Every agent probes every directly connected link every millisecond. That is powerful. But the total probe traffic and control overhead at 100,000 nodes is not characterized. There is also a small tension to resolve. The paper says MRC makes denylists unnecessary. Yet it keeps Clustermapper for observability and some policy calls. One sentence reconciling the two would help.</p>
<p>Several key figures are single incidents. Figure 6 is one transceiver glitch that cost about 25 percent throughput. Figure 8 is one T1 reboot. These traces are vivid and useful. But a distribution across many failures would tell readers the typical case, not just the illustrative one. For example, a histogram of throughput dips and recovery times across all flaps in a job.</p>
<p>The remaining single point of failure is flagged, and it should be quantified. An 800 Gb/s NIC optic splits into 4 lanes of 200 Gb/s. If the NIC transceiver itself flaps, all ports go down at once. Then the queue pairs fail and the job cannot ride it out. The authors say this is rare and that a different optical design might avoid it. How often does it happen at scale, and what does it cost the job. That number would tell readers how close to fully resilient the system really is.</p>
<p>Generalizability is narrow by design. MRC needs SRv6 uN micro-segment support in the switches. It needs packet trimming in the switches. It needs specific NICs. It needs a multi-plane topology. So it suits a 100,000 GPU frontier cluster, where you can co-design the whole stack. A short note on what a smaller operator could adopt step by step would widen the paper’s reach.</p>
<p>The relation to UET could be sharper. MRC is described as a minimal extension to RoCE that borrows from Ultra Ethernet Transport. So a crisp line on what is new in MRC beyond UET would help. The novelty seems to be the SRv6 static-routing plus multi-plane co-design plus the production experience itself. Saying so directly would place the contribution well.</p>
</section>
<section id="bottom-line" class="level2">
<h2 class="anchored" data-anchor-id="bottom-line">Bottom line</h2>
<p>This is a bold, important, and candid paper. The static-routing-for-observability argument is a standout. The multi-vendor production deployment is rare and valuable. Turning off both dynamic routing and PFC is exactly the kind of principled risk-taking the field needs.</p>
<p>The main opportunity is evidence symmetry. MRC’s at-scale wins are weighed against small-testbed RoCE. They are also weighed against an unquantified before. So the size of the benefit is the one thing a reader has to take partly on faith. Close that gap and a very persuasive paper becomes an unarguable one.</p>


</section>

 ]]></description>
  <category>paper-review</category>
  <category>networking</category>
  <category>ml-systems</category>
  <guid>https://krimler.github.io/reviews/mrc-srv6/</guid>
  <pubDate>Sat, 06 Jun 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/reviews/mrc-srv6/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Reading AccelNet: SmartNICs in the public cloud</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/reviews/accelnet/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/reviews/accelnet/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Veduta del Canal Grande dalla Punta della Dogana, Bernardo Bellotto (18th century). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A review of an external paper. The work is not mine. This post is a reader’s notes, in the spirit of an admiring colleague.</p>
<p><strong>Paper:</strong> Azure Accelerated Networking: SmartNICs in the Public Cloud. Firestone et al., Microsoft. NSDI ’18.</p>
<p><strong>Read the original:</strong> <a href="https://www.usenix.org/conference/nsdi18/presentation/firestone">USENIX page</a>. It appears in the Proceedings of the 15th USENIX Symposium on Networked Systems Design and Implementation, pages 51 to 66, Renton, WA, April 2018.</p>
<section id="what-the-paper-does" class="level2">
<h2 class="anchored" data-anchor-id="what-the-paper-does">What the paper does</h2>
<p>Azure runs a lot of network policy in the hypervisor. Think private virtual networks, ACLs, load balancing, NAT, metering, and QoS. Running all of this on host CPUs costs cores. Those cores could be sold to customers instead.</p>
<p>AccelNet moves this work onto an FPGA SmartNIC. The NIC sits between the host NIC and the top-of-rack switch. The authors call this a bump-in-the-wire design.</p>
<p>The clever part is the Generic Flow Table, or GFT. The first packet of a flow goes to software. The VFP stack reads the policy, compiles it into one exact-match rule, and installs that rule on the FPGA. Every packet after that is handled by hardware. The host CPU does almost nothing for the rest of the flow.</p>
<p>The numbers are strong. VM to VM latency drops from about 50 microseconds to about 17 microseconds. A single TCP connection reaches about 32 Gbps. Host CPU use for the datapath falls under 1 percent. This has been running on more than 1 million hosts since 2015.</p>
</section>
<section id="what-works-well" class="level2">
<h2 class="anchored" data-anchor-id="what-works-well">What works well</h2>
<p>The production evidence is the best part. These are real numbers from a real fleet over several years. Most papers cannot offer this.</p>
<p>The first-packet-in-software idea is simple and it ages well. You keep the full flexibility of software for policy. You keep the speed of hardware for the bulk of the traffic. For example, a typical TCP flow has at least 7 to 10 packets including the handshake. So processing only the first packet in software still offloads the large majority.</p>
<p>The four-way hardware comparison is honest. The team weighs ASICs, multicore SoCs, FPGAs, and plain host CPUs. They say plainly when a choice rests on judgment rather than measurement.</p>
<p>The operational story is unusually complete. They cover FPGA reconfiguration without losing flows. They cover live migration. They cover transparent VF bonding through NetVSC so a revoked VF does not break the VM. They even cover a failsafe path for DPDK and RDMA apps.</p>
</section>
<section id="a-few-friendly-suggestions" class="level2">
<h2 class="anchored" data-anchor-id="a-few-friendly-suggestions">A few friendly suggestions</h2>
<p>The FPGA versus ASIC versus SoC case could use real measurements. Right now it leans on judgment. It also leans on the fact that Catapult FPGAs were already deployed. A head-to-head test on the same policy workload would settle it. As written, a reader cannot tell if FPGAs won on merit or on circumstance.</p>
<p>The cost story is only half told. The price of a CPU core is laid out carefully, around 0.10 to 0.11 dollars per hour. The FPGA side is missing. We do not see FPGA unit cost. We do not see the aggregate power of 17 to 19 watts across more than 1 million hosts weighed against the cores it saves. A rough two-sided model would make the don’t-burn-cores thesis much stronger.</p>
<p>The software path is the part I would most like to see stressed. The first packet of every flow goes to software. So the real limit is the new-flow rate, not the packet rate. The paper measures long-lived elephant flows. It does not measure the corner cases.</p>
<p>Here are concrete cases I would want tested. How many new connections per second can the VFP exception path handle before it saturates. What happens under a SYN flood, where an attacker opens many short connections on purpose. What happens when the flow count blows past the cache. The L1 cache holds only 2048 flows. The L2 cache lives in DRAM and holds about 1 million flows. The eviction policy and the miss cost are never described.</p>
<p>The AWS and GCP comparison is a single snapshot from November 2017. Competitors keep improving. So a point-in-time fastest-in-the-cloud claim is fragile. A note on the number of runs, the tuning, and the variance would help. A CDF would help more than P50, P99, and P99.9 bars alone.</p>
<p>The security framing is upbeat, and one tradeoff is left out. The Spectre and Meltdown resilience point is fair, because the datapath skips the host CPU. But SR-IOV hands a VF straight to an untrusted guest. That opens new surface, like guest-to-hardware DMA paths and side channels on a shared FPGA. One honest paragraph would round out the operational story.</p>
<p>The reliability claims would be better with numbers. The paper says failure rates stay low and that DRAM fails most often. Both are believable. The team has the fleet telemetry to give an annual failure rate, so it would be nice to see it.</p>
</section>
<section id="bottom-line" class="level2">
<h2 class="anchored" data-anchor-id="bottom-line">Bottom line</h2>
<p>This is a landmark paper and it earned its influence. Its strength is production evidence at real scale. Its soft spots are evaluation. The FPGA-versus-alternatives case is argued, not measured. The cost model is one-sided. The first-packet path is never stressed under high churn or attack. None of this takes away from a fine piece of engineering. These are the notes of an admiring colleague who would love to see the next version close the loop on the corner cases.</p>


</section>

 ]]></description>
  <category>paper-review</category>
  <category>networking</category>
  <category>systems</category>
  <guid>https://krimler.github.io/reviews/accelnet/</guid>
  <pubDate>Sat, 06 Jun 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/reviews/accelnet/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>AEGIS: typed evidence and obligations for AI-native enterprise architecture</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/aegis-evidence-obligation/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/aegis-evidence-obligation/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Allegory of Good Government, Ambrogio Lorenzetti (1338-1339). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>Enterprise architecture is the discipline that aligns an organisation’s business strategy with its information assets, applications, and technology. Two open standards govern the field. TOGAF defines a lifecycle. ArchiMate defines a modelling language. Both assume systems that behave predictably. Both assume governance happens in periodic review meetings. Both assume an architecture document stays accurate for months after it is written.</p>
<p>AI-native systems break these assumptions. A deployed language model produces different outputs for similar inputs. An autonomous agent calls tools in situations it has not seen during testing. A retrieval-augmented pipeline changes what it knows every time new documents are ingested. When such a system decides on credit, hiring, or infrastructure configuration, a static diagram cannot tell you whether the system still meets its regulatory obligations. That question needs checking that runs continuously and that a machine can perform.</p>
<p>The regulatory pressure is concrete. The EU AI Act entered into force in August 2024. Its rules for high-risk systems become enforceable from August 2026 <span class="citation" data-cites="euaiact2024">(European Parliament and Council of the European Union 2024)</span>. ISO/IEC 42001, the management-system standard for AI, asks for a traceable index that links each obligation to the specific processes and documents that satisfy it. The NIST AI Risk Management Framework names traceability as a core property of trustworthy AI. Current enterprise architecture tools do not produce this kind of evidence at the level of detail or at the speed these rules expect.</p>
<section id="the-idea" class="level2">
<h2 class="anchored" data-anchor-id="the-idea">The idea</h2>
<p>AEGIS is a framework that sits one layer above existing architecture tools. The name stands for Architecture with Evidence, Governance, Intent, and Safety. The core move is simple to state. AEGIS makes evidence and obligations into things you can model directly, the same way TOGAF and ArchiMate already let you model services and data. Once an obligation is a modelled object, a machine can ask whether the evidence for it is still valid. Once that check is automatic, it can run all the time.</p>
<p>The paper makes three contributions. It defines the new building blocks and how they attach to existing architecture models. It replaces the periodic review cycle with a continuous one. It maps the new building blocks to actual regulation, so a conformance report can be generated rather than written by hand.</p>
</section>
<section id="the-new-building-blocks" class="level2">
<h2 class="anchored" data-anchor-id="the-new-building-blocks">The new building blocks</h2>
<p>AEGIS introduces seven kinds of object. Each one names something that governance of an AI system needs but that current architecture languages cannot express.</p>
<ul>
<li><strong>Evidence</strong> is a record that something is true, stamped with who issued it, when it was issued, and when it expires. Evidence can be valid, expired, superseded, or revoked.</li>
<li><strong>Obligation</strong> is a requirement placed on part of the system, such as “this service must keep an audit log”. An obligation says what must be true, what would prove it, and which regulation it comes from.</li>
<li><strong>Policy</strong> is a named, versioned bundle of obligations.</li>
<li><strong>Risk</strong> is a structured record of something that could go wrong, linked to the obligations meant to control it.</li>
<li><strong>RuntimeSignal</strong> is an event from a running system, such as an enforcement log or an audit result. Once it is linked to the right part of the model, it becomes a piece of evidence.</li>
<li><strong>Exception</strong> is a recorded, time-limited waiver from an obligation, with a reason and an owner.</li>
<li><strong>ArchitectureDecisionRecord</strong> is the record of a design decision, made queryable so the obligations and risks behind a choice stay attached to it.</li>
</ul>
<p>These objects connect to the services, agents, and data assets you already model. AEGIS is built as an extension, so existing architecture models do not need to be redrawn.</p>
</section>
<section id="the-rule-that-does-the-work" class="level2">
<h2 class="anchored" data-anchor-id="the-rule-that-does-the-work">The rule that does the work</h2>
<p>One simple rule drives everything. A part of the system that is required to do something is in violation the moment there is no unexpired evidence that it is doing it. The framework checks this rule continuously rather than at review time.</p>
<p>A short example shows why this matters. A service is required to keep personal data from leaving the organisation unless a redaction step has run first. This requirement comes from the EU AI Act. A piece of evidence confirms the redaction step works, and that evidence is set to expire on a fixed date. The day after it expires, the rule fires on its own. The service is now in violation, a signal is raised, and the responsible owner is notified. No one had to remember to re-check.</p>
<p>The same idea gives a health score for any part of the system. The score is the share of a part’s mandatory obligations that currently have valid evidence behind them. When the score drops below a set level, the framework re-checks the affected area and refreshes whatever has gone stale.</p>
</section>
<section id="what-this-lets-you-catch" class="level2">
<h2 class="anchored" data-anchor-id="what-this-lets-you-catch">What this lets you catch</h2>
<p>The paper shows three things the framework can do that current tools cannot. None of these are measured on a live system. They are demonstrations of what the model can express.</p>
<p>It can express every control in the ISO/IEC 42001 standard as a checkable obligation, so a conformance report becomes a query rather than a manual exercise.</p>
<p>It can catch three ways governance silently drifts. Evidence can expire without anyone re-checking it. A rule enforced at the level of an individual agent can be changed while the organisation-wide policy is not, so the two no longer agree. A regulation can be updated so that an obligation now points at an old version of the law. Today’s architecture diagrams and code-level checks miss all three.</p>
<p>It can pull the rules enforced on individual AI agents up to the organisation level and show where two agents’ rules conflict with each other, a conflict that is invisible when each agent is governed on its own.</p>
</section>
<section id="limits" class="level2">
<h2 class="anchored" data-anchor-id="limits">Limits</h2>
<p>The three demonstrations show what the model can represent. They do not report results from a deployed system. The mapping to regulation covers the EU AI Act and ISO/IEC 42001. Other regimes, such as GDPR or medical-device rules, would need their own mappings. The reasoning engine behind the checks has not been tested at the scale of a large organisation. A full working implementation is the main piece of future work, and a real evaluation against existing tools depends on building it first.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p>The full paper, with the formal model and the complete regulatory mapping, is here: <a href="../../papers/aegis.html">AEGIS (PDF and details)</a>.</p>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<div id="refs" class="references csl-bib-body hanging-indent">
<div id="ref-euaiact2024" class="csl-entry">
European Parliament and Council of the European Union. 2024. <em>Regulation (EU) 2024/1689 Laying down Harmonised Rules on Artificial Intelligence (Artificial Intelligence Act)</em>. Official Journal of the European Union, L 2024/1689.
</div>
</div>


</section>

 ]]></description>
  <category>ai-governance</category>
  <category>enterprise-architecture</category>
  <category>ontology</category>
  <category>security</category>
  <guid>https://krimler.github.io/posts/aegis-evidence-obligation/</guid>
  <pubDate>Wed, 08 Apr 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/aegis-evidence-obligation/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Did you check the right pocket? Routing retrieval across an agent’s memory</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/memory-store-routing/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/memory-store-routing/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Cabinet of Curiosities, Domenico Remps (c.&nbsp;1690). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A memory-augmented agent keeps several specialized stores. One might hold facts, another the recent conversation, another notes about tools or users. When a request arrives, most systems read from every store and stuff all of it into the model’s context. That is the equivalent of patting down every pocket to find your keys. It works, and it is wasteful. Reading everything costs tokens, and it pulls in irrelevant context that can crowd out the useful part.</p>
<section id="retrieval-as-routing" class="level2">
<h2 class="anchored" data-anchor-id="retrieval-as-routing">Retrieval as routing</h2>
<p>The paper reframes the problem. Choosing which store to read is a routing decision, and routing deserves to be a first-class part of the design. Stated plainly, for each request the agent should decide which store or stores to consult, and that decision should weigh two things against each other. One is accuracy, the quality of the eventual answer. The other is retrieval cost, measured in context tokens. A good router reads the store that holds the answer and skips the rest.</p>
</section>
<section id="what-the-evidence-shows" class="level2">
<h2 class="anchored" data-anchor-id="what-the-evidence-shows">What the evidence shows</h2>
<p>To measure the ceiling, the paper uses an oracle router. An oracle router is an idealized router that always picks the right store, used here to show what perfect routing would buy. The oracle achieves better downstream question-answering accuracy while spending far fewer context tokens than reading from all stores. Both numbers move in the good direction at once. Selective retrieval is not only cheaper, it gives better answers, because irrelevant context was hurting quality in the first place.</p>
<p>The oracle is a measurement tool rather than a deployable system, since it relies on knowing the right store in advance. The paper presents this as early-stage work and argues for learned routing, where the agent learns to make the store choice on its own, as the path to scalable multi-store systems.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>As agents accumulate more kinds of memory, reading all of it per request scales badly in both cost and quality. Turning store selection into an explicit, cost-aware decision is what keeps a multi-store agent affordable and sharp as the number of stores grows.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2603.15658">Did You Check the Right Pocket? Cost-Sensitive Store Routing for Memory-Augmented Agents (arXiv:2603.15658)</a>.</p>


</section>

 ]]></description>
  <category>llm-agents</category>
  <category>retrieval</category>
  <category>memory</category>
  <category>ml-systems</category>
  <guid>https://krimler.github.io/posts/memory-store-routing/</guid>
  <pubDate>Wed, 18 Mar 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/memory-store-routing/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Finite-size guarantees for dense associative memory</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/dam-associative-memory/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/dam-associative-memory/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>The Librarian, Giuseppe Arcimboldo (c.&nbsp;1566). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>An associative memory stores a set of patterns and recalls the right one from a partial or corrupted version of it. Give it a noisy image and it returns the clean stored image it most resembles. The classic version is the Hopfield network. Dense Associative Memory, or DAM, is the modern version. It uses higher-order interactions among the stored bits, and that buys a large jump in capacity. The number of patterns it can hold grows roughly like a high power of the network size, where the power is set by the order of the interactions.</p>
<section id="the-gap-in-the-theory" class="level2">
<h2 class="anchored" data-anchor-id="the-gap-in-the-theory">The gap in the theory</h2>
<p>The existing analysis of DAM studies the limit where the network is infinitely large and the stored patterns are drawn at random. That setting is clean, and it tells you the capacity scales. It does not tell you what happens in a real network of a fixed, finite size. It gives no convergence rate, so you do not know how many steps recall takes. It does not say how the memory behaves when an adversary, rather than chance, chooses the corruption. This work fills those gaps with an algorithmic analysis, meaning it studies the actual retrieval procedure step by step under conditions you can check.</p>
</section>
<section id="how-fast-recall-settles" class="level2">
<h2 class="anchored" data-anchor-id="how-fast-recall-settles">How fast recall settles</h2>
<p>The first result is about speed. Recall in these networks runs by updating one unit at a time, which is called asynchronous updating. The paper assumes two checkable conditions. The stored patterns are well separated from each other, and the interference between them stays bounded even when the memory is heavily loaded. Under these, retrieval converges geometrically. Geometric convergence means the error shrinks by a constant fraction at every step. Once the state enters the basin of attraction, the region around a stored pattern that pulls inputs toward it, the number of steps needed to lock on grows only with the logarithm of the network size. That is fast. Doubling the network adds only a constant number of steps.</p>
</section>
<section id="how-much-corruption-it-survives" class="level2">
<h2 class="anchored" data-anchor-id="how-much-corruption-it-survives">How much corruption it survives</h2>
<p>The second result is about robustness against a deliberate attacker. The paper states an explicit margin condition. A margin here is the safety gap between the correct pattern and its nearest competitor. The condition turns that gap into a concrete number: how many corrupted bits the memory can absorb in a single pass and still recover the right pattern. This makes robustness a quantity you can compute for a given network rather than a hope.</p>
</section>
<section id="why-it-always-settles" class="level2">
<h2 class="anchored" data-anchor-id="why-it-always-settles">Why it always settles</h2>
<p>The third result explains why retrieval never gets stuck cycling. The paper shows that DAM retrieval is a potential game. A potential game is a system where every local update improves a single global score. Because each unit’s update can only raise that score, and the score cannot rise forever, the process must come to rest. It settles at a stable configuration, which in game terms is a pure Nash equilibrium and in memory terms is a recalled pattern. The capacity results survive this finite-size treatment, matching the classical scaling for random patterns and holding up to small logarithmic factors in the worst case.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Dense associative memory underlies the attention mechanism in modern networks, so its guarantees are not a curiosity. Turning capacity, speed, and robustness from statements about an infinite limit into checkable conditions on a real network is what lets you reason about these systems as engineered components.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p>Algorithmic Analysis of Dense Associative Memory, ICLR 2026 Workshop. <a href="https://openreview.net/forum?id=zgHAqaIybd">OpenReview</a>.</p>


</section>

 ]]></description>
  <category>machine-learning</category>
  <category>associative-memory</category>
  <category>learning-theory</category>
  <guid>https://krimler.github.io/posts/dam-associative-memory/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/dam-associative-memory/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>A common language for benchmarking LLM serving: four IETF drafts</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ietf-llm-benchmarking/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/ietf-llm-benchmarking/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>The Tower of Babel, Pieter Bruegel the Elder (1563). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>When two systems both claim a throughput number for serving a language model, the numbers usually do not compare. One measured tokens per second at the model engine. The other measured it after a gateway, a firewall, and a network hop. One counted the prompt tokens, the other did not. The words are the same and the measurements are not. A set of Internet-Drafts in the IETF Benchmarking Methodology Working Group sets out to fix this for large language model serving. The drafts are individual submissions under review and carry no formal IETF endorsement yet. Taken together they cover four layers of the problem: the words, the method, the measurement boundaries, and the workloads.</p>
<p>This post is the overview. Each draft also has its own post.</p>
<ul>
<li><a href="../ietf-benchmarking-terminology/">Terminology: a shared vocabulary</a></li>
<li><a href="../ietf-benchmarking-methodology/">Methodology: how to run the tests</a></li>
<li><a href="../ietf-benchmarking-profiles/">Profiles: declaring the measurement boundary</a></li>
<li><a href="../ietf-benchmarking-workloads/">Workloads: twenty-five representative tasks</a></li>
</ul>
<section id="the-words" class="level2">
<h2 class="anchored" data-anchor-id="the-words">The words</h2>
<p>The first draft is a terminology document. It defines a shared vocabulary for LLM serving performance, covering latency, throughput, resource use, and quality. It gives precise definitions for a large set of metrics. These include time to first token, the delay before the first output appears, and inter-token latency, the gap between successive output tokens. It separates the two phases of generation, prefill where the prompt is processed and decode where tokens are produced. It covers throughput, latency percentiles and jitter, multi-tenant concerns such as fairness and head-of-line blocking, optimizations such as prefix caching and speculative decoding, compound systems such as retrieval-augmented generation and agents, and quality signals such as policy violations and false refusals. It defines terms only. It prescribes no method and sets no pass-or-fail thresholds.</p>
<p>See the <a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-terminology/">Terminology draft</a>.</p>
</section>
<section id="the-method" class="level2">
<h2 class="anchored" data-anchor-id="the-method">The method</h2>
<p>The second draft is a methodology. It says how to run the tests, set up the parameters, take the measurements, and report the results. It defines three system boundaries to test at: the model engine, the application gateway, and the full compound system. It defines reference workloads, including uniform and skewed synthetic traffic, conversation, code completion, and long context. It defines ten tests, among them time to first token, output token throughput, the throughput-and-latency tradeoff, the distribution of inter-token latency, concurrent request capacity, scheduling fairness, prefix cache effectiveness, behavior under memory pressure, long-context scaling, and the overhead added by guardrails. The goal is reproducible and fair comparison that accounts for streaming output, dynamic batching, and the cost of safety systems.</p>
<p>See the <a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-methodology/">Methodology draft</a>.</p>
</section>
<section id="the-measurement-boundaries" class="level2">
<h2 class="anchored" data-anchor-id="the-measurement-boundaries">The measurement boundaries</h2>
<p>The third draft defines profiles. A profile binds the terms and the procedures to a concrete role in the system and a concrete workload pattern, and it declares exactly where the measurement starts and stops. This matters because a metric like time to first token changes depending on whether you include the gateway, the firewall, and the network. Without a declared boundary the numbers are not comparable. The draft defines infrastructure profiles for the model engine, the AI gateway, the AI firewall, and the compound system, along with workload profiles for a chatbot and a compound workflow. It specifies profiles only, not new metrics or thresholds.</p>
<p>See the <a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-profiles/">Profiles draft</a>.</p>
</section>
<section id="the-workloads" class="level2">
<h2 class="anchored" data-anchor-id="the-workloads">The workloads</h2>
<p>The fourth draft defines the workloads themselves. It gives 25 standard workload profiles organized into six groups, so that everyone tests against the same representative tasks. The groups run from non-generative work such as embeddings, reranking, and scoring, through minimal-output tasks such as classification and function calling, interactive streaming such as chat and code completion, prefill-heavy tasks such as summarization and document question answering, decode-heavy tasks such as content generation and reasoning, and multi-step agentic workflows. Each profile is described along five dimensions: the ratio of input to output, the constraints on the output, the latency sensitivity, the concurrency pattern, and how much of the prompt prefix is shared across requests.</p>
<p>See the <a href="https://datatracker.ietf.org/doc/draft-mondal-llm-serving-workload-profiles/">Serving Workload Profiles draft</a>.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Benchmarks only mean something when everyone measures the same thing the same way. These four drafts supply the missing pieces in order. The vocabulary removes ambiguity in the terms. The methodology makes a run reproducible. The profiles declare what was and was not included in a measurement. The workloads make sure systems are compared on representative tasks. Together they make LLM serving numbers something you can actually trust when you compare them.</p>


</section>

 ]]></description>
  <category>llm-systems</category>
  <category>benchmarking</category>
  <category>ietf</category>
  <category>distributed-systems</category>
  <guid>https://krimler.github.io/posts/ietf-llm-benchmarking/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ietf-llm-benchmarking/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Twenty-five representative tasks: the IETF workload profiles draft</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ietf-benchmarking-workloads/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/ietf-benchmarking-workloads/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Actiniae, from Kunstformen der Natur, Ernst Haeckel (1904). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p><em>Part of a series on the IETF drafts for benchmarking LLM serving. Start with the <a href="../ietf-llm-benchmarking/">overview</a>.</em></p>
<p>A serving system can look fast on one kind of task and slow on another. Embedding a short document and running a long agentic plan stress completely different parts of the stack. To compare systems fairly, the workloads themselves have to be standardized. The fourth IETF draft does this. It is co-authored by Mohadeb Mondal and Madhava Gaikwad, an individual submission to the IETF Benchmarking Methodology Working Group with no formal IETF endorsement.</p>
<section id="five-dimensions" class="level2">
<h2 class="anchored" data-anchor-id="five-dimensions">Five dimensions</h2>
<p>Every workload is described along five dimensions. Together they capture what makes a task cheap or expensive to serve.</p>
<ul>
<li><strong>Input to output ratio.</strong> Whether the task is mostly prompt, mostly generation, or balanced.</li>
<li><strong>Output constraints.</strong> Whether the output is non-token, minimal, structured, semi-structured, or free-form.</li>
<li><strong>Latency sensitivity.</strong> Whether the task is interactive, near-real-time, or throughput-oriented.</li>
<li><strong>Concurrency pattern.</strong> Whether requests are single-stream, bursty, sustained and high, or chained in sequence.</li>
<li><strong>Prefix sharing.</strong> How much of the prompt prefix is shared across requests, from none, through a shared system prompt, up to a shared document or schema.</li>
</ul>
</section>
<section id="twenty-five-profiles-in-six-groups" class="level2">
<h2 class="anchored" data-anchor-id="twenty-five-profiles-in-six-groups">Twenty-five profiles in six groups</h2>
<p>The draft defines 25 standard workloads, sorted into six groups by what they demand of the system.</p>
<ul>
<li><strong>Group A, non-generative.</strong> Embeddings, cross-encoder reranking, and logprob scoring.</li>
<li><strong>Group B, minimal output.</strong> Classification, short question answering, and function calling.</li>
<li><strong>Group C, interactive streaming.</strong> Chat, code completion, and roleplay.</li>
<li><strong>Group D, prefill-heavy.</strong> Summarization, document question answering, and extraction.</li>
<li><strong>Group E, decode-heavy.</strong> Content generation, reasoning, and translation.</li>
<li><strong>Group F, multi-step.</strong> Agentic workflows and planning.</li>
</ul>
<p>Each profile maps to the metrics and test procedures from the companion methodology and profiles drafts, so a workload, the way to measure it, and the boundary it is measured at all line up.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Without standard workloads, every benchmark picks its own favourable task and the results stop being comparable. A fixed, representative set means a serving system is judged on the same range of work that production actually throws at it.</p>
</section>
<section id="read-the-draft" class="level2">
<h2 class="anchored" data-anchor-id="read-the-draft">Read the draft</h2>
<p><a href="https://datatracker.ietf.org/doc/draft-mondal-llm-serving-workload-profiles/">Benchmarking Workload Profiles for Large Language Model Serving</a>.</p>


</section>

 ]]></description>
  <category>llm-systems</category>
  <category>benchmarking</category>
  <category>ietf</category>
  <guid>https://krimler.github.io/posts/ietf-benchmarking-workloads/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ietf-benchmarking-workloads/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Declaring the measurement boundary: the IETF profiles draft</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ietf-benchmarking-profiles/</link>
  <description><![CDATA[ 





<p><img src="https://krimler.github.io/posts/ietf-benchmarking-profiles/cover.svg" class="img-fluid"></p>
<p><em>Part of a series on the IETF drafts for benchmarking LLM serving. Start with the <a href="../ietf-llm-benchmarking/">overview</a>.</em></p>
<p>Time to first token is a single phrase that can mean several different numbers. It depends on where you start the clock. Do you include the gateway. Do you include the firewall inspection. Do you include the network hop. Each choice gives a different value, and a benchmark that does not say which choice it made cannot be compared with another. The third IETF draft fixes this with profiles. It is an individual submission to the IETF Benchmarking Methodology Working Group with no formal IETF endorsement.</p>
<section id="what-a-profile-is" class="level2">
<h2 class="anchored" data-anchor-id="what-a-profile-is">What a profile is</h2>
<p>A profile binds the vocabulary and the procedures to a concrete role in the system and a concrete workload pattern. Its job is to declare the boundary. A profile says exactly where a measurement starts and stops, so two results taken under the same profile are measuring the same thing.</p>
</section>
<section id="the-profiles-it-defines" class="level2">
<h2 class="anchored" data-anchor-id="the-profiles-it-defines">The profiles it defines</h2>
<p>The draft defines infrastructure profiles for the distinct roles in a serving stack.</p>
<ul>
<li><strong>Model engine.</strong> Raw inference: prefill, decode, and management of the key-value cache.</li>
<li><strong>AI gateway.</strong> The overhead of routing, authentication, and caching.</li>
<li><strong>AI firewall.</strong> The latency and accuracy of security inspection, including detection rates and false positive rates.</li>
<li><strong>Compound system.</strong> End-to-end completion for orchestrated multi-step workflows such as retrieval-augmented generation and agents.</li>
</ul>
<p>It also defines workload profiles for how the system is driven, including a chatbot pattern, which is multi-turn and human-paced, and a compound workflow pattern, which is multi-step and machine-paced.</p>
<p>The draft specifies profiles only. It introduces no new metrics and no thresholds. It is the layer that makes the terminology and the methodology comparable across real deployments, where a request passes through several components before it reaches the model.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Production systems are built from a gateway, a firewall, an engine, and more. Most published benchmarks never say which of these the numbers include. Profiles remove that ambiguity by making the boundary an explicit, declared part of every result.</p>
</section>
<section id="read-the-draft" class="level2">
<h2 class="anchored" data-anchor-id="read-the-draft">Read the draft</h2>
<p><a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-profiles/">Performance Benchmarking Profiles for Large Language Model Serving Systems</a>.</p>


</section>

 ]]></description>
  <category>llm-systems</category>
  <category>benchmarking</category>
  <category>ietf</category>
  <guid>https://krimler.github.io/posts/ietf-benchmarking-profiles/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ietf-benchmarking-profiles/cover.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>A shared vocabulary for LLM serving (IETF terminology draft)</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ietf-benchmarking-terminology/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/ietf-benchmarking-terminology/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Saint Jerome in His Study, Antonello da Messina (c.&nbsp;1475). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p><em>Part of a series on the IETF drafts for benchmarking LLM serving. Start with the <a href="../ietf-llm-benchmarking/">overview</a>.</em></p>
<p>When two teams report a throughput number for serving a language model, the numbers often do not mean the same thing. One counted prompt tokens, the other did not. One measured at the model engine, the other after a gateway. The words match and the measurements do not. The first IETF draft in this series addresses that directly. It defines a shared vocabulary for LLM serving performance and nothing more. The draft is an individual submission to the IETF Benchmarking Methodology Working Group and carries no formal IETF endorsement.</p>
<section id="what-it-defines" class="level2">
<h2 class="anchored" data-anchor-id="what-it-defines">What it defines</h2>
<p>The draft gives precise definitions for a large set of metrics, on the order of seventy, grouped into about a dozen categories. The categories cover the parts of serving that people measure and disagree about.</p>
<ul>
<li><strong>Request and response timing.</strong> Time to first token, the delay before the first output appears. Inter-token latency, the gap between successive output tokens. Normalized latency, which adjusts for output length.</li>
<li><strong>Phase-specific timing.</strong> Prefill latency, the cost of processing the prompt, and decode latency, the cost of generating tokens. These two phases behave differently, so the draft keeps them separate.</li>
<li><strong>Throughput.</strong> Token rates and request rates, defined so it is clear what is being counted.</li>
<li><strong>Latency distribution.</strong> Percentiles and jitter, since an average hides the tail that users actually feel.</li>
<li><strong>Multi-tenancy and scheduling.</strong> Fairness across tenants and head-of-line blocking, where one large request stalls the queue behind it.</li>
<li><strong>Optimizations.</strong> Prefix caching, which reuses work across requests that share a prompt, and speculative decoding, which guesses tokens ahead and verifies them.</li>
<li><strong>Compound systems.</strong> Retrieval-augmented generation and agentic workflows, where a request triggers several model and tool calls.</li>
<li><strong>Quality enforcement.</strong> Policy violations and false refusals, so safety behavior is measurable rather than anecdotal.</li>
</ul>
</section>
<section id="what-it-leaves-out-on-purpose" class="level2">
<h2 class="anchored" data-anchor-id="what-it-leaves-out-on-purpose">What it leaves out, on purpose</h2>
<p>The draft defines terms only. It prescribes no method for measuring them and sets no pass-or-fail thresholds. That restraint is the point. A vocabulary that everyone agrees on has to be separable from any one way of testing. The method comes in the next draft, and the thresholds are left to whoever runs a benchmark.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Comparable benchmarks start with agreed words. Once time to first token and inter-token latency mean one thing across papers and products, the rest of the benchmarking effort has a foundation to stand on.</p>
</section>
<section id="read-the-draft" class="level2">
<h2 class="anchored" data-anchor-id="read-the-draft">Read the draft</h2>
<p><a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-terminology/">Benchmarking Terminology for Large Language Model Serving</a>.</p>


</section>

 ]]></description>
  <category>llm-systems</category>
  <category>benchmarking</category>
  <category>ietf</category>
  <guid>https://krimler.github.io/posts/ietf-benchmarking-terminology/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ietf-benchmarking-terminology/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>How to run the tests: the IETF LLM serving methodology draft</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ietf-benchmarking-methodology/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/ietf-benchmarking-methodology/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>An Experiment on a Bird in the Air Pump, Joseph Wright of Derby (1768). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p><em>Part of a series on the IETF drafts for benchmarking LLM serving. Start with the <a href="../ietf-llm-benchmarking/">overview</a>.</em></p>
<p>Agreed words are the start. A reproducible benchmark also needs an agreed procedure. The second IETF draft supplies it. It specifies how to set up a test, what traffic to send, what to measure, and how to report the result. It is an individual submission to the IETF Benchmarking Methodology Working Group with no formal IETF endorsement.</p>
<section id="where-to-measure" class="level2">
<h2 class="anchored" data-anchor-id="where-to-measure">Where to measure</h2>
<p>The draft defines three system boundaries, because a serving stack has layers and a number means little without saying which layer it covers.</p>
<ul>
<li>The <strong>model engine</strong>, which is raw inference.</li>
<li>The <strong>application gateway</strong>, which adds routing, authentication, and caching.</li>
<li>The <strong>compound system</strong>, which is the full end-to-end path including retrieval and tool use.</li>
</ul>
<p>A measurement always states which of these boundaries it was taken at.</p>
</section>
<section id="what-traffic-to-send" class="level2">
<h2 class="anchored" data-anchor-id="what-traffic-to-send">What traffic to send</h2>
<p>It defines reference workloads so that everyone drives the system with comparable traffic. These include uniform synthetic traffic, skewed synthetic traffic, a conversation pattern, code completion, and long context. Each stresses the system in a different way, from steady load to bursty load to very long prompts.</p>
</section>
<section id="the-ten-tests" class="level2">
<h2 class="anchored" data-anchor-id="the-ten-tests">The ten tests</h2>
<p>The draft lays out ten benchmarking tests. Together they cover speed, capacity, fairness, and the cost of the features that production systems actually run.</p>
<ol type="1">
<li>Time to first token.</li>
<li>Output token throughput.</li>
<li>The tradeoff between throughput and latency.</li>
<li>The distribution of inter-token latency, not just its average.</li>
<li>Concurrent request capacity.</li>
<li>Scheduling fairness across requests.</li>
<li>Prefix cache effectiveness.</li>
<li>Behavior under memory pressure.</li>
<li>Long-context scaling.</li>
<li>The overhead added by guardrails.</li>
</ol>
</section>
<section id="what-it-accounts-for" class="level2">
<h2 class="anchored" data-anchor-id="what-it-accounts-for">What it accounts for</h2>
<p>The methodology is built for how LLM serving really behaves. It handles streaming output, where tokens arrive over time rather than all at once. It handles dynamic batching, where the system groups requests on the fly. It handles context-dependent performance, where a long prompt changes the numbers. It also measures the cost of safety systems rather than ignoring them. The goal throughout is a run that someone else can repeat and get the same answer.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>A benchmark that cannot be reproduced is a marketing number. By fixing the boundaries, the traffic, and the tests, this draft makes a serving result something a second team can check.</p>
</section>
<section id="read-the-draft" class="level2">
<h2 class="anchored" data-anchor-id="read-the-draft">Read the draft</h2>
<p><a href="https://datatracker.ietf.org/doc/draft-gaikwad-llm-benchmarking-methodology/">Benchmarking Methodology for Large Language Model Serving</a>.</p>


</section>

 ]]></description>
  <category>llm-systems</category>
  <category>benchmarking</category>
  <category>ietf</category>
  <guid>https://krimler.github.io/posts/ietf-benchmarking-methodology/</guid>
  <pubDate>Mon, 19 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ietf-benchmarking-methodology/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>AlignDP: locking knowledge transfer at the data interface</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/aligndp-rarity-privacy/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/aligndp-rarity-privacy/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>The Moneylender and His Wife, Quentin Massys (1514). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>Large language models can be copied without permission. An attacker can extract training data, distill the model into a smaller copy, or fine-tune on its outputs. The common defenses are watermarking and monitoring. Both share a weakness. They act after the leak. A watermark helps you prove that copying happened, and monitoring helps you notice it, but by then the knowledge has already moved. AlignDP works earlier. It is a hybrid privacy lock that blocks the transfer at the data interface, before knowledge leaves.</p>
<section id="two-kinds-of-field-need-two-kinds-of-protection" class="level2">
<h2 class="anchored" data-anchor-id="two-kinds-of-field-need-two-kinds-of-protection">Two kinds of field need two kinds of protection</h2>
<p>The key observation is that not all data is equally risky, and the right protection depends on how often a value appears.</p>
<p>Rare fields are the dangerous ones. A value that shows up only a few times can identify its source, so it needs strong hiding. AlignDP applies PAC indistinguishability to rare fields. The practical meaning is that an observer cannot reliably tell whether a given rare value was present, so the rare information stays concealed.</p>
<p>Common fields are different. You often want to keep useful aggregate statistics about them, such as how frequent each value is. AlignDP protects these with RAPPOR, a well-known method for local differential privacy. RAPPOR randomizes each individual report so no single response is revealing, while still allowing accurate frequency estimates once many reports are combined. The frequent values stay usable in aggregate without exposing any one contributor.</p>
<p>A global aggregator sits over both tiers. It manages composition, meaning the way many small privacy releases add up, and it tracks the overall budget so the total exposure stays bounded.</p>
</section>
<section id="what-the-paper-shows" class="level2">
<h2 class="anchored" data-anchor-id="what-the-paper-shows">What the paper shows</h2>
<p>The work establishes theoretical results for both tiers. It extends the PAC guarantee to the global aggregation step and derives error bounds for the RAPPOR estimates. Simulations match the design intent. Rare categories remain hidden, while frequent categories can be recovered with small error. The paper is explicit about the tradeoff between privacy and utility, since that tension is the heart of any differential privacy scheme.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Defending a model after it has been copied is a weak position. AlignDP moves the control to the point where data enters, and it tailors the strength of protection to the risk each field carries. Strong hiding goes where identification is possible. Lighter, aggregate-preserving protection goes where only statistics matter.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2512.17251">AlignDP: Hybrid Differential Privacy with Rarity-Aware Protection for LLMs (arXiv:2512.17251)</a>.</p>


</section>

 ]]></description>
  <category>privacy</category>
  <category>differential-privacy</category>
  <category>llm</category>
  <category>security</category>
  <guid>https://krimler.github.io/posts/aligndp-rarity-privacy/</guid>
  <pubDate>Sat, 20 Dec 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/aligndp-rarity-privacy/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Enforcing privacy at the edge for local language models: AVEC</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/avec-edge-privacy/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/avec-edge-privacy/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Woman Reading a Letter, Johannes Vermeer (c.&nbsp;1663). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A local language model runs on your own device, which keeps your data close. Some queries are too hard for the small local model, so it delegates them to a larger model in the cloud. That handoff is the weak point. The query sent outward can carry sensitive information. AVEC is a proposal for controlling that handoff. The name stands for Adaptive Verifiable Edge Control. It enforces privacy at the edge and makes the delegation verifiable.</p>
<p>A note on what this is. AVEC is a position paper. Its evaluation is simulation based by design, and it does not claim deployment readiness or measured task quality with live models. The contribution is an architecture and the theory that goes with it.</p>
<section id="spending-a-privacy-budget-per-query" class="level2">
<h2 class="anchored" data-anchor-id="spending-a-privacy-budget-per-query">Spending a privacy budget per query</h2>
<p>The core mechanism is an adaptive budget. Differential privacy is a way of adding calibrated random noise so that an output reveals very little about any single underlying record. The strength of that protection is a budget, and spending more budget buys more accuracy at the cost of more exposure. Most systems fix one budget for everything. AVEC sets the budget per query, based on three things: how sensitive the query is, how confident the local model is on its own, and how much budget the user has already spent in the past.</p>
<p>To keep the spending honest, AVEC tracks it with an odometer. An odometer is a running tally of privacy budget consumed across many queries, so the system always knows how much protection remains. The accounting uses Rényi differential privacy, a version of the theory that composes cleanly when you add up many small releases.</p>
</section>
<section id="what-it-proves-it-can-and-cannot-do" class="level2">
<h2 class="anchored" data-anchor-id="what-it-proves-it-can-and-cannot-do">What it proves it can and cannot do</h2>
<p>The paper does the unglamorous work of marking the boundaries. It establishes utility ceilings, which are limits on how good the answers can be at a given level of privacy. It establishes delegation-leakage bounds, which cap how much the handoff to the remote model can reveal. It also proves impossibility results. Two tempting shortcuts do not work on their own. Deterministic gating, where a fixed rule decides what to send, cannot provide the guarantee. Hash-only certification, where a hash is used to prove integrity, is not enough by itself.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Local models are sold on privacy, and the delegation step quietly undermines that promise. AVEC takes the step seriously. It treats each outward query as a metered privacy event, verifies the transformation on the device, and is honest about the ceilings and the dead ends. That gives later empirical work a clear target.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2509.10561">AVEC: Bootstrapping Privacy for Local LLMs (arXiv:2509.10561)</a>.</p>


</section>

 ]]></description>
  <category>privacy</category>
  <category>differential-privacy</category>
  <category>llm</category>
  <category>edge</category>
  <guid>https://krimler.github.io/posts/avec-edge-privacy/</guid>
  <pubDate>Fri, 12 Sep 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/avec-edge-privacy/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>When are two RLHF objectives the same? A canonical form for preference losses</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/opal-rlhf-equivalence/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/opal-rlhf-equivalence/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Narcissus, Caravaggio (c.&nbsp;1597-1599). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>Aligning a model to human preferences has produced a long list of training objectives. Each new one tends to arrive as a distinct improvement over the last. The list keeps growing, and it is hard to tell which of these objectives are genuinely new and which are the same idea written in different notation. This paper gives a tool to settle the question.</p>
<section id="canonicalization" class="level2">
<h2 class="anchored" data-anchor-id="canonicalization">Canonicalization</h2>
<p>The tool is called Opal, and it does canonicalization. A canonical form is a standard way of writing something so that two things that are really equal end up looking identical. Given two preference objectives, Opal returns one of two answers. Either it produces a canonical form that shows the two are algebraically the same, or it produces a concrete witness that they differ. A witness here is a specific case where the two objectives disagree, so the difference is demonstrated rather than asserted.</p>
</section>
<section id="what-it-finds" class="level2">
<h2 class="anchored" data-anchor-id="what-it-finds">What it finds</h2>
<p>Run Opal across the popular methods and a clear picture emerges. Many widely used objectives optimize the same underlying thing. Their apparent differences are reparameterizations, meaning the same objective dressed in different variables. Some methods, by contrast, are provably distinct, and Opal isolates a small set of structural mechanisms that produce real differences rather than cosmetic ones.</p>
<p>One finding is worth calling out because it is easy to miss. Batch normalization can cause the same response pair to receive different gradients depending on which other examples share its batch. The training signal for a pair stops being a property of the pair alone. It becomes a property of the batch it landed in. That is a genuine difference in objective, and it comes from a detail most people treat as bookkeeping.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>A field that keeps proposing objectives needs a way to tell novelty from notation. Opal turns that into a decidable check. It tells you when a new method is a real departure and when it is an old method in new clothes. That saves effort, and it points attention at the handful of structural choices that actually change what the model learns.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2509.11298">When Are Two RLHF Objectives the Same? (arXiv:2509.11298)</a>.</p>


</section>

 ]]></description>
  <category>ai-alignment</category>
  <category>rlhf</category>
  <category>preference-optimization</category>
  <guid>https://krimler.github.io/posts/opal-rlhf-equivalence/</guid>
  <pubDate>Wed, 10 Sep 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/opal-rlhf-equivalence/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Why the alignment gap always wins, unless you know where to look</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/murphy-alignment-gap/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/murphy-alignment-gap/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Landscape with the Fall of Icarus, after Pieter Bruegel the Elder (16th century). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>Reinforcement learning from human feedback is the standard way to align a model. People compare model outputs, the comparisons train a reward model, and the model is tuned to score well on that reward. The whole scheme rests on the feedback being right. This paper studies what happens when it is not.</p>
<section id="a-compass-that-points-wrong-in-some-places" class="level2">
<h2 class="anchored" data-anchor-id="a-compass-that-points-wrong-in-some-places">A compass that points wrong in some places</h2>
<p>The setup is misspecified feedback. Human feedback is systematically wrong on certain kinds of input. A useful picture is a compass that points true almost everywhere but points the wrong way in a few specific regions. The problem is not random error, which averages out. It is consistent error in particular places.</p>
<p>Two numbers describe how bad it is. One is the fraction of contexts where the feedback is biased. The other is the strength of that bias. The trouble lives in the corner of the input space where both are nonzero.</p>
</section>
<section id="the-hard-result" class="level2">
<h2 class="anchored" data-anchor-id="the-hard-result">The hard result</h2>
<p>The paper proves a lower bound. Suppose two candidate reward functions agree everywhere except on the biased contexts. To tell them apart from feedback alone, any learning algorithm needs a number of samples that grows exponentially in the prevalence of the bias and the square of its strength. Rare edge cases with subtly wrong feedback create a learning problem that is exponentially hard. You can pour in data and still not know which objective you are actually optimizing.</p>
<p>This is the sense in which the gap always wins. The gap is the distance between what you optimize, a proxy built from human feedback, and what you actually want, the true objective. When the problematic contexts are rare and the feedback there is quietly biased, no amount of ordinary data closes that gap.</p>
</section>
<section id="the-way-out" class="level2">
<h2 class="anchored" data-anchor-id="the-way-out">The way out</h2>
<p>There is one escape, and it is specific. Suppose you have a calibration oracle, a way to identify where the feedback is unreliable. Then you can spend your limited questions on exactly those contexts. The paper shows that this collapses the cost from exponential to polynomial. You no longer need to find the needle by luck, because you have been told which haystack it is in.</p>
<p>The lesson is practical. Throwing more feedback at an aligned system does not help where the feedback itself is broken. Finding and targeting the broken regions does.</p>
</section>
<section id="what-is-settled-and-what-is-open" class="level2">
<h2 class="anchored" data-anchor-id="what-is-settled-and-what-is-open">What is settled and what is open</h2>
<p>The results are theoretical. The paper proves the lower bound and the oracle speedup. It invites collaboration on large-scale experiments and on building the benchmarks that would test these effects in practice.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2509.05381">Murphy’s Laws of AI Alignment: Why the Gap Always Wins (arXiv:2509.05381)</a>.</p>


</section>

 ]]></description>
  <category>ai-alignment</category>
  <category>rlhf</category>
  <category>learning-theory</category>
  <guid>https://krimler.github.io/posts/murphy-alignment-gap/</guid>
  <pubDate>Thu, 04 Sep 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/murphy-alignment-gap/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Scoring a datacenter fleet by the risk of what happens next</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/ansc-capacity-health/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/ansc-capacity-health/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>Rain, Steam and Speed - The Great Western Railway, J. M. W. Turner (1844). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>A hyperscale datacenter network runs thousands of devices and links. When one fails, an alert fires. That alert tells you what broke. It does not tell you how close the whole system is to running out of capacity. Those are different questions. A single link failing in a region with plenty of spare capacity is routine. The same failure in a region already running hot can be the last step before a shortfall. ANSC is built to score the second question.</p>
<section id="the-gap-in-ordinary-alerting" class="level2">
<h2 class="anchored" data-anchor-id="the-gap-in-ordinary-alerting">The gap in ordinary alerting</h2>
<p>Standard monitoring detects individual device or link failures. Each alert is local. It says nothing about the aggregate risk that several failures together push a datacenter or a region past its capacity limit. Operators are left to piece that picture together by hand, often while the alerts are still arriving. The risk that matters is the cascading one, and it lives above the level of any single alert.</p>
</section>
<section id="what-ansc-measures" class="level2">
<h2 class="anchored" data-anchor-id="what-ansc-measures">What ANSC measures</h2>
<p>ANSC produces a color-coded health score for each datacenter and region. The score ranks urgency by the probability of an imminent capacity violation rather than by the impact of what has already happened. Two ingredients go into it. The first is the current residual capacity, meaning how much headroom is left right now. The second is the probability of additional failures on top of the current state. The score combines these and normalizes them at the datacenter level and the regional level, so a green datacenter and a red one mean the same thing wherever you look.</p>
</section>
<section id="what-it-changes-for-operators" class="level2">
<h2 class="anchored" data-anchor-id="what-it-changes-for-operators">What it changes for operators</h2>
<p>The paper reports ANSC running across more than 400 datacenters and 60 regions. The effect is to cut noise and point attention at the places most likely to fail soon. Instead of a flat stream of equal-looking alerts, an operator sees a ranked view of where capacity is genuinely at risk. Remediation effort goes to the highest risk first, which is where it does the most good.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>Reliability at this scale is a prioritization problem. There are always more alerts than people. A score that orders work by the probability of the next failure, rather than by the noise of the last one, is what lets a small team hold a large fleet.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2508.16119">ANSC: Probabilistic Capacity Health Scoring for Datacenter-Scale Reliability (arXiv:2508.16119)</a>.</p>


</section>

 ]]></description>
  <category>distributed-systems</category>
  <category>reliability</category>
  <category>sre</category>
  <guid>https://krimler.github.io/posts/ansc-capacity-health/</guid>
  <pubDate>Thu, 21 Aug 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/ansc-capacity-health/cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Treating alignment as something you can measure and reduce: NPO</title>
  <dc:creator>Madhava Gaikwad</dc:creator>
  <link>https://krimler.github.io/posts/npo-meta-alignment/</link>
  <description><![CDATA[ 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://krimler.github.io/posts/npo-meta-alignment/cover.jpg" class="img-fluid figure-img"></p>
<figcaption>The Geographer, Johannes Vermeer (c.&nbsp;1668). Public domain, via Wikimedia Commons.</figcaption>
</figure>
</div>
<p>Alignment means making a model behave the way people actually want it to behave. Most production pipelines treat this as a one-time step. You train the model, you ship it, and you hope it stays aligned. NPO starts from a different stance. Alignment is a quantity you can measure, supervise, and drive down over time.</p>
<section id="the-two-quantities" class="level2">
<h2 class="anchored" data-anchor-id="the-two-quantities">The two quantities</h2>
<p>NPO names two things and turns each into a number.</p>
<p>The first is alignment loss. This is how far the model’s behavior sits from what was intended. Driving it down is the usual goal.</p>
<p>The second is meta-alignment, and it is the idea that gives the paper its name. Meta-alignment asks whether your monitoring is itself trustworthy. A system that reports “everything looks aligned” is only useful if that report tracks reality. NPO calls this monitoring fidelity. The paper shows that meta-alignment reduces to ordinary alignment once you fix a threshold on the monitor. In plain terms, checking the checker is the same kind of problem as the original check, so the same machinery handles both.</p>
</section>
<section id="the-feedback-that-drives-it" class="level2">
<h2 class="anchored" data-anchor-id="the-feedback-that-drives-it">The feedback that drives it</h2>
<p>The loop runs on structured human feedback. This is more than a thumbs up. It includes likes, explicit overrides where a person corrects the system, and abstentions where a person declines to answer. Each kind of signal carries different information, and NPO ingests all of them. Around this sit the operational pieces a real deployment needs: scoring scenarios, tuning thresholds, and validating policies before they take effect.</p>
</section>
<section id="why-the-loop-is-stable" class="level2">
<h2 class="anchored" data-anchor-id="why-the-loop-is-stable">Why the loop is stable</h2>
<p>A feedback loop is only useful if it settles rather than drifts. NPO proves that under noisy feedback both quantities converge, and that they do so together. The alignment loss and the monitoring fidelity both approach their targets as more feedback arrives. The paper backs the theory with results from a large deployment, along with simulation artifacts and ablation studies that isolate which parts of the design carry the weight.</p>
</section>
<section id="why-it-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-it-matters">Why it matters</h2>
<p>The shift here is from a single alignment event to a controlled process. Once alignment and the honesty of its monitoring are both numbers that provably go down under feedback, you can run alignment the way you run any other reliability metric. You watch it, you set targets, and you route effort to where the number is worst.</p>
</section>
<section id="read-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="read-the-paper">Read the paper</h2>
<p><a href="https://arxiv.org/abs/2507.21131">NPO: Learning Alignment and Meta-Alignment through Structured Human Feedback (arXiv:2507.21131)</a>.</p>


</section>

 ]]></description>
  <category>ai-alignment</category>
  <category>rlhf</category>
  <category>ml-systems</category>
  <guid>https://krimler.github.io/posts/npo-meta-alignment/</guid>
  <pubDate>Sun, 27 Jul 2025 18:30:00 GMT</pubDate>
  <media:content url="https://krimler.github.io/posts/npo-meta-alignment/cover.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
