<?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: Bhushan Kinge</title>
    <description>The latest articles on DEV Community by Bhushan Kinge (@cookies_c9dc8b91f33d29250).</description>
    <link>https://dev.to/cookies_c9dc8b91f33d29250</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%2F4141729%2F909d4b95-8e2e-4b75-b7da-d939a312a0a0.jpg</url>
      <title>DEV Community: Bhushan Kinge</title>
      <link>https://dev.to/cookies_c9dc8b91f33d29250</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cookies_c9dc8b91f33d29250"/>
    <language>en</language>
    <item>
      <title>We Tested a 35B LLM Against Typed-Decision Models on 12,000 Real RFQs—Confidence Changed the Winner</title>
      <dc:creator>Bhushan Kinge</dc:creator>
      <pubDate>Thu, 24 Sep 2026 19:39:35 +0000</pubDate>
      <link>https://dev.to/cookies_c9dc8b91f33d29250/we-tested-a-35b-llm-against-typed-decision-models-on-12000-real-rfqs-confidence-changed-the-winner-56hh</link>
      <guid>https://dev.to/cookies_c9dc8b91f33d29250/we-tested-a-35b-llm-against-typed-decision-models-on-12000-real-rfqs-confidence-changed-the-winner-56hh</guid>
      <description>&lt;p&gt;&lt;strong&gt;91.9%. 89.6%. 78.0%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those were the primary-class accuracies of a typed-decision API, a 35B mixture-of-experts LLM, and a 421M open-weight decision model on the same real classification job.&lt;/p&gt;

&lt;p&gt;But accuracy was not the result that changed the deployment decision.&lt;/p&gt;

&lt;p&gt;The decisive question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the model tell us when its answer is safe enough to automate—and when a human needs to look?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To find out, I compared &lt;strong&gt;Jev&lt;/strong&gt;, &lt;strong&gt;Qwen3.5-35B-A3B&lt;/strong&gt;, and &lt;strong&gt;Laya 421M&lt;/strong&gt; on 12,000 U.S. federal IT solicitations. The models were graded against behavioral evidence: what a reseller's sales team actually quoted.&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%2Fmay4gw66ez3cb51ze9q5.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%2Fmay4gw66ez3cb51ze9q5.png" alt="Headline classification benchmark results" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The complete pipeline, aggregate metrics, figures, experiment design, and runbook are open in &lt;a href="https://github.com/bhushankinge/jev-laya-classification-bench" rel="noopener noreferrer"&gt;jev-laya-classification-bench&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Privacy note:&lt;/strong&gt; The public repository contains aggregate results only. Solicitation samples, quote identifiers, gold-label files, and per-row predictions remain private.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The real job behind the benchmark
&lt;/h2&gt;

&lt;p&gt;A federal IT reseller receives solicitations from SEWP, GSA MAS, and GSA 2GIT. Every opportunity must be classified before it can move through the CRM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is being purchased: hardware, software, support, services, or something else?&lt;/li&gt;
&lt;li&gt;Is it a renewal, upgrade, replacement, or new purchase?&lt;/li&gt;
&lt;li&gt;What solution domain owns it?&lt;/li&gt;
&lt;li&gt;Does hardware come from distributor catalog SKUs, or does it require an OEM-configured build?&lt;/li&gt;
&lt;li&gt;Is the text insufficient, an RFI, or brand-name-only?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These decisions are operational. Hardware may trigger distributor price lookups. A configured build may need an engineer and an OEM portal. Software can require publisher authorization. Services go to a statement-of-work workflow.&lt;/p&gt;

&lt;p&gt;The goal was not to win a generic benchmark. It was to determine how much of this queue could be automated safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three very different model paths
&lt;/h2&gt;

&lt;p&gt;All three paths produced one shared label schema:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Execution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;TypeSafe System One, jev-1.13.0&lt;/td&gt;
&lt;td&gt;Hosted API with calibrated probabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen&lt;/td&gt;
&lt;td&gt;Qwen3.5-35B-A3B-FP8&lt;/td&gt;
&lt;td&gt;On-prem vLLM with structured JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laya&lt;/td&gt;
&lt;td&gt;Convai Laya, 421M parameters&lt;/td&gt;
&lt;td&gt;Open weights on an RTX 2000 Ada laptop GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jev and Laya received byte-identical typed-question bundles. Qwen received a strict JSON schema, and its answers were mapped onto the same taxonomy.&lt;/p&gt;

&lt;p&gt;All three labeled the 12,000-opportunity sample. Qwen produced 69 permanently malformed responses, leaving 11,931 rows in the all-source paired set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ground truth came from behavior, not a labeling exercise
&lt;/h2&gt;

&lt;p&gt;When a sales rep quoted an opportunity, the product types on the latest quote lines provided the composition label. That yielded 741 paired opportunities with a single unambiguous primary class.&lt;/p&gt;

&lt;p&gt;For fulfillment mode, configurator fingerprints and distributor information on quote lines produced 634 paired labels.&lt;/p&gt;

&lt;p&gt;This gold is useful because it reflects real downstream behavior, but it is not perfect truth. Quoted opportunities are a selected subset, Hardware represents 77% of the single-class rows, and the fulfillment labels include an unvalidated heuristic. Those limitations matter throughout the interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Primary accuracy&lt;/th&gt;
&lt;th&gt;Calibration error&lt;/th&gt;
&lt;th&gt;Auto-accepted at a bounded 95% precision target&lt;/th&gt;
&lt;th&gt;Fulfillment accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;91.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.049&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;65.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-35B-A3B&lt;/td&gt;
&lt;td&gt;89.6%&lt;/td&gt;
&lt;td&gt;n/a: three confidence levels&lt;/td&gt;
&lt;td&gt;not reached&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71.0%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laya 421M&lt;/td&gt;
&lt;td&gt;78.0%&lt;/td&gt;
&lt;td&gt;0.322&lt;/td&gt;
&lt;td&gt;not reached&lt;/td&gt;
&lt;td&gt;45.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jev beat the much larger LLM by 2.3 percentage points on the primary class. Laya's shipped defaults trailed by 13.9 points.&lt;/p&gt;

&lt;p&gt;Yet the biggest difference was not those two points between Jev and Qwen. It was calibration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confidence changed the winner
&lt;/h2&gt;

&lt;p&gt;Jev's expected calibration error was 0.049. At a confidence cutoff of 0.94, it accepted 641 of 741 gold rows—&lt;strong&gt;86.5% coverage with 96.7% observed precision&lt;/strong&gt;. The Wilson 95% lower bound remained at or above the 95% target along the cutoff envelope.&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%2Fbgfz4s8v1ypvsmua9snn.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%2Fbgfz4s8v1ypvsmua9snn.png" alt="Precision versus coverage" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen reported three prompt-defined confidence levels. Its “high” bucket covered 97.8% of rows, but precision was 90.1%, so no bucket reached the 95% target.&lt;/p&gt;

&lt;p&gt;Laya produced 705 distinct confidence values on 741 rows, but those scores were not ranked well enough to reach the target at any useful cutoff.&lt;/p&gt;

&lt;p&gt;That distinction is operationally enormous. A classifier that is slightly more accurate but badly calibrated still leaves you without a defensible automation boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nine prompt variants moved only five answers
&lt;/h2&gt;

&lt;p&gt;I tested nine Jev variants across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twelve independent presence questions&lt;/li&gt;
&lt;li&gt;One 12-way subclass choice&lt;/li&gt;
&lt;li&gt;Hierarchical subclass choices&lt;/li&gt;
&lt;li&gt;Title and description only&lt;/li&gt;
&lt;li&gt;Added structured line items&lt;/li&gt;
&lt;li&gt;An added 1,500-character attachment excerpt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All nine landed between &lt;strong&gt;91.2% and 91.9%&lt;/strong&gt; on the same 741 rows—676 to 681 correct.&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%2Fzhz7pfi2nxjt8pz13t7f.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%2Fzhz7pfi2nxjt8pz13t7f.png" alt="Nine Jev prompt and state variants" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The winner, A-S2, was chosen using a rule written before the experiments: accuracy first, then coverage at the bounded precision cutoff, then the cheaper input.&lt;/p&gt;

&lt;p&gt;The practical lesson was unexpected: elaborate question structure and a small attachment excerpt did not measurably improve this top-level task. The question bundle itself consumed most of the tokens, and the tested attachment excerpt existed on only 5.6% of rows.&lt;/p&gt;

&lt;p&gt;That is not proof that attachments never help. It is evidence that this particular excerpt strategy did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  One queueing rule changed automation from 26.6% to 91.9%
&lt;/h2&gt;

&lt;p&gt;The original design sent every row with any raised flag to human review. One flag—brand-name-only—fired on more than half the dataset.&lt;/p&gt;

&lt;p&gt;In the gate simulation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Auto-classified&lt;/th&gt;
&lt;th&gt;Primary precision on scored accepted rows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Any flag forces review&lt;/td&gt;
&lt;td&gt;26.6%&lt;/td&gt;
&lt;td&gt;93.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record flags as attributes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;91.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93.8%&lt;/strong&gt;&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F59wvswe0xoz9b1uii0n5.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%2F59wvswe0xoz9b1uii0n5.png" alt="Automation gate simulation" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The stricter rule removed almost two thirds of the volume from automation and bought no measurable precision. When flags became attributes instead of automatic blockers, the remaining review queue was dominated by genuine Jev–Qwen disagreements.&lt;/p&gt;

&lt;p&gt;This was one of the most useful results in the study: &lt;strong&gt;workflow policy can matter more than another point of model accuracy.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fulfillment mode remained hard for everyone
&lt;/h2&gt;

&lt;p&gt;Qwen led fulfillment-mode accuracy at 71.0%, followed by Jev at 65.0% and Laya at 45.7%.&lt;/p&gt;

&lt;p&gt;That still fell far short of the operational target. Configured-build precision ranged from 19% to 36%, and the mixed category was effectively unsolved.&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%2Fou5iqady6kfjlsodun8g.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%2Fou5iqady6kfjlsodun8g.png" alt="Per-class F1 for composition and fulfillment" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The likely reason is structural: the distinction between distributor SKUs and an OEM-configured build often lives inside a bill of materials, configurator quote, or spreadsheet attachment—not in the notice text.&lt;/p&gt;

&lt;p&gt;There is a second uncertainty: the fulfillment gold itself uses an unvalidated “eight or more lines from one OEM” heuristic. Human validation is the next required experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened with open-weight Laya?
&lt;/h2&gt;

&lt;p&gt;Laya's 78.0% result describes &lt;strong&gt;the shipped defaults on this task&lt;/strong&gt;, not the model's ceiling.&lt;/p&gt;

&lt;p&gt;It also did several things well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero runtime errors across 12,927 rows&lt;/li&gt;
&lt;li&gt;Deterministic output&lt;/li&gt;
&lt;li&gt;The same request schema as Jev&lt;/li&gt;
&lt;li&gt;Stable single-row latency around 300 ms&lt;/li&gt;
&lt;li&gt;93% Hardware precision&lt;/li&gt;
&lt;li&gt;Near-Jev accuracy on the short, hardware-heavy 2GIT slice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The failure analysis produced concrete hypotheses rather than a vague “small model loses” conclusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option definitions were silently truncated
&lt;/h3&gt;

&lt;p&gt;Laya's sequence packer reserves a 192-token question head. The primary-class question had seven options with definitions written to separate hardware, software, support, and services.&lt;/p&gt;

&lt;p&gt;With seven options, each definition was cut to &lt;strong&gt;25 tokens&lt;/strong&gt;, and the instruction could shrink to as few as eight tokens. The text designed to prevent Hardware-versus-Software confusion was exactly what got truncated.&lt;/p&gt;

&lt;p&gt;Laya called 105 of 572 Hardware rows “Software.” Jev made that error seven times; Qwen made it 20 times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accuracy dropped before the context window filled
&lt;/h3&gt;

&lt;p&gt;Laya reached 81.5% accuracy on states below 600 characters but only 65.8% from 600 to 1,200 characters—roughly 150 to 300 tokens and still inside its 512-token window.&lt;/p&gt;

&lt;p&gt;Jev and Qwen did not show the same decline. That means simple end-of-window truncation cannot explain the whole effect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Presence questions over-fired
&lt;/h3&gt;

&lt;p&gt;Laya emitted an average of 4.05 components per row, compared with 1.95 for Jev and 1.16 for Qwen. Its RFI and text-insufficient flags fired on 63% and 71% of rows, while the discovery analysis found true RFI rates around 2–3%.&lt;/p&gt;

&lt;p&gt;The public repository lists six follow-up experiments: increase the head budget, warn on truncation, try the typed-decision and multilingual checkpoints, fit per-question thresholds, split the primary question from the rest, and record actual token counts.&lt;/p&gt;

&lt;p&gt;These are testable engineering questions—and contributions are welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost and operational behavior
&lt;/h2&gt;

&lt;p&gt;For all 12,000 opportunities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Cost or compute&lt;/th&gt;
&lt;th&gt;Observed operation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.78 at list input-token price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;p50 185 ms, p95 273 ms, zero errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-35B&lt;/td&gt;
&lt;td&gt;About 80 minutes of one shared GPU&lt;/td&gt;
&lt;td&gt;2.7 rows/s, 69 malformed responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laya 421M&lt;/td&gt;
&lt;td&gt;Local RTX 2000 Ada laptop&lt;/td&gt;
&lt;td&gt;p50 299 ms, p95 576 ms, zero errors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are different deployment products, so the table is not a simple price race. Jev includes hosted operations. Qwen used an existing on-prem cluster. Laya ran unbatched at one row at a time; its separate CUDA study shows what a batched server can do.&lt;/p&gt;

&lt;p&gt;The right architecture depends on volume, infrastructure, latency, privacy, and whether calibrated probabilities are part of the product requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agreement tells us where humans add value
&lt;/h2&gt;

&lt;p&gt;Jev and Qwen agreed on &lt;strong&gt;91.0% of 11,931 paired rows&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9xhb6v25ff818yj98cp.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%2Fl9xhb6v25ff818yj98cp.png" alt="Jev versus Qwen agreement" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 1,068 disagreements clustered around Hardware versus Other, Hardware versus Software, Software versus Maintenance &amp;amp; Support, and Services versus Software or Other.&lt;/p&gt;

&lt;p&gt;Instead of reviewing random rows, those disagreements form a much more valuable blind-adjudication pool. The next planned step is human review of a stratified sample and 300 blinded Jev–Qwen disagreements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations I would not hide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quote gold measures agreement with what reps quoted, not objective truth.&lt;/li&gt;
&lt;li&gt;Hardware dominates the evaluation set; Services has only six rows and Maintenance &amp;amp; Support has 32.&lt;/li&gt;
&lt;li&gt;Fulfillment gold contains an unvalidated heuristic.&lt;/li&gt;
&lt;li&gt;Subclass, lifecycle, and domain answers do not yet have human gold.&lt;/li&gt;
&lt;li&gt;Laya ran single-row with default configuration, no threshold tuning, and one checkpoint.&lt;/li&gt;
&lt;li&gt;Qwen's three-valued confidence was imposed by the prompt.&lt;/li&gt;
&lt;li&gt;The 69 malformed Qwen rows are excluded from paired metrics and are not random.&lt;/li&gt;
&lt;li&gt;The study covers one organization, one domain, one Jev version, and one measurement period.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results are useful because the boundaries are explicit—not because the benchmark pretends to be universal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce or challenge it
&lt;/h2&gt;

&lt;p&gt;Everything publishable is open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/jev-laya-classification-bench" rel="noopener noreferrer"&gt;bhushankinge/jev-laya-classification-bench&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full report:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/jev-laya-classification-bench/blob/57e89266a7680a92c6803b5a33f711ab90c6ca08/docs/reports/2026-09-24-classification-experiments-report.md" rel="noopener noreferrer"&gt;classification experiment report&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate metrics:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/jev-laya-classification-bench/tree/57e89266a7680a92c6803b5a33f711ab90c6ca08/results/e2-full" rel="noopener noreferrer"&gt;results/e2-full&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiment runbook:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/jev-laya-classification-bench/blob/57e89266a7680a92c6803b5a33f711ab90c6ca08/pipeline/RUN.md" rel="noopener noreferrer"&gt;pipeline/RUN.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companion CUDA study:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/laya-cuda-bench" rel="noopener noreferrer"&gt;laya-cuda-bench&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository includes 52 passing tests, deterministic figure generation, a citation file, and the pre-registered selection rule.&lt;/p&gt;

&lt;p&gt;If you build production classifiers, I would be especially interested in your answer to this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you optimize for the highest raw accuracy—or for the largest slice of traffic that can be automated at a defensible precision bound?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>classification</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How Fast Can a 421M-Parameter Decision Model Run? I Benchmarked Laya Across NVIDIA GPUs</title>
      <dc:creator>Bhushan Kinge</dc:creator>
      <pubDate>Thu, 24 Sep 2026 19:15:49 +0000</pubDate>
      <link>https://dev.to/cookies_c9dc8b91f33d29250/how-fast-can-a-421m-parameter-decision-model-run-i-benchmarked-laya-across-nvidia-gpus-2863</link>
      <guid>https://dev.to/cookies_c9dc8b91f33d29250/how-fast-can-a-421m-parameter-decision-model-run-i-benchmarked-laya-across-nvidia-gpus-2863</guid>
      <description>&lt;p&gt;One H100 NVL. A 421M-parameter decision model. &lt;strong&gt;15.1 million decisions per day while staying inside a p99 ≤ 130 ms latency budget.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That number sounds impressive—but raw throughput is the easy number to publish. The useful question is harder:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How many typed decisions can one GPU sustain when tail latency, correctness, and cost all matter?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built an independent, fully reproducible benchmark to answer that question for &lt;a href="https://github.com/NandhaKishorM/laya" rel="noopener noreferrer"&gt;Laya&lt;/a&gt;, Convai's open-weights “System 1” decision models.&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%2Ftcdvonq5jm8ookkuhhad.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%2Ftcdvonq5jm8ookkuhhad.png" alt="Sustained decisions per second versus p99 latency" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This is an independent benchmark, not an official Laya or Convai result. The harness, workload, raw per-request data, environment captures, notebook, and figures are all public.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I tested
&lt;/h2&gt;

&lt;p&gt;Laya turns a state plus a typed question into a decision. Instead of generating prose, an application can ask which team should own an opportunity, how time-critical it is, or whether it needs human review.&lt;/p&gt;

&lt;p&gt;The benchmark used a frozen sample of &lt;strong&gt;1,000 public SAM.gov contract-opportunity notices&lt;/strong&gt;. Every request asked the same three questions—choice, score, and yes/no—so throughput is reported as decisions per second rather than requests per second.&lt;/p&gt;

&lt;p&gt;I tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RTX 2000 Ada laptop, 8 GB&lt;/li&gt;
&lt;li&gt;RTX PRO 5000 Blackwell laptop, 24 GB&lt;/li&gt;
&lt;li&gt;RTX PRO 6000 Blackwell workstation, 96 GB&lt;/li&gt;
&lt;li&gt;H100 NVL, 94 GB—whole and split into seven 1g.12gb MIG instances&lt;/li&gt;
&lt;li&gt;PyTorch eager FP32, FP16, and BF16&lt;/li&gt;
&lt;li&gt;torch.compile with max-autotune&lt;/li&gt;
&lt;li&gt;ONNX Runtime CUDA and TensorRT FP16&lt;/li&gt;
&lt;li&gt;The hosted Jev API and two Qwen3.5 vLLM configurations as context baselines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two service-level objectives were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;p99 ≤ 50 ms&lt;/strong&gt; for an inline guardrail-style budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p99 ≤ 130 ms&lt;/strong&gt; for a less aggressive server budget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The load generator used open-loop Poisson arrivals against a small dynamic-batching HTTP server. A point counted only if it achieved at least 90% of the offered rate, stayed under the latency SLO, returned no errors, and did not show a growing queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline capacity results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPU and serving backend&lt;/th&gt;
&lt;th&gt;p99 ≤ 50 ms&lt;/th&gt;
&lt;th&gt;p99 ≤ 130 ms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX PRO 5000, TensorRT FP16&lt;/td&gt;
&lt;td&gt;15 decisions/s&lt;/td&gt;
&lt;td&gt;42 decisions/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX PRO 6000, TensorRT FP16&lt;/td&gt;
&lt;td&gt;not measured&lt;/td&gt;
&lt;td&gt;146 decisions/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H100 NVL, TensorRT FP16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;105 decisions/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;175 decisions/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H100, 7 × MIG 1g.12gb, eager FP16&lt;/td&gt;
&lt;td&gt;not met&lt;/td&gt;
&lt;td&gt;not met reliably&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the 130 ms SLO, those sustained rates translate to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3.6M decisions/day&lt;/strong&gt; on the RTX PRO 5000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12.6M decisions/day&lt;/strong&gt; on the RTX PRO 6000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15.1M decisions/day&lt;/strong&gt; on the H100 NVL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The H100 result was 175 decisions/s with a measured p99 of about 91 ms at the selected operating point—not a theoretical offline ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five findings that changed how I think about serving small models
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The latency knee is sharp
&lt;/h3&gt;

&lt;p&gt;A GPU can look healthy right until it does not. One load step beyond sustainable capacity caused the batcher to fill, long-document batches to become expensive, and p99 latency to jump from roughly 100 ms into seconds.&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%2Flk8wer108gsif521b77e.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%2Flk8wer108gsif521b77e.png" alt="The capacity knee" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The operational lesson is simple: &lt;strong&gt;size below the knee, not at “100% GPU.”&lt;/strong&gt; Average latency hides this behavior; p99 exposes it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. TensorRT was not the universal winner
&lt;/h3&gt;

&lt;p&gt;For fixed-shape throughput, &lt;strong&gt;torch.compile(mode=max-autotune) FP16&lt;/strong&gt; was fastest on every card at larger batches—about 1.3–1.7× eager FP16.&lt;/p&gt;

&lt;p&gt;Dynamic serving told a more nuanced story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Hopper&lt;/strong&gt;, TensorRT raised H100 capacity at p99 ≤ 130 ms from 93 to 175 decisions/s.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;RTX PRO 6000 Blackwell&lt;/strong&gt;, eager FP16 and TensorRT both reached 146 decisions/s.&lt;/li&gt;
&lt;li&gt;On the Blackwell laptop's multilingual checkpoint, eager FP16 beat TensorRT under the same SLO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Static microbenchmarks are useful, but they do not automatically predict the best dynamic-serving backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Seven MIG slices were worse than one whole H100 for this workload
&lt;/h3&gt;

&lt;p&gt;Seven concurrent H100 1g.12gb slices provided excellent isolation—their measurements agreed within roughly 1 ms—but they were the wrong shape for 400+-token documents.&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%2Fzpe1gqh6k28tpbjhyede.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%2Fzpe1gqh6k28tpbjhyede.png" alt="Whole H100 versus seven MIG slices" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the lowest tested aggregate load, seven slices reached about 49 decisions/s at p99 127 ms, but they missed the benchmark's achieved-rate gate. Higher loads missed the 130 ms SLO. The whole H100 served 175 decisions/s inside that budget.&lt;/p&gt;

&lt;p&gt;MIG 1g may still be an excellent fit for short-prompt decision traffic. It simply was not the right fit here.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Faster means nothing if the answers change
&lt;/h3&gt;

&lt;p&gt;Before timing a backend, I required it to reproduce the upstream FP32 answer on a parity set covering 16 cases and 63 typed questions.&lt;/p&gt;

&lt;p&gt;Across four GPUs, three checkpoints, multiple precisions, and five backends, &lt;strong&gt;74 of 74 backend-and-device rows passed all 63 questions&lt;/strong&gt;. The test also checked public JSON equality, finite outputs, and steady-state allocator stability.&lt;/p&gt;

&lt;p&gt;This is fidelity to upstream—not a claim of real-world task accuracy—but it prevents an optimization from quietly changing behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A 10-million-decision day fit on one workstation GPU
&lt;/h3&gt;

&lt;p&gt;I replayed a compressed 24-hour diurnal curve at each hour's real arrival rate on one RTX PRO 6000. It completed &lt;strong&gt;138,863 requests—10 million individual decisions—with zero errors and an overall p99 of 111 ms&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F42jp56o9v8r3q6fac6kv.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%2F42jp56o9v8r3q6fac6kv.png" alt="Ten-million-decision day replay" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two peak-hour segments reached 132 and 143 ms. A deployment that must remain below 130 ms continuously would therefore need roughly 25% headroom at that volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did it cost?
&lt;/h2&gt;

&lt;p&gt;Using three-year card amortization, 100% utilization, and electricity at $0.12/kWh, self-hosted Laya cost approximately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0.67 per million decisions&lt;/strong&gt; on the RTX PRO 5000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.66 per million decisions&lt;/strong&gt; on the RTX PRO 6000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$1.86 per million decisions&lt;/strong&gt; on the H100 NVL&lt;/li&gt;
&lt;/ul&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%2Frqni0s71zt9yapy1wc6f.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%2Frqni0s71zt9yapy1wc6f.png" alt="Cost per million decisions" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted Jev API came to roughly $6.8–8.2 per million decisions at its list token price for this workload. That comparison needs context: the Jev measurement includes the public network path from Arizona, and a hosted API removes hardware and operational work. At lower volumes—roughly below one million decisions per day in this cost model—the API can still be the economically sensible option.&lt;/p&gt;

&lt;p&gt;The Qwen3.5 LLM baselines reached about 190–200 decisions/s per card, but their p99 latency was around one second, so they did not meet either serving SLO. These were throughput and latency comparisons only; I make no accuracy claim for the LLM baselines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The limitations matter
&lt;/h2&gt;

&lt;p&gt;This study deliberately does &lt;strong&gt;not&lt;/strong&gt; claim universal latency or model quality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It uses one English federal-procurement workload.&lt;/li&gt;
&lt;li&gt;Parity proves fidelity to upstream outputs, not correctness of those outputs.&lt;/li&gt;
&lt;li&gt;Server sweeps and replays used one run per configuration.&lt;/li&gt;
&lt;li&gt;The RTX PRO 6000 sweep did not test below 50 requests/s, so its 50 ms capacity is unknown.&lt;/li&gt;
&lt;li&gt;torch.compile was measured for fixed shapes but was not tested as a serving backend.&lt;/li&gt;
&lt;li&gt;The serving implementation is a compact asyncio dynamic batcher over loopback, not Triton.&lt;/li&gt;
&lt;li&gt;Jev latency includes the public internet; self-hosted Laya latency does not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every caveat, including failed experiments and follow-up work, is documented in the full report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything is open
&lt;/h2&gt;

&lt;p&gt;You can inspect or reproduce the entire study:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/laya-cuda-bench" rel="noopener noreferrer"&gt;bhushankinge/laya-cuda-bench&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full report:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/laya-cuda-bench/blob/6cf4148ef4d148273eae83604815fb63ca2254de/REPORT.md" rel="noopener noreferrer"&gt;REPORT.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harness and raw results:&lt;/strong&gt; &lt;a href="https://github.com/bhushankinge/laya-cuda-bench/tree/6cf4148ef4d148273eae83604815fb63ca2254de" rel="noopener noreferrer"&gt;immutable benchmark snapshot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstream documentation contribution:&lt;/strong&gt; &lt;a href="https://github.com/NandhaKishorM/laya/pull/429" rel="noopener noreferrer"&gt;Laya PR #429&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstream project:&lt;/strong&gt; &lt;a href="https://github.com/NandhaKishorM/laya" rel="noopener noreferrer"&gt;NandhaKishorM/laya&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work on GPU inference, dynamic batching, TensorRT, MIG, or decision models, I would love to see you reproduce the benchmark on another card or challenge the methodology. The most valuable next data points are L4/A10G-class GPUs, torch.compile under dynamic serving, and a production Triton implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What GPU or serving backend should I test next?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>cuda</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
