<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Edge on lo0 — Tech Blog</title><link>https://blog.lo0.es/en/tags/edge/</link><description>Recent content in Edge on lo0 — Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 09 Jun 2026 01:50:00 +0000</lastBuildDate><atom:link href="https://blog.lo0.es/en/tags/edge/index.xml" rel="self" type="application/rss+xml"/><item><title>Device-native architectures: fine-grained MoE and pre-attention router</title><link>https://blog.lo0.es/en/posts/device-native-architectures-fine-grained-moe-pre-attention-router/</link><pubDate>Tue, 09 Jun 2026 01:50:00 +0000</pubDate><guid>https://blog.lo0.es/en/posts/device-native-architectures-fine-grained-moe-pre-attention-router/</guid><description>&lt;blockquote>
&lt;p>This post belongs to the series on inference performance in small models. It is the architectural face of a problem we have already looked at from the compute-regime side (the SLM&amp;rsquo;s inverted roofline) and from the weight-loading side in &lt;a href="https://blog.lo0.es/en/posts/pantry-lift-from-disk-to-hbm-why-the-kitchen-opens-late/">From disk to HBM&lt;/a>. Here the question is different: what if, instead of adapting a large model to the device, we design the model &lt;em>for&lt;/em> the device from the first commit?&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>The default move to get an LLM onto a laptop, a phone or an edge box is to &lt;strong>take a dense model built for cloud and compress it&lt;/strong>: distillation, pruning, quantisation. It is a gesture of &lt;em>reduction&lt;/em>: you start from something big and take things away. SmallThinker (arXiv:2507.20984, SJTU IPADS + Zenergize AI) argues for the reverse gesture, &lt;em>designing from scratch&lt;/em>, and articulates it in three pieces. &lt;strong>First: fine-grained MoE&lt;/strong>, many small experts with very few activated per token, so that total parameters &lt;code>N&lt;/code> (the capacity) decouple from activated parameters &lt;code>A&lt;/code> (the compute cost per token). &lt;strong>Second: sparse FFN&lt;/strong>, ReLU-style activation sparsity inside each block, which adds a second level of sparsity on top of the first. &lt;strong>Third: a pre-attention router&lt;/strong> that predicts which experts will be needed &lt;em>before&lt;/em> running the attention block and launches the prefetch of those weights from SSD/flash in parallel with attention compute, hiding the storage latency, which is the real bottleneck when the model does not fit entirely in RAM. The authors report SmallThinker-4B-A0.6B and SmallThinker-21B-A3B exceeding ~20 tok/s on consumer CPUs with Q4_0, using ~1 GB and ~8 GB of RAM. The numbers are interesting and the direction is right; the evaluation methodology and the quality cost of activating so little deserve scepticism, and that is what the last part is for.&lt;/p>
&lt;h2 id="the-analogy-the-librarian-who-anticipates-your-request">The analogy: the librarian who anticipates your request&lt;/h2>
&lt;p>Picture a huge library with a small reading room. You are sitting in the room at a single desk: only a few books fit on it at a time (that is RAM). The bulk of the collection is in the back room, on long shelves that are slow to walk (that is the SSD/flash). And there is a librarian.&lt;/p>
&lt;p>The naive method: you read, you reach a point where you need a specific book, you request it, and then the librarian gets up, walks to the back room, looks for it and comes back. Meanwhile, you wait with the page open, making no progress. Every time you need a new book, you pay the full trip to the back room. The reading room spends most of its time waiting, not reading.&lt;/p>
&lt;p>The SmallThinker method: the librarian is clever and gets ahead of you. While you are still reading the chapter&amp;rsquo;s &lt;strong>table of contents&lt;/strong>, working out what it is about and connecting ideas, which in the model is the &lt;strong>attention&lt;/strong> block, they have already glanced over your shoulder, &lt;strong>predicted&lt;/strong> which three or four books you are going to ask for and gone to the back room to fetch them. By the time you finish the contents and formulate the request, the books are already on your desk. You have not waited: the trip to the back room happened &lt;em>in parallel&lt;/em> with your reading of the contents.&lt;/p>
&lt;p>The analogy holds on four details:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The small desk is RAM&lt;/strong>; the slow back room is the &lt;strong>SSD/flash&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>The books are the MoE&amp;rsquo;s experts&lt;/strong>: only a few are on the desk at any moment.&lt;/li>
&lt;li>&lt;strong>Reading the contents is the attention block&lt;/strong>; requesting and using the books is the FFN/expert block.&lt;/li>
&lt;li>&lt;strong>The librarian who predicts and gets ahead is the pre-attention router&lt;/strong>: the prediction is made first, and the trip to fetch (the prefetch) overlaps with reading the contents (attention).&lt;/li>
&lt;/ul>
&lt;p>The quantitative question running through the whole post is: does the librarian get back in time? The wait is only hidden if the trip to the back room takes less than your reading of the contents. That is the condition &lt;code>t_{\text{attention}} \ge t_{\text{prefetch}}&lt;/code>, and we will do it with numbers.&lt;/p>
&lt;h2 id="compressing-a-dense-model-vs-designing-for-device">Compressing a dense model vs. designing for device&lt;/h2>
&lt;p>It is worth laying out the two approaches plainly, because they are not degrees of the same thing: they are different philosophies.&lt;/p>
&lt;p>&lt;strong>Approach A — compress a dense model built for cloud.&lt;/strong> You start from, say, a dense 7B–14B model trained to run on an RTX 4090 (24 GB, Ada Lovelace) or on a generic 4×H100 SXM cluster (320 GB, NVLink, native FP8). To fit it into a device you apply three levers, each with its own post: &lt;a href="https://blog.lo0.es/en/posts/knowledge-distillation-teaching-small-model-think-like-big-one/">distillation&lt;/a> (you train a small student that imitates the teacher), &lt;a href="https://blog.lo0.es/en/posts/llm-pruning-cutting-without-amputating/">pruning&lt;/a> (you remove weights or whole structures) and aggressive quantisation (you go down to 4 bits or fewer). The resulting model &lt;strong>is still dense&lt;/strong>: all its parameters are activated on every token. You have reduced the number of parameters, but the compute pattern is the cloud&amp;rsquo;s, only smaller.&lt;/p>
&lt;p>&lt;strong>Approach B — design for device from scratch.&lt;/strong> Here the device&amp;rsquo;s constraints enter the &lt;em>architecture&lt;/em>, not a later compression phase. The constraints are three and very concrete:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Weak compute.&lt;/strong> A laptop CPU or a mobile SoC does orders of magnitude fewer FLOPs than a datacenter GPU. This pushes you to minimise the &lt;strong>activated&lt;/strong> parameters per token, not the total ones.&lt;/li>
&lt;li>&lt;strong>Little RAM.&lt;/strong> Tens of GB do not fit. This pushes you to keep resident only what is essential and to &lt;em>stream&lt;/em> the rest.&lt;/li>
&lt;li>&lt;strong>Slow storage.&lt;/strong> The SSD or flash you are forced to stream from has far less bandwidth than a GPU&amp;rsquo;s HBM. This turns storage I/O into the bottleneck, and pushes you to &lt;em>hide&lt;/em> it.&lt;/li>
&lt;/ol>
&lt;p>SmallThinker is approach B taken to the detail: each of those three constraints has an architectural answer. Weak compute is attacked with fine-grained MoE + sparse FFN (minimise &lt;code>A&lt;/code>). Scarce RAM is attacked with streaming from SSD (resident ≈ &lt;code>A&lt;/code> + cache, not &lt;code>N&lt;/code>). Slow storage is attacked with the pre-attention router (hide the I/O behind attention). It is no accident that the three pieces fit together: each one solves a constraint, and together they reinforce each other.&lt;/p>
&lt;p>An important nuance, so as not to fall into the hype: approach B &lt;strong>is neither free nor universally superior&lt;/strong>. It requires training a new model (you do not reuse existing weights), and the quality ceiling of a model with a very small &lt;code>A&lt;/code> is intrinsically bounded, as we will see. The argument is not &amp;ldquo;B always wins&amp;rdquo;, but &amp;ldquo;for the device regime, B attacks the right bottlenecks, and A only attacks them in passing&amp;rdquo;.&lt;/p>
&lt;h2 id="two-levels-of-sparsity">Two levels of sparsity&lt;/h2>
&lt;p>The central capacity idea is old and well understood in &lt;a href="https://blog.lo0.es/en/posts/moe-inference-fundamentals-expert-parallel-deepseek-economics/">MoE&lt;/a>: separate &lt;strong>capacity&lt;/strong> from &lt;strong>compute cost&lt;/strong>. In a MoE, the model has &lt;code>N&lt;/code> total parameters spread across experts, but for each token only &lt;code>A&lt;/code> parameters are activated (those of the top-k experts the router picks). Compute cost per token scales with &lt;code>A&lt;/code>; knowledge capacity scales with &lt;code>N&lt;/code>. SmallThinker applies this idea at &lt;strong>two superimposed levels&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Level 1 — fine-grained MoE.&lt;/strong> &amp;ldquo;Fine-grained&amp;rdquo; means many small experts instead of few large ones, with very few activated per token. Instead of, say, 8 experts of which you activate 2, you have dozens of experts of which you activate a handful. With smaller experts, the same &lt;code>A&lt;/code> is spread across more possible combinations, which gives the router fine granularity and keeps &lt;code>A&lt;/code> very low relative to &lt;code>N&lt;/code>. The result is an aggressive &lt;code>N/A&lt;/code> ratio: a lot of capacity, very little compute per token.&lt;/p>
&lt;p>&lt;strong>Level 2 — sparse FFN (ReLU-style activation sparsity).&lt;/strong> This level is orthogonal and operates &lt;em>inside&lt;/em> each FFN. With a ReLU-style non-linearity, a large fraction of the intermediate layer&amp;rsquo;s neurons produce exactly zero for a given token. A neuron that comes out at zero contributes nothing to the output: its matrix-vector multiplication can be skipped. This is &lt;em>activation sparsity&lt;/em>: predictable token by token, and exploitable so as not to load or multiply the weight rows/columns corresponding to inactive neurons. It is the same phenomenon exploited by work such as Deja Vu or PowerInfer; SmallThinker builds it in from the factory by choosing activations that favour it.&lt;/p>
&lt;p>The combined effect, in one sentence: &lt;strong>large &lt;code>N&lt;/code> (capacity), tiny &lt;code>A&lt;/code> (compute cost per token ≈ proportional to &lt;code>A&lt;/code>)&lt;/strong>, and on top of that, inside that &lt;code>A&lt;/code>, a fraction of the multiplications is saved through activation sparsity. It is sparsity on top of sparsity.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 780 300" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Classic MoE vs fine-grained MoE with sparse FFN">
&lt;defs>&lt;marker id="ar1" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;text x="195" y="22" text-anchor="middle" font-size="13" font-weight="600" fill="currentColor">Classic MoE (coarse-grained)&lt;/text>
&lt;text x="585" y="22" text-anchor="middle" font-size="13" font-weight="600" fill="currentColor">Fine-grained MoE + sparse FFN&lt;/text>
&lt;line x1="390" y1="35" x2="390" y2="285" stroke="currentColor" stroke-width="1" stroke-dasharray="4 3"/>
&lt;!-- classic: 8 large experts, 2 active -->
&lt;text x="40" y="50" font-size="11" fill="currentColor">8 large experts · activates 2&lt;/text>
&lt;rect x="40" y="60" width="64" height="40" fill="#1f5fa8" stroke="#13335c" stroke-width="1.4"/>
&lt;rect x="114" y="60" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;rect x="188" y="60" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;rect x="262" y="60" width="64" height="40" fill="#1f5fa8" stroke="#13335c" stroke-width="1.4"/>
&lt;rect x="40" y="106" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;rect x="114" y="106" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;rect x="188" y="106" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;rect x="262" y="106" width="64" height="40" fill="#cfd8e3" stroke="#7b8794" stroke-width="1.2"/>
&lt;text x="183" y="172" text-anchor="middle" font-size="11" fill="currentColor">large A per expert · coarse granularity&lt;/text>
&lt;!-- fine: many small experts, several active but low total A -->
&lt;text x="410" y="50" font-size="11" fill="currentColor">many small experts · activates few&lt;/text>
&lt;g>
&lt;rect x="410" y="60" width="28" height="22" fill="#2a7a40" stroke="#1a4d29" stroke-width="1.2"/>
&lt;rect x="444" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="478" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="512" y="60" width="28" height="22" fill="#2a7a40" stroke="#1a4d29" stroke-width="1.2"/>
&lt;rect x="546" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="580" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="614" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="648" y="60" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="410" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="444" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="478" y="88" width="28" height="22" fill="#2a7a40" stroke="#1a4d29" stroke-width="1.2"/>
&lt;rect x="512" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="546" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="580" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;rect x="614" y="88" width="28" height="22" fill="#2a7a40" stroke="#1a4d29" stroke-width="1.2"/>
&lt;rect x="648" y="88" width="28" height="22" fill="#cfe3d5" stroke="#7b948a" stroke-width="1"/>
&lt;/g>
&lt;text x="543" y="128" text-anchor="middle" font-size="11" fill="currentColor">low total A · fine granularity&lt;/text>
&lt;!-- sparse FFN inside -->
&lt;text x="410" y="158" font-size="11" font-weight="600" fill="currentColor">+ sparse FFN inside each active expert:&lt;/text>
&lt;g>
&lt;rect x="410" y="168" width="14" height="40" fill="#a48000"/>
&lt;rect x="428" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;rect x="446" y="168" width="14" height="40" fill="#a48000"/>
&lt;rect x="464" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;rect x="482" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;rect x="500" y="168" width="14" height="40" fill="#a48000"/>
&lt;rect x="518" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;rect x="536" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;rect x="554" y="168" width="14" height="40" fill="#a48000"/>
&lt;rect x="572" y="168" width="14" height="40" fill="#f1e7c2" stroke="#b8a96a" stroke-width="0.8"/>
&lt;/g>
&lt;text x="600" y="192" font-size="11" fill="currentColor">neurons at 0 (ReLU) →&lt;/text>
&lt;text x="600" y="206" font-size="11" fill="currentColor">skipped in the compute&lt;/text>
&lt;text x="40" y="245" font-size="11.5" font-weight="600" fill="currentColor">Capacity = N (all experts) · Cost/token ≈ A (activated) · and inside A, sparse FFN saves more&lt;/text>
&lt;text x="40" y="270" font-size="11" fill="currentColor">The trick: raise N without raising A. Fine granularity allows a far more aggressive N/A ratio.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h2 id="the-pre-attention-router-predict-and-prefetch">The pre-attention router: predict and prefetch&lt;/h2>
&lt;p>Here is the paper&amp;rsquo;s specific piece, and the one that gives the post its name. The problem it solves is one of &lt;em>I/O scheduling&lt;/em>, not of quality.&lt;/p>
&lt;p>When the model does not fit entirely in RAM, the expert weights live in SSD/flash and are loaded on demand. The naive flow of a MoE layer is sequential: you run attention, then the router decides which experts are needed, then you &lt;strong>load those experts from SSD&lt;/strong> (waiting), then you run the FFN of those experts. The loading step is pure waiting: the CPU is blocked waiting for bytes from the SSD. In the device regime, where the SSD is slow, that waiting time dominates the decode step.&lt;/p>
&lt;p>The &lt;strong>pre-attention router&lt;/strong> breaks the sequentiality by inverting the order of the decision. The observation is that the router does not need &lt;em>this&lt;/em> same layer&amp;rsquo;s attention output to make a reasonable prediction of which experts will be needed: it can predict it from the state it already has &lt;em>before&lt;/em> running attention. So:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Before&lt;/strong> running the layer&amp;rsquo;s attention block, the router predicts the experts that will be needed.&lt;/li>
&lt;li>It launches the &lt;strong>prefetch&lt;/strong> of those experts from SSD/flash asynchronously.&lt;/li>
&lt;li>&lt;strong>In parallel&lt;/strong>, the CPU runs the attention block, which is pure compute and does not need the SSD.&lt;/li>
&lt;li>When attention finishes, the prefetched experts are (ideally) already in RAM, and the FFN proceeds without waiting.&lt;/li>
&lt;/ol>
&lt;p>Storage I/O has been &lt;strong>overlapped&lt;/strong> with attention compute. It is exactly the librarian who goes to the back room while you read the contents.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 780 270" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Pre-attention router flow with overlapped prefetch">
&lt;defs>&lt;marker id="ar2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;text x="20" y="22" font-size="12.5" font-weight="600" fill="currentColor">Naive (sequential): the load from SSD blocks&lt;/text>
&lt;rect x="20" y="32" width="110" height="34" fill="#d4ecff" stroke="#1f5fa8" stroke-width="1.4"/>
&lt;text x="75" y="53" text-anchor="middle" font-size="11" fill="#13335c">attention&lt;/text>
&lt;rect x="138" y="32" width="80" height="34" fill="#e6d0ff" stroke="#5a2db0" stroke-width="1.4"/>
&lt;text x="178" y="53" text-anchor="middle" font-size="11" fill="#3a1d70">router&lt;/text>
&lt;rect x="226" y="32" width="180" height="34" fill="#f6caca" stroke="#a52a2a" stroke-width="1.4"/>
&lt;text x="316" y="49" text-anchor="middle" font-size="11" fill="#6e1d1d">load experts from SSD&lt;/text>
&lt;text x="316" y="61" text-anchor="middle" font-size="10" fill="#6e1d1d">(blocking wait)&lt;/text>
&lt;rect x="414" y="32" width="110" height="34" fill="#cdebd0" stroke="#2a7a40" stroke-width="1.4"/>
&lt;text x="469" y="53" text-anchor="middle" font-size="11" fill="#1a4d29">expert FFN&lt;/text>
&lt;path d="M130,49 L138,49" stroke="#666" stroke-width="1.4" fill="none" marker-end="url(#ar2)"/>
&lt;path d="M218,49 L226,49" stroke="#666" stroke-width="1.4" fill="none" marker-end="url(#ar2)"/>
&lt;path d="M406,49 L414,49" stroke="#666" stroke-width="1.4" fill="none" marker-end="url(#ar2)"/>
&lt;text x="540" y="53" font-size="11" fill="currentColor">t_total = t_att + t_load + t_ffn&lt;/text>
&lt;line x1="20" y1="92" x2="760" y2="92" stroke="currentColor" stroke-width="0.8" stroke-dasharray="3 3"/>
&lt;text x="20" y="118" font-size="12.5" font-weight="600" fill="currentColor">Pre-attention router: the prefetch overlaps with attention&lt;/text>
&lt;text x="20" y="140" font-size="11" font-weight="600" fill="currentColor">compute thread (CPU)&lt;/text>
&lt;rect x="170" y="130" width="80" height="30" fill="#e6d0ff" stroke="#5a2db0" stroke-width="1.4"/>
&lt;text x="210" y="149" text-anchor="middle" font-size="10.5" fill="#3a1d70">router (pre)&lt;/text>
&lt;rect x="258" y="130" width="150" height="30" fill="#d4ecff" stroke="#1f5fa8" stroke-width="1.4"/>
&lt;text x="333" y="149" text-anchor="middle" font-size="11" fill="#13335c">attention (t_att)&lt;/text>
&lt;rect x="416" y="130" width="120" height="30" fill="#cdebd0" stroke="#2a7a40" stroke-width="1.4"/>
&lt;text x="476" y="149" text-anchor="middle" font-size="11" fill="#1a4d29">expert FFN&lt;/text>
&lt;text x="20" y="190" font-size="11" font-weight="600" fill="currentColor">I/O thread (SSD)&lt;/text>
&lt;rect x="258" y="180" width="130" height="30" fill="#ffe0a8" stroke="#a48000" stroke-width="1.4"/>
&lt;text x="323" y="199" text-anchor="middle" font-size="10.5" fill="#6b5400">prefetch experts (t_prefetch)&lt;/text>
&lt;path d="M250,145 C254,145 254,150 258,150" stroke="#5a2db0" stroke-width="1.2" fill="none"/>
&lt;path d="M250,150 L256,150 L256,195 L258,195" stroke="#a48000" stroke-width="1.2" fill="none" marker-end="url(#ar2)" stroke-dasharray="3 2"/>
&lt;line x1="258" y1="122" x2="258" y2="218" stroke="currentColor" stroke-width="0.7" stroke-dasharray="2 2"/>
&lt;line x1="408" y1="122" x2="408" y2="218" stroke="currentColor" stroke-width="0.7" stroke-dasharray="2 2"/>
&lt;text x="20" y="245" font-size="11.5" fill="currentColor">The prefetch is hidden if &lt;tspan font-weight="700">t_att ≥ t_prefetch&lt;/tspan>: by the time attention ends, the experts are in RAM.&lt;/text>
&lt;text x="20" y="262" font-size="11" fill="currentColor">If t_prefetch &amp;gt; t_att, a wait bubble (t_prefetch − t_att) appears before the FFN. That is the case to avoid.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The &lt;strong>hiding condition&lt;/strong> is the inequality above: the prefetch is completely hidden if and only if&lt;/p>
$$t_{\text{attention}} \;\ge\; t_{\text{prefetch}}.$$
&lt;p>If attention takes longer than loading the experts, the load is free (it was already done). If the experts are too large or the SSD too slow, &lt;code>t_prefetch &amp;gt; t_att&lt;/code> and a wait bubble equal to &lt;code>t_prefetch − t_att&lt;/code> appears. That is why the design &lt;em>needs&lt;/em> &lt;code>A&lt;/code> to be small (small experts → fewer bytes to prefetch → low &lt;code>t_prefetch&lt;/code>) and the grain to be fine: the two things level 1 of sparsity does are not only about saving FLOPs, they are about making the prefetch fit underneath attention.&lt;/p>
&lt;h2 id="the-maths-that-matter">The maths that matter&lt;/h2>
&lt;h3 id="memory-footprint-resident-n-vs-a--cache">Memory footprint: resident N vs. A + cache&lt;/h3>
&lt;p>The parameter that decides whether the model fits is how much you have to keep &lt;strong>resident in RAM&lt;/strong> at once.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Everything in RAM.&lt;/strong> If you require all the experts to be loaded, the footprint is &lt;code>\approx N&lt;/code> (all parameters, multiplied by bytes/parameter according to the quantisation). For a 21B this is prohibitive on a device.&lt;/li>
&lt;li>&lt;strong>Streaming from SSD.&lt;/strong> If you only keep the active experts resident plus a cache of the recent/likely ones, the footprint drops to &lt;code>\approx A + \text{cache}&lt;/code>. The weights that are not in RAM live on SSD and get prefetched when needed. This is where the real saving is: the resident set scales with &lt;code>A&lt;/code>, not with &lt;code>N&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>The non-expert part of the model (embeddings, attention, router, layernorms) is always resident, but in a fine-grained MoE the bulk of &lt;code>N&lt;/code> is in the experts, so the approximation &lt;code>resident ≈ A + cache + dense_part&lt;/code> is a good one.&lt;/p>
&lt;h3 id="the-prefetch-calculation-with-numbers">The prefetch calculation, with numbers&lt;/h3>
&lt;p>Let us put numbers on the analogy. Suppose a consumer SSD at &lt;strong>5 GB/s&lt;/strong> of sequential read and a quantised expert of size &lt;code>X&lt;/code> MB. The time to load one expert is&lt;/p>
$$t_{\text{1 expert}} = \frac{X \text{ MB}}{5000 \text{ MB/s}} = \frac{X}{5000}\ \text{s} = \frac{X}{5}\ \text{ms}.$$
&lt;p>Let us make &lt;code>X&lt;/code> concrete. In SmallThinker-4B-A0.6B with Q4_0 (~0.5 byte/param effective counting block overhead), a small expert of, say, 4M parameters weighs &lt;code>\approx 4\text{M} \times 0.5 = 2&lt;/code> MB. Loading it costs &lt;code>t_{\text{1 expert}} = 2/5 = 0.4&lt;/code> ms.&lt;/p>
&lt;p>Now the scheduling question: if the layer&amp;rsquo;s attention block takes &lt;code>Y&lt;/code> ms, &lt;strong>how many experts can I prefetch while attention runs?&lt;/strong> The number is&lt;/p>
$$n_{\text{prefetch}} = \left\lfloor \frac{Y}{t_{\text{1 expert}}} \right\rfloor = \left\lfloor \frac{Y \cdot 5}{X} \right\rfloor.$$
&lt;p>With &lt;code>Y = 2&lt;/code> ms of attention and &lt;code>X = 2&lt;/code> MB per expert: &lt;code>n_{\text{prefetch}} = \lfloor 2 \times 5 / 2 \rfloor = 5&lt;/code> experts. That is, within that layer&amp;rsquo;s attention window the SSD manages to bring in 5 experts. If the layer&amp;rsquo;s top-k activates ≤ 5 experts, the prefetch hides them all and &lt;code>t_prefetch ≤ t_att&lt;/code>: zero load latency. If the layer needed 8 experts, you would bring 5 for free and pay the load of the remaining 3 as a bubble: &lt;code>(8-5) \times 0.4 = 1.2&lt;/code> ms of waiting per layer. Hence why the design wants fine grain with a small top-k: to fit underneath the attention window.&lt;/p>
&lt;p>Two critical observations about this calculation:&lt;/p>
&lt;ul>
&lt;li>The 5 GB/s is &lt;strong>idealised sequential read&lt;/strong>. The experts are scattered across the disk; random 4K reads on a consumer SSD are far slower. The effective bandwidth can be a fraction of the nominal one, which reduces &lt;code>n_{\text{prefetch}}&lt;/code>. Any methodology reporting tok/s ought to say whether it measures with experts pre-sorted on disk or with realistic access.&lt;/li>
&lt;li>The attention window &lt;code>Y&lt;/code> &lt;strong>shrinks with short context&lt;/strong> and at the start of generation. With short prompts, attention is cheap and may &lt;em>not&lt;/em> cover the prefetch; the advantage of the overlap grows with longer sequences. Another detail an honest benchmark should break down.&lt;/li>
&lt;/ul>
&lt;h3 id="weight-footprint-why-they-report-1-gb-for-a-4b">Weight footprint: why they report ~1 GB for a 4B&lt;/h3>
&lt;p>Let us do the 4B calculation in Q4_0. Quantisation to 4 bits ≈ 0.5 byte/param, plus a small overhead of per-block scales (Q4_0 adds one FP16 scale every 32 weights, ~0.56 effective byte/param). So:&lt;/p>
$$4\text{B} \times 0.5\ \text{B/param} \approx 2\ \text{GB}.$$
&lt;p>That is, &lt;strong>the full model in Q4_0 takes up ~2 GB on disk&lt;/strong>. But the authors report &lt;strong>~1 GB of RAM&lt;/strong>. A contradiction? No, and understanding why is understanding the design:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Not all experts are resident.&lt;/strong> Only the activated ones (&lt;code>A = 0.6B&lt;/code>) plus a cache fit in RAM; the rest lives on SSD and is streamed. &lt;code>0.6\text{B} \times 0.5 \approx 0.3&lt;/code> GB of active experts, plus the dense part (attention, embeddings, router) and a cache of hot experts.&lt;/li>
&lt;li>&lt;strong>Sparse FFN reduces the work and the useful resident set.&lt;/strong> The neurons that come out at zero do not need to be materialised for that token.&lt;/li>
&lt;/ul>
&lt;p>Adding up active experts + dense part + a reasonable cache, ~1 GB is plausible. But mind the nuance: ~1 GB is the &lt;strong>resident set in RAM&lt;/strong>, not the total footprint in storage, which is still ~2 GB on SSD. Conflating the two, reporting a bare &amp;ldquo;1 GB&amp;rdquo;, is misleading if the reader understands &amp;ldquo;the model takes up 1 GB&amp;rdquo;. It takes up 2 GB; it &lt;em>keeps&lt;/em> 1 GB in RAM. The distinction matters for a device with 2 GB of free storage: there it does not fit.&lt;/p>
&lt;p>Analogously, SmallThinker-21B-A3B: &lt;code>21\text{B} \times 0.5 \approx 10.5&lt;/code> GB on disk; &lt;code>3\text{B} \times 0.5 \approx 1.5&lt;/code> GB of active experts, and the ~8 GB of RAM reported includes active experts + a generous cache + the dense part. The large cache is what takes it from 1.5 to ~8 GB: you keep many hot experts resident so as not to hit the SSD constantly.&lt;/p>
&lt;h2 id="the-quality-cost-the-necessary-scepticism">The quality cost: the necessary scepticism&lt;/h2>
&lt;p>All the machinery above reduces the compute per token to &lt;code>\approx A&lt;/code>. But &lt;code>A = 0.6B&lt;/code> activated is &lt;strong>very&lt;/strong> little. This is where the enthusiasm needs a brake:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Bounded reasoning capacity.&lt;/strong> A model that activates 0.6B parameters per token has, per token, the compute power of a 0.6B model, not of a 4B one. The total capacity &lt;code>N=4B&lt;/code> helps to &lt;em>store&lt;/em> more knowledge (more specialised experts), but the &lt;em>processing&lt;/em> of each token is still limited by &lt;code>A&lt;/code>. For tasks requiring composition and intensive multi-step reasoning, this is a real ceiling, not a detail.&lt;/li>
&lt;li>&lt;strong>The router is a single point of failure for quality.&lt;/strong> If the fine-grained router picks the wrong experts, and with fine grain there are more decisions to take, quality drops without any speed metric reflecting it. The pre-attention router makes this worse: it predicts the experts &lt;em>before&lt;/em> seeing attention, with less information than a post-attention router. The authors ought to report how much quality is lost by predicting early (mismatch between the prefetched expert and the expert a post-attention router would have chosen).&lt;/li>
&lt;li>&lt;strong>The ~20 tok/s needs small print.&lt;/strong> On which CPU exactly? With what context and generation length (the advantage of the overlap depends on &lt;code>Y&lt;/code>)? Cold start included or steady state? Did the SSD have the experts pre-sorted sequentially? An &amp;ldquo;exceeds 20 tok/s&amp;rdquo; without those conditions is a marketing number, not a methodological one.&lt;/li>
&lt;li>&lt;strong>A fair comparison.&lt;/strong> The right question is not &amp;ldquo;is it fast?&amp;rdquo;, but &amp;ldquo;at equal quality on an independent benchmark, is it faster or smaller than an equivalent compressed dense model?&amp;rdquo;. That requires evals the reader can reproduce, not just tok/s on the authors&amp;rsquo; machine.&lt;/li>
&lt;/ul>
&lt;p>None of this invalidates the direction. Designing for device is, conceptually, the right approach: it attacks the real bottlenecks (compute, RAM, I/O) in the architecture instead of patching them afterwards. But &amp;ldquo;20 tok/s in ~1 GB&amp;rdquo; is a claim about &lt;em>efficiency&lt;/em>, and efficiency only means something anchored to a level of &lt;em>quality&lt;/em> measured honestly. Until that anchor is clear, the right amount of scepticism is high.&lt;/p>
&lt;h2 id="implications-for-on-premise-and-edge-inference">Implications for on-premise and edge inference&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>The SSD becomes part of the inference hierarchy.&lt;/strong> In cloud, the hierarchy is HBM → RAM. On device, the SSD/flash enters as one more level, and its bandwidth and random-access latency become first-order performance parameters. This connects with &lt;a href="https://blog.lo0.es/en/posts/pantry-lift-from-disk-to-hbm-why-the-kitchen-opens-late/">From disk to HBM&lt;/a>: cold start and weight streaming stop being just a startup problem and become part of the &lt;em>steady state&lt;/em>.&lt;/li>
&lt;li>&lt;strong>The heterogeneous edge box starts to make sense.&lt;/strong> In a &lt;a href="https://blog.lo0.es/en/posts/mixed-nvidia-intel-environments-llm-inference/">mixed environments&lt;/a> pattern, a device-native model like SmallThinker runs on the NUC/edge with CPU and SSD, serving locally, while the heavy work stays on the central cluster. The pre-attention router is what makes a GPU-less edge box viable.&lt;/li>
&lt;li>&lt;strong>Capacity planning changes axes.&lt;/strong> As discussed in &lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">Inference capacity planning&lt;/a>, on device the resource to plan is not VRAM but the triad resident-RAM / SSD-bandwidth / CPU-FLOPs. A model with small &lt;code>A&lt;/code> and overlapped prefetch moves the bottleneck from &amp;ldquo;does it fit in RAM?&amp;rdquo; to &amp;ldquo;does the SSD feed the prefetch in time?&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>SmallThinker is, above all, a change of question. Not &amp;ldquo;how do I shrink this cloud model so it fits on the device?&amp;rdquo; but &amp;ldquo;what would the model look like if I designed it for the device from the first parameter?&amp;rdquo;. The answer, fine-grained MoE to decouple &lt;code>N&lt;/code> from &lt;code>A&lt;/code>, sparse FFN to save inside &lt;code>A&lt;/code>, and a pre-attention router that hides storage I/O underneath attention, attacks the device&amp;rsquo;s three constraints (compute, RAM, I/O) in the architecture, not in a later compression phase. The key condition, &lt;code>t_att ≥ t_prefetch&lt;/code>, explains why the pieces fit: fine grain does not only save FLOPs, it makes the prefetch fit underneath attention. The reported numbers (~20 tok/s, ~1 GB / ~8 GB of RAM) are promising and the direction is solid; the cost of activating so little and the lack of methodological detail on quality call for caution. Designing for device is the right bet; measuring it honestly is the unfinished business.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/moe-inference-fundamentals-expert-parallel-deepseek-economics/">MoE inference: the call centre with 256 specialists&lt;/a> — the conceptual basis of this post: how a router routes tokens to experts and why &lt;code>N&lt;/code> and &lt;code>A&lt;/code> decouple; read it first if MoE sounds distant.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/pantry-lift-from-disk-to-hbm-why-the-kitchen-opens-late/">From disk to HBM: cold start and model loading&lt;/a> — weight streaming from slow storage, which here stops being a startup problem and becomes steady state via prefetch.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/knowledge-distillation-teaching-small-model-think-like-big-one/">Knowledge distillation&lt;/a> — the canonical lever of the &amp;ldquo;compress a cloud dense model&amp;rdquo; approach, the exact counterpoint to the device-native one.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-pruning-cutting-without-amputating/">Pruning LLM models&lt;/a> — the other reduction lever; useful for comparing &amp;ldquo;take away from a big one&amp;rdquo; against &amp;ldquo;design small from scratch&amp;rdquo;.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mixed-nvidia-intel-environments-llm-inference/">Mixed NVIDIA + Intel environments&lt;/a> — where a device-native model fits: the edge box with CPU and SSD that serves locally without a GPU.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">On-premise LLM inference capacity planning&lt;/a> — on device the axes to plan are resident RAM, SSD bandwidth and CPU FLOPs, not VRAM.&lt;/li>
&lt;li>&lt;strong>Inverted roofline in small models&lt;/strong> (sibling of this series, coming soon) — the SLM&amp;rsquo;s performance regime, which explains why a small &lt;code>A&lt;/code> keeps decode memory-bound and where the real ceiling is.&lt;/li>
&lt;li>&lt;strong>Self-speculative decoding with early-exit&lt;/strong> (sibling of this series, coming soon) — self-spec applied to on-device MoE: how to accelerate decode without an external draft when the model is already small.&lt;/li>
&lt;li>&lt;strong>Aggressive sub-4-bit and ternary quantisation&lt;/strong> (sibling of this series, coming soon) — Q4_0 and beyond on device: ternary and 2-bit to push the expert footprint on SSD down further.&lt;/li>
&lt;/ul>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Equipo SmallThinker (SJTU IPADS + Zenergize AI). &lt;em>SmallThinker: A Family of Efficient Large Language Models Natively Trained for Local Deployment&lt;/em>. arXiv:2507.20984. &lt;a href="https://arxiv.org/abs/2507.20984">https://arxiv.org/abs/2507.20984&lt;/a>&lt;/li>
&lt;li>Repositorio oficial SmallThinker: &lt;a href="https://github.com/SJTU-IPADS/SmallThinker">https://github.com/SJTU-IPADS/SmallThinker&lt;/a>&lt;/li>
&lt;li>&lt;em>Self-Speculative Decoding for On-device MoE Acceleration&lt;/em>. ACM The Web Conference (WWW) 2026. doi:10.1145/3774904.3792218. &lt;a href="https://doi.org/10.1145/3774904.3792218">https://doi.org/10.1145/3774904.3792218&lt;/a>&lt;/li>
&lt;li>Liu, Z. et al. &lt;em>Deja Vu: Contextual Sparsity for Efficient LLMs at Inference Time&lt;/em>. ICML 2023. &lt;a href="https://arxiv.org/abs/2310.17157">https://arxiv.org/abs/2310.17157&lt;/a>&lt;/li>
&lt;li>Song, Y. et al. &lt;em>PowerInfer: Fast Large Language Model Serving with a Consumer-grade GPU&lt;/em> (sparse activation + hot/cold experts). SJTU IPADS, 2023. &lt;a href="https://arxiv.org/abs/2312.12456">https://arxiv.org/abs/2312.12456&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Mixed NVIDIA + Intel environments for LLM inference: from the central H100 cluster to the NUC in the branch office</title><link>https://blog.lo0.es/en/posts/mixed-nvidia-intel-environments-llm-inference/</link><pubDate>Tue, 02 Jun 2026 04:30:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/mixed-nvidia-intel-environments-llm-inference/</guid><description>&lt;blockquote>
&lt;p>This post complements those on &lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">Capacity planning for on-premise LLM inference&lt;/a> (which assumed a pure NVIDIA cluster), &lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven layers of the stack&lt;/a> (which also did not get into hardware heterogeneity) and &lt;a href="https://blog.lo0.es/en/posts/llm-inference-router-l7-switchboard/">The LLM inference router&lt;/a> (where capability routing makes full sense once there is mixed hardware). It is the missing piece for talking about &amp;ldquo;hardware sovereignty&amp;rdquo; without reducing it to &amp;ldquo;which vendor do I pick&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>A production LLM inference cluster in 2026 can stop being monolithically NVIDIA if it accepts heterogeneity as an architectural decision. The motivation is not theory but &lt;strong>three measurable operational advantages&lt;/strong>. (1) &lt;strong>Cost&lt;/strong>: an Intel Xeon 6 with AMX (Advanced Matrix Extensions) delivers 7B INT4 at ~80 tok/s while serving embeddings and reranking at a fraction of the cost of dedicating an H100 to that task; the &lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">capacity planning&lt;/a> adds up better with an Intel CPU handling the cheap work and an NVIDIA H100 the big LLM. (2) &lt;strong>Sovereignty and supply chain diversification&lt;/strong>: NVIDIA holds roughly 94 % of the AI accelerator market (November 2025), single-vendor dependency with all its risks; Intel manufactures in Europe (Leixlip operational, Magdeburg planned) against a design-only NVIDIA with TSMC as foundry, which for a Spanish or European organisation subject to ENS / NIS2 / EU AI Act is a real hedging argument. (3) &lt;strong>Edge&lt;/strong>: an Intel NUC with a Lunar Lake CPU (48 TOPS NPU) or Panther Lake (50 TOPS NPU + 120 TOPS Xe3 = 180 TOPS platform) runs 7B INT4 models at usable speed, which opens up the &amp;ldquo;branch office with local inference + central DC for complex cases&amp;rdquo; pattern. Relevant Intel hardware in June 2026: &lt;strong>Intel Gaudi 3&lt;/strong> (128 GB HBM2e, 1,835 TFLOPS BF16/FP8, 3.67 TB/s; a direct competitor to the H100, Intel claims +20 % on Llama 2 70B but Signal65 published H200 9× over Gaudi 3 on Llama 3.1 405B, you have to cite both; Falcon Shores cancelled in January 2025, Jaguar Shores 2026 as the restart bet, &lt;strong>Gaudi 4 confirmed as never happening&lt;/strong>); &lt;strong>Intel Xeon 6 with AMX&lt;/strong> (up to 288 E-cores on Sierra Forest or 86 P-cores on Granite Rapids, 1,024 FLOPS BF16/cycle/core with AMX, Intel claims 2.7× tok/s vs EPYC 9965 on the vLLM CPU backend); &lt;strong>Intel Arc Pro B60&lt;/strong> (Battlemage, 24 GB GDDR6, 456 GB/s, 197 TOPS INT8, launched September 2025, with a dual-GPU 48 GB variant and a &amp;ldquo;Battlematrix&amp;rdquo; rack with 8× = 192 GB VRAM); &lt;strong>Intel NUC with NPU&lt;/strong> (Lunar Lake 48 TOPS, Arrow Lake similar, Panther Lake 50 TOPS at CES 2026; realistic for 7-13B INT4, not for the 30-70B Intel claims in its marketing). Software: &lt;strong>OpenVINO 2025.3&lt;/strong> with the GenAI API and vLLM-OpenVINO; &lt;strong>IPEX-LLM&lt;/strong> with integrations into llama.cpp, vLLM, HF, LangChain; &lt;strong>vLLM CPU backend&lt;/strong> with AMX; &lt;strong>llama.cpp SYCL&lt;/strong> (better than Vulkan on Arc). Four canonical patterns: embeddings + reranker on Intel alongside the LLM on NVIDIA; guardrails + PII redaction on a near-edge NUC; speculative drafter on a NUC near the user and target on the H100; NUC dev workstations. Unified observability via DCGM + habana-metric-exporter + intel-gpu-exporter + Intel PCM federated in Prometheus. Pitfalls: tokenizer mismatch between engines, edge↔central round-trip latency, FP8 Hopper ≠ INT8 AMX in quality, version synchronisation. Applied to a generic cluster: central DC 4×H100 SXM + Xeon 6 AMX sidecar + 6-12 Intel NUCs in branch offices. &lt;strong>Critical disclaimer&lt;/strong>: as of June 2026 there are no publicly verifiable cases of a mixed NVIDIA + Intel deployment in European banking or government; the pattern is emergent architecture and worth recommending, not established practice with an industrial track record.&lt;/p>
&lt;h2 id="you-are-here-deploy-with-heterogeneity-as-a-decision">You are here: DEPLOY (with heterogeneity as a decision)&lt;/h2>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 90" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="you are here: Deploy with heterogeneous hardware">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#7ad88f;stroke-width:3}.idle{fill:#f4f4f4}.lbl{font:600 12px sans-serif;fill:#222}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#mxm)}.cyc{stroke:#888;stroke-width:1.2;fill:none;stroke-dasharray:4 2;marker-end:url(#mxm)}&lt;/style>
&lt;defs>&lt;marker id="mxm" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;text x="390" y="20" text-anchor="middle" class="lbl">You are here: DEPLOY · heterogeneous NVIDIA + Intel hardware as an architectural decision&lt;/text>
&lt;rect x="30" y="35" width="110" height="35" class="box idle"/>&lt;text x="85" y="58" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="155" y="35" width="110" height="35" class="box idle"/>&lt;text x="210" y="58" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="280" y="35" width="110" height="35" class="box idle"/>&lt;text x="335" y="58" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="405" y="35" width="110" height="35" class="box active"/>&lt;text x="460" y="58" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="530" y="35" width="110" height="35" class="box idle"/>&lt;text x="585" y="58" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="655" y="35" width="110" height="35" class="box idle"/>&lt;text x="710" y="58" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;path class="arr" d="M140,52 L155,52"/>&lt;path class="arr" d="M265,52 L280,52"/>&lt;path class="arr" d="M390,52 L405,52"/>&lt;path class="arr" d="M515,52 L530,52"/>&lt;path class="arr" d="M640,52 L655,52"/>
&lt;path class="cyc" d="M710,72 L710,82 L85,82 L85,72"/>
&lt;/svg>
&lt;/div>
&lt;h2 id="the-analogy-the-factory-with-several-different-machines">The analogy: the factory with several different machines&lt;/h2>
&lt;p>A serious factory has several machines with different purposes, not one universal machine. A 200-tonne hydraulic press for heavy stamping; a bench lathe for turned parts; a 3D printer for quick prototypes; a pick-and-place robot for SMD. Each machine does what it does better than the others in its niche, and the plant manager sizes the mix according to the real product portfolio, not according to fashion. Buying three hydraulic presses because &amp;ldquo;they are the most impressive&amp;rdquo; when 60 % of the work is turned parts wastes capital: the lathe is cheaper, faster in its niche and frees the press for what genuinely needs it.&lt;/p>
&lt;p>An LLM inference cluster with an NVIDIA H100 dedicated to computing embeddings for a RAG corpus is using a hydraulic press to drill bolts. The H100 is magnificent for a 70B LLM in BF16 with concurrency of 40+; for embeddings of an 800-token document with bge-m3, what you need is an Intel Xeon 6 with AMX at a fraction of the cost and power draw. A cluster that wants to serve light guardrails (Llama Guard 4 8B) on every request, with a 50 ms budget, does not need that guardrail on an H100 either: an Intel NUC with a 48 TOPS NPU covers the case with room to spare.&lt;/p>
&lt;p>The heterogeneous factory is not theoretical elegance: it is &lt;strong>maximising the useful utilisation of fixed capital&lt;/strong>. Nor is the heterogeneous LLM inference cluster.&lt;/p>
&lt;h2 id="three-operational-reasons-for-heterogeneity">Three operational reasons for heterogeneity&lt;/h2>
&lt;h3 id="reason-1--cost">Reason 1 — cost&lt;/h3>
&lt;p>An H100 SXM 80 GB running 24/7 draws ~700 W (real measurement at the wall ~697 W with vLLM Llama 3.1 405B batch=4) and represents between 25,000 € and 35,000 € of amortised hardware. An Intel Xeon 6 with AMX (Granite Rapids 86 cores or Sierra Forest 288 E-cores) draws 350-500 W for the socket and costs a fraction. The operational split: the H100 is reserved for the big LLM (Llama 70B BF16 or FP8, where its HBM3 and FP8 tensor cores are worth their weight); the Xeon AMX absorbs embeddings (bge-m3, e5-large), reranking (bge-reranker-v2-m3), small models (Llama 3.2 1B / 3B INT4) and offline batch processing. It is the same logic as the &lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">capacity planning&lt;/a> taken one step further: instead of budgeting KV cache VRAM only on the H100, budget each workload on the silicon where its arithmetic intensity fits best.&lt;/p>
&lt;h3 id="reason-2--sovereignty-and-supply-chain-diversification">Reason 2 — sovereignty and supply chain diversification&lt;/h3>
&lt;p>As of November 2025, NVIDIA holds approximately &lt;strong>94 % of the AI accelerator market&lt;/strong>. That concentration is risk. For an organisation subject to ENS / NIS2 / EU AI Act, depending on a single supplier whose foundry is concentrated in Taiwan (TSMC) introduces supply chain vulnerabilities that recent regulations (NIS2, supply chain provisions) are starting to require you to document and mitigate. Intel diversifies: it has its own fabs in Europe (Leixlip operational in Ireland; Magdeburg planned in Germany, with EU Chips Act funding), which for a Spanish or European public sector client is a real contractual argument, not marketing.&lt;/p>
&lt;p>Mandatory disclaimer: &lt;strong>the Intel roadmap after Falcon Shores is unstable&lt;/strong>. Intel cancelled Falcon Shores in January 2025 and relegated Gaudi 4 to &amp;ldquo;will never exist&amp;rdquo;; the restart bet is Jaguar Shores in 2026 as a rack-scale platform, still with no confirmed public specs. Diversification is strategically correct, &lt;strong>but assuming continuity of the Intel roadmap at NVIDIA&amp;rsquo;s level in 2026 would be naive&lt;/strong>. The operational strategy: Intel for workloads where lock-in is lower (CPU for embeddings, NUC for light edge, replaceable by AMD/Apple/SiFive if Intel pivots again), NVIDIA for the big LLM where the maturity of the software stack still has no rival.&lt;/p>
&lt;h3 id="reason-3--edge">Reason 3 — edge&lt;/h3>
&lt;p>The &amp;ldquo;everything travels to the central DC&amp;rdquo; pattern breaks in three cases: latency (branch office 100+ ms away from the DC, unacceptable for chat), data sovereignty (prompts with personal or classified data that must not leave the local perimeter), and offline operation (branch office with intermittent connectivity). The Intel NUC with a modern CPU (Lunar Lake / Arrow Lake / Panther Lake) brings 48-50 TOPS NPU + 100-180 TOPS Xe2/Xe3 iGPU in a box of 0.5-1.5 L volume drawing 30-65 W. 7B INT4 models run at usable speed; with more aggressive quantisation (Q3_K) a Llama 13B fits. For branch offices with RAG over a local corpus + a 7B LLM + guardrails, the NUC is perfect.&lt;/p>
&lt;h2 id="relevant-intel-hardware-june-2026">Relevant Intel hardware (June 2026)&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Part&lt;/th>
&lt;th>Memory&lt;/th>
&lt;th>Key performance&lt;/th>
&lt;th>Launch&lt;/th>
&lt;th>Status&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Intel Gaudi 3&lt;/td>
&lt;td>128 GB HBM2e, 3.67 TB/s&lt;/td>
&lt;td>1,835 TFLOPS BF16/FP8; 1,200 GB/s networking&lt;/td>
&lt;td>Apr 2024&lt;/td>
&lt;td>Active; successor Jaguar Shores 2026 (not Gaudi 4)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon 6 (Granite Rapids)&lt;/td>
&lt;td>DDR5 + MRDIMM&lt;/td>
&lt;td>86 P-cores, AMX 1,024 FLOPS BF16/cycle/core&lt;/td>
&lt;td>2024-2025&lt;/td>
&lt;td>Active&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon 6 (Sierra Forest)&lt;/td>
&lt;td>DDR5&lt;/td>
&lt;td>288 E-cores&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Active&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Arc Pro B60 (Battlemage)&lt;/td>
&lt;td>24 GB GDDR6, 456 GB/s&lt;/td>
&lt;td>197 TOPS INT8; 12.28 TFLOPS FP32&lt;/td>
&lt;td>Sep 2025&lt;/td>
&lt;td>Active; dual 48 GB variant, rack 8× = 192 GB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Data Center GPU Max&lt;/td>
&lt;td>128 GB HBM&lt;/td>
&lt;td>successor to Ponte Vecchio&lt;/td>
&lt;td>discontinued&lt;/td>
&lt;td>&lt;strong>Discontinued&lt;/strong> Jan 2026&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Lunar Lake)&lt;/td>
&lt;td>DDR5x&lt;/td>
&lt;td>NPU 48 TOPS + Xe2 67 TOPS = 120 TOPS platform&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Active&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Arrow Lake)&lt;/td>
&lt;td>DDR5&lt;/td>
&lt;td>NPU 13 TOPS + Xe iGPU&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Active (less NPU than Lunar)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Panther Lake)&lt;/td>
&lt;td>DDR5x&lt;/td>
&lt;td>NPU 50 TOPS + Xe3 120 TOPS = 180 TOPS platform&lt;/td>
&lt;td>CES Jan 2026&lt;/td>
&lt;td>Rolling out&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="intel-gaudi-3--the-critical-note-on-the-marketing">Intel Gaudi 3 — the critical note on the marketing&lt;/h3>
&lt;p>Intel publishes that Gaudi 3 delivers &lt;strong>+20 % throughput vs H100 on Llama 2 70B inference&lt;/strong> and 2× price/performance. The figure appears in the official whitepaper and in launch presentations. However, &lt;strong>Signal65 (an independent firm)&lt;/strong> published in 2025 that &lt;strong>the H200 beats Gaudi 3 by a factor of 9× on Llama 3.1 405B&lt;/strong>. The discrepancy matters: both numbers can be true for their specific benchmarks (Llama 2 70B FP16 vs Llama 3.1 405B FP8) but the operational conclusion changes radically depending on which one you keep.&lt;/p>
&lt;p>This post&amp;rsquo;s recommendation: treat Gaudi 3 as a valid option for Llama-class 70B in BF16/FP8 where Intel claims parity or advantage, not for frontier 200B+ models where NVIDIA keeps a clear margin. And consider the roadmap risk: Gaudi 4 will never exist; the line&amp;rsquo;s successor is Jaguar Shores 2026 with a completely new rack-scale architecture, a discontinuity rather than an evolution.&lt;/p>
&lt;h3 id="intel-xeon-6-with-amx--the-cpu-workhorse">Intel Xeon 6 with AMX — the CPU workhorse&lt;/h3>
&lt;p>The &lt;strong>Advanced Matrix Extensions (AMX)&lt;/strong> are the non-obvious piece. Each Granite Rapids P-core executes up to 1,024 BF16 FLOPS per cycle via AMX, which turns a Xeon 6 with 64-86 cores into a respectable matrix accelerator for small and mid-sized models. Real reported figures: &lt;strong>Llama 3.2 INT4 at ~57 tok/s with AMX vs 28 tok/s without AMX&lt;/strong> (a clean 2× factor). For serving 7B INT4 with the vLLM CPU backend + AMX, Intel claims &lt;strong>2.7× tok/s vs EPYC 9965&lt;/strong>, a figure with Intel bias but qualitatively corroborated by LMSYS in their DeepSeek R1 671B deployment on Xeon 6 + SGLang.&lt;/p>
&lt;p>Operational use case: embeddings and reranking on a Xeon 6 sidecar next to the H100 cluster. Models such as &lt;code>bge-m3&lt;/code> (multilingual embedding) or &lt;code>bge-reranker-v2-m3&lt;/code> run at acceptable throughput on CPU AMX; they do not deserve a dedicated H100. Freeing the H100 for the 70B LLM raises the cluster&amp;rsquo;s effective RPS without buying more GPUs.&lt;/p>
&lt;h3 id="intel-arc-pro-b60-and-battlematrix">Intel Arc Pro B60 and Battlematrix&lt;/h3>
&lt;p>Launched in September 2025, the Arc Pro B60 (Battlemage) brings 24 GB GDDR6 with 456 GB/s of bandwidth and 197 TOPS INT8 at 200 W. Maxsun has a dual-GPU 48 GB variant. The &amp;ldquo;Battlematrix&amp;rdquo; rack configuration combines 8 units = &lt;strong>192 GB of aggregate VRAM&lt;/strong>. The interesting point: at a cost far below an H100 SXM 80 GB, which makes it a candidate for 30-70B INT4-INT8 LLMs served via OpenVINO or llama.cpp SYCL.&lt;/p>
&lt;p>Phoronix verified that on SYCL the Arc Pro B70 reaches parity with the Radeon PRO W7900 (previous AMD generation) on DeepSeek R1 Llama 8B &lt;code>pp512&lt;/code>. The Vulkan backend loses heavily (~1/4 of SYCL performance); for Arc Pro, always SYCL.&lt;/p>
&lt;h3 id="intel-nuc-with-npu--the-edge-node">Intel NUC with NPU — the edge node&lt;/h3>
&lt;p>Intel NUCs with a Lunar Lake CPU (Core Ultra Series 2) bring NPU 4 with 48 TOPS and a platform total of 120 TOPS adding the Xe2 iGPU and CPU AVX. Panther Lake (CES January 2026) goes up to NPU 5 = 50 TOPS + Xe3 120 TOPS = 180 TOPS platform.&lt;/p>
&lt;p>Intel states that Panther Lake &amp;ldquo;runs 30-70B models locally&amp;rdquo;. Reality check: &lt;strong>it is marketing&lt;/strong>. A 30-70B INT4 fits in RAM (DDR5x 32-64 GB) but sustained speed with Q4_K_M quantisation on a NUC hovers around 2-8 tok/s; comfortable for occasional use, not for serving traffic. &lt;strong>The NUC&amp;rsquo;s real sweet spot is 7B INT4 at 20-40 tok/s&lt;/strong> on the iGPU/NPU, perfect for a client branch office with casual queries.&lt;/p>
&lt;h2 id="intel-software--the-relevant-stack">Intel software — the relevant stack&lt;/h2>
&lt;p>&lt;strong>OpenVINO 2025.3&lt;/strong> (June 2026) is the central piece. It supports single-command deployment via the OVMS CLI with automatic download from the HF Hub; it integrates &lt;code>OpenVINO GenAI&lt;/code> with a C++/Python API for generative pipelines; it exposes a vLLM v1-compatible API (&lt;code>vLLM-OpenVINO&lt;/code>). GGUF model support: DeepSeek Distill, Qwen 2/2.5, Llama 3. Optimisations: Sage Attention (first token with long prompts), per-channel KV-cache compression.&lt;/p>
&lt;p>&lt;strong>Intel Extension for PyTorch (IPEX)&lt;/strong>, XPU version 2.8.10+xpu, adds Intel backends to PyTorch. &lt;strong>IPEX-LLM&lt;/strong> is the subproject that integrates with llama.cpp, Ollama, HuggingFace, LangChain, LlamaIndex, vLLM and DeepSpeed. May 2025: it ran DeepSeek V3/R1 671B and Qwen3MoE 235B on 1-2 Arc A770/B580 cards with FlashMoE.&lt;/p>
&lt;p>&lt;strong>vLLM CPU backend&lt;/strong>, the CPU branch of vLLM with AMX optimisations. For 7B INT4 on a 4th-gen Xeon with AMX: 12-50 tok/s; with a Xeon Gold 6530 + INT4: ~80 tok/s. Academic figures (arXiv 2410.04466).&lt;/p>
&lt;p>&lt;strong>llama.cpp SYCL&lt;/strong>, the recommended backend for Arc; Vulkan works but hovers around 1/4 of SYCL performance on an Arc B580. SYCL reaches parity with the previous AMD generation.&lt;/p>
&lt;p>&lt;strong>Habana SynapseAI&lt;/strong>, the Gaudi 3 stack. The PyTorch bridge &lt;code>habana_frameworks.torch&lt;/code> registers the &lt;code>hpu&lt;/code> device; it integrates with &lt;code>torch.compile&lt;/code>. It is &lt;strong>not&lt;/strong> a complete port to oneAPI but a partial integration via oneMKL. That implies the Gaudi ecosystem keeps a certain separation from Intel&amp;rsquo;s general oneAPI, relevant in view of the hypothetical Jaguar Shores and future unification.&lt;/p>
&lt;h2 id="the-four-canonical-patterns">The four canonical patterns&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 340" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="four canonical NVIDIA + Intel patterns">
&lt;style>.b{stroke:#333;stroke-width:1.4;rx:6}.e{fill:#dfe9f5;stroke:#356}.g{fill:#eef0d0;stroke:#7a3}.s{fill:#f4e3cf;stroke:#a63}.d{fill:#ead8f5;stroke:#634}.title{font:600 13px sans-serif;fill:#222}.h{font:700 12px sans-serif;fill:#222}.l{font:11px sans-serif;fill:#222}.n{font:italic 10px sans-serif;fill:#444}&lt;/style>
&lt;text x="410" y="20" text-anchor="middle" class="title">Four canonical patterns of mixed NVIDIA + Intel use&lt;/text>
&lt;rect x="20" y="40" width="380" height="120" class="b e"/>
&lt;text x="30" y="62" class="h">1 · EMBEDDINGS + RERANKER ON INTEL&lt;/text>
&lt;text x="30" y="82" class="l">A Xeon 6 AMX sidecar (or Arc Pro B60) serves bge-m3 +&lt;/text>
&lt;text x="30" y="98" class="l">bge-reranker-v2-m3 next to the H100 with the 70B LLM.&lt;/text>
&lt;text x="30" y="118" class="n">Frees the H100 from cheap work; improves effective RPS&lt;/text>
&lt;text x="30" y="132" class="n">with no extra GPU. The most mature pattern.&lt;/text>
&lt;rect x="420" y="40" width="380" height="120" class="b g"/>
&lt;text x="430" y="62" class="h">2 · GUARDRAILS + PII ON A NEAR-EDGE NUC&lt;/text>
&lt;text x="430" y="82" class="l">A Lunar/Panther Lake NUC in the branch runs&lt;/text>
&lt;text x="430" y="98" class="l">Llama Guard 4 + Presidio before the round-trip.&lt;/text>
&lt;text x="430" y="118" class="n">PII never leaves the local perimeter;&lt;/text>
&lt;text x="430" y="132" class="n">latency 50-150ms instead of 200-500ms.&lt;/text>
&lt;rect x="20" y="170" width="380" height="120" class="b s"/>
&lt;text x="30" y="192" class="h">3 · SPECULATIVE DRAFTER ON A NUC&lt;/text>
&lt;text x="30" y="212" class="l">Llama 3.2 1B INT4 on a NUC near the user;&lt;/text>
&lt;text x="30" y="228" class="l">the target Llama 70B on the central H100 accepts/rejects.&lt;/text>
&lt;text x="30" y="248" class="n">TTFT falls ~50% if the acceptance rate is &amp;gt; 60%.&lt;/text>
&lt;text x="30" y="262" class="n">Requires a tokenizer-identical drafter.&lt;/text>
&lt;rect x="420" y="170" width="380" height="120" class="b d"/>
&lt;text x="430" y="192" class="h">4 · NUC DEV WORKSTATIONS&lt;/text>
&lt;text x="430" y="212" class="l">Dev/CI runs tests on Llama 3.2 3B on a NUC;&lt;/text>
&lt;text x="430" y="228" class="l">prod deploys to the H100 cluster after green CI.&lt;/text>
&lt;text x="430" y="248" class="n">Iteration 10× cheaper; validates end-to-end logic&lt;/text>
&lt;text x="430" y="262" class="n">without spending production GPU.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="pattern-1--embeddings--reranker-on-intel">Pattern 1 — embeddings + reranker on Intel&lt;/h3>
&lt;p>The most mature and the easiest to adopt. In a typical RAG system, each user request invokes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Query embedding&lt;/strong> (50 ms on an H100, 80 ms on a Xeon AMX, 30 ms on an Arc Pro B60).&lt;/li>
&lt;li>&lt;strong>Vector search&lt;/strong> (Qdrant / Milvus / Chroma; latency ~10-30 ms).&lt;/li>
&lt;li>&lt;strong>Reranker over the top-k candidates&lt;/strong> (60 ms on an H100, 100-150 ms on a Xeon AMX).&lt;/li>
&lt;li>&lt;strong>LLM&lt;/strong> over the augmented prompt (200-500 ms TTFT, 30-50 ms/token).&lt;/li>
&lt;/ol>
&lt;p>Steps 1 and 3 are memory-bound and relatively small (100M-1B models): a Xeon 6 with AMX (the Arc Pro B60 is faster but is already a dedicated GPU) does the job at a hardware cost that is a fraction of a dedicated H100. Step 4 stays on NVIDIA because that is where its tensor architecture + HBM3 + FP8 is worth what it costs.&lt;/p>
&lt;p>&lt;strong>Operational implication&lt;/strong>: a Xeon 6 sidecar (~40 cores, ~10-15 k€) serving embeddings + reranking frees the equivalent of 1-2 H100s of &amp;ldquo;cheap&amp;rdquo; load, recovering that capacity for the big LLM. Clear ROI in sizing.&lt;/p>
&lt;h3 id="pattern-2--guardrails--pii-redaction-on-a-near-edge-nuc">Pattern 2 — guardrails + PII redaction on a near-edge NUC&lt;/h3>
&lt;p>A bank branch, a medical practice or a law office generates prompts with personal or classified data. Sending those prompts to the central DC (even if it is corporate on-premise) can clash with local retention policies or with specific compliance (GDPR, professional privilege).&lt;/p>
&lt;p>The pattern: the &lt;strong>NUC in the branch office&lt;/strong> runs two critical steps before the round-trip:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PII redaction&lt;/strong> with Presidio (CPU-only, fast) or Llama Guard 4 8B on the NUC&amp;rsquo;s NPU + iGPU. It replaces names, tax IDs and account numbers with placeholders.&lt;/li>
&lt;li>&lt;strong>Light guardrails&lt;/strong> (PromptGuard 2 86M, Llama Guard 4 8B) on the NPU + iGPU. It filters prompt injection, jailbreaks and prohibited content.&lt;/li>
&lt;/ol>
&lt;p>Only afterwards does the redacted prompt travel to the central DC so the big LLM can answer. The response comes back to the NUC, which rehydrates the placeholders with the real values before showing it to the user. The sensitive data never leaves the branch office.&lt;/p>
&lt;p>Costs: a Panther Lake NUC is ~1,500-2,500 € per unit, scalable to dozens of branch offices with no additional central GPU cost. Latency: 50-150 ms for the edge step before the DC&amp;rsquo;s 200-500 ms round-trip.&lt;/p>
&lt;h3 id="pattern-3--speculative-decoding-drafter-on-a-nuc">Pattern 3 — speculative decoding drafter on a NUC&lt;/h3>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/speculative-decoding-fundamentals-maths-state-of-play/">Speculative decoding&lt;/a> uses a &lt;strong>small drafter&lt;/strong> that proposes γ tokens and a &lt;strong>large target&lt;/strong> that accepts or rejects them in a single forward pass. If the drafter is geographically close to the user (a NUC in the branch office) and the target is in the central DC, the client&amp;rsquo;s perceived latency falls further still.&lt;/p>
&lt;p>&lt;strong>Setup&lt;/strong>: drafter Llama 3.2 1B INT4 on a NUC + target Llama 3.1 70B FP8 on the central H100. The NUC generates γ=4 tokens in ~50 ms locally; the target verifies them in one pass (40-80 ms including round-trip); if the acceptance rate is &amp;gt; 60 %, &lt;strong>effective TTFT falls ~50 %&lt;/strong> compared with Llama 70B without speculative decoding.&lt;/p>
&lt;p>An important constraint: &lt;strong>drafter and target must share a tokenizer&lt;/strong>. Llama 3.2 1B and Llama 3.1 70B have compatible tokenizers. Mixing a Llama drafter with a Qwen target breaks the pattern.&lt;/p>
&lt;h3 id="pattern-4--nuc-dev-workstations">Pattern 4 — NUC dev workstations&lt;/h3>
&lt;p>Dev / CI iterating on prompts, evals and retrieval logic does not need a production GPU to validate correctness. A NUC with Llama 3.2 3B INT4 runs the end-to-end functional tests (including embeddings + retrieval + LLM + guardrails) at a tenth of the cost of iterating on an H100. &lt;strong>Only the last pre-prod smoke test uses the production cluster&lt;/strong>.&lt;/p>
&lt;p>A mature pattern in organisations with many developers and scarce production GPU. Iteration that is 10× faster and cheaper translates into feature delivery speed.&lt;/p>
&lt;h2 id="unified-observability-in-a-heterogeneous-cluster">Unified observability in a heterogeneous cluster&lt;/h2>
&lt;p>The &lt;a href="https://blog.lo0.es/en/posts/gpu-observability-llm-inference-twelve-dcgm-vllm-metrics/">GPU observability post&lt;/a> covered DCGM Exporter for NVIDIA. In a mixed cluster you need more:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Hardware part&lt;/th>
&lt;th>Exporter&lt;/th>
&lt;th>Key metrics&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>NVIDIA H100/A100&lt;/td>
&lt;td>&lt;code>nvidia/dcgm-exporter&lt;/code>&lt;/td>
&lt;td>DCGM_FI_DEV_* + DCGM_FI_PROF_*&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Gaudi 3&lt;/td>
&lt;td>&lt;code>HabanaAI/habana-metric-exporter&lt;/code>&lt;/td>
&lt;td>habana_hpu_utilization, habana_hbm_used&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Arc Pro&lt;/td>
&lt;td>&lt;code>intel/intel-gpu-exporter&lt;/code> (unofficial; alternatives exist)&lt;/td>
&lt;td>xe_engine_utilization, xe_memory_used&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon CPU + AMX&lt;/td>
&lt;td>&lt;code>prometheus/node-exporter&lt;/code> + Intel PCM&lt;/td>
&lt;td>cpu_amx_utilization (via PCM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (NPU+iGPU)&lt;/td>
&lt;td>&lt;code>intel/intel-gpu-exporter&lt;/code> + custom NPU exporter&lt;/td>
&lt;td>npu_utilization, xe_iGPU&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>All federated into a single Prometheus + Grafana. The dashboards are organised by hardware family (NVIDIA, Intel server, Intel edge) plus an aggregate &amp;ldquo;heterogeneous cluster&amp;rdquo; view with per-tenant SLOs combining all four.&lt;/p>
&lt;p>Cardinality: ~1.5-2× that of a pure NVIDIA cluster. Manageable with Thanos / Mimir for long retention.&lt;/p>
&lt;h2 id="capability-routing--from-the-l7-router-to-the-heterogeneous-one">Capability routing — from the L7 router to the heterogeneous one&lt;/h2>
&lt;p>The &lt;a href="https://blog.lo0.es/en/posts/llm-inference-router-l7-switchboard/">LLM inference router&lt;/a> stops being a version selector for the same model and becomes a &lt;strong>capability dispatcher&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-70b-chat&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;vllm-llama70b.inference.svc:8000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nvidia-h100&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">chat, tool_use, json_mode]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;embedding-multilingual&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ipex-bge-m3.inference.svc:8080&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-xeon-amx&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">embeddings]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;reranker-multilingual&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ipex-bge-reranker.inference.svc:8080&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-xeon-amx&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">reranking]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;guardrail-prompt-injection&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;openvino-llama-guard.edge-suc01.local:8080&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-nuc-edge&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">guardrails, redact-pii]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sucursal-01&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-3b-draft&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;openvino-llama-3b.edge-suc01.local:8080&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-nuc-edge&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">speculative-drafter]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sucursal-01&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">target_model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-70b-chat&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The router resolves &lt;code>model=embedding-multilingual&lt;/code> → Intel Xeon; &lt;code>model=llama-70b-chat&lt;/code> → H100; &lt;code>model=guardrail-prompt-injection&lt;/code> with &lt;code>region=sucursal-01&lt;/code> → local NUC. If the branch office NUC goes down, &lt;strong>failover&lt;/strong> to an equivalent replica in the central DC, accepting the latency cost.&lt;/p>
&lt;p>LiteLLM Proxy, NVIDIA Dynamo and Envoy AI Gateway support this capability routing. The non-obvious piece: the router has to know the compatible tokenizer between drafter and target for pattern 3, which is modelled in extra catalogue metadata.&lt;/p>
&lt;h2 id="specific-pitfalls">Specific pitfalls&lt;/h2>
&lt;p>&lt;strong>Tokenizer mismatch between engines.&lt;/strong> OpenVINO with a Llama 3.2 GGUF and vLLM with the same nominal Llama 3.2 can use slightly different tokenizers (chat template, special tokens). Validate token identity with &lt;code>tokenizer.encode(&amp;quot;hola&amp;quot;)&lt;/code> on both sides before assuming interchangeability. For speculative decoding, &lt;strong>a single different token breaks the pattern&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Edge ↔ central round-trip latency.&lt;/strong> Patterns 2 and 3 assume the NUC and the DC are on the same corporate WAN with controlled latency. If the branch office is on 4G/5G with 100-200 ms of jitter, the speculative drafter compensates for nothing; on the contrary, it adds latency. Measure before promising.&lt;/p>
&lt;p>&lt;strong>FP8 Hopper ≠ INT8 AMX in output quality.&lt;/strong> The operator assumes a request that runs FP8 on an H100 and INT8 on a Xeon AMX will produce the same output. &lt;strong>That is not true&lt;/strong>: the two quantisations have different degradation profiles. If the system expects idempotence (for example, evals with golden output), validate offline that the Intel version reproduces the expected behaviour within tolerance.&lt;/p>
&lt;p>&lt;strong>Model version synchronisation between sites.&lt;/strong> The model in the central DC gets updated, but the branch office NUCs keep the old version of the drafter or the guardrail for weeks. Result: divergent behaviour between branches with no easy diagnosis. Policy: &lt;strong>the central model and the edge model advance together&lt;/strong> or within a documented window; the &lt;a href="https://blog.lo0.es/en/posts/canary-blue-green-shadow-llm-models/">canary&lt;/a> extends to the NUC fleet.&lt;/p>
&lt;p>&lt;strong>Unstable Intel roadmap.&lt;/strong> Falcon Shores cancelled, Gaudi 4 will never exist, Jaguar Shores 2026 still with no confirmed public specs. Buying Gaudi 3 today is reasonable if the use case justifies the 18-24 months of amortisation; committing an architecture for 5+ years on an Intel accelerator is a riskier bet than the NVIDIA equivalent, at least until Jaguar Shores materialises with a mature software stack.&lt;/p>
&lt;p>&lt;strong>Absence of public production deployments.&lt;/strong> As of June 2026, the confirmed Gaudi 3 deployments are IBM Cloud, Dell AI Factory and a handful of early adopters (Bharti Airtel, Bosch, Naver). &lt;strong>There is no publicly verifiable case of a mixed NVIDIA + Intel cluster in European banking or government&lt;/strong>. This pattern is recommended emergent architecture, not practice with an industrial track record. The first adopter takes on a validation cost that a second adopter avoids.&lt;/p>
&lt;h2 id="applied-to-a-generic-on-premise-cluster">Applied to a generic on-premise cluster&lt;/h2>
&lt;p>For an organisation with a generic heterogeneous LLM inference cluster:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Central DC&lt;/strong>: 4 nodes × 4×H100 SXM 80 GB with intra-node NVLink = 16 H100s. Serves the big LLMs (Llama 70B, Mixtral 8×22B, Qwen 72B) in BF16 or FP8.&lt;/li>
&lt;li>&lt;strong>Xeon 6 sidecar&lt;/strong>: 2-4 Xeon 6 servers (Granite Rapids 64-86 cores) with AMX, 512 GB DDR5, in the same rack as the H100 cluster. Serves embeddings (bge-m3), reranking (bge-reranker-v2-m3) and small models (Llama 3.2 1B/3B) on the vLLM CPU backend with AMX.&lt;/li>
&lt;li>&lt;strong>Arc Pro sidecar&lt;/strong> (optional): 1-2 servers with 4-8× Arc Pro B60 24 GB each (Battlematrix), for 13-30B INT8 models via OpenVINO. Useful if the cost per mid-sized LLM has to come down from the H100.&lt;/li>
&lt;li>&lt;strong>Edge NUCs in branch offices&lt;/strong>: 1-2 Panther Lake NUCs per branch, with a 50 TOPS NPU + Xe3 120 TOPS, serving Llama Guard 4 + Presidio + a Llama 3.2 1B INT4 drafter via OpenVINO. Corporate WAN connectivity with latency &amp;lt; 80 ms to the DC.&lt;/li>
&lt;/ul>
&lt;p>Estimated envelope: central cluster ~120 kW of GPU peak + ~10-15 kW of Intel sidecars. Edge: ~50 W per NUC, negligible compared with office costs.&lt;/p>
&lt;p>Observability: federated Prometheus in the DC + pull scrape from the NUCs (via corporate VPN). Dashboards &amp;ldquo;NVIDIA GPU fleet&amp;rdquo;, &amp;ldquo;Intel server fleet&amp;rdquo;, &amp;ldquo;Intel edge fleet&amp;rdquo; plus a &amp;ldquo;consolidated SLO&amp;rdquo; view.&lt;/p>
&lt;p>Router: LiteLLM Proxy or NVIDIA Dynamo in the DC, with an extended model catalogue to include Intel backends and regions (sucursal-01, sucursal-02, &amp;hellip;). Documented edge→central failover.&lt;/p>
&lt;h2 id="what-we-have-not-covered-upcoming-posts">What we have not covered (upcoming posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Reproducible benchmarks&lt;/strong> of Llama 70B on Gaudi 3 vs H100 SXM on equivalent hardware, the missing material for making decisions with your own data rather than Intel&amp;rsquo;s or Signal65&amp;rsquo;s.&lt;/li>
&lt;li>&lt;strong>AMD ROCm in the mix&lt;/strong>: how MI300X / MI355X fit into this heterogeneous pattern and what changes in the router catalogue.&lt;/li>
&lt;li>&lt;strong>Apple Silicon as edge&lt;/strong>: M3/M4 Max with a Neural Engine of ~38 TOPS + a 40-core GPU, hardware equivalent to the Panther Lake NUC but with a different software stack (MLX).&lt;/li>
&lt;li>&lt;strong>Energy cost optimisation&lt;/strong>: how &lt;code>nvidia-smi -pl 500W&lt;/code> + an Intel TDP cap on Xeon 6 cuts the bill by 25-30 % with a 15-20 % throughput loss.&lt;/li>
&lt;li>&lt;strong>Model CI/CD for an edge fleet&lt;/strong>: how a rolling update of a Llama Guard reaches 50 branch office NUCs without any of them losing service.&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/serving-embeddings-rerankers-tei-production/">Serving embeddings and rerankers with TEI in production&lt;/a> — TEI on CPU for batch ingest and on GPU for query time, the concrete heterogeneous case.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/rag-cpu-data-plane-generation-plane/">Taking RAG to the CPU: separating the data plane from the generation plane&lt;/a> — the concrete case: the RAG data plane on the CPU nodes, generation on the GPU.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/capacity-planning-on-premise-llm-inference/">Capacity planning for on-premise LLM inference&lt;/a> — the sizing that this heterogeneity lets you optimise task by task, instead of everything on the H100.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven layers of the on-premise LLM inference stack&lt;/a> — the seven layers apply just the same on heterogeneous hardware; the backends are interchangeable as long as the OpenAI-compatible contract is respected.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-inference-router-l7-switchboard/">The LLM inference router&lt;/a> — the capability router is the central piece of the heterogeneous pattern.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/gpu-observability-llm-inference-twelve-dcgm-vllm-metrics/">GPU observability for LLM inference&lt;/a> — extends to Gaudi, Arc, Xeon AMX and edge NPUs.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/quantization-llm-inference-fp8-int4-gguf/">Quantisation for LLM inference&lt;/a> — FP8 Hopper, INT8 AMX, INT4 GGUF, the basis for why mixed hardware demands cross-validation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/speculative-decoding-fundamentals-maths-state-of-play/">Speculative decoding&lt;/a> — pattern 3 of this post; how the near-edge drafter closes the latency gap.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a> — the models that live on the NUC in pattern 2.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">OSS catalogue for LLMOps&lt;/a> — entries for OpenVINO, IPEX-LLM and the vLLM CPU backend.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">OSS vs hyperscalers&lt;/a> — the parallel lock-in analysis that underpins the diversification argument.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="references">References&lt;/h2>
&lt;p>&lt;strong>Intel Gaudi 3&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Gaudi 3 AI Accelerator White Paper&lt;/em>. &lt;a href="https://cdrdv2-public.intel.com/817486/gaudi-3-ai-accelerator-white-paper.pdf">https://cdrdv2-public.intel.com/817486/gaudi-3-ai-accelerator-white-paper.pdf&lt;/a>&lt;/li>
&lt;li>Intel — Hot Chips 2024 Gaudi 3 deep dive. &lt;a href="https://hc2024.hotchips.org/assets/program/conference/day1/60_HC2024.Intel.RomanKaplan.Gaudi3-0826.pdf">https://hc2024.hotchips.org/assets/program/conference/day1/60_HC2024.Intel.RomanKaplan.Gaudi3-0826.pdf&lt;/a>&lt;/li>
&lt;li>Signal65 / DataCenterDynamics — &lt;em>NVIDIA H200 outperforms Intel Gaudi 3 by factor of 9× across first Llama 3.1 405B benchmark test&lt;/em>. &lt;a href="https://www.datacenterdynamics.com/en/news/nvidia-h200-outperforms-intel-gaudi-3-by-factor-of-nine-across-first-llama-31-405b-benchmark-test-exclusive/">https://www.datacenterdynamics.com/en/news/nvidia-h200-outperforms-intel-gaudi-3-by-factor-of-nine-across-first-llama-31-405b-benchmark-test-exclusive/&lt;/a>&lt;/li>
&lt;li>IEEE Spectrum — &lt;em>Intel Gaudi 3 review&lt;/em>. &lt;a href="https://spectrum.ieee.org/intel-gaudi-3">https://spectrum.ieee.org/intel-gaudi-3&lt;/a>&lt;/li>
&lt;li>Tom&amp;rsquo;s Hardware — &lt;em>Intel cancels Falcon Shores GPU; Jaguar Shores to be successor&lt;/em>. &lt;a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/intel-cancels-falcon-shores-gpu-for-ai-workloads-jaguar-shores-to-be-successor">https://www.tomshardware.com/tech-industry/artificial-intelligence/intel-cancels-falcon-shores-gpu-for-ai-workloads-jaguar-shores-to-be-successor&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel Xeon 6 + AMX&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Xeon 6 (Granite Rapids) Product Brief&lt;/em>. &lt;a href="https://www.intel.com/content/dam/www/central-libraries/us/en/documents/2025-02/xeon-6-granite-rapids-product-brief.pdf">https://www.intel.com/content/dam/www/central-libraries/us/en/documents/2025-02/xeon-6-granite-rapids-product-brief.pdf&lt;/a>&lt;/li>
&lt;li>OpenMetal — &lt;em>Intel AMX AI Inference Performance&lt;/em>. &lt;a href="https://openmetal.io/resources/blog/intel-amx-ai-inference-performance/">https://openmetal.io/resources/blog/intel-amx-ai-inference-performance/&lt;/a>&lt;/li>
&lt;li>LMSYS — &lt;em>Intel Xeon 6 + SGLang for DeepSeek R1 671B&lt;/em>. &lt;a href="https://www.lmsys.org/blog/2025-07-14-intel-xeon-optimization/">https://www.lmsys.org/blog/2025-07-14-intel-xeon-optimization/&lt;/a>&lt;/li>
&lt;li>arXiv 2410.04466 — &lt;em>CPU-LLM benchmarks with AMX&lt;/em>.&lt;/li>
&lt;li>Intel community blog — &lt;em>Accelerating vLLM Inference on Intel Xeon 6 Processor&lt;/em>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel Arc Pro Battlemage&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Arc Pro B60 Graphics Specifications&lt;/em>. &lt;a href="https://www.intel.com/content/www/us/en/products/sku/243916/intel-arc-pro-b60-graphics/specifications.html">https://www.intel.com/content/www/us/en/products/sku/243916/intel-arc-pro-b60-graphics/specifications.html&lt;/a>&lt;/li>
&lt;li>StorageReview — &lt;em>Intel Arc Pro B60 Battlematrix Preview: 192GB VRAM for On-Premise AI&lt;/em>. &lt;a href="https://www.storagereview.com/review/intel-arc-pro-b60-battlematrix-preview-192gb-of-vram-for-on-premise-ai">https://www.storagereview.com/review/intel-arc-pro-b60-battlematrix-preview-192gb-of-vram-for-on-premise-ai&lt;/a>&lt;/li>
&lt;li>Phoronix — &lt;em>Intel Arc Pro B-series review&lt;/em>. &lt;a href="https://www.phoronix.com/review/intel-arc-pro-b-series">https://www.phoronix.com/review/intel-arc-pro-b-series&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel NUC / NPU&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>HotHardware — &lt;em>Intel CES 2026 Panther Lake is a Go&lt;/em>. &lt;a href="https://hothardware.com/news/intel-ces-2026-panther-lake-is-a-go">https://hothardware.com/news/intel-ces-2026-panther-lake-is-a-go&lt;/a>&lt;/li>
&lt;li>TechPowerUp — &lt;em>Intel Panther Lake Technical Deep Dive&lt;/em>.&lt;/li>
&lt;li>arXiv 2412.11053 — &lt;em>NITRO: LLM inference on laptop NPU&lt;/em>.&lt;/li>
&lt;li>Intel — &lt;em>AI PC brings larger LLM development to your desk&lt;/em>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Software&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>OpenVINO — &lt;em>Release Notes 2025.3&lt;/em>. &lt;a href="https://www.intel.com/content/www/us/en/developer/articles/release-notes/openvino/2025-3.html">https://www.intel.com/content/www/us/en/developer/articles/release-notes/openvino/2025-3.html&lt;/a>&lt;/li>
&lt;li>HuggingFace — &lt;em>Deploy with OpenVINO&lt;/em>. &lt;a href="https://huggingface.co/blog/deploy-with-openvino">https://huggingface.co/blog/deploy-with-openvino&lt;/a>&lt;/li>
&lt;li>Intel — &lt;em>Intel Extension for PyTorch XPU 2.8.10&lt;/em>. &lt;a href="https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/releases.html">https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/releases.html&lt;/a>&lt;/li>
&lt;li>IPEX-LLM — &lt;code>github.com/intel/ipex-llm&lt;/code>.&lt;/li>
&lt;li>Habana — &lt;em>SynapseAI PyTorch Theory of Operations&lt;/em>. &lt;a href="https://docs.habana.ai/en/latest/PyTorch/PyTorch_Gaudi_Theory_of_Operations.html">https://docs.habana.ai/en/latest/PyTorch/PyTorch_Gaudi_Theory_of_Operations.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Market context&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>MLCommons — &lt;em>MLPerf Inference v6.0 benchmark results&lt;/em>. &lt;a href="https://www.spheron.network/blog/mlperf-inference-v6-benchmark-results-2026/">https://www.spheron.network/blog/mlperf-inference-v6-benchmark-results-2026/&lt;/a>&lt;/li>
&lt;li>Intel newsroom — &lt;em>Gaudi 3 Expanded Availability&lt;/em>. &lt;a href="https://newsroom.intel.com/artificial-intelligence/intel-gaudi-3-expands-availability-drive-ai-innovation-scale">https://newsroom.intel.com/artificial-intelligence/intel-gaudi-3-expands-availability-drive-ai-innovation-scale&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Sources: the full URLs are linked inline on each reference.&lt;/p></description></item></channel></rss>