<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: GINIGEN AI</title>
    <description>The latest articles on DEV Community by GINIGEN AI (@ginigen_ai_010d9180cbbdb1).</description>
    <link>https://dev.to/ginigen_ai_010d9180cbbdb1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4163333%2F8df509f4-22c1-4190-9b28-35e38a01d52a.png</url>
      <title>DEV Community: GINIGEN AI</title>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ginigen_ai_010d9180cbbdb1"/>
    <language>en</language>
    <item>
      <title>The Inference Hardware You Already Own Might Train Models Too: A 325M Pretraining Run on an NPU</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Mon, 26 Oct 2026 05:53:38 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/the-inference-hardware-you-already-own-might-train-models-too-a-325m-pretraining-run-on-an-npu-g28</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/the-inference-hardware-you-already-own-might-train-models-too-a-325m-pretraining-run-on-an-npu-g28</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: the work described here is by VIDRAFT, an affiliate of Ginigen AI.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Edge and on-premise deployments usually split hardware into two worlds: GPUs to train, cheaper accelerators to serve. A new result from VIDRAFT narrows that split. They pretrained a 325M parameter language model from random initialization on the &lt;strong&gt;Rebellions ATOM-Max&lt;/strong&gt;, a commercial inference NPU released in 2025, and trained the same model on a &lt;strong&gt;B200 GPU&lt;/strong&gt; for comparison. On text neither model saw in training, the losses are &lt;strong&gt;0.7993 (NPU)&lt;/strong&gt; and &lt;strong&gt;0.7994 (GPU)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig1_hero.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig1_hero.png" alt="VKORE-325M at a glance" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should edge and on-prem teams care?
&lt;/h2&gt;

&lt;p&gt;Most organizations running AI on premise already have inference accelerators in the rack. They buy them because they are cheaper per query and draw less power than training GPUs. When a model needs adapting to local data, the usual answer is to rent GPU time or ship data out.&lt;/p&gt;

&lt;p&gt;If the inference hardware can train, that changes the economics and the data story. Adaptation and even pretraining can happen on hardware the team already owns, inside its own network.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually shown?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;VKORE-325M-NPU-Base, 325.6M parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start&lt;/td&gt;
&lt;td&gt;random initialization, no pretrained weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;5.0B byte tokens of FineWeb-Edu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run&lt;/td&gt;
&lt;td&gt;76,292 steps, about four days, no divergence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;Rebellions ATOM-Max NPU (2025)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;the identical model on a B200 GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig6_twin_design.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig6_twin_design.png" alt="One model, two machines, everything else held fixed" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two training curves overlap for the whole run, and both runs follow the same learning-rate schedule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig2_training_loss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig2_training_loss.png" alt="Training loss, NPU vs B200" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8yjy8vynqyh2f6oggya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8yjy8vynqyh2f6oggya.png" alt="Identical learning-rate schedule" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Is the NPU-trained model really as good?
&lt;/h2&gt;

&lt;p&gt;On 1,024 windows from a FineWeb-Edu shard that was never in the training corpus:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Loss&lt;/th&gt;
&lt;th&gt;Bits per byte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rebellions ATOM-Max NPU&lt;/td&gt;
&lt;td&gt;0.7993&lt;/td&gt;
&lt;td&gt;1.1531&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B200 GPU reference&lt;/td&gt;
&lt;td&gt;0.7994&lt;/td&gt;
&lt;td&gt;1.1533&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig3_evaluation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig3_evaluation.png" alt="Evaluation with 95% confidence intervals" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Window by window, the difference is -0.0001 with a standard error of 0.0007. That is a tie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy50kh9fr17pvf4zzc3vx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy50kh9fr17pvf4zzc3vx.png" alt="Per-window difference on unseen text" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How far has this line come?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig7_journey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2FFINAL-Bench%2FVKORE-325M-NPU-Base%2Fresolve%2Fmain%2Farticle%2Ffig7_journey.png" alt="From VKORE-46M-NPU to VKORE-325M-NPU-Base" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the catch?
&lt;/h2&gt;

&lt;p&gt;Two honest limits. First, the hardware alone does not do this: the ATOM-Max and its standard software are built for inference, and training depends on VIDRAFT's own training stack and stability technique, which are under patent application. Buying the chip does not by itself enable training. Second, 325M on 5B tokens is a research-scale base model, not a production assistant. The result is about what the hardware class can do.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which NPU was used?&lt;/strong&gt; The Rebellions ATOM-Max, a commercial inference NPU released in 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I verify the numbers?&lt;/strong&gt; Yes. Both weights and &lt;code&gt;evaluate_unseen.py&lt;/code&gt; are in &lt;a href="https://huggingface.co/FINAL-Bench/VKORE-325M-NPU-Base" rel="noopener noreferrer"&gt;FINAL-Bench/VKORE-325M-NPU-Base&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this mean GPUs are unnecessary for training?&lt;/strong&gt; No. It means inference NPUs can carry real training runs when the software exists. Scale, speed and cost per run are separate questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does it mean for on-device AI?&lt;/strong&gt; Models can be adapted close to where they run, on hardware already deployed, without moving data to a GPU cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Technical report: &lt;a href="https://huggingface.co/blog/FINAL-Bench/pretraining-a-325m-language-model-from-zero-on-an" rel="noopener noreferrer"&gt;Pretraining a 325M Language Model from Zero on an Inference-Only NPU&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/01-bits-per-weight-is-not-01-bits-per-weight-where-the-bytes-go-in-sub-2-bit-llms-2b0e"&gt;0.1 Bits Per Weight Is Not 0.1 Bits Per Weight: Where the Bytes Go in Sub-2-Bit LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/chitos-on-the-owasp-benchmark-778-youden-on-prem-49km"&gt;Chitos on the OWASP Benchmark: 77.8 Youden, on-prem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>edgeai</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Chitos on the OWASP Benchmark: 77.8 Youden, on-prem</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:23:19 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/chitos-on-the-owasp-benchmark-778-youden-on-prem-49km</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/chitos-on-the-owasp-benchmark-778-youden-on-prem-49km</guid>
      <description>&lt;p&gt;The OWASP Benchmark is an official evaluation set that scores a security tool's accuracy across about 2,700 test cases as a Youden index from 0 to 100. Here is where Chitos lands, self-measured.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Youden&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base code scanner alone&lt;/td&gt;
&lt;td&gt;52.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chitos, online judgment engine (Claude Opus 5.5)&lt;/td&gt;
&lt;td&gt;77.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chitos, on-prem judgment engine (Darwin-180B-RSI)&lt;/td&gt;
&lt;td&gt;77.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Reading the jump
&lt;/h2&gt;

&lt;p&gt;The gap from 52.8 to 77 is the AI verification layer. It removes more than 60 percent of false positives while missing none of the real vulnerabilities. A Youden index weights sensitivity and specificity together, so this is not a precision trick that quietly drops true positives; it is cleaner findings at the same recall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the on-prem row matters most
&lt;/h2&gt;

&lt;p&gt;The online engine and the on-prem engine scored effectively the same. For regulated environments, that is the whole story: you can keep code and findings inside your network and still operate in the commercial upper range.&lt;/p&gt;

&lt;p&gt;Chitos is non-destructive, autonomous in finding its own audit points, and refreshes vulnerability fingerprints daily. These numbers are self-measured, with cross-validation through the official scoring tool in progress.&lt;/p&gt;

&lt;p&gt;Details: &lt;a href="https://vidraft.net" rel="noopener noreferrer"&gt;https://vidraft.net&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>appsec</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>0.1 Bits Per Weight Is Not 0.1 Bits Per Weight: Where the Bytes Go in Sub-2-Bit LLMs</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:06:11 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/01-bits-per-weight-is-not-01-bits-per-weight-where-the-bytes-go-in-sub-2-bit-llms-2b0e</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/01-bits-per-weight-is-not-01-bits-per-weight-where-the-bytes-go-in-sub-2-bit-llms-2b0e</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Recent coverage of Samsung Research's LittleBit repeats its headline: Llama2-13B at &lt;strong&gt;0.1 bits per weight&lt;/strong&gt;, under 1 GB. The paper (arXiv 2506.13771, NeurIPS 2025) supports the number, but the number is a property of the transformer blocks only. Three things follow when you account for the whole file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The file is not 0.1 bits per parameter.&lt;/strong&gt; The embedding table and &lt;code&gt;lm_head&lt;/code&gt; stay in FP16. By our reconstruction they are about 80% of the 0.84 GB Llama2-13B file and about 83% of the 0.63 GB Llama2-7B file. File-level bits per parameter are 0.52 (13B) and 0.75 (7B), not 0.10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The quality cost is real and was measured by the authors.&lt;/strong&gt; At 0.1 BPW, WikiText-2 perplexity on Llama2-7B is 15.92 against 5.47 for FP16, about 2.9x. At 0.3 BPW several zero-shot tasks sit at chance level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 11.6x speedup is one MLP layer on an A100&lt;/strong&gt;, from a custom kernel the authors say is not yet at the level of industry libraries. It is not a phone benchmark.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post is arithmetic on published numbers and file sizes. We did not run LittleBit. Every figure is either quoted from the paper, read from Hugging Face metadata on 2026-10-22, or computed by us with the script shown below, and we say which.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D1000%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25220.55%2520BPW%2522%252C%25220.3%2520BPW%2522%252C%25220.1%2520BPW%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Transformer%2520blocks%2520%2528estimated%2529%2522%252C%2522data%2522%253A%255B0.872%252C0.476%252C0.159%255D%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%257D%252C%257B%2522label%2522%253A%2522Embedding%2520%252B%2520lm_head%252C%2520FP16%2520%2528estimated%2529%2522%252C%2522data%2522%253A%255B0.655%252C0.655%252C0.655%255D%252C%2522backgroundColor%2522%253A%2522%2523495057%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-13B%2520on%2520disk%253A%2520at%25200.1%2520BPW%2520the%2520FP16%2520embeddings%2520are%252080%2525%2520of%2520the%2520file%2522%252C%2522fontSize%2522%253A24%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522stacked%2522%253Atrue%252C%2522ticks%2522%253A%257B%2522fontSize%2522%253A18%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522stacked%2522%253Atrue%252C%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522fontSize%2522%253A16%257D%252C%2522scaleLabel%2522%253A%257B%2522display%2522%253Atrue%252C%2522labelString%2522%253A%2522GB%2522%252C%2522fontSize%2522%253A16%257D%257D%255D%257D%252C%2522legend%2522%253A%257B%2522labels%2522%253A%257B%2522fontSize%2522%253A16%257D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522color%2522%253A%2522white%2522%252C%2522font%2522%253A%257B%2522size%2522%253A18%252C%2522weight%2522%253A%2522bold%2522%257D%252C%2522formatter%2522%253A%2522%2528v%2529%253D%253Ev.toFixed%25282%2529%2522%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D1000%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25220.55%2520BPW%2522%252C%25220.3%2520BPW%2522%252C%25220.1%2520BPW%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Transformer%2520blocks%2520%2528estimated%2529%2522%252C%2522data%2522%253A%255B0.872%252C0.476%252C0.159%255D%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%257D%252C%257B%2522label%2522%253A%2522Embedding%2520%252B%2520lm_head%252C%2520FP16%2520%2528estimated%2529%2522%252C%2522data%2522%253A%255B0.655%252C0.655%252C0.655%255D%252C%2522backgroundColor%2522%253A%2522%2523495057%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-13B%2520on%2520disk%253A%2520at%25200.1%2520BPW%2520the%2520FP16%2520embeddings%2520are%252080%2525%2520of%2520the%2520file%2522%252C%2522fontSize%2522%253A24%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522stacked%2522%253Atrue%252C%2522ticks%2522%253A%257B%2522fontSize%2522%253A18%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522stacked%2522%253Atrue%252C%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522fontSize%2522%253A16%257D%252C%2522scaleLabel%2522%253A%257B%2522display%2522%253Atrue%252C%2522labelString%2522%253A%2522GB%2522%252C%2522fontSize%2522%253A16%257D%257D%255D%257D%252C%2522legend%2522%253A%257B%2522labels%2522%253A%257B%2522fontSize%2522%253A16%257D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522color%2522%253A%2522white%2522%252C%2522font%2522%253A%257B%2522size%2522%253A18%252C%2522weight%2522%253A%2522bold%2522%257D%252C%2522formatter%2522%253A%2522%2528v%2529%253D%253Ev.toFixed%25282%2529%2522%257D%257D%257D%257D" alt="Llama2-13B file size split into transformer blocks and FP16 embeddings" width="2000" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "0.1 bits per weight" actually mean?
&lt;/h2&gt;

&lt;p&gt;LittleBit replaces each linear layer's weight matrix &lt;code&gt;W&lt;/code&gt; (shape &lt;code&gt;d_out x d_in&lt;/code&gt;) with a low-rank factorization whose two factors are binarized to +1 or -1. Scales in FP16 compensate for the lost magnitude. The paper stores two parallel paths, a primary one and a residual one, and counts bits per layer like this (the paper's Appendix D, Eq. 16):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bits = 2r(d_out + d_in) + 32(d_out + d_in) + 32r
b    = bits / (d_out * d_in)          # effective bits per weight of that layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first term is the sign bits of the two factors on two paths. The second and third are the FP16 row, column and latent scales on two paths. To hit a target &lt;code&gt;b&lt;/code&gt;, the authors solve for the latent rank &lt;code&gt;r&lt;/code&gt; (Eq. 17):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_in&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_out&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_in&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d_in&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d_in&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 86.2   -&amp;gt; a rank-86 factorization of a 4096 x 4096 matrix
&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11008&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 133.1  -&amp;gt; Llama-2 7B gate/up projection
&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 290.6
&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 546.1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So "0.1 bits per weight" for Llama-2 7B means each attention projection is approximated by two paths of rank about 86, which is 2.1% of the full 4096 rank. We checked that plugging the rounded rank back into Eq. 16 returns 0.0998. The paper's KV-cache table (Table 4) lists a latent rank of 192 for 0.1 BPW and 1,624 for 0.8 BPW, roughly twice our per-path values, which looks like the two paths' ranks added together. We did not confirm that reading with the authors.&lt;/p&gt;

&lt;p&gt;This is also why the method is quantization-aware training and not a drop-in post-training step. The factors are initialized from an SVD (the paper calls it Dual-SVID) and then trained with a distillation loss, using WikiText-2 plus C4 partitions, sequence length 2048 and 5 epochs. The compute cost of that training is not stated in the parts of the paper we read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is a 0.1 BPW 13B model 0.84 GB and not 0.16 GB?
&lt;/h2&gt;

&lt;p&gt;Because quantization is applied to the transformer blocks only. The paper says so itself in the caption of Table 3: "components like the embedding layer and the lm_head remain in FP16."&lt;/p&gt;

&lt;p&gt;Llama-2 has a 32,000-token vocabulary. The embedding table and the output head each hold &lt;code&gt;32000 x d_model&lt;/code&gt; parameters, and neither is shrunk. At FP16 that is a fixed cost no matter how hard the blocks are squeezed. We rebuilt the file size from the public architecture shapes (layer count, hidden size, FFN size, KV width):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Block params&lt;/th&gt;
&lt;th&gt;FP16 embed + head&lt;/th&gt;
&lt;th&gt;Blocks at 0.1 BPW&lt;/th&gt;
&lt;th&gt;Our estimate&lt;/th&gt;
&lt;th&gt;Paper Table 3&lt;/th&gt;
&lt;th&gt;Embedding share of file&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Llama2-7B&lt;/td&gt;
&lt;td&gt;6.48B&lt;/td&gt;
&lt;td&gt;0.524 GB&lt;/td&gt;
&lt;td&gt;0.081 GB&lt;/td&gt;
&lt;td&gt;0.605 GB&lt;/td&gt;
&lt;td&gt;0.63 GB&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama2-13B&lt;/td&gt;
&lt;td&gt;12.69B&lt;/td&gt;
&lt;td&gt;0.655 GB&lt;/td&gt;
&lt;td&gt;0.159 GB&lt;/td&gt;
&lt;td&gt;0.814 GB&lt;/td&gt;
&lt;td&gt;0.84 GB&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama2-70B&lt;/td&gt;
&lt;td&gt;68.45B&lt;/td&gt;
&lt;td&gt;1.049 GB&lt;/td&gt;
&lt;td&gt;0.856 GB&lt;/td&gt;
&lt;td&gt;1.904 GB&lt;/td&gt;
&lt;td&gt;1.98 GB&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our estimates land 3% to 4% below the paper's sizes. We did not chase the remainder, which is plausibly rank rounding, norm weights and file overhead. The same reconstruction also tracks the paper at the other settings for 13B: 1.53 GB estimated against 1.51 GB at 0.55 BPW, and 1.13 GB against 1.15 GB at 0.3 BPW.&lt;/p&gt;

&lt;p&gt;Two practical consequences for an on-device team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Below roughly 0.3 BPW, the next saving is not in the blocks.&lt;/strong&gt; At 0.1 BPW on 13B, going all the way to zero bits in the blocks would still leave 0.655 GB of embeddings. Quantizing the embedding table and &lt;code&gt;lm_head&lt;/code&gt; is the remaining lever, and vocabulary size matters. A model with a 150,000-token vocabulary pays about 4.7x this embedding cost at the same hidden size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression factors flatter large models.&lt;/strong&gt; The headline 31x for 13B and 69.7x for 70B are file-size ratios against FP16. They grow with model size because the fixed embedding cost is a smaller fraction of a bigger file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How do other sub-2-bit releases look at the file level?
&lt;/h2&gt;

&lt;p&gt;"Bits per weight" is reported inconsistently across projects: sometimes nominal for the quantized tensors, sometimes for the whole file. The honest comparison metric for deployment is the same one you pay for in RAM: file bytes times 8, divided by total parameters. Here it is for LittleBit's published sizes next to three GGUF files from PrismML's Bonsai family on Hugging Face (Apache-2.0, based on Qwen3.6-27B and Qwen3.8-27B), measured the same way:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;File-level bits per parameter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LittleBit Llama2-70B, 0.1 nominal&lt;/td&gt;
&lt;td&gt;1.98 GB&lt;/td&gt;
&lt;td&gt;0.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LittleBit Llama2-13B, 0.1 nominal&lt;/td&gt;
&lt;td&gt;0.84 GB&lt;/td&gt;
&lt;td&gt;0.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LittleBit Llama2-7B, 0.1 nominal&lt;/td&gt;
&lt;td&gt;0.63 GB&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Bonsai-27B-Q1_0.gguf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.80 GB&lt;/td&gt;
&lt;td&gt;1.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ternary-Bonsai-2-27B-PTQ1_0.gguf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.95 GB&lt;/td&gt;
&lt;td&gt;1.77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ternary-Bonsai-27B-Q2_0.gguf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.17 GB&lt;/td&gt;
&lt;td&gt;2.13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D900%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522LittleBit%2520Llama2-70B%2520%25280.1%2520nominal%2529%2522%252C%2522LittleBit%2520Llama2-13B%2520%25280.1%2529%2522%252C%2522LittleBit%2520Llama2-7B%2520%25280.1%2529%2522%252C%2522Bonsai-27B%2520Q1_0%2522%252C%2522Ternary-Bonsai-2-27B%2520PTQ1_0%2522%252C%2522Ternary-Bonsai-27B%2520Q2_0%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B0.23%252C0.52%252C0.75%252C1.13%252C1.77%252C2.13%255D%252C%2522backgroundColor%2522%253A%255B%2522%25230ca678%2522%252C%2522%25230ca678%2522%252C%2522%25230ca678%2522%252C%2522%25231c7ed6%2522%252C%2522%25231c7ed6%2522%252C%2522%25231c7ed6%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522File-level%2520bits%2520per%2520parameter%253A%2520file%2520bytes%2520x%25208%2520%2F%2520total%2520parameters%2522%252C%2522fontSize%2522%253A20%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A2.6%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A13%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522end%2522%252C%2522font%2522%253A%257B%2522size%2522%253A16%252C%2522weight%2522%253A%2522bold%2522%257D%252C%2522formatter%2522%253A%2522%2528v%2529%253D%253Ev.toFixed%25282%2529%2522%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D900%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522LittleBit%2520Llama2-70B%2520%25280.1%2520nominal%2529%2522%252C%2522LittleBit%2520Llama2-13B%2520%25280.1%2529%2522%252C%2522LittleBit%2520Llama2-7B%2520%25280.1%2529%2522%252C%2522Bonsai-27B%2520Q1_0%2522%252C%2522Ternary-Bonsai-2-27B%2520PTQ1_0%2522%252C%2522Ternary-Bonsai-27B%2520Q2_0%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B0.23%252C0.52%252C0.75%252C1.13%252C1.77%252C2.13%255D%252C%2522backgroundColor%2522%253A%255B%2522%25230ca678%2522%252C%2522%25230ca678%2522%252C%2522%25230ca678%2522%252C%2522%25231c7ed6%2522%252C%2522%25231c7ed6%2522%252C%2522%25231c7ed6%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522File-level%2520bits%2520per%2520parameter%253A%2520file%2520bytes%2520x%25208%2520%2F%2520total%2520parameters%2522%252C%2522fontSize%2522%253A20%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A2.6%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A13%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522end%2522%252C%2522font%2522%253A%257B%2522size%2522%253A16%252C%2522weight%2522%253A%2522bold%2522%257D%252C%2522formatter%2522%253A%2522%2528v%2529%253D%253Ev.toFixed%25282%2529%2522%257D%257D%257D%257D" alt="File-level bits per parameter for LittleBit and Bonsai files" width="1800" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Bonsai rows use the GGUF metadata total of 26,895,998,464 parameters and the file sizes from the Hugging Face API. The LittleBit rows use &lt;code&gt;16 x size / FP16 size&lt;/code&gt; from the paper's Table 3. Here is the script for the GGUF side, which works for any GGUF repository that reports a parameter total:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;file_bits_per_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://huggingface.co/api/models/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;?blobs=true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})))&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rfilename&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;siblings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}[&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gguf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;file_bits_per_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prism-ml/Bonsai-27B-gguf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bonsai-27B-Q1_0.gguf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 1.131
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This table is a size comparison and nothing more. The rows are different models, different base architectures, different training procedures and different benchmarks, so it says nothing about which one is better. We have not inspected the Bonsai tensor layouts, and we do not know which of their tensors, if any, are kept at higher precision. We also have not tested whether any of these files runs well on a specific phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the quality cost?
&lt;/h2&gt;

&lt;p&gt;The authors report WikiText-2 perplexity across model families, with STBLLM, a sub-1-bit baseline, as the comparison. For Llama2-7B (paper Table 1), LittleBit keeps perplexity within a factor of three of FP16 all the way down to 0.1 BPW, while STBLLM collapses at 0.3 BPW:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D900%26h%3D450%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522line%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25220.8%2522%252C%25220.7%2522%252C%25220.55%2522%252C%25220.3%2522%252C%25220.1%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522LittleBit%2520%2528QAT%2529%2522%252C%2522data%2522%253A%255B9.53%252C9.85%252C10.47%252C12.0%252C15.92%255D%252C%2522borderColor%2522%253A%2522%25230ca678%2522%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522STBLLM%2520%2528no%25200.1%2520result%2520reported%2529%2522%252C%2522data%2522%253A%255B13.81%252C19.17%252C30.67%252C1800%255D%252C%2522borderColor%2522%253A%2522%2523e03131%2522%252C%2522backgroundColor%2522%253A%2522%2523e03131%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522FP16%2520%25285.47%2529%2522%252C%2522data%2522%253A%255B5.47%252C5.47%252C5.47%252C5.47%252C5.47%255D%252C%2522borderColor%2522%253A%2522%2523495057%2522%252C%2522borderDash%2522%253A%255B8%252C6%255D%252C%2522fill%2522%253Afalse%252C%2522pointRadius%2522%253A0%252C%2522borderWidth%2522%253A3%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-7B%2520WikiText-2%2520perplexity%2520vs%2520effective%2520bits%2520per%2520weight%2520%2528paper%2520Table%25201%252C%2520log%2520scale%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522type%2522%253A%2522logarithmic%2522%252C%2522ticks%2522%253A%257B%2522min%2522%253A1%252C%2522max%2522%253A3000%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A16%257D%252C%2522scaleLabel%2522%253A%257B%2522display%2522%253Atrue%252C%2522labelString%2522%253A%2522effective%2520bits%2520per%2520weight%2522%252C%2522fontSize%2522%253A14%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522display%2522%253Afalse%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D900%26h%3D450%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522line%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25220.8%2522%252C%25220.7%2522%252C%25220.55%2522%252C%25220.3%2522%252C%25220.1%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522LittleBit%2520%2528QAT%2529%2522%252C%2522data%2522%253A%255B9.53%252C9.85%252C10.47%252C12.0%252C15.92%255D%252C%2522borderColor%2522%253A%2522%25230ca678%2522%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522STBLLM%2520%2528no%25200.1%2520result%2520reported%2529%2522%252C%2522data%2522%253A%255B13.81%252C19.17%252C30.67%252C1800%255D%252C%2522borderColor%2522%253A%2522%2523e03131%2522%252C%2522backgroundColor%2522%253A%2522%2523e03131%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522FP16%2520%25285.47%2529%2522%252C%2522data%2522%253A%255B5.47%252C5.47%252C5.47%252C5.47%252C5.47%255D%252C%2522borderColor%2522%253A%2522%2523495057%2522%252C%2522borderDash%2522%253A%255B8%252C6%255D%252C%2522fill%2522%253Afalse%252C%2522pointRadius%2522%253A0%252C%2522borderWidth%2522%253A3%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-7B%2520WikiText-2%2520perplexity%2520vs%2520effective%2520bits%2520per%2520weight%2520%2528paper%2520Table%25201%252C%2520log%2520scale%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522type%2522%253A%2522logarithmic%2522%252C%2522ticks%2522%253A%257B%2522min%2522%253A1%252C%2522max%2522%253A3000%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A16%257D%252C%2522scaleLabel%2522%253A%257B%2522display%2522%253Atrue%252C%2522labelString%2522%253A%2522effective%2520bits%2520per%2520weight%2522%252C%2522fontSize%2522%253A14%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522display%2522%253Afalse%257D%257D%257D%257D" alt="Llama2-7B perplexity versus bits per weight, LittleBit and STBLLM" width="1800" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Llama2-7B WikiText-2 perplexity&lt;/th&gt;
&lt;th&gt;FP16&lt;/th&gt;
&lt;th&gt;0.55 BPW&lt;/th&gt;
&lt;th&gt;0.3 BPW&lt;/th&gt;
&lt;th&gt;0.1 BPW&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LittleBit&lt;/td&gt;
&lt;td&gt;5.47&lt;/td&gt;
&lt;td&gt;10.47 (1.9x)&lt;/td&gt;
&lt;td&gt;12.00 (2.2x)&lt;/td&gt;
&lt;td&gt;15.92 (2.9x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STBLLM&lt;/td&gt;
&lt;td&gt;5.47&lt;/td&gt;
&lt;td&gt;30.67&lt;/td&gt;
&lt;td&gt;about 1,800&lt;/td&gt;
&lt;td&gt;not reported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The multiplier grows with model difficulty. At 0.1 BPW the table gives 15.09 against 4.88 for Llama2-13B (3.1x), 26.11 against 6.10 for Llama3-8B (4.3x) and 35.26 against 6.34 for QwQ-32B (5.6x). The authors themselves write that "a quantization cliff appears between 0.3 and 0.1 BPW" and recommend 0.3 to 0.55 BPW as the sweet spot.&lt;/p&gt;

&lt;p&gt;Perplexity is a gentle metric. Zero-shot accuracy is harsher (paper Table 2, Llama2-7B, average over seven tasks):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522FP16%2522%252C%2522LittleBit%25200.55%2522%252C%2522STBLLM%25200.55%2522%252C%2522LittleBit%25200.3%2522%252C%2522STBLLM%25200.3%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B62.97%252C47.26%252C44.29%252C45.2%252C35.78%255D%252C%2522backgroundColor%2522%253A%255B%2522%2523495057%2522%252C%2522%25230ca678%2522%252C%2522%2523e03131%2522%252C%2522%25230ca678%2522%252C%2522%2523e03131%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-7B%2520zero-shot%2520average%2520over%25207%2520tasks%252C%2520%2525%2520%2528paper%2520Table%25202%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A80%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A14%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A16%252C%2522weight%2522%253A%2522bold%2522%257D%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522FP16%2522%252C%2522LittleBit%25200.55%2522%252C%2522STBLLM%25200.55%2522%252C%2522LittleBit%25200.3%2522%252C%2522STBLLM%25200.3%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B62.97%252C47.26%252C44.29%252C45.2%252C35.78%255D%252C%2522backgroundColor%2522%253A%255B%2522%2523495057%2522%252C%2522%25230ca678%2522%252C%2522%2523e03131%2522%252C%2522%25230ca678%2522%252C%2522%2523e03131%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Llama2-7B%2520zero-shot%2520average%2520over%25207%2520tasks%252C%2520%2525%2520%2528paper%2520Table%25202%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A80%252C%2522fontSize%2522%253A14%257D%257D%255D%252C%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A14%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A16%252C%2522weight%2522%253A%2522bold%2522%257D%257D%257D%257D%257D" alt="Llama2-7B zero-shot average accuracy for FP16, LittleBit and STBLLM" width="1600" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FP16 averages 62.97%. LittleBit at 0.55 BPW averages 47.26% and at 0.3 BPW 45.20%. Look at the individual tasks at 0.3 BPW and the picture is stark: WinoGrande, a two-choice task, scores 51.30% against a chance level of 50%, and ARC-Challenge, a four-choice task, scores 25.09% against a chance level of 25%. Tasks that need broader knowledge or reasoning are close to guessing. PIQA, at 65.83% against 78.12% for FP16, and BoolQ, at 61.80% against 71.37%, retain more.&lt;/p&gt;

&lt;p&gt;Two caveats on how to read these numbers. First, the training data includes WikiText-2 (presumably its training split), and WikiText-2 perplexity is the headline metric, so the perplexity figures are partly in-distribution for the training run. The paper says it follows the training protocol of an earlier binarization paper, but the setup still flatters perplexity compared with a held-out domain. Second, the zero-shot tasks are common-sense multiple choice benchmarks. They tell you nothing about long-context behavior, tool calling or code, which are what most on-device assistants need.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the 11.6x speedup, and what is it not?
&lt;/h2&gt;

&lt;p&gt;The paper reports a custom 1-bit GEMV CUDA kernel running a single Llama2-70B MLP layer (8,192 x 28,672) on an NVIDIA A100, peaking at 11.6x over an optimized FP16 baseline at 0.1 BPW. That is a kernel micro-benchmark on a data-center GPU.&lt;/p&gt;

&lt;p&gt;The authors add that "the discrepancy between theoretical computational gains and practical latency is likely attributable to memory access dominance during small-batch inference" and that the kernel "has not yet reached the optimization level of industry-standard libraries." They list hardware co-design for NPUs as future work. So there is no published number for end-to-end tokens per second on a phone, and you should not infer one from 11.6x.&lt;/p&gt;

&lt;p&gt;The authors also publish a code repository, &lt;code&gt;SamsungLabs/LittleBit&lt;/code&gt;, whose description says it contains the NeurIPS 2025 implementation and the follow-up LittleBit-2. That follow-up, arXiv 2603.00042, says its geometric preconditioning "establishes a new state-of-the-art in the sub-1-bit regime" from 1 down to 0.1 bits per parameter and matches the fidelity of leading 1-bit baselines. We have not read its tables, so we make no claim about its numbers here.&lt;/p&gt;

&lt;h2&gt;
  
  
  When does this matter for an edge deployment?
&lt;/h2&gt;

&lt;p&gt;Our reading, which is an opinion and not a measurement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If your budget is a few hundred megabytes of weights&lt;/strong&gt;, the 0.3 to 0.55 BPW range is where the authors' own data suggests the trade is defensible. It pairs with a use case that tolerates a large quality gap, such as a classifier, a router or a drafter, and not with open-ended chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your target is a phone with 8 to 12 GB of RAM&lt;/strong&gt;, a 4-bit or 2-bit file of a stronger model is likely the better starting point, because the quality gap at 0.1 BPW is large and the runtime stack for factorized binary weights is not mature. Measure on your own tasks before choosing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you are comparing quantization headlines&lt;/strong&gt;, convert every claim to file-level bits per parameter first. It takes two lines of Python, and it turns marketing numbers into numbers that predict your RAM bill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the limits of this analysis?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We did not run LittleBit or any Bonsai model. Quality numbers are the authors' own, from the arXiv HTML of the paper (v5, February 2026).&lt;/li&gt;
&lt;li&gt;Our file-size reconstruction uses public Llama-2 shapes and assumes every block linear layer sits exactly at the nominal rate. It is within 4% of the paper, and the gap is unexplained.&lt;/li&gt;
&lt;li&gt;Table 1 mixes Llama (first generation) and Llama2 columns. We used the Llama2-7B and Llama2-13B columns, which the paper's own text confirms for the 12.00 and 15.92 figures.&lt;/li&gt;
&lt;li&gt;The Bonsai comparison is file size only. We did not verify press figures about those models beyond what Hugging Face metadata shows.&lt;/li&gt;
&lt;li&gt;The paper's license is CC BY-NC-ND 4.0, so we summarize and cite and do not reproduce its tables beyond the figures quoted above.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does 0.1 bits per weight mean for LittleBit?&lt;/strong&gt;&lt;br&gt;
It is the average cost per weight of the quantized transformer blocks, counting sign bits and FP16 scales, after replacing each matrix with two rank-r binary factorizations. It does not include the embedding table and output head, which stay in FP16.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How big is Llama2-13B with LittleBit at 0.1 BPW?&lt;/strong&gt;&lt;br&gt;
0.84 GB according to the paper, against 26.06 GB in FP16. That is 31x smaller, and about 0.52 bits per parameter for the whole file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does LittleBit need training?&lt;/strong&gt;&lt;br&gt;
Yes. It is quantization-aware training with distillation, initialized from an SVD of the original weights, using WikiText-2 and C4 data for 5 epochs at sequence length 2048 in the authors' setup. It is not a post-training step you can run in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much accuracy is lost at 0.1 bits per weight?&lt;/strong&gt;&lt;br&gt;
Perplexity on Llama2-7B rises from 5.47 to 15.92. At 0.3 BPW, zero-shot WinoGrande and ARC-Challenge for Llama2-7B are at chance level. The authors call 0.3 to 0.55 BPW the sweet spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run it on a phone today?&lt;/strong&gt;&lt;br&gt;
We found no published phone benchmark. The reported 11.6x speedup is a single-layer kernel on an A100 GPU, and the authors state that the kernel is not yet at the level of industry-standard libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/lfm25-24b-a2b-on-your-own-hardware-the-ram-kv-cache-and-bandwidth-budget-2dbd"&gt;LFM2.5-24B-A2B on Your Own Hardware: The RAM, KV Cache and Bandwidth Budget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/4-bit-gguf-quality-for-moe-models-why-only-3b-of-180b-params-fire-and-how-to-prove-parity-16a9"&gt;4-bit GGUF Quality for MoE Models: Why Only 3B of 180B Params Fire, and How to Prove Parity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://arxiv.org/abs/2506.13771" rel="noopener noreferrer"&gt;LittleBit paper, arXiv 2506.13771&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2603.00042" rel="noopener noreferrer"&gt;LittleBit-2, arXiv 2603.00042&lt;/a&gt;, &lt;a href="https://github.com/SamsungLabs/LittleBit" rel="noopener noreferrer"&gt;SamsungLabs/LittleBit on GitHub&lt;/a&gt;, &lt;a href="https://huggingface.co/prism-ml/Bonsai-27B-gguf" rel="noopener noreferrer"&gt;prism-ml/Bonsai-27B-gguf&lt;/a&gt;, &lt;a href="https://huggingface.co/prism-ml/Ternary-Bonsai-27B-gguf" rel="noopener noreferrer"&gt;prism-ml/Ternary-Bonsai-27B-gguf&lt;/a&gt;, &lt;a href="https://huggingface.co/prism-ml/Ternary-Bonsai-2-27B-gguf" rel="noopener noreferrer"&gt;prism-ml/Ternary-Bonsai-2-27B-gguf&lt;/a&gt;, &lt;a href="https://startupfortune.com/samsungs-littlebit-squeezes-ai-models-to-a-tenth-of-a-bit-per-weight/" rel="noopener noreferrer"&gt;Startup Fortune coverage&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>edgeai</category>
      <category>quantization</category>
    </item>
    <item>
      <title>Put the Decision Model Inside the Agent Loop, Not Beside It</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Tue, 20 Oct 2026 01:26:40 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/put-the-decision-model-inside-the-agent-loop-not-beside-it-4o9f</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/put-the-decision-model-inside-the-agent-loop-not-beside-it-4o9f</guid>
      <description>&lt;h2&gt;
  
  
  The cost nobody budgets for
&lt;/h2&gt;

&lt;p&gt;Build an agent and count where the tokens go. A surprising share is not the work. It is the agent asking itself small questions.&lt;/p&gt;

&lt;p&gt;Is this tool call safe to run. Does this document answer the question. Should this go to a human. Is this output in the right format. Did the last step actually succeed.&lt;/p&gt;

&lt;p&gt;Each one is a yes, a pick, or a score. Each one currently costs a full generation: prompt in, reasoning out, parse the text, hope the format held. At a thousand of those a minute, the checking costs more than the task.&lt;/p&gt;

&lt;p&gt;So teams stop checking. They drop the safety gate, skip the retrieval relevance test, let the agent run unguarded. Not because they decided the checks were unnecessary, but because the checks were too expensive to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  A different shape of model
&lt;/h2&gt;

&lt;p&gt;A decision model answers without writing. Given the situation and a typed question, it returns a probability over the options in one forward pass.&lt;/p&gt;

&lt;p&gt;Three shapes cover nearly everything an agent asks itself:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shape&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;th&gt;In the loop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;yes or no&lt;/td&gt;
&lt;td&gt;Probability the statement holds&lt;/td&gt;
&lt;td&gt;Safety gate, retry decision, escalation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pick one&lt;/td&gt;
&lt;td&gt;A probability per option&lt;/td&gt;
&lt;td&gt;Routing, tool selection, triage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;score&lt;/td&gt;
&lt;td&gt;A probability per level&lt;/td&gt;
&lt;td&gt;Relevance, risk, confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing to parse. No format drift. No reasoning tokens to wait through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why calibration is the whole point
&lt;/h2&gt;

&lt;p&gt;Accuracy alone does not let you build a gate. A gate needs a threshold, and a threshold needs probabilities that mean what they say.&lt;/p&gt;

&lt;p&gt;If the model says 0.9 and is right nine times in ten, you can route everything above 0.9 automatically and send the rest to a human, and you can predict your error rate before shipping. If the model is accurate on average but its 0.9 means anything from 0.6 to 0.99, no threshold is safe and you are back to reading the output yourself.&lt;/p&gt;

&lt;p&gt;This is why decision benchmarks score calibration, not just hit rate. Yes or no questions use Brier score. Choice questions score the probability mass on the correct option. Scales use expected score error. A model can top an accuracy table and still be useless as a gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it changes in practice
&lt;/h2&gt;

&lt;p&gt;Once checking is cheap you can check things you previously could not justify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gate every tool call instead of the risky-looking ones&lt;/li&gt;
&lt;li&gt;Score every retrieved passage for relevance instead of trusting the top k&lt;/li&gt;
&lt;li&gt;Ask after every step whether the step succeeded, instead of discovering failure at the end&lt;/li&gt;
&lt;li&gt;Keep a confidence number on every decision so that the escalation rule is a threshold, not a guess&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture shift is small. The decision model sits inside the loop as a function call rather than beside it as another agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the public boards
&lt;/h2&gt;

&lt;p&gt;Decision models are now measured on public leaderboards such as &lt;a href="https://huggingface.co/spaces/hotchpotch/S1MB-leaderboard" rel="noopener noreferrer"&gt;S1MB&lt;/a&gt;, which currently covers 197 models across 137 benchmarks and ranks by aggregating ranks rather than averaging scores.&lt;/p&gt;

&lt;p&gt;When comparing entries, read which column a claim quotes, the date it was read, and how many of the benchmarks the model was actually scored on. Most public boards mix self-reported and verified numbers.&lt;/p&gt;

&lt;p&gt;Open-weight options exist in this category, so the approach is testable on your own traffic before it is a procurement decision. That is the right way to evaluate it: run your own decision log through a candidate and see whether the probabilities hold up at the threshold you intend to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  A current reference point
&lt;/h2&gt;

&lt;p&gt;If you want a concrete model to test this with, the S1MB english-v1 board currently lists Darwin-27B-ZTC-v9 first on Borda score at 90.38 across 137 benchmarks and 197 models, read on 20 October 2026. It is Apache-2.0, so you can run your own decision log through it rather than taking the board's word for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hf download FINAL-Bench/Darwin-27B-ZTC-v9 systemone_config.json &lt;span class="nt"&gt;--local-dir&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
transformers serve FINAL-Bench/Darwin-27B-ZTC-v9 &lt;span class="nt"&gt;--decision-config&lt;/span&gt; systemone_config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same board publishes a task-average column where that model is second at 72.20. Quote the column you mean.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>LFM2.5-24B-A2B on Your Own Hardware: The RAM, KV Cache and Bandwidth Budget</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:46:56 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/lfm25-24b-a2b-on-your-own-hardware-the-ram-kv-cache-and-bandwidth-budget-2dbd</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/lfm25-24b-a2b-on-your-own-hardware-the-ram-kv-cache-and-bandwidth-budget-2dbd</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Liquid AI released LFM2.5-24B-A2B on Hugging Face this month: 23.97B total parameters, 2.45B active per token, 131,072-token context, GGUF on day one. For on-device use, three numbers decide whether it fits your hardware, and all three can be computed from &lt;code&gt;config.json&lt;/code&gt; and the GGUF file list instead of taken from a launch post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM floor: about 14.5 GB&lt;/strong&gt; for the Q4_K_M weights (4.85 bits per weight). A 24B MoE costs 24B of memory even though it computes like a 2B model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KV cache: 20 KiB per token in FP16&lt;/strong&gt;, because only 10 of 40 layers use attention. A full 128K context is 2.5 GiB, not the 10 GiB a plain transformer of this width would need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decode ceiling: about 67 tokens per second per 100 GB/s of memory bandwidth&lt;/strong&gt; at Q4_K_M, since each token streams roughly 1.5 GB of weights.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a budget calculation, not a benchmark. We did not run the model for this post. Everything below is derived from published files, and the one speed claim from the vendor is marked as theirs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D1000%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522Held%2520in%2520RAM%2520%2528total%252C%2520B%2520params%2529%2522%252C%2522Read%2520per%2520token%2520%2528active%252C%2520B%2520params%2529%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B23.97%252C2.45%255D%252C%2522backgroundColor%2522%253A%255B%2522%2523495057%2522%252C%2522%25230ca678%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522LFM2.5-24B-A2B%253A%252024B%2520to%2520hold%252C%25202.45B%2520to%2520read%2520per%2520token%2522%252C%2522fontSize%2522%253A26%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A30%252C%2522fontSize%2522%253A18%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A18%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522end%2522%252C%2522font%2522%253A%257B%2522size%2522%253A22%252C%2522weight%2522%253A%2522bold%2522%257D%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D1000%26h%3D420%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522Held%2520in%2520RAM%2520%2528total%252C%2520B%2520params%2529%2522%252C%2522Read%2520per%2520token%2520%2528active%252C%2520B%2520params%2529%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B23.97%252C2.45%255D%252C%2522backgroundColor%2522%253A%255B%2522%2523495057%2522%252C%2522%25230ca678%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522LFM2.5-24B-A2B%253A%252024B%2520to%2520hold%252C%25202.45B%2520to%2520read%2520per%2520token%2522%252C%2522fontSize%2522%253A26%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A30%252C%2522fontSize%2522%253A18%257D%257D%255D%252C%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522fontSize%2522%253A18%257D%257D%255D%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522end%2522%252C%2522font%2522%253A%257B%2522size%2522%253A22%252C%2522weight%2522%253A%2522bold%2522%257D%257D%257D%257D%257D" alt="24B total versus 2.45B active parameters" width="2000" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does a 24B model with 2.45B active parameters still need 14.5 GB of RAM?
&lt;/h2&gt;

&lt;p&gt;Mixture-of-experts models split compute from storage. The router picks 4 of 64 experts per layer for each token, so compute looks like a 2B model. But the router can pick any expert on the next token, so every expert has to be resident, or paged in from fast storage, to keep decoding smooth.&lt;/p&gt;

&lt;p&gt;The published files make this concrete. These are the GGUF sizes from the &lt;code&gt;LiquidAI/LFM2.5-24B-A2B-GGUF&lt;/code&gt; repository, with bits per weight computed against the 23,971,587,712 parameters in the GGUF metadata:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;File size&lt;/th&gt;
&lt;th&gt;Bits per weight&lt;/th&gt;
&lt;th&gt;Active weight bytes per token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QAD-Q4_0&lt;/td&gt;
&lt;td&gt;13.58 GB&lt;/td&gt;
&lt;td&gt;4.53&lt;/td&gt;
&lt;td&gt;1.39 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;14.53 GB&lt;/td&gt;
&lt;td&gt;4.85&lt;/td&gt;
&lt;td&gt;1.48 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;17.03 GB&lt;/td&gt;
&lt;td&gt;5.68&lt;/td&gt;
&lt;td&gt;1.74 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q6_K&lt;/td&gt;
&lt;td&gt;19.69 GB&lt;/td&gt;
&lt;td&gt;6.57&lt;/td&gt;
&lt;td&gt;2.01 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;25.49 GB&lt;/td&gt;
&lt;td&gt;8.51&lt;/td&gt;
&lt;td&gt;2.61 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BF16&lt;/td&gt;
&lt;td&gt;47.96 GB&lt;/td&gt;
&lt;td&gt;16.01&lt;/td&gt;
&lt;td&gt;4.90 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522QAD-Q4_0%2522%252C%2522Q4_K_M%2522%252C%2522Q5_K_M%2522%252C%2522Q6_K%2522%252C%2522Q8_0%2522%252C%2522BF16%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522GGUF%2520file%2520size%2520%2528GB%2529%2522%252C%2522data%2522%253A%255B13.58%252C14.53%252C17.03%252C19.69%252C25.49%252C47.96%255D%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522LFM2.5-24B-A2B%2520GGUF%2520file%2520sizes%2520%2528measured%252C%2520Hugging%2520Face%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A14%257D%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522QAD-Q4_0%2522%252C%2522Q4_K_M%2522%252C%2522Q5_K_M%2522%252C%2522Q6_K%2522%252C%2522Q8_0%2522%252C%2522BF16%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522GGUF%2520file%2520size%2520%2528GB%2529%2522%252C%2522data%2522%253A%255B13.58%252C14.53%252C17.03%252C19.69%252C25.49%252C47.96%255D%252C%2522backgroundColor%2522%253A%2522%25230ca678%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522LFM2.5-24B-A2B%2520GGUF%2520file%2520sizes%2520%2528measured%252C%2520Hugging%2520Face%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A14%257D%257D%257D%257D%257D" alt="GGUF file sizes by quantization" width="1600" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last column multiplies the 2.45B active parameters by the bits per weight. It is an approximation, because K-quants mix precisions per tensor, but it is close enough for sizing.&lt;/p&gt;

&lt;p&gt;Two things stand out. First, QAD-Q4_0 is the smallest 4-bit file. QAD in the file name points to quantization-aware distillation, which, if it works as the name suggests, would make it a better 4-bit default than a post-hoc K-quant, but the repository README is short and we did not find an accuracy table for it. Treat that as a hypothesis to test on your own task, not a claim. Second, going from Q4_K_M to Q8_0 costs 11 GB more RAM for a 1.76x increase in bits per weight. On a 16 GB machine that difference decides whether the model loads at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do the 2.45B active parameters actually go?
&lt;/h2&gt;

&lt;p&gt;You can reconstruct the active count from the config, which is a good habit before trusting any "A2B" label. From &lt;code&gt;config.json&lt;/code&gt;: hidden size 2048, MoE intermediate size 1536, 64 experts, top-4 routing, 40 layers of which 2 are dense, so 38 MoE layers.&lt;/p&gt;

&lt;p&gt;Assuming a SwiGLU expert has three projection matrices (gate, up, down):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;moe_inter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;experts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;moe_layers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;38&lt;/span&gt;
&lt;span class="n"&gt;per_expert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;moe_inter&lt;/span&gt;                      &lt;span class="c1"&gt;# 9,437,184 params
&lt;/span&gt;&lt;span class="n"&gt;all_experts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;per_expert&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;experts&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;moe_layers&lt;/span&gt;     &lt;span class="c1"&gt;# 22.95 B
&lt;/span&gt;&lt;span class="n"&gt;active_experts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;per_expert&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;moe_layers&lt;/span&gt;    &lt;span class="c1"&gt;# 1.43 B
&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;23_971_587_712&lt;/span&gt;
&lt;span class="n"&gt;always_on&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;all_experts&lt;/span&gt;                     &lt;span class="c1"&gt;# 1.02 B
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;always_on&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;active_experts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                   &lt;span class="c1"&gt;# 2.4548 B
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result, 2.4548B, matches the model card's 2.45B. That also tells us how the active budget splits: about 1.43B (58%) are the four selected experts, and about 1.02B (42%) are always-on weights: the attention and convolution blocks, the two dense feed-forward layers, and the tied 128,000-token embedding and output matrix.&lt;/p&gt;

&lt;p&gt;Why this matters on-device: the always-on 1.02B is read for every single token no matter what the router does. If you ever offload experts to slower storage, the always-on part is what you pin in fast memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  How big is the KV cache when 30 of 40 layers are convolutions?
&lt;/h2&gt;

&lt;p&gt;This is the quiet edge-AI feature of the architecture. The config's &lt;code&gt;layer_types&lt;/code&gt; list shows a repeating pattern of three &lt;code&gt;conv&lt;/code&gt; layers followed by one &lt;code&gt;full_attention&lt;/code&gt; layer, 30 convolution and 10 attention layers in total. Only attention layers keep a per-token KV cache. The convolution layers carry a small fixed-size state (&lt;code&gt;conv_L_cache&lt;/code&gt; is 3), which does not grow with context.&lt;/p&gt;

&lt;p&gt;With 8 KV heads and a head dimension of 64 (hidden size 2048 divided by 32 attention heads; the config has no explicit &lt;code&gt;head_dim&lt;/code&gt;, so this is our assumption), the FP16 cost per token is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 (K and V) x 10 attention layers x 8 KV heads x 64 dims x 2 bytes = 20,480 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Hybrid, 10 attention layers&lt;/th&gt;
&lt;th&gt;If all 40 layers were attention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;0.16 GiB&lt;/td&gt;
&lt;td&gt;0.62 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;0.62 GiB&lt;/td&gt;
&lt;td&gt;2.50 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64K&lt;/td&gt;
&lt;td&gt;1.25 GiB&lt;/td&gt;
&lt;td&gt;5.00 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;2.50 GiB&lt;/td&gt;
&lt;td&gt;10.00 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522line%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25228K%2522%252C%252232K%2522%252C%252264K%2522%252C%2522128K%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Hybrid%253A%252010%2520attention%2520layers%2520%2528actual%2520config%2529%2522%252C%2522data%2522%253A%255B0.16%252C0.62%252C1.25%252C2.5%255D%252C%2522borderColor%2522%253A%2522%25230ca678%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522If%2520all%252040%2520layers%2520were%2520attention%2520%2528hypothetical%2529%2522%252C%2522data%2522%253A%255B0.62%252C2.5%252C5.0%252C10.0%255D%252C%2522borderColor%2522%253A%2522%2523e03131%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522FP16%2520KV%2520cache%2520%2528GiB%2529%2520by%2520context%2520length%252C%2520computed%2520from%2520config.json%2522%252C%2522fontSize%2522%253A18%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522display%2522%253Afalse%257D%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%257D%257D%255D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522line%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%25228K%2522%252C%252232K%2522%252C%252264K%2522%252C%2522128K%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Hybrid%253A%252010%2520attention%2520layers%2520%2528actual%2520config%2529%2522%252C%2522data%2522%253A%255B0.16%252C0.62%252C1.25%252C2.5%255D%252C%2522borderColor%2522%253A%2522%25230ca678%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%252C%257B%2522label%2522%253A%2522If%2520all%252040%2520layers%2520were%2520attention%2520%2528hypothetical%2529%2522%252C%2522data%2522%253A%255B0.62%252C2.5%252C5.0%252C10.0%255D%252C%2522borderColor%2522%253A%2522%2523e03131%2522%252C%2522fill%2522%253Afalse%252C%2522borderWidth%2522%253A4%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522FP16%2520KV%2520cache%2520%2528GiB%2529%2520by%2520context%2520length%252C%2520computed%2520from%2520config.json%2522%252C%2522fontSize%2522%253A18%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522display%2522%253Afalse%257D%257D%252C%2522scales%2522%253A%257B%2522yAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%257D%257D%255D%257D%257D%257D" alt="FP16 KV cache by context length" width="1600" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The right-hand column is hypothetical, a same-width model with attention in every layer, shown only to isolate what the hybrid design saves. At 128K the saving is 7.5 GiB, which is larger than the entire RAM headroom of many laptops. With &lt;code&gt;-ctk q8_0 -ctv q8_0&lt;/code&gt; in llama.cpp the cache shrinks further (about 1.33 GiB at 128K using 1.0625 bytes per element), though a quantized V cache generally requires flash attention to be enabled, so check your build.&lt;/p&gt;

&lt;p&gt;The convolution state is negligible: roughly 30 layers x 2048 channels x 3 positions x 2 bytes is about 0.35 MiB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Will it fit on my machine?
&lt;/h2&gt;

&lt;p&gt;Weights plus FP16 KV cache for Q4_K_M, before the operating system, the runtime's compute buffers, and anything else you have open:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device RAM&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Weights + KV&lt;/th&gt;
&lt;th&gt;Headroom&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 GiB&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;14.15 GiB&lt;/td&gt;
&lt;td&gt;1.85 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 GiB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;16.03 GiB&lt;/td&gt;
&lt;td&gt;-0.03 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24 GiB&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;14.15 GiB&lt;/td&gt;
&lt;td&gt;9.85 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24 GiB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;16.03 GiB&lt;/td&gt;
&lt;td&gt;7.97 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GiB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;16.03 GiB&lt;/td&gt;
&lt;td&gt;15.97 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest reading: on a 16 GiB machine this model is borderline even at 32K context, because 1.85 GiB of headroom has to cover the OS, the compute graph, and your application. In practice that means 24 GiB is the comfortable minimum for Q4_K_M at long context, and 16 GiB is a "close everything else" configuration, or a case for mmap with some paging. Phones with 8 to 12 GiB cannot hold these weights at all, which is why the smaller LFM2.5 siblings exist for that tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What speed should I expect? A bandwidth ceiling, not a promise
&lt;/h2&gt;

&lt;p&gt;Autoregressive decoding is bandwidth-bound: each new token must read every active weight from memory once. The ceiling is simply memory bandwidth divided by active bytes per token. For Q4_K_M that is 1.48 GB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;active_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.45e9&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;4.85&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;          &lt;span class="c1"&gt;# ~1.48e9 bytes per token
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bw_gbs&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bw_gbs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bw_gbs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;active_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# 50 -&amp;gt; 33.7, 100 -&amp;gt; 67.4, 200 -&amp;gt; 134.7, 400 -&amp;gt; 269.4 tokens/s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%252250%2520GB%2Fs%2522%252C%2522100%2520GB%2Fs%2522%252C%2522200%2520GB%2Fs%2522%252C%2522400%2520GB%2Fs%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Decode%2520ceiling%252C%2520tok%2Fs%2520%2528Q4_K_M%252C%2520illustrative%2529%2522%252C%2522data%2522%253A%255B33.7%252C67.4%252C134.7%252C269.4%255D%252C%2522backgroundColor%2522%253A%2522%25231c7ed6%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Bandwidth-bound%2520decode%2520ceiling%2520by%2520memory%2520bandwidth%2520%2528illustrative%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A14%257D%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D800%26h%3D400%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%252250%2520GB%2Fs%2522%252C%2522100%2520GB%2Fs%2522%252C%2522200%2520GB%2Fs%2522%252C%2522400%2520GB%2Fs%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Decode%2520ceiling%252C%2520tok%2Fs%2520%2528Q4_K_M%252C%2520illustrative%2529%2522%252C%2522data%2522%253A%255B33.7%252C67.4%252C134.7%252C269.4%255D%252C%2522backgroundColor%2522%253A%2522%25231c7ed6%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Bandwidth-bound%2520decode%2520ceiling%2520by%2520memory%2520bandwidth%2520%2528illustrative%2529%2522%252C%2522fontSize%2522%253A18%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522plugins%2522%253A%257B%2522datalabels%2522%253A%257B%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522font%2522%253A%257B%2522size%2522%253A14%257D%257D%257D%257D%257D" alt="Bandwidth-bound decode ceiling" width="1600" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bandwidth tiers are illustrative round numbers, not specific devices. Real throughput lands below the ceiling because of compute, KV reads, expert routing overhead, and cache effects, so treat these as upper bounds you can sanity-check measurements against.&lt;/p&gt;

&lt;p&gt;The vendor reports 184 tokens per second on an Apple M5 Max. We could not confirm which quantization was used for that figure from the model card. If it was a 4-bit-class format, 184 tokens per second times roughly 1.4 to 1.5 GB per token implies something like 255 to 270 GB/s of effective weight traffic. That is a consistency check on the claim, not a measurement of ours, and it suggests the number is plausible only on a high-bandwidth unified-memory machine, not on a typical thin laptop.&lt;/p&gt;

&lt;p&gt;Two caveats on the ceiling. It applies to decode only; during prompt processing many tokens are in flight, the router touches most experts, and the workload becomes compute-bound. And the model is a pure reasoning model: the chat template appends &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; to every assistant turn, so a visible answer is preceded by reasoning tokens. Cheap tokens are good, but you will generate many of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I run it with a tight memory budget?
&lt;/h2&gt;

&lt;p&gt;A starting point with llama.cpp, using flags that exist in the current server documentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;llama-server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-m&lt;/span&gt; LFM2.5-24B-A2B-Q4_K_M.gguf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; 32768 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-ctk&lt;/span&gt; q8_0 &lt;span class="nt"&gt;-ctv&lt;/span&gt; q8_0 &lt;span class="nt"&gt;-fa&lt;/span&gt; on &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jinja&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the weights do not fit in GPU memory, &lt;code&gt;--n-cpu-moe N&lt;/code&gt; keeps the expert weights of the first N layers in system RAM, and &lt;code&gt;--cpu-moe&lt;/code&gt; keeps all of them there. That maps well to the parameter split above: the 1.02B always-on weights stay on the accelerator, and the 1.43B-per-token expert traffic comes from RAM. Because only 4 of 64 experts are read per layer per token, the traffic per token is far smaller than the 14.5 GB resident size suggests. Measure it, because routing locality varies by workload.&lt;/p&gt;

&lt;p&gt;Generation settings from the model card: temperature 0.1, top_k 50, repetition penalty 1.05. Tool calls are emitted as Pythonic lists between &lt;code&gt;&amp;lt;|tool_call_start|&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;|tool_call_end|&amp;gt;&lt;/code&gt; tokens unless the system prompt asks for JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the limits?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We did not benchmark it.&lt;/strong&gt; The numbers here are arithmetic on published files. Quality on your task needs your own evaluation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model card says it is not recommended for knowledge-heavy tasks alone&lt;/strong&gt; and suggests pairing it with retrieval or web search. That fits the on-device agent role it targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The license is a custom &lt;code&gt;lfm1.0&lt;/code&gt; license&lt;/strong&gt;, listed as "other" on Hugging Face, not Apache 2.0 or MIT. Read the &lt;code&gt;LICENSE&lt;/code&gt; file before shipping it in a product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor benchmark claims are the vendor's.&lt;/strong&gt; The LiveClaw score of 48.09 against 38.19 for Qwen3.6-35B-A3B comes from the model card, and we have not reproduced it.&lt;/li&gt;
&lt;li&gt;Head dimension 64 and the three-matrix expert structure are inferred from config values, not stated explicitly. The reconstruction landing on 2.4548B against the stated 2.45B supports the second one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much RAM does LFM2.5-24B-A2B need?&lt;/strong&gt;&lt;br&gt;
About 14.5 GB for the Q4_K_M GGUF weights plus roughly 0.6 GiB of FP16 KV cache at 32K context, so plan for 16 GiB at the very least and 24 GiB for comfort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is a 2B-active model not 2B in memory?&lt;/strong&gt;&lt;br&gt;
Because the router can select any of the 64 experts for the next token. All 23.97B parameters must be resident, or quickly pageable, even though only 2.45B are read per token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How big is the KV cache at 128K context?&lt;/strong&gt;&lt;br&gt;
2.5 GiB in FP16, from 20,480 bytes per token across 10 attention layers with 8 KV heads of dimension 64. About 1.33 GiB with a q8_0 cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What decode speed is realistic on a laptop?&lt;/strong&gt;&lt;br&gt;
The ceiling is about 67 tokens per second per 100 GB/s of memory bandwidth at Q4_K_M. Measured speed will be lower. Check your machine's memory bandwidth first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which GGUF should I pick?&lt;/strong&gt;&lt;br&gt;
Start with Q4_K_M, or try QAD-Q4_0 if you need 1 GB less and can test quality on your own prompts. Move up to Q5_K_M only if you have the RAM and see quality problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/offline-ai-on-a-phone-thread-pinning-lazy-loading-and-a-safety-gate-that-knows-when-to-stay-quiet-5a9k"&gt;Offline AI on a Phone: Thread Pinning, Lazy Loading, and a Safety Gate That Knows When to Stay Quiet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ginigen_ai_010d9180cbbdb1/4-bit-gguf-quality-for-moe-models-why-only-3b-of-180b-params-fire-and-how-to-prove-parity-16a9"&gt;4-bit GGUF Quality for MoE Models: Why Only 3B of 180B Params Fire, and How to Prove Parity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B" rel="noopener noreferrer"&gt;LFM2.5-24B-A2B model card and config&lt;/a&gt;, &lt;a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B-GGUF" rel="noopener noreferrer"&gt;GGUF repository&lt;/a&gt;, &lt;a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md" rel="noopener noreferrer"&gt;llama.cpp server documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>edgeai</category>
      <category>quantization</category>
    </item>
    <item>
      <title>사라진 명리 비기를 AI로 복원하다: 주명명리(宙明命理) 개발기</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Mon, 12 Oct 2026 10:29:04 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/sarajin-myeongri-bigireul-airo-bogweonhada-jumyeongmyeongrizhou-ming-ming-li-gaebalgi-dm3</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/sarajin-myeongri-bigireul-airo-bogweonhada-jumyeongmyeongrizhou-ming-ming-li-gaebalgi-dm3</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;지니젠AI가 만든 &lt;strong&gt;주명명리(宙明命理)&lt;/strong&gt; 는 AI로 복원한 한국식 사주 풀이 서비스입니다. 생년월일과 태어난 시간을 넣으면 정밀 만세력을 뽑고, 그 위에 성격, 재물, 직업, 인연, 건강, 대운, 올해 운세, 궁합까지 이야기로 풀어 줍니다. 모든 풀이는 "아주 매운 정곡 찌르기 → 명식 근거 → 공감 → 용기와 개운법" 4단 흐름으로 나옵니다. 무료로 바로 체험할 수 있습니다.&lt;/p&gt;

&lt;p&gt;링크: &lt;a href="https://ginigen-ai-saju.hf.space/" rel="noopener noreferrer"&gt;https://ginigen-ai-saju.hf.space/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  왜 만들었나
&lt;/h2&gt;

&lt;p&gt;명리학의 깊은 해석은 소수의 숙련자에게만 남아 있습니다. 좋은 풀이는 수십 년 경험에서 나오고, 흩어진 구결과 비기는 접근하기 어렵습니다. 우리는 이 간극을 AI로 메우려 했습니다. 고전의 틀(맹파 구결, 난강망 조후, 적천수 중화, 신살 비전)을 교차검증하고, 현대의 언어로 일관되게 풀어 주는 시스템을 만드는 것이 목표였습니다.&lt;/p&gt;

&lt;p&gt;핵심 질문은 하나였습니다. "사람이 사주를 볼 때 거치는 계산과 해석을, 틀리지 않게 자동화할 수 있는가."&lt;/p&gt;

&lt;h2&gt;
  
  
  만세력 엔진은 어떻게 동작하나
&lt;/h2&gt;

&lt;p&gt;풀이의 토대는 정확한 만세력입니다. 여기서 틀리면 그 위의 모든 해석이 무너집니다. 그래서 엔진은 다음을 직접 계산합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;사주 네 기둥(년월일시)의 간지와 절기 기반 월주 산정&lt;/li&gt;
&lt;li&gt;납음 60갑자, 지장간 삼기(여기, 중기, 정기)&lt;/li&gt;
&lt;li&gt;12신살, 귀인과 흉살, 합충형회파해&lt;/li&gt;
&lt;li&gt;삼기귀인(천상 갑무경, 지하 을병정, 인중 임계신) 같은 드문 귀격&lt;/li&gt;
&lt;li&gt;대운(양남음녀 순행과 역행, 대운수 산정)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;정확도 검증은 실제 전문 만세력 앱 결과와 수작업으로 대조하며 맞췄습니다. 같은 사주에는 같은 결과가 나오도록 명식에 고유 식별자를 부여해, 한 번 계산한 사주는 다시 쓸 수 있게 했습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  풀이는 어떻게 생성되나
&lt;/h2&gt;

&lt;p&gt;좋은 운세 서비스의 체감은 문체에서 갈립니다. 밋밋한 교과서체는 아무도 읽지 않습니다. 우리는 풀이를 네 박자로 설계했습니다.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;매운 정곡&lt;/strong&gt;: 읽는 순간 "이거 완전 내 얘기네" 하도록 정확히 찌른다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;근거&lt;/strong&gt;: 명식의 글자로 왜 그런 기질인지 납득시킨다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;공감&lt;/strong&gt;: "그러느라 힘들었겠다"고 안아 준다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;용기와 개운&lt;/strong&gt;: 그 기질을 강점으로 뒤집고, 오늘부터 할 실천 개운법을 쥐여 준다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;단정과 과장, 공포 조장은 금지입니다. 매운맛으로 시작하되 뒷맛은 따뜻하게 닫습니다. 독자는 수준을 고를 수 있습니다. 용어 없이 쉬운 길잡이, 용어와 근거를 함께 보는 탐구, 원전에 가까운 비전 세 단계입니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  서비스 아키텍처
&lt;/h2&gt;

&lt;p&gt;가볍고 재현 가능한 구조를 택했습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;백엔드는 FastAPI, 프런트는 정적 페이지 한 장&lt;/li&gt;
&lt;li&gt;만세력 계산은 파이썬 라이브러리 기반, 해석은 LLM 백엔드를 추상화해 호출&lt;/li&gt;
&lt;li&gt;같은 사주, 같은 장은 한 번만 생성하고 재사용(캐시)&lt;/li&gt;
&lt;li&gt;풀이는 탭으로 묶어, 사용자가 연 탭의 내용만 그때 생성(지연 생성)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;지연 생성은 중요한 선택이었습니다. 모든 장을 미리 만들면 비용과 지연이 큽니다. 사용자가 보는 탭만 만들면 평균 생성량이 크게 줄고, 같은 사주는 전 사용자가 한 번만 만든 결과를 공유합니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  X에서 댓글로 사주 보기
&lt;/h2&gt;

&lt;p&gt;서비스를 더 널리 퍼뜨리기 위해, X(옛 트위터)에 자동응답 봇을 붙였습니다. 사용자가 게시물에 "생년월일 더하기 태어난 시간 더하기 성별"을 댓글로 남기면, 봇이 그 자리에서 만세력 요약과 맛보기 풀이를 답글로 달아 줍니다.&lt;/p&gt;

&lt;p&gt;흐름은 이렇습니다.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;멘션을 주기적으로 확인&lt;/li&gt;
&lt;li&gt;자유 서식의 한국어에서 생년월일과 시간, 성별을 파싱(예: "1990년 1월 1일 오후 2시 남자")&lt;/li&gt;
&lt;li&gt;만세력과 맛보기 풀이 생성&lt;/li&gt;
&lt;li&gt;글자 수 한도 안에서 요약과 링크를 붙여 답글 게시&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;생년월일 파싱은 생각보다 까다롭습니다. "여명"처럼 여성을 뜻하는 표현, "02시"처럼 시만 적힌 경우, "생시 모름"까지 받아내야 실제 댓글을 놓치지 않습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  배운 점
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;토대가 먼저다.&lt;/strong&gt; 해석 품질을 올리기 전에 만세력이 100퍼센트 맞아야 한다. 계산 오류 하나가 모든 문장을 거짓으로 만든다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;문체가 제품이다.&lt;/strong&gt; 같은 데이터라도 네 박자 흐름으로 풀면 체감이 완전히 달라진다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;지연 생성이 비용을 가른다.&lt;/strong&gt; 사용자가 실제로 보는 것만 만들면 평균 비용이 떨어진다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;입력 파싱이 전파를 가른다.&lt;/strong&gt; SNS의 자유 서식을 폭넓게 받아내지 못하면 좋은 엔진도 사용자를 놓친다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;정확한가요?&lt;/strong&gt; 만세력 계산은 전문 앱 결과와 대조해 맞췄습니다. 해석은 고전의 경향을 현대어로 푼 것으로, 재미와 통찰을 위한 참고입니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;생시를 모르면 쓸 수 있나요?&lt;/strong&gt; 네. 생시 모름을 선택하면 시주 관련 해석은 단정 없이 유연하게 풀어 줍니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;비용이 드나요?&lt;/strong&gt; 무료로 체험할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;궁합도 되나요?&lt;/strong&gt; 상대의 생년월일을 넣으면 두 명식을 포개어 인연의 결을 봅니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;어떤 언어를 지원하나요?&lt;/strong&gt; 현재 한국어 중심입니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  지금 체험하기
&lt;/h2&gt;

&lt;p&gt;링크에서 생년월일을 넣고 바로 확인할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ginigen-ai-saju.hf.space/" rel="noopener noreferrer"&gt;https://ginigen-ai-saju.hf.space/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;재미와 통찰을 위한 서비스입니다. 운명을 단정하지 않습니다.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Zero-Token Decisions in the Browser: On-Device Multimodal Classification with EmbeddingGemma 2 and WebGPU</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:38:49 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/zero-token-decisions-in-the-browser-on-device-multimodal-classification-with-embeddinggemma-2-and-3keo</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/zero-token-decisions-in-the-browser-on-device-multimodal-classification-with-embeddinggemma-2-and-3keo</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Decide Live&lt;/strong&gt; is a static web page that turns a camera frame, a microphone window, an image or a line of text into a &lt;strong&gt;typed decision&lt;/strong&gt;, entirely in the browser. It runs a fine-tuned &lt;strong&gt;EmbeddingGemma 2&lt;/strong&gt; (Apache-2.0) through &lt;strong&gt;transformers.js on WebGPU&lt;/strong&gt;, generates &lt;strong&gt;zero tokens&lt;/strong&gt;, and never uploads anything. No server, no per-decision API call, weights cached once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live demo: &lt;a href="https://huggingface.co/spaces/FINAL-Bench/Decision-AI-Web" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/FINAL-Bench/Decision-AI-Web&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why a decision should not be a generation
&lt;/h2&gt;

&lt;p&gt;If a model needs to answer "is this egg fertile", "is this scene safe to proceed", or "which of these four states are we in", asking a chat model to write a sentence is the wrong tool. Generation is slow, non-deterministic, and every token is a chance to drift. A decision has a &lt;strong&gt;type&lt;/strong&gt;: a class, a yes or no, a score. You want that type directly.&lt;/p&gt;

&lt;p&gt;Decide Live produces it with an embedding model and a calibrated similarity, so the number of generated tokens is zero. This is the on-device form of what we call &lt;strong&gt;ZTC (Zero-Token Confidence)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a decision is computed
&lt;/h2&gt;

&lt;p&gt;Everything below is in the page and the model card, so you can reproduce it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Query embedding.&lt;/strong&gt; The media placeholders come first, then &lt;code&gt;task: classification | query: {question}&lt;/code&gt;, and &lt;code&gt;\nContext: {context}&lt;/code&gt; when a context is given. The model embeds the media and the text together in one pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option embeddings.&lt;/strong&gt; Each option is written as &lt;code&gt;title: none | text: {description}&lt;/code&gt;, embedded once and cached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pooling.&lt;/strong&gt; Mean pooling over the attention mask, then L2 normalization, giving a 768-dimensional unit vector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoring.&lt;/strong&gt; &lt;code&gt;P(option) = softmax(scale * cosine(query, option))&lt;/code&gt;. The scale is learned, 19.96 (a temperature near 0.05), shipped in &lt;code&gt;decision.json&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P(option_i) = softmax_i( 19.96 * cos(e_query, e_option_i) )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No decoding loop appears anywhere in that path. One forward pass of the encoder per card, then a dot product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The on-device stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;transformers.js 4.3.1&lt;/strong&gt; loads the model in a &lt;strong&gt;Web Worker&lt;/strong&gt; and returns embeddings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebGPU&lt;/strong&gt; runs the ONNX graphs, with a &lt;strong&gt;WASM (CPU)&lt;/strong&gt; fallback when WebGPU is absent.&lt;/li&gt;
&lt;li&gt;The ONNX files are shipped in &lt;code&gt;q4f16&lt;/code&gt; and in a &lt;strong&gt;portable &lt;code&gt;q4&lt;/code&gt;&lt;/strong&gt; build (4-bit weights with plain 8-bit gathers, so the same files also run on the WASM runtime, which lacks GatherBlockQuantized), plus a 4-bit audio encoder. fp16 and fp32 are omitted to fit the 1 GB Space limit.&lt;/li&gt;
&lt;li&gt;Weights download once and are cached by the browser. After that, decisions are local.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you can actually do with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live&lt;/strong&gt;: embed camera frames and score up to four decision cards, each with its own question, in the trained one-pass-per-card format. Each card shows probability bars, the current decision, and a confidence gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microphone or sound file&lt;/strong&gt;: the same cards over 2 second windows at 16 kHz mono; windows quieter than -55 dBFS are skipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single input&lt;/strong&gt;: one image, text, audio clip or short video, plus a question and 2 to 8 options written as &lt;code&gt;key: description&lt;/code&gt;, or a yes/no question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample tests&lt;/strong&gt;: 18 image tests with gold answers, run in the browser with an accuracy report and a comparison of prompt formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters for edge AI
&lt;/h2&gt;

&lt;p&gt;A decision that runs on the device is private by construction (camera frames and audio never leave the machine), free per call, and available offline after the first load. Pair that with the zero-token form and you can score &lt;strong&gt;every frame&lt;/strong&gt; or &lt;strong&gt;every audio window&lt;/strong&gt; without a cloud bill or a latency round trip. That is the shape of practical edge intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does anything get uploaded?&lt;/strong&gt;&lt;br&gt;
No. Camera frames, audio, images and text are processed on the device. Only the model weights are downloaded, once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What model is behind it?&lt;/strong&gt;&lt;br&gt;
A decision fine-tune of google/embeddinggemma-2 (Apache-2.0), served as ONNX and run with transformers.js on WebGPU or WASM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why zero tokens?&lt;/strong&gt;&lt;br&gt;
The decision is a softmax over cosine similarity between a query embedding and option embeddings. There is no text generation, so it is deterministic and cheap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need a GPU?&lt;/strong&gt;&lt;br&gt;
No. WebGPU is used when available for speed; otherwise it falls back to CPU (WASM), slower but working.&lt;/p&gt;




&lt;p&gt;Built by VIDRAFT / FINAL-Bench. Apache-2.0. Try it, then read the page source to see the whole decision path.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>webgpu</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Open Quantum Challenge (OQC): a reproducible, hardware-free quantum benchmark</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:08:55 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/open-quantum-challenge-oqc-a-reproducible-hardware-free-quantum-benchmark-1dig</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/open-quantum-challenge-oqc-a-reproducible-hardware-free-quantum-benchmark-1dig</guid>
      <description>&lt;p&gt;Run it on your own GPU. No quantum hardware required.&lt;/p&gt;

&lt;p&gt;The Open Quantum Challenge is a vendor neutral, fully reproducible benchmark for quantum computing methods. You download a frozen problem, solve it with any method on your GPU, and submit a prediction file. A private answer key scores every entry the same way, so the ranking is reproducible and independent of hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two seasons, $1,000 prize each
&lt;/h2&gt;

&lt;p&gt;Season 1 is Quantum Simulation. Report the ground state energy of Fermi Hubbard systems (chains, ladders, plaquettes). Scored by mean absolute error against exact diagonalization. Deadline 28 February 2027.&lt;/p&gt;

&lt;p&gt;Season 2 is QEC Decoder. Decode a frozen rotated surface code dataset (distance 5, p = 0.005, circuit level noise). Scored by logical error rate. Deadline 31 March 2027.&lt;/p&gt;

&lt;p&gt;Prize per season: first $600, second $300, third $100.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to enter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Get the public inputs: FINAL-Bench/oqc-data on Hugging Face.&lt;/li&gt;
&lt;li&gt;Solve on your GPU. A reference harness is at github.com/final-bench/quantum-bench-harness.&lt;/li&gt;
&lt;li&gt;Sign in with Hugging Face on the challenge Space and submit your prediction JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your entry is auto scored within minutes and appears on the live leaderboard under your Hugging Face profile. Answers stay private, the harness and frozen problems are public, and the ladder is the same for everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Challenge: &lt;a href="https://huggingface.co/spaces/FINAL-Bench/open-quantum-challenge" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/FINAL-Bench/open-quantum-challenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Leaderboard: &lt;a href="https://huggingface.co/spaces/FINAL-Bench/quantum-bench-leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/FINAL-Bench/quantum-bench-leaderboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Data: &lt;a href="https://huggingface.co/datasets/FINAL-Bench/oqc-data" rel="noopener noreferrer"&gt;https://huggingface.co/datasets/FINAL-Bench/oqc-data&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Harness: &lt;a href="https://github.com/final-bench/quantum-bench-harness" rel="noopener noreferrer"&gt;https://github.com/final-bench/quantum-bench-harness&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;License: code MIT, benchmark data CC-BY-NC-4.0.&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>benchmark</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>One Self-Improving Model, Eleven Number-One Titles: What That Takes</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Sun, 11 Oct 2026 02:52:12 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/one-self-improving-model-eleven-number-one-titles-what-that-takes-3ehd</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/one-self-improving-model-eleven-number-one-titles-what-that-takes-3ehd</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;One self-improving model family now holds eleven public number-one benchmark records at the same time, across math, science, law, structured output, and decisions. The interesting part is not any single score, it is that a recursive self-improvement loop, bound to external verification, can push a whole spread of benchmarks to the top at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The eleven, at a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Math: AIME 2026 100%, HMMT 2026 100%&lt;/li&gt;
&lt;li&gt;Science: GPQA Diamond 94.44%&lt;/li&gt;
&lt;li&gt;Knowledge and multimodal: MMLU-Pro 88.12%, MMMU-Pro 79.48%&lt;/li&gt;
&lt;li&gt;Law: LEXam 68.94%, LEXam-hard 45.72%&lt;/li&gt;
&lt;li&gt;Extraction and structure: ExtractBench 90.29%, IFStruct 98.95%&lt;/li&gt;
&lt;li&gt;Decisions: MDPBench 83.65%, S1MB Borda 89.58&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why a self-improving loop gets here
&lt;/h2&gt;

&lt;p&gt;A model that only trains once is stuck with the data it saw. A self-improving (RSI) model runs a loop: it attempts problems, keeps the attempts that pass an external check, and trains on those. The reward is tied to verification outside the model, such as code execution, external evidence, or an answer key, not to the model grading itself. That is what keeps the loop from drifting into its own confident mistakes.&lt;/p&gt;

&lt;p&gt;When the loop is honest, improvement on one reasoning skill tends to carry to others, which is why the records span unrelated fields instead of one narrow test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision layer
&lt;/h2&gt;

&lt;p&gt;For typed decisions, the family uses a zero-token method: it reads the problem in one forward pass and applies a calibrated probe to produce the decision, generating no text. That is deterministic and cheap, which also makes it a good fit for running decisions close to where the data is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open to use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;S1MB number one model: &lt;a href="https://github.com/final-bench/s1mb" rel="noopener noreferrer"&gt;https://github.com/final-bench/s1mb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ZTC method: &lt;a href="https://github.com/final-bench/ztc" rel="noopener noreferrer"&gt;https://github.com/final-bench/ztc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;On-device models: &lt;a href="https://github.com/final-bench/pocket" rel="noopener noreferrer"&gt;https://github.com/final-bench/pocket&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many number-one records, and across what?&lt;/strong&gt;&lt;br&gt;
Eleven at once, across math, science, law, structured output, and decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a self-improving (RSI) model?&lt;/strong&gt;&lt;br&gt;
A model that runs a loop: it solves problems, keeps the solutions that pass an external check, and trains on them, so it improves without new human labels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why tie the loop to external verification?&lt;/strong&gt;&lt;br&gt;
If a model grades its own work, the loop can reinforce confident errors. External checks keep improvement real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it open?&lt;/strong&gt;&lt;br&gt;
Yes, the decision model and method are public under Apache-2.0.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>4-bit GGUF Quality for MoE Models: Why Only 3B of 180B Params Fire, and How to Prove Parity</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Tue, 06 Oct 2026 19:10:26 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/4-bit-gguf-quality-for-moe-models-why-only-3b-of-180b-params-fire-and-how-to-prove-parity-16a9</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/4-bit-gguf-quality-for-moe-models-why-only-3b-of-180b-params-fire-and-how-to-prove-parity-16a9</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Mixture-of-Experts (MoE) models look enormous on disk, but only a small slice of the weights does work on any single token. A 180B-parameter MoE can activate roughly 3B parameters per forward pass. That sparsity is exactly why 4-bit GGUF quantization behaves so differently on MoE than on a dense model, and why a mixed-precision scheme such as the UD-Q4_K_XL style graft can hold accuracy that a flat 4-bit cast would lose.&lt;/p&gt;

&lt;p&gt;The honest part of the story is not the compression ratio. It is verification. A quantized file that loads and produces fluent text is not proof of anything. You prove parity by scoring the quantized model on a held-out benchmark and comparing it to the full-precision baseline, number against number. In the example below, a 4-bit mixed graft reaches MMLU-Pro 87.65, equal to the full-precision baseline inside noise. This post shows the reasoning and the exact &lt;code&gt;llama.cpp&lt;/code&gt; commands to reproduce that check yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does only a fraction of an MoE model activate per token?
&lt;/h2&gt;

&lt;p&gt;A dense transformer runs every weight for every token. A Mixture-of-Experts transformer replaces the big feed-forward block in each layer with many smaller expert blocks plus a router. For each token the router picks a few experts (often two) and ignores the rest. The attention layers and the router still run every time, but the overwhelming majority of the feed-forward parameters sit idle on any given token.&lt;/p&gt;

&lt;p&gt;The practical consequence: the "180B" headline counts total parameters, while the compute and the active memory traffic track the much smaller active set, on the order of 3B. Two numbers describe an MoE and they answer different questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total parameters set the disk and RAM footprint you must store.&lt;/li&gt;
&lt;li&gt;Active parameters per token set the arithmetic you actually perform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quantization touches storage, so it operates on the total. Quality, however, is decided token by token on the active path. This gap is the whole reason MoE quantization is its own topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does 4-bit hurt MoE differently than a dense model?
&lt;/h2&gt;

&lt;p&gt;Two forces pull in opposite directions.&lt;/p&gt;

&lt;p&gt;First, MoE is more forgiving in aggregate. Averaged over a corpus, errors introduced into rarely used experts barely move the output, because those experts rarely fire. A dense model has no such luxury: every weight is on the hot path for every token, so quantization error accumulates everywhere at once.&lt;/p&gt;

&lt;p&gt;Second, MoE is more fragile in specific places. The router is tiny but decisive. If quantization noise flips a routing decision, the token is suddenly served by a different expert, and the error is not a small perturbation but a discrete change of computation. Shared or "always-on" experts, the attention projections, and the embedding and output layers are also on the hot path for every token, so error there behaves like dense-model error.&lt;/p&gt;

&lt;p&gt;So the right mental model is not "MoE tolerates 4-bit." It is "MoE has a small hot path that must stay precise and a large cold path that can be squeezed hard." A flat 4-bit cast ignores that structure and spends the same few bits on the router as on a seldom-touched expert. That is where quality quietly leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a UD-Q4_K_XL style mixed-precision graft preserve?
&lt;/h2&gt;

&lt;p&gt;Unsloth's "UD" (Unsloth Dynamic) GGUF variants, and similar mixed-precision schemes, treat the model as a graft rather than a uniform block. The idea is simple to state: keep the sensitive, always-active tensors at higher precision and push the rarely active expert tensors down to 4-bit. The &lt;code&gt;_K_XL&lt;/code&gt; suffix signals a K-quant layout with an extra-large share of high-precision tensors retained.&lt;/p&gt;

&lt;p&gt;In practice a graft like this tends to protect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The token embedding and the final output projection, which every token reads and writes.&lt;/li&gt;
&lt;li&gt;Attention query, key, value, and output projections, which run on every token in every layer.&lt;/li&gt;
&lt;li&gt;The router or gate weights, so routing decisions stay stable and tokens keep landing on the intended experts.&lt;/li&gt;
&lt;li&gt;Often the first and last transformer blocks, which empirically carry more than their share of the quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else, principally the large pool of expert feed-forward weights, goes to 4-bit. Because that pool is both the biggest contributor to file size and the least active per token, you capture most of the compression while leaving the hot path near full precision. The result is a file a fraction of the original size whose per-token behavior barely changed, which is the only kind of compression worth shipping to an edge device.&lt;/p&gt;

&lt;p&gt;The important caveat: which tensors you keep high is a model-specific choice, and vendors publish ready-made UD builds precisely so you do not have to guess. The reasoning above is the general principle, not a recipe to hand-tune.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you verify quality parity instead of trusting the quant?
&lt;/h2&gt;

&lt;p&gt;Here is the rule that matters: a quant is guilty until it passes a benchmark. Perplexity on a tiny sample and a few good-looking chat replies are not evidence. You need a discriminating, held-out benchmark scored identically on both the full-precision model and the quantized model, then you compare the scores.&lt;/p&gt;

&lt;p&gt;MMLU-Pro is a reasonable choice because it is broad, hard enough to separate models, and standard enough that the harness is well tested. The workflow is: build the quant, score the baseline, score the quant, and accept only if the gap is within benchmark noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: produce the quantized GGUF
&lt;/h3&gt;

&lt;p&gt;If you are starting from a full-precision GGUF and want to roll your own 4-bit file (rather than download a vendor UD build), &lt;code&gt;llama.cpp&lt;/code&gt; does the cast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Convert a Hugging Face checkpoint to a full-precision GGUF first (if needed)&lt;/span&gt;
python llama.cpp/convert_hf_to_gguf.py ./model-full &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--outfile&lt;/span&gt; model-f16.gguf &lt;span class="nt"&gt;--outtype&lt;/span&gt; f16

&lt;span class="c"&gt;# Quantize to a 4-bit K-quant. Q4_K_M is the common balanced target.&lt;/span&gt;
./llama-quantize model-f16.gguf model-Q4_K_M.gguf Q4_K_M

&lt;span class="c"&gt;# Inspect which tensors landed at which precision&lt;/span&gt;
./llama-gguf model-Q4_K_M.gguf | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"type|ffn|attn|token_embd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MoE specifically, prefer a published mixed-precision build (UD-Q4_K_XL or equivalent) when one exists, because the per-tensor precision map is the hard part and it has already been tuned for that architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: score both models on the same benchmark
&lt;/h3&gt;

&lt;p&gt;Run the identical harness against the baseline and the quant. Keep every knob fixed: same prompt template, same number of shots, same decoding settings, same subset of questions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Baseline: full-precision model&lt;/span&gt;
llama-perplexity &lt;span class="nt"&gt;--multiple-choice&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-m&lt;/span&gt; model-f16.gguf &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-bf&lt;/span&gt; mmlu-pro.bin &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ctx-size&lt;/span&gt; 4096 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;baseline.log

&lt;span class="c"&gt;# Candidate: 4-bit mixed graft&lt;/span&gt;
llama-perplexity &lt;span class="nt"&gt;--multiple-choice&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-m&lt;/span&gt; model-UD-Q4_K_XL.gguf &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-bf&lt;/span&gt; mmlu-pro.bin &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ctx-size&lt;/span&gt; 4096 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;quant.log

&lt;span class="c"&gt;# Compare the final accuracy lines&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"final"&lt;/span&gt; baseline.log quant.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: accept or reject on the number
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;baseline (f16)        MMLU-Pro: 87.6x
UD-Q4_K_XL (4-bit)    MMLU-Pro: 87.65
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Equal inside noise is a pass. If instead the quant drops several points, do not ship it: either the graft protected the wrong tensors, the router drifted, or the target precision was too aggressive for this model. The benchmark told you something the demo never would.&lt;/p&gt;

&lt;p&gt;A few guardrails so the comparison stays honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the random seed and the question subset so both runs see the same items.&lt;/li&gt;
&lt;li&gt;Report the margin, not just "it passed." A positive gap is not automatically a win if it is smaller than run-to-run variance.&lt;/li&gt;
&lt;li&gt;Run at least two passes per model. If the two baseline runs disagree by more than the baseline-to-quant gap, your measurement is too noisy to conclude anything.&lt;/li&gt;
&lt;li&gt;Beware caches and warm-up effects that help one run and not the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When is 4-bit MoE the right call, and when is it not?
&lt;/h2&gt;

&lt;p&gt;It shines when the total parameter count is what blocks you (you cannot fit the file in RAM) while the active path is small enough that the device can actually run it. That is the classic edge case: a big MoE that no consumer machine can hold at full precision becomes loadable at 4-bit because the cold experts shrink dramatically.&lt;/p&gt;

&lt;p&gt;It is the wrong call when the model is dense, when you need the last fraction of a point on a sensitive task, or when you have not budgeted time to verify. The compression is free; the confidence is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does a smaller GGUF always mean lower quality?&lt;/strong&gt;&lt;br&gt;
No. File size tracks total parameters, but MoE quality is decided on the small active path. A mixed-precision graft can shrink the file a lot while keeping the active path near full precision, so a much smaller file can score the same on a held-out benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between Q4_K_M and a UD-Q4_K_XL style build?&lt;/strong&gt;&lt;br&gt;
Q4_K_M applies a mostly uniform 4-bit K-quant. A UD-Q4_K_XL style build keeps more of the sensitive, always-active tensors (embeddings, attention, router) at higher precision and pushes only the rarely active experts to 4-bit, which protects quality on MoE at a similar overall size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not just read the perplexity number?&lt;/strong&gt;&lt;br&gt;
Perplexity on a small sample is a weak proxy and can look fine while task accuracy slips. A discriminating multiple-choice benchmark like MMLU-Pro, scored identically on both models, is far harder to fool and tells you whether real task behavior survived.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How close is close enough to call it parity?&lt;/strong&gt;&lt;br&gt;
Within the benchmark's own run-to-run noise. Score each model at least twice. If the baseline-to-quant gap is smaller than the spread between two baseline runs, treat it as equal. Report the actual margin rather than a pass or fail label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just download a vendor quant instead of making my own?&lt;/strong&gt;&lt;br&gt;
Usually yes, and for MoE it is often the better choice, because the per-tensor precision map is model specific and tuning it is the hard part. Still run the verification step yourself: trust the build, but confirm the number on your own harness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this apply to dense models too?&lt;/strong&gt;&lt;br&gt;
The verification workflow applies to everything. The sparsity argument does not: dense models run every weight on every token, so 4-bit error accumulates across the whole network and there is no large cold path to squeeze cheaply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Running a 180B Model on a Laptop With No GPU: How 4-bit GGUF Keeps Full Accuracy&lt;/li&gt;
&lt;li&gt;Offline AI on a Phone: Thread Pinning, Lazy Loading, and a Safety Gate That Knows When to Stay Quiet&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>quantization</category>
      <category>edgeai</category>
    </item>
    <item>
      <title>Building an AI That Refuses to Say "Safe": Reliability Engineering for an Offline Disaster App</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:12:57 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/building-an-ai-that-refuses-to-say-safe-reliability-engineering-for-an-offline-disaster-app-4eel</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/building-an-ai-that-refuses-to-say-safe-reliability-engineering-for-an-offline-disaster-app-4eel</guid>
      <description>&lt;p&gt;Most AI reliability writing assumes a network. You call a bigger model to double-check, you log to a server, you push a hotfix when something goes wrong. A disaster app breaks every one of those assumptions. By the time someone opens it, the cell tower may be rubble and the phone may be in airplane mode for the next two days. There is no bigger model to call, no server to log to, and no hotfix that will arrive in time.&lt;/p&gt;

&lt;p&gt;This post is about the engineering we did for HeliGO, an offline disaster and distress app built around an on-device 4B model. The runtime side (thread pinning and lazy loading on a phone) was covered earlier in this series. Here I want to focus on the harder problem: how do you make a small model's answers trustworthy when a wrong answer can get someone killed and nobody is online to catch it?&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HeliGO runs entirely on-device in airplane mode: maps, contour lines, altitude, compass, rescue coordinates, and an AI chat, with no network call at any point.&lt;/li&gt;
&lt;li&gt;The model is Edge-4B-TELL, built on Gemma-4 E4B, small enough to run on a phone chip.&lt;/li&gt;
&lt;li&gt;Safety is not a prompt. It is a 3-stage gate around the model: block fatal outputs, substitute official guidance text, or refuse.&lt;/li&gt;
&lt;li&gt;The gate is asymmetric on purpose. It never says a thing is safe to eat, but it always warns when something is poisonous.&lt;/li&gt;
&lt;li&gt;Confidence comes from reading the model's hidden state (the TELL technique), not from asking the model how sure it is, because asking does not work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why "just prompt it to be careful" fails offline
&lt;/h2&gt;

&lt;p&gt;The obvious approach is a system prompt: "You are a disaster assistant. Never give dangerous advice. Say you are unsure when you are unsure." On a 4B model with no fallback, this is wishful thinking for two reasons.&lt;/p&gt;

&lt;p&gt;First, a prompt is a suggestion, not a constraint. A small model under distribution shift (a panicked, ungrammatical question about a mushroom in the dark) will still occasionally produce a confident, wrong, fatal answer. There is no second model downstream to catch it.&lt;/p&gt;

&lt;p&gt;Second, and this is the part that surprised us most, the model's own stated confidence is not just useless, it is inverted. When we asked the model to attach a confidence number to its answers, wrong answers tended to come with &lt;em&gt;higher&lt;/em&gt; stated confidence than right ones. Asking a model "are you sure?" and trusting the reply is worse than a coin flip in exactly the cases that matter.&lt;/p&gt;

&lt;p&gt;So the reliability layer cannot live inside the model's text output. It has to wrap the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-stage safety gate
&lt;/h2&gt;

&lt;p&gt;Every answer the model produces passes through three stages before it reaches the screen. Think of it as a decision pipeline, not a filter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model draft
   |
   v
[1] fatal-output block   -- is this a category that can kill if wrong?
   |  (if yes and risky) -&amp;gt; suppress, escalate to stage 2
   v
[2] official-text substitute -- is there a matching MOIS guideline?
   |  (if yes) -&amp;gt; answer with the official text, not the model's words
   v
[3] refuse               -- still not confident enough?
   |  (if yes) -&amp;gt; say "I am not sure", do not guess
   v
answer shown to user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stage 1, fatal-output block.&lt;/strong&gt; Some answer categories are life-or-death: "yes, you can eat this", "yes, this water is safe", "yes, go that way". For these, the model's confidence is irrelevant. If the content falls in a fatal category and carries any risk signal, it is suppressed regardless of how sure the model sounds. This is the direct consequence of the inverted-confidence finding: in the categories where being wrong is fatal, we do not let the model's certainty vote at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2, official-text substitution.&lt;/strong&gt; We packaged 75 official response guidelines from Korea's Ministry of the Interior and Safety (MOIS) on the device. When a question maps to one of them (earthquake, flood, wildfire, first aid, and so on), the app answers with the official text verbatim instead of the model's paraphrase. The model is still useful here: it does the matching and retrieval. But the words the user reads are the authoritative source, not a 4B paraphrase that might drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3, refuse.&lt;/strong&gt; If an answer is neither safely substitutable nor confidently verifiable, the app declines. "I am not sure" is a valid and often correct output for a disaster tool. A refusal costs the user a little time. A confident wrong answer can cost a life. The gate is built so refusal is the default failure mode, never a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  The asymmetry principle
&lt;/h2&gt;

&lt;p&gt;The gate is deliberately not symmetric, and this is the design decision I am most sure about.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The app never says "this is safe." It always says "this is poisonous" when it has reason to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reasoning is a straightforward expected-cost argument. Consider the two ways the app can be wrong about something edible:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;App says&lt;/th&gt;
&lt;th&gt;If app is wrong&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Edible plant&lt;/td&gt;
&lt;td&gt;"I cannot confirm this is safe"&lt;/td&gt;
&lt;td&gt;User stays hungry&lt;/td&gt;
&lt;td&gt;Low, recoverable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poisonous plant&lt;/td&gt;
&lt;td&gt;"This may be poisonous"&lt;/td&gt;
&lt;td&gt;User avoids safe food&lt;/td&gt;
&lt;td&gt;Low, recoverable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poisonous plant&lt;/td&gt;
&lt;td&gt;"This is safe to eat"&lt;/td&gt;
&lt;td&gt;User is poisoned&lt;/td&gt;
&lt;td&gt;Catastrophic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three of these outcomes are survivable. Only one is not. So the app is tuned to make the unsurvivable mistake nearly impossible, at the cost of being overly cautious in the harmless direction. The costs of silence are not equal on the two sides, so the gate is not equal either. We ship warnings for 12 venomous and poisonous species in the same spirit: a false alarm is cheap, a missed warning is not. Any edge safety system where errors have asymmetric cost should bias toward the cheap error.&lt;/p&gt;

&lt;h2&gt;
  
  
  TELL: reading the model instead of asking it
&lt;/h2&gt;

&lt;p&gt;Stages 1 and 3 both need a trustworthy confidence signal, and we already established that the model's spoken confidence is inverted. The fix is to stop asking.&lt;/p&gt;

&lt;p&gt;TELL reads the model's internal state while it produces an answer and derives a reliability estimate from that, rather than from any number the model writes in its text. The intuition: the computation a transformer performs on its way to an answer carries signal about whether that answer is well-grounded, and that signal is more honest than the self-report the model emits at the end. Internal state does not have an incentive to sound confident; the output text, apparently, does.&lt;/p&gt;

&lt;p&gt;I am not going to publish the thresholds or the exact internal signals we read, for the obvious reason that they are what makes the gate hard to game. The point for this article is architectural: the confidence check lives outside the token stream. We treat the model as an instrument to be read, not a witness to be interviewed.&lt;/p&gt;

&lt;p&gt;The TELL technique was released alongside the model. In HeliGO it currently backs the gate's suppress-or-refuse decisions, and a future update will surface low-confidence filtering more directly to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually ships on the device
&lt;/h2&gt;

&lt;p&gt;For an offline tool, "on-device" has to be literal. Everything the gate and the map need is packaged into the app so it works with the radio off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4,998 terrain tiles with elevation data, and contour lines that redraw automatically by zoom range&lt;/li&gt;
&lt;li&gt;16,568 mountain summit elevations&lt;/li&gt;
&lt;li&gt;1,255 shelter, medical, water, and fire facilities, plus nearest-high-ground routing for floods&lt;/li&gt;
&lt;li&gt;75 MOIS official response guidelines (the stage-2 substitution corpus)&lt;/li&gt;
&lt;li&gt;12 venomous and poisonous species warnings&lt;/li&gt;
&lt;li&gt;The Edge-4B-TELL model itself, for offline chat, photo identification, and voice input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this phones home. Location history in particular never leaves the device, which is both a privacy property and a reliability property: there is no network dependency to fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  H2: How do you make an offline AI trustworthy without a bigger model to check it?
&lt;/h2&gt;

&lt;p&gt;You move trust out of the model and into a deterministic wrapper. The model drafts and retrieves; a gate you control decides what reaches the user. Fatal categories are blocked on content, not on the model's confidence. Authoritative answers come from packaged official text. When neither applies, you refuse. The model never gets the final word on anything that can kill.&lt;/p&gt;

&lt;h2&gt;
  
  
  H2: Why not just use a larger model on-device?
&lt;/h2&gt;

&lt;p&gt;Because the phone is the budget. A 4B model is what runs in airplane mode on a consumer chip with room left for maps and rendering. The interesting claim of this project is not that a big model is safe, it is that a small model plus the right wrapper can be safe enough to ship for life-or-death use. The reliability came from architecture, not from parameter count.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does HeliGO send anything to a server?&lt;/strong&gt;&lt;br&gt;
No. Maps, contours, altitude, compass, rescue coordinates, and the AI chat all run on-device in airplane mode. Location history does not leave the phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the model?&lt;/strong&gt;&lt;br&gt;
Edge-4B-TELL, built on Google's Gemma-4 E4B, published on Hugging Face. It handles offline chat, photo identification, and voice input on the phone's own chip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does it never say something is safe to eat?&lt;/strong&gt;&lt;br&gt;
Because the cost of being wrong is asymmetric. A missed safe meal is hunger; a wrong "safe" is poisoning. The gate biases toward the recoverable error and only ever issues the poison warning side confidently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I trust the AI's confidence when it answers?&lt;/strong&gt;&lt;br&gt;
The app does not trust the model's stated confidence, and neither should you in general. Measured on this model, wrong answers tended to be stated more confidently than right ones. HeliGO derives confidence from the model's internal state (TELL) instead, outside the text it writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this a replacement for calling emergency services?&lt;/strong&gt;&lt;br&gt;
No. HeliGO does not replace rescue services. If you have any signal, call emergency services first. It is a tool for when you have no connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways for edge builders
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Put the safety logic outside the model. A prompt is not a constraint; a deterministic gate is.&lt;/li&gt;
&lt;li&gt;Do not trust self-reported confidence. Measure whether it is calibrated before you rely on it. It may be inverted.&lt;/li&gt;
&lt;li&gt;Make your error handling asymmetric when the costs are asymmetric. Bias toward the cheap mistake.&lt;/li&gt;
&lt;li&gt;Package everything. For a true offline tool, every datum the app needs must live on the device.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Further reading (same account):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline AI on a Phone: Thread Pinning, Lazy Loading, and a Safety Gate That Knows When to Stay Quiet&lt;/li&gt;
&lt;li&gt;Running a 180B Model on a Laptop With No GPU: How 4-bit GGUF Keeps Full Accuracy&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>edgeai</category>
      <category>llm</category>
      <category>android</category>
    </item>
    <item>
      <title>Running a 180B Model on a Laptop With No GPU: How 4-bit GGUF Keeps Full Accuracy</title>
      <dc:creator>GINIGEN AI</dc:creator>
      <pubDate>Tue, 06 Oct 2026 00:42:56 +0000</pubDate>
      <link>https://dev.to/ginigen_ai_010d9180cbbdb1/running-a-180b-model-on-a-laptop-with-no-gpu-how-4-bit-gguf-keeps-full-accuracy-31c9</link>
      <guid>https://dev.to/ginigen_ai_010d9180cbbdb1/running-a-180b-model-on-a-laptop-with-no-gpu-how-4-bit-gguf-keeps-full-accuracy-31c9</guid>
      <description>&lt;p&gt;A frontier-class model used to mean a rack of data-center GPUs. That assumption is what this post takes apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POCKET-Darwin-180B-GGUF&lt;/strong&gt; is a 4-bit build of Darwin-180B-RSI, a 180-billion-parameter model, packaged so it runs &lt;strong&gt;without a GPU&lt;/strong&gt;. It ships as GGUF on Hugging Face and on ModelScope. The headline numbers, all measured in October 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size:&lt;/strong&gt; 111 GB (4-bit GGUF, 4 files), down from 360 GB (BF16, 131 files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU only:&lt;/strong&gt; a single server CPU (16 threads) generates &lt;strong&gt;18.4 to 21.0 tokens/s&lt;/strong&gt;, peak memory 78.8 GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laptop:&lt;/strong&gt; an RTX 5060 Laptop (8 GB VRAM) with 32 GB RAM runs it at &lt;strong&gt;4.17 tokens/s&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mini PC:&lt;/strong&gt; a 128 GB-RAM mini PC holds the whole model in memory, no GPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy:&lt;/strong&gt; MMLU-Pro, 2,000 questions, paired comparison, &lt;strong&gt;87.65% original vs 87.65% quantized&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;A 180B mixture-of-experts model activates only about 3B parameters per token. Combine that sparsity with a 4-bit quantization that keeps the small fraction of the weights that actually changed during training at high precision, and you get a model that fits in laptop-class memory and still answers like the full model. You run it with llama.cpp in one command. This post explains why it works and how to reproduce it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does a 180B model fit on a laptop?
&lt;/h2&gt;

&lt;p&gt;Two things make this possible, and neither is magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, the architecture is sparse.&lt;/strong&gt; Darwin-180B is a mixture-of-experts (MoE) model: 512 expert sub-networks, of which only 10 are selected per token. Of the 180B total parameters, roughly &lt;strong&gt;3B are active for any given token&lt;/strong&gt;. The dense parts (attention, routing, embeddings) run every step; the expert weights are read on demand. llama.cpp can memory-map the file and let the operating system page expert tensors in and out, so you do not need all 111 GB resident at once. On a 128 GB mini PC the whole thing sits in RAM; on a 32 GB laptop the OS pages against the GGUF file on disk, which is why the laptop is slower but still runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, the quantization is selective.&lt;/strong&gt; The build starts from a community-verified 4-bit quantization of the base weights. On top of that, only the portion that the self-improvement training actually modified (about &lt;strong&gt;3% of total volume&lt;/strong&gt;) is kept at higher precision. You spend your bit budget where the signal is, not uniformly. That is the difference between "4-bit and lossy" and "4-bit and lossless on the benchmark."&lt;/p&gt;

&lt;h2&gt;
  
  
  Does 4-bit quantization hurt accuracy here?
&lt;/h2&gt;

&lt;p&gt;On the measured benchmark, no. The honest way to check quantization damage is a &lt;strong&gt;paired comparison&lt;/strong&gt;: same questions, same decoding, original versus quantized, item by item. On MMLU-Pro (2,000 questions) both the original and the 4-bit build scored &lt;strong&gt;87.65%&lt;/strong&gt;. Identical.&lt;/p&gt;

&lt;p&gt;That result is specific and worth reading carefully. It does not mean 4-bit is free in general. It means that for this model, on this benchmark, with a selective scheme that protects the trained delta, the drop is below the measurement's resolution. Quantization error concentrates in the weights that carry the most task-relevant signal, so protecting that 3% is what preserves the score.&lt;/p&gt;

&lt;p&gt;There is a second, subtler result. On SuperGPQA (1,000 graduate-level science questions, never used in training), the quantized POCKET build was compared against the same 4-bit quantization of its base model. POCKET scored &lt;strong&gt;61.55% vs 59.10%&lt;/strong&gt;, a 2.45-point gain that held as statistically significant, while using about &lt;strong&gt;13% fewer tokens per question&lt;/strong&gt;. The self-improvement training taught the model to commit to an answer instead of re-deriving it, and quantization preserved that behavior. A third-party developer reproduced this at the file level in a public thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you run POCKET-Darwin-180B-GGUF?
&lt;/h2&gt;

&lt;p&gt;You need a recent &lt;strong&gt;llama.cpp&lt;/strong&gt; build (b11048 or later), the four GGUF files (111 GB total), and enough memory to either hold or page the model. No cloud account, no GPU driver stack required for the CPU path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Build llama.cpp (b11048 or later)&lt;/span&gt;
git clone https://github.com/ggml-org/llama.cpp
&lt;span class="nb"&gt;cd &lt;/span&gt;llama.cpp
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;--config&lt;/span&gt; Release &lt;span class="nt"&gt;-j&lt;/span&gt;

&lt;span class="c"&gt;# 2. Download the GGUF (4 files, ~111 GB) from Hugging Face&lt;/span&gt;
&lt;span class="c"&gt;#    FINAL-Bench/POCKET-Darwin-180B-GGUF&lt;/span&gt;
&lt;span class="c"&gt;#    (any standard huggingface download works; place all parts&lt;/span&gt;
&lt;span class="c"&gt;#     in one directory so the loader finds the shards)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Run, CPU only, 16 threads&lt;/span&gt;
./build/bin/llama-cli &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-m&lt;/span&gt; ./POCKET-Darwin-180B-Q4.gguf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 16 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; 8192 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Explain mixture-of-experts routing in two sentences."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few practical notes from the measurements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Threads matter.&lt;/strong&gt; The server CPU result used 16 threads. Match &lt;code&gt;-t&lt;/code&gt; to your physical cores. Oversubscribing threads past your core count usually slows generation, not speeds it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory decides your path.&lt;/strong&gt; With 128 GB of RAM the model stays resident and you get the top of the range. With 32 GB the OS pages expert tensors from disk, so throughput drops to a few tokens per second. A fast NVMe SSD helps the paging path noticeably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context length costs memory too.&lt;/strong&gt; The 78.8 GB figure is peak at a working context. Raising &lt;code&gt;-c&lt;/code&gt; raises the KV-cache footprint on top of the weights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU offload is optional.&lt;/strong&gt; On the 8 GB laptop GPU, only a fraction of layers fit in VRAM, so most of the work still lands on CPU and RAM. The 4.17 tok/s number reflects that mixed path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When is a CPU-only 180B model actually the right call?
&lt;/h2&gt;

&lt;p&gt;Throughput is the honest tradeoff. 21 tok/s on a server CPU is fine for batch jobs, drafting, extraction, and agent steps that tolerate latency. 4 tok/s on a laptop is a developer convenience, not a chat product. If you need interactive speed at scale, a GPU still wins.&lt;/p&gt;

&lt;p&gt;Where the CPU path wins is &lt;strong&gt;where the data cannot leave the building&lt;/strong&gt;. An air-gapped server, a mini PC on a factory floor, a defense or finance or public-sector box with no outbound connection: there a model that runs entirely on local CPU and RAM, with weights you downloaded once, is not a compromise. It is the only option that clears the policy. Edge AI is often less about milliseconds and more about where the bytes are allowed to sit.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I run this in LM Studio or Ollama?&lt;/strong&gt;&lt;br&gt;
This post only verifies the &lt;strong&gt;llama.cpp&lt;/strong&gt; path (b11048 or later), which is the engine GGUF targets. Treat other runners as untested here until you confirm they load this specific build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need the full 111 GB in RAM?&lt;/strong&gt;&lt;br&gt;
No. With 128 GB you can keep it resident for best speed. With 32 GB the OS memory-maps the GGUF and pages expert tensors on demand, trading throughput for a smaller footprint. You do need the full 111 GB on disk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is the laptop so much slower than the server CPU?&lt;/strong&gt;&lt;br&gt;
Memory. The 32 GB laptop cannot hold the model, so it pages from disk, and only a few layers fit on the 8 GB GPU. The 16-thread server CPU with ample RAM keeps far more of the working set hot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is 4-bit always this lossless?&lt;/strong&gt;&lt;br&gt;
No, and do not generalize it. The 87.65% match is a measured paired result for this model and benchmark, enabled by keeping the trained delta (about 3% of the weights) at higher precision. Always verify your own quantization with a paired comparison rather than assuming parity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes the active parameter count so low?&lt;/strong&gt;&lt;br&gt;
The MoE router picks 10 of 512 experts per token, so roughly 3B of the 180B parameters do work on any single token. That sparsity is what makes CPU inference and on-demand expert loading practical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do I get it?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;huggingface.co/FINAL-Bench/POCKET-Darwin-180B-GGUF&lt;/code&gt; and &lt;code&gt;modelscope.cn/models/FINAL-Bench/POCKET-Darwin-180B-GGUF&lt;/code&gt;. The original is &lt;code&gt;huggingface.co/FINAL-Bench/Darwin-180B-RSI&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Earlier in this series: &lt;em&gt;Offline AI on a Phone: Thread Pinning, Lazy Loading, and a Safety Gate That Knows When to Stay Quiet&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measurements in this post are from October 2026 device testing. Quantization parity was checked with paired, same-question comparisons; treat quantization as model-specific and verify your own.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>edgeai</category>
      <category>quantization</category>
    </item>
  </channel>
</rss>
