<?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: Ankit Khandelwal</title>
    <description>The latest articles on DEV Community by Ankit Khandelwal (@ankk98).</description>
    <link>https://dev.to/ankk98</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%2F37202%2Fcffd594b-2290-43e7-9e13-b61cdf6c6b8e.jpeg</url>
      <title>DEV Community: Ankit Khandelwal</title>
      <link>https://dev.to/ankk98</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ankk98"/>
    <language>en</language>
    <item>
      <title>Agentic AI That Survives the Enterprise, Part 5: Humans in the Loop Without Burning Out Humans</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:49:19 +0000</pubDate>
      <link>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-5-humans-in-the-loop-without-burning-out-humans-1mlf</link>
      <guid>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-5-humans-in-the-loop-without-burning-out-humans-1mlf</guid>
      <description>&lt;p&gt;Part 1 ended with a confession: you'll never test your way to 100% correctness. For critical workflows the final safety net is a human. But "human in the loop" has a dirty secret. Badly designed, it's theater.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rubber-stamp problem
&lt;/h2&gt;

&lt;p&gt;Route every agent action to a human for approval and watch what happens. Week one, careful reviews. By week three approval fatigue sets in and people click approve at the speed of thought. You've paid a human salary to become an Enter key, and the loop provides zero actual oversight.&lt;/p&gt;

&lt;p&gt;The goal isn't humans reviewing everything. It's humans reviewing exactly the things that need judgment, at a volume they can sustain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing oversight people can actually do
&lt;/h2&gt;

&lt;p&gt;Filter before you route. Confidence thresholds decide who sees what: high-confidence routine actions execute directly with logging, low-stakes medium-confidence ones get sampled, and genuinely uncertain or high-impact ones go to a human. Careful UX design here keeps human load limited. That's the whole game.&lt;/p&gt;

&lt;p&gt;Show diffs, not documents. Nobody re-reads a generated contract. Show what changed from the template, highlight which fields the model filled, and make deviations impossible to miss. Reviewing a diff takes seconds; reviewing a page takes minutes, and minutes don't survive week three.&lt;/p&gt;

&lt;p&gt;Sample with LLMs, confirm with humans. An LLM auditor grades a random slice of automated outputs daily. Scores trending down? Raise the human-review rate automatically. This is how you catch silent drift (Part 4's scariest failure mode) without hiring a review department.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌─────────────────────────┐
                        │      Agent output       │
                        └────────────┬────────────┘
                                     ▼
                     confidence + impact triage
              ┌──────────────────┼──────────────────────┐
              ▼                  ▼                      ▼
   high conf,         medium stakes            low conf or high stakes
   low stakes         LLM-sampled audit        human review, diff-based UI
   auto-execute       trend monitoring              │ like / unlike
   (logged)                │ trend drops            ▼
                           └──────────────► feedback loop back into evals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close the loop. Every like, unlike, and human correction is labeled data. Feed it back into your eval suite from Part 2. Your reviewers aren't just gatekeeping; they're continuously building your regression tests.&lt;/p&gt;

&lt;p&gt;One thing to stop doing: 100% human review of everything. It feels safe, produces rubber stamps, and hides real failures inside noise. Oversight is a budget. Spend it where judgment matters.&lt;/p&gt;

&lt;p&gt;This closes the series arc: constrain the workflow, buy only the intelligence you need, secure the credentials, engineer for failure, and put humans where humans add value. None of it requires a smarter model. All of it requires deliberate design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your action
&lt;/h2&gt;

&lt;p&gt;Pick one approval queue in your system. Measure what fraction gets approved, how fast, by whom. If approvals take under five seconds each, you don't have oversight; you have rubber stamping. Redesign it with filtering and diffs this month.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>ux</category>
      <category>humantime</category>
    </item>
    <item>
      <title>Agentic AI That Survives the Enterprise, Part 4: Boring Engineering Wins</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:48:54 +0000</pubDate>
      <link>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-4-boring-engineering-wins-4p44</link>
      <guid>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-4-boring-engineering-wins-4p44</guid>
      <description>&lt;p&gt;The first three parts covered thesis, cost, and security. This one covers everything that separates a demo from a production system. None of it is exciting. All of it is why some teams sleep at night.&lt;/p&gt;

&lt;h2&gt;
  
  
  The production checklist
&lt;/h2&gt;

&lt;p&gt;Trace everything. Langfuse, LangSmith, or OpenTelemetry; pick one and stick with it. When (not if) a workflow misbehaves in production, traces are the difference between debugging and staring into a black box.&lt;/p&gt;

&lt;p&gt;Test like it's software, because it is. Unit tests, integration tests, CI. Accept a hard truth too: you will never reach full coverage of model behavior. That's why critical paths get verification loops and everything else gets user feedback loops.&lt;/p&gt;

&lt;p&gt;LLMs are not calculators. Force them through tools for arithmetic, with strict JSON schemas on inputs and outputs. Validate at every boundary.&lt;/p&gt;

&lt;p&gt;Design for failure everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network requests fail, so retry with backoff&lt;/li&gt;
&lt;li&gt;Servers go down, so replicate&lt;/li&gt;
&lt;li&gt;Agents loop, so put step limits in the harness&lt;/li&gt;
&lt;li&gt;Humans and LLMs wreck databases, so keep immutable offsite backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make workflows resumable. Durable execution engines and checkpointing mean a crashed 40-step run resumes at step 31 instead of restarting. Every tool call should be idempotent too, so retries don't double-charge anyone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Run agent step ──► failed? ──yes──► resume from checkpoint ──► retry idempotent tool
        │                │
        no               └──► retries are safe because every call is idempotent
        ▼
  Next step ──► log + trace + meter cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Roll out like an SRE, not a shipper. Controlled rollouts, canaries, versioned prompts, feature flags, and every change revertible in one action. Model updates will silently shift behavior. You want to be the one who notices through monitoring and alerts, before your customers do.&lt;/p&gt;

&lt;p&gt;Meter money obsessively. Cost limits at every level: per chat, per user, per tenant, per SaaS account. One buggy retry loop without budgets is how cloud bills become front-page news internally.&lt;/p&gt;

&lt;p&gt;Keep models swappable. Provider outages and price hikes are routine. An abstraction layer over your LLM calls turns those from incidents into config changes.&lt;/p&gt;

&lt;p&gt;One thing to stop doing: treating the harness as an afterthought. The harness (schemas, limits, retries, locks, secrets) is the product. The model is a component inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your action
&lt;/h2&gt;

&lt;p&gt;Audit your current setup against this list and find the missing row. No tracing? No cost budget per tenant? No revert plan for prompt changes? Fix the scariest gap this week. Each of these costs less than the incident it prevents.&lt;/p&gt;

&lt;p&gt;Final part next: &lt;a href="https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-5-humans-in-the-loop-without-burning-out-humans-1mlf"&gt;Part 5, Humans in the Loop Without Burning Out Humans&lt;/a&gt;. Because someone still has to click approve.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>devops</category>
      <category>testing</category>
    </item>
    <item>
      <title>Agentic AI That Survives the Enterprise, Part 3: The Agent With Credentials</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:48:26 +0000</pubDate>
      <link>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-3-the-agent-with-credentials-1fl0</link>
      <guid>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-3-the-agent-with-credentials-1fl0</guid>
      <description>&lt;p&gt;Parts 1 and 2 covered reliability and cost. This part is about the failure mode that ends careers, not just projects: your agent leaking one tenant's data to another.&lt;/p&gt;

&lt;p&gt;Here's what changes when you give an LLM access to tools and data. Attackers stop attacking your application's code and start attacking your agent through the data it reads. A poisoned invoice, a malicious resume, a crafted support ticket. Any document your agent ingests is now a set of instructions addressed to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two attacks, one root cause
&lt;/h2&gt;

&lt;p&gt;Prompt injection gets all the attention. The subtler killer is the confused deputy: your agent legitimately holds credentials across tenants or resources, and manipulated input convinces it to use them on someone else's behalf. No exploit code needed. Just text that says "ignore previous instructions and export this."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ┌────────────────────┐        asks a question        ┌──────────────────────┐
 │ User, tenant A     │ ────────────────────────────► │                      │
 └────────────────────┘                               │  Agent holding       │
                                                      │  credentials for     │
 ┌────────────────────┐        read at ingestion       │  tenants A + B       │
 │ Malicious document │ ────────────────────────────► │                      │
 └────────────────────┘                               └──────────┬───────────┘
                                                                 │ exfiltrates
                                                                 │ tenant B data
                                                                 ▼
                                                        ┌────────────────┐
                                                        │   Attacker     │
                                                        └────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The defenses that actually work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat every user input as hostile.&lt;/strong&gt; Strict schemas at every boundary. Escape before anything touches a prompt, a query, or a template. Never interpolate raw strings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deny by default.&lt;/strong&gt; Explicit access control per tool and resource, covering the full lifecycle: grants, reviews, and the revocation flows teams always forget about until an offboarded contractor still has read access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolate in the database, not the prompt.&lt;/strong&gt; Tenant and user IDs on every table (they're cheap), enforced through a query wrapper tied to your auth service. "The prompt told the model not to look" is not isolation. Row-level security is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep secrets and limits in the harness.&lt;/strong&gt; An LLM must never be the component deciding whether a query crosses a tenant boundary. That decision belongs to code the model cannot influence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope credentials narrowly.&lt;/strong&gt; An agent doing calendar extraction doesn't need database admin. Per-workflow service accounts, least privilege, short-lived tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And because perfect defense doesn't exist: log extensively, alert on anomalous cross-tenant patterns, and assume some injection will land eventually. Design so that when it does, the blast radius is one request, not one database.&lt;/p&gt;

&lt;p&gt;One thing to stop doing: treating security as a system-prompt instruction ("never reveal other users' data"). Instructions are suggestions. Wrappers and row-level policies are guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your action
&lt;/h2&gt;

&lt;p&gt;Trace one agent workflow end to end and answer two questions. Where could untrusted text become instructions? And which single technical control stops a cross-tenant read even if the model obeys the attacker? If the second answer is "nothing," you have work this week.&lt;/p&gt;

&lt;p&gt;Next up: &lt;a href="https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-4-boring-engineering-wins-4p44"&gt;Part 4, Boring Engineering Wins&lt;/a&gt;. The checklist nobody puts in a keynote but every production system runs on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>security</category>
      <category>multitenancy</category>
    </item>
    <item>
      <title>Agentic AI That Survives the Enterprise, Part 2: You Are Overbuying Intelligence</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:48:06 +0000</pubDate>
      <link>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-2-you-are-overbuying-intelligence-1lao</link>
      <guid>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-2-you-are-overbuying-intelligence-1lao</guid>
      <description>&lt;p&gt;Part 1 argued that most enterprise agent failures are architecture failures. This part covers their favorite architecture mistake: paying frontier prices for work a cheaper model does just as well.&lt;/p&gt;

&lt;p&gt;Teams default to the biggest model because it feels safe. Then they run it billions of times on tasks like extracting a date from an email, and wonder why the AI line item looks like payroll.&lt;/p&gt;

&lt;h2&gt;
  
  
  The math nobody runs
&lt;/h2&gt;

&lt;p&gt;Compare the extremes of the current market (list prices as of Aug 2026):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Fable 5&lt;/th&gt;
&lt;th&gt;DeepSeek V4 Flash 0731&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input / 1M tokens&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;~$0.14-0.22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output / 1M tokens&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;~$0.28-0.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weights&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;MIT, open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capability&lt;/td&gt;
&lt;td&gt;SOTA everywhere&lt;/td&gt;
&lt;td&gt;~1 pt behind its own Pro tier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's roughly 20x to 70x cheaper per token for a model that sits near the top of independent intelligence indices, even though it trails Fable on every capability row.&lt;/p&gt;

&lt;p&gt;Now be honest about the caveats, because they matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flash is verbose. It emits far more tokens per task than the median model, so the real cost-per-task gap is smaller than the per-token gap. Still enormous, though.&lt;/li&gt;
&lt;li&gt;Benchmarks are mostly vendor-reported pending independent verification.&lt;/li&gt;
&lt;li&gt;It trails the frontier. On hard agentic coding, large codebases, optimization problems, genuinely ambiguous work, the frontier model earns its price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the point: your workload probably isn't those things. Gmail-style calendar extraction doesn't need frontier intelligence. Neither does classification, routing, structured extraction, or most RAG answering. A focused workflow with strict schemas and verification turns "10% worse on a leaderboard" into "indistinguishable in production."&lt;/p&gt;

&lt;p&gt;The trap is trusting general-purpose leaderboards for narrow tasks. General benchmark deltas don't transfer. A model 10% lower on a leaderboard might be 0% worse at extracting invoice totals. Or it might be 50% worse at your weird domain jargon. You can't know without measuring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evals before models
&lt;/h2&gt;

&lt;p&gt;This is why eval-driven development comes first, not last:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Define task
      │
      ▼
  Build eval set (20+ real examples)
      │
      ▼
  Score candidate models (include the cheap ones)
      │
      ▼
  Does a cheap model pass? ──yes──► Ship it. Save 20-70x.
      │no
      ▼
  Try the next tier up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Evals also do something subtler. Writing them forces you to enumerate edge cases early and get precise about what you're actually building. Teams that skip them don't just pick wrong models. They build the wrong thing.&lt;/p&gt;

&lt;p&gt;Two things to stop doing: picking a model first and evaluating later, and building multi-agent architectures before checking whether one cheap model plus a schema suffices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your action
&lt;/h2&gt;

&lt;p&gt;Take your most expensive LLM call in production. Build a 20-example eval for it. Run a mid-tier model against your current one. Publish the delta to your team, whatever it says.&lt;/p&gt;

&lt;p&gt;Next up: &lt;a href="https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-3-the-agent-with-credentials-1fl0"&gt;Part 3, The Agent With Credentials&lt;/a&gt;. What happens when attackers stop attacking your app and start talking to your agent.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>llm</category>
      <category>cost</category>
    </item>
    <item>
      <title>Agentic AI That Survives the Enterprise, Part 1: Probabilistic Engines, Deterministic Businesses</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:47:35 +0000</pubDate>
      <link>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-1-probabilistic-engines-deterministic-businesses-1eem</link>
      <guid>https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-1-probabilistic-engines-deterministic-businesses-1eem</guid>
      <description>&lt;p&gt;Enterprises run on workflows that must be auditable, explainable, predictable, and correct. A single arithmetic error is not a quirk. It's a financial loss. Access control, data privacy, and robustness aren't features either. They're the price of admission.&lt;/p&gt;

&lt;p&gt;LLMs are the opposite kind of machine: probabilistic, open-ended, general-purpose brains. Brilliant at ambiguity, terrible at guarantees.&lt;/p&gt;

&lt;p&gt;Put those two facts together and you get the central tension of enterprise AI in 2026:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need deterministic outcomes from probabilistic engines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The job isn't to shrink what the model can do. It's to contain how it operates without capping its capability. Let it fly, but inside a fuselage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable truth
&lt;/h2&gt;

&lt;p&gt;Most vendor decks won't tell you this: most enterprise "AI agent" failures are architecture failures, not model failures. Teams reach for a better model when what they actually needed was boring engineering. Schemas. Verification loops. Access control. Cost limits.&lt;/p&gt;

&lt;p&gt;And the prediction that follows: over the next two years, most enterprise AI adoption will be led by focused, constrained workflows rather than autonomous agents roaming your systems. Constrained workflows win on cost, latency, and control. Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six ways this actually fails
&lt;/h2&gt;

&lt;p&gt;Before we talk solutions in Parts 2 through 5, get honest about failure modes. In production agentic systems, things break in six recurring ways:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────────────┐
                    │  Agentic system in prod      │
                    └──────────────┬───────────────┘
       ┌──────────┬──────────┬─────┴─────┬──────────┬──────────┐
       ▼          ▼          ▼           ▼          ▼          ▼
  Hallucination  Loops    Injection   Silent     State      Garbage in
  confident     runaway   &amp;amp; exfil,    drift,     corruption vague user
  wrong facts   costs     confused    quality    concurrent  input,
                          deputy      decays     writes      agent guesses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination:&lt;/strong&gt; the model confidently states something false.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loops:&lt;/strong&gt; agents circle forever while your bill climbs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injection and exfiltration:&lt;/strong&gt; malicious input turns your agent into a confused deputy with credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent drift:&lt;/strong&gt; a model update quietly changes outputs. Nothing crashes, quality just decays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State corruption:&lt;/strong&gt; concurrent runs write over each other because nobody designed locking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garbage in:&lt;/strong&gt; users are lazy. They omit details, and the agent guesses instead of asking.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these get solved by a smarter model. All of them get solved by design: evals, harness limits, isolation, clarification flows, human gates where they matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do before Part 2
&lt;/h2&gt;

&lt;p&gt;Pick one workflow you'd like to make agentic. Before choosing a model, choosing a framework, or writing a prompt, write one task-specific eval for it. Twenty examples of correct behavior. That artifact will settle more arguments than any architecture debate.&lt;/p&gt;

&lt;p&gt;Next up: &lt;a href="https://dev.to/ankk98/agentic-ai-that-survives-the-enterprise-part-2-you-are-overbuying-intelligence-1lao"&gt;Part 2, You Are Overbuying Intelligence&lt;/a&gt;. We put DeepSeek V4 Flash head-to-head with Claude Fable 5 and do the math frontier vendors hope you won't.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Spec-Driven Development for Agentic Coding</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:29:45 +0000</pubDate>
      <link>https://dev.to/ankk98/spec-driven-development-for-agentic-coding-5b4i</link>
      <guid>https://dev.to/ankk98/spec-driven-development-for-agentic-coding-5b4i</guid>
      <description>&lt;p&gt;Effective agentic coding is not mainly about better prompts. It is about control.&lt;/p&gt;

&lt;p&gt;You want three things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;move extremely fast&lt;/li&gt;
&lt;li&gt;let AI generate almost all of the code&lt;/li&gt;
&lt;li&gt;keep quality, security, and production judgment under human control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spec-driven development is how you hold that tension. Stronger agents make generation cheaper. They do not decide what you want, what you refuse, or how you will know the result is good. Specs are the control loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Vibes Coding Fails
&lt;/h2&gt;

&lt;p&gt;When a model writes code without enough structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requirements stay fuzzy&lt;/li&gt;
&lt;li&gt;tradeoffs stay unspoken&lt;/li&gt;
&lt;li&gt;constraints get forgotten mid-generation&lt;/li&gt;
&lt;li&gt;teams ship the first plausible answer instead of the right one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better autocomplete and better agents improve speed. They do not create shared intent. If your team cannot point to what "done" means before generation starts, the model is guessing in your name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Generation the Last Step
&lt;/h2&gt;

&lt;p&gt;A useful pipeline looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Thought dump.&lt;/strong&gt; Capture raw ideas, constraints, edge cases, and half-formed opinions. Do not force structure yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRD with clarification rounds.&lt;/strong&gt; Have an LLM ask clarifying questions across a few rounds, then turn the dump into a product requirements document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TRD with repo context.&lt;/strong&gt; Combine the PRD with code and architecture context. Clarify again. Produce a technical requirements document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiments when needed.&lt;/strong&gt; Run benchmarks, spikes, or comparisons when a design choice is still uncertain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phased implementation plan.&lt;/strong&gt; Break the TRD into small phases that stack. Each phase should be reviewable and testable. Prefer one phase per commit, one feature per PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code generation.&lt;/strong&gt; Only then generate implementation, with the plan and context as the source of truth.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step produces an artifact the next step can trust. The model stays busy generating. People stay responsible for intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Force the Hard Questions Early
&lt;/h2&gt;

&lt;p&gt;Clarification rounds are not only for cleaner documents. They make your team answer things that are easy to skip once someone is already coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what exactly are we building&lt;/li&gt;
&lt;li&gt;what are we not building&lt;/li&gt;
&lt;li&gt;what happens at scale&lt;/li&gt;
&lt;li&gt;how data migration works&lt;/li&gt;
&lt;li&gt;how we deploy&lt;/li&gt;
&lt;li&gt;how we verify after deploy&lt;/li&gt;
&lt;li&gt;how we roll back&lt;/li&gt;
&lt;li&gt;how security is handled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build those questions into the process. A short security checklist, drawn from past incidents and reviews, works much better when the pipeline expects it. The awkward checks become normal, not optional.&lt;/p&gt;

&lt;p&gt;There is a second payoff: people learn during the pipeline. By the time coding starts, the team usually understands the problem better than when they began.&lt;/p&gt;

&lt;h2&gt;
  
  
  Productize Context
&lt;/h2&gt;

&lt;p&gt;A pipeline fails if the model has nowhere stable to look. Maintain markdown your team can point at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;products and feature areas&lt;/li&gt;
&lt;li&gt;DB schemas&lt;/li&gt;
&lt;li&gt;services and ownership boundaries&lt;/li&gt;
&lt;li&gt;API surfaces&lt;/li&gt;
&lt;li&gt;conventions: what you prefer, what you avoid, what "good" looks like here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code shape matters too. Large files fight context windows and make generation worse. Smaller, focused modules make agentic coding more usable for both humans and models.&lt;/p&gt;

&lt;p&gt;When you ask for implementation, be explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;include dependency changes&lt;/li&gt;
&lt;li&gt;include class and DB schema changes&lt;/li&gt;
&lt;li&gt;call out new or updated libraries&lt;/li&gt;
&lt;li&gt;keep the design SOLID and testable&lt;/li&gt;
&lt;li&gt;treat tests as part of the delivery, not an afterthought&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the hard work is not prompt craft. It is writing context, watching where generation drifts, rewriting the context, and repeating until the model stays inside your standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolve Unknowns Before You Commit
&lt;/h2&gt;

&lt;p&gt;Not every project needs a spike. Some do.&lt;/p&gt;

&lt;p&gt;Before locking a library, plugin, or approach, ask for comparisons. Sometimes that is reading docs. Sometimes that is a small benchmark or prototype.&lt;/p&gt;

&lt;p&gt;If the design depends on an unknown, write the unknown down and resolve it before spending a full implementation cycle on the wrong path. A confident TRD is useless if it is still a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the Spine When Tools Change
&lt;/h2&gt;

&lt;p&gt;Internal generators, Tab complete, agents: the surface keeps moving. Keep the same spine underneath:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PRD&lt;/li&gt;
&lt;li&gt;TRD&lt;/li&gt;
&lt;li&gt;experiments when needed&lt;/li&gt;
&lt;li&gt;implementation plan&lt;/li&gt;
&lt;li&gt;phased execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better agents make longer changes practical. They still do not replace a clear plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Effective Agentic Coding Looks Like
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Specs before code.&lt;/strong&gt; Dump thoughts, then force clarity into a PRD and TRD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phases before pull requests.&lt;/strong&gt; Make each step small enough to review, test, and reverse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context before clever prompts.&lt;/strong&gt; Schemas, services, APIs, and conventions should be written down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular code before magic.&lt;/strong&gt; Focused files make both humans and models better.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparisons before commitment.&lt;/strong&gt; Do not pretend uncertainty is a design decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checklists before "looks good".&lt;/strong&gt; Scale, migration, deploy, rollback, and security are not optional add-ons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humans own judgment.&lt;/strong&gt; Models generate. People decide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agentic coding fails when people treat the model as the source of truth. It works when people treat the model as a very fast implementer working inside a clear, testable plan. Specs are how you keep that boundary.&lt;/p&gt;

&lt;p&gt;I arrived at this the hard way while shipping with AI coding agents at BlogVault from about 2023 to 2025. I am no longer there, and none of this is an official company write-up. I still use the same pattern in my own work, including on dharmiq: clarify product intent, write the technical requirements, then implement in phases against written principles and plans.&lt;/p&gt;

</description>
      <category>development</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>How We Scaled Firewall Logs with ClickHouse at MalCare</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:52:58 +0000</pubDate>
      <link>https://dev.to/ankk98/how-we-scaled-firewall-logs-with-clickhouse-at-malcare-2p5m</link>
      <guid>https://dev.to/ankk98/how-we-scaled-firewall-logs-with-clickhouse-at-malcare-2p5m</guid>
      <description>&lt;p&gt;I worked on this while I was at BlogVault, on the MalCare side of the product, roughly between 2022 and 2024. I am no longer there. This post is just me sharing what we built and learned during that period. It is based on my own experience and memory, not an official BlogVault or MalCare write-up.&lt;/p&gt;

&lt;p&gt;At the time, MalCare's Web Application Firewall ran across more than 500,000 websites. It produced hundreds of billions of firewall request log rows, and we ingested over a billion new rows every day.&lt;/p&gt;

&lt;p&gt;This post covers how we moved that data to ClickHouse, how we ran it on modest hardware, and what we learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every request that hits a MalCare-protected site gets logged: source IP, site ID, timestamp, request path, action taken, and more.&lt;/p&gt;

&lt;p&gt;At our scale this added up to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hundreds of billions of rows&lt;/li&gt;
&lt;li&gt;terabytes of raw data&lt;/li&gt;
&lt;li&gt;over a billion new rows per day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We did not only need to store these logs. A post-processing pipeline scanned recent logs to find attack patterns and flag bad actors. So the database had to handle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;high write throughput&lt;/li&gt;
&lt;li&gt;fast reads for queries like "give me logs after timestamp X"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why We Left MongoDB
&lt;/h2&gt;

&lt;p&gt;These logs used to live in MongoDB.&lt;/p&gt;

&lt;p&gt;That stopped being a good fit because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;most of our queries scanned large amounts of historical data&lt;/li&gt;
&lt;li&gt;writes were mostly append-only&lt;/li&gt;
&lt;li&gt;we did not need document-level transactions for this workload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We looked at column-oriented analytics databases instead. ClickHouse fit the use case well. Others running similar workloads on it also helped give us confidence: Cloudflare for high-volume HTTP analytics,[^1] and Uber for a large log analytics platform.[^2]&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Learned from ClickHouse's Design
&lt;/h2&gt;

&lt;p&gt;Looking at ClickHouse's architecture was useful on its own, especially when we compared it with MongoDB and MySQL-style engines.&lt;/p&gt;

&lt;p&gt;A few ideas stood out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compress, then write.&lt;/strong&gt; On insert, ClickHouse sorts a batch, splits it into columns, compresses those blocks, and then writes them to disk. Writing less data is often faster when disk and network are the bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Append parts, merge later.&lt;/strong&gt; MergeTree does not need an auto-increment ID on the write path. Each insert becomes a new local part. Background merges combine small parts into larger ones later. That is very different from updating a global B-tree-style index on every write.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer simple, typed columns.&lt;/strong&gt; Fixed-width integers pack well for compression and CPU work. Free-form strings need extra offset metadata and are harder to work with at this scale.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Migrating from MongoDB
&lt;/h2&gt;

&lt;p&gt;We did not switch everything to ClickHouse in one shot. We migrated in stages so MongoDB stayed as a safety net.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dual-write.&lt;/strong&gt; We started writing every new firewall log row to both MongoDB and ClickHouse. Reads still came from MongoDB. If ClickHouse had write or schema issues, production logging and post-processing were unaffected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move reads gradually.&lt;/strong&gt; Once dual-writes looked healthy (matching volumes, good query latency, no surprise disk or CPU pressure), we started moving reads to ClickHouse. Lower-risk paths moved first. Higher-volume paths, including bad-actor detection, moved later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finish the cutover.&lt;/strong&gt; After all reads and writes were on ClickHouse, we waited a few weeks. Then we removed the MongoDB write path and the dual-write code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dual-running cost us extra disk and write work for a while. For a system that cannot drop a day of firewall logs, that trade-off was worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema and Indexing
&lt;/h2&gt;

&lt;p&gt;We used the &lt;code&gt;MergeTree&lt;/code&gt; table engine for firewall logs.&lt;/p&gt;

&lt;p&gt;Two choices mattered most for query speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Order by &lt;code&gt;(site_id, timestamp)&lt;/code&gt;.&lt;/strong&gt; Almost every read was for one website first. Keeping the data sorted that way on disk let ClickHouse skip large chunks of data instead of scanning the whole table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping index on &lt;code&gt;timestamp&lt;/code&gt;.&lt;/strong&gt; The post-processing pipeline often asked for "all logs after time T." This index made that path cheaper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also partitioned the table by date.&lt;/p&gt;

&lt;p&gt;That made retention simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a background job found old partitions&lt;/li&gt;
&lt;li&gt;it dropped those partitions&lt;/li&gt;
&lt;li&gt;we did not run row-level &lt;code&gt;DELETE&lt;/code&gt;s over billions of rows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Partition drops in ClickHouse are cheap metadata operations, so cleanup stayed simple and safe to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Disk Hog: &lt;code&gt;system.query_log&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One surprise was unexplained disk growth.&lt;/p&gt;

&lt;p&gt;ClickHouse enables &lt;code&gt;system.query_log&lt;/code&gt; by default. It records metadata for every query. At our query volume, that table grew to terabytes. It became larger than the firewall logs table itself.&lt;/p&gt;

&lt;p&gt;We did not need query audit logs for the product. Once we found the cause, we disabled &lt;code&gt;system.query_log&lt;/code&gt; and got the disk back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware
&lt;/h2&gt;

&lt;p&gt;Even at hundreds of billions of rows and over a billion inserts a day, the workload ran well on a single server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU stayed under 5%&lt;/li&gt;
&lt;li&gt;network had spare capacity&lt;/li&gt;
&lt;li&gt;disk I/O had spare capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Columnar compression and fast query execution are a big part of why that was possible.&lt;/p&gt;

&lt;p&gt;We also designed, but did not ship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hot-cold tiering: last 7 days on SSD, older data on cheaper disks&lt;/li&gt;
&lt;li&gt;replication for durability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Priorities moved elsewhere before we deployed either. The low load on one server suggested we still had room to grow vertically first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rails and MySQL Integration
&lt;/h2&gt;

&lt;p&gt;The hardest part was not ClickHouse itself. It was connecting it to our Ruby on Rails 5 app, which already used MySQL.&lt;/p&gt;

&lt;p&gt;At the time, the ClickHouse Ruby gems we tried were incomplete or buggy. None handled binary string encoding correctly, which led to bad queries. We evaluated two or three gems, picked the best one, and monkey-patched binary string handling.&lt;/p&gt;

&lt;p&gt;On top of that, we built a ClickHouse-specific Active Record-style base class:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every ClickHouse-backed model inherited from it&lt;/li&gt;
&lt;li&gt;it kept ClickHouse queries out of the MySQL connection pool and transaction flow&lt;/li&gt;
&lt;li&gt;it added ClickHouse-only operations that ActiveRecord does not have, especially partition create and partition drop for retention&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Read-Only Access and Query Control
&lt;/h2&gt;

&lt;p&gt;We created a read-only ClickHouse user for ad hoc analysis and debugging. That let people explore firewall logs without risking accidental writes.&lt;/p&gt;

&lt;p&gt;This paid off once. A query under the read-only account started hurting database performance. We found the running query through ClickHouse's introspection views, killed it, and service recovered without a restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backup and Archival
&lt;/h2&gt;

&lt;p&gt;For long-term durability, a secondary server ran a background job that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;queried recent logs&lt;/li&gt;
&lt;li&gt;compressed them into archive files&lt;/li&gt;
&lt;li&gt;pushed those files to S3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That kept backup work off the primary ClickHouse server and gave us an archive outside the live database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Notes
&lt;/h2&gt;

&lt;p&gt;Two things stuck with us:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ClickHouse gave us a lot of performance headroom on small hardware. We were doing billion-row daily ingest with single-digit CPU usage.&lt;/li&gt;
&lt;li&gt;Application tooling still needed real work. Outside languages like Python, Go, and Java, we had to invest in glue code to fit ClickHouse into our Rails and MySQL stack.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The official ClickHouse documentation[^3] and Altinity's docs and knowledge base[^4] helped a lot while we designed the schema, operated the cluster, and debugged production issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/" rel="noopener noreferrer"&gt;HTTP Analytics for 6M requests per second using ClickHouse&lt;/a&gt; - Cloudflare Engineering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.uber.com/us/en/blog/logging/" rel="noopener noreferrer"&gt;Fast and Reliable Schema-Agnostic Log Analytics Platform&lt;/a&gt; - Uber Engineering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://clickhouse.com/docs/" rel="noopener noreferrer"&gt;ClickHouse Documentation&lt;/a&gt; - Official ClickHouse docs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.altinity.com/" rel="noopener noreferrer"&gt;Altinity Documentation&lt;/a&gt; / &lt;a href="https://kb.altinity.com/" rel="noopener noreferrer"&gt;Altinity Knowledge Base&lt;/a&gt; - Altinity ClickHouse docs and operational guides&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>clickhouse</category>
      <category>database</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Running LLMs on AMD NPU with FastFlowLM - Fedora Guide</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sun, 28 Jun 2026 10:51:52 +0000</pubDate>
      <link>https://dev.to/ankk98/running-llms-on-amd-npu-with-fastflowlm-fedora-guide-1oo5</link>
      <guid>https://dev.to/ankk98/running-llms-on-amd-npu-with-fastflowlm-fedora-guide-1oo5</guid>
      <description>&lt;h1&gt;
  
  
  Running LLMs on AMD NPU with FastFlowLM - Fedora Guide
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Tested on &lt;strong&gt;Fedora 44&lt;/strong&gt;, kernel &lt;strong&gt;7.0.12&lt;/strong&gt;, &lt;strong&gt;ROG Flow Z13&lt;/strong&gt; (Ryzen AI Max 390 / Strix Halo NPU).&lt;br&gt;&lt;br&gt;
Goal: copy-paste setup that gets &lt;code&gt;flm validate&lt;/code&gt; and &lt;code&gt;flm run&lt;/code&gt; working on Fedora.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;You need &lt;strong&gt;four layers&lt;/strong&gt; working together:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Kernel + DKMS driver&lt;/strong&gt; (&lt;code&gt;amdxdna&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Creates &lt;code&gt;/dev/accel/accel0&lt;/code&gt;, loads NPU firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XRT base&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AMD runtime installed to &lt;code&gt;/opt/xilinx/xrt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;XRT NPU plugin&lt;/strong&gt; (&lt;code&gt;xrt_plugin&lt;/code&gt; RPM)&lt;/td&gt;
&lt;td&gt;Provides &lt;code&gt;libxrt_driver_xdna.so&lt;/code&gt; so XRT sees the NPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;FastFlowLM&lt;/strong&gt; (&lt;code&gt;flm&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Runs LLMs on the NPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On Fedora there is no prebuilt PPA like Ubuntu. You build &lt;strong&gt;XRT&lt;/strong&gt;, the &lt;strong&gt;NPU plugin&lt;/strong&gt;, and &lt;strong&gt;FastFlowLM&lt;/strong&gt; from source.&lt;/p&gt;

&lt;p&gt;Two non-obvious blockers we hit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amd_iommu=off&lt;/code&gt;&lt;/strong&gt; in kernel cmdline — common for GPU LLM tuning, but &lt;strong&gt;breaks the NPU&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Symlinking &lt;code&gt;xrt-smi&lt;/code&gt;&lt;/strong&gt; — the script is path-sensitive; use a wrapper instead&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Hardware tested
&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;Machine&lt;/td&gt;
&lt;td&gt;ASUS ROG Flow Z13 GZ302EA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU / NPU&lt;/td&gt;
&lt;td&gt;AMD Ryzen AI Max 390 (Strix Halo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU PCI ID&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1022:17f0&lt;/code&gt; rev 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Fedora Linux 44 Workstation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel&lt;/td&gt;
&lt;td&gt;7.0.12-201.fc44.x86_64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU firmware&lt;/td&gt;
&lt;td&gt;1.1.2.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XRT&lt;/td&gt;
&lt;td&gt;2.25.0 (built from &lt;code&gt;amd/xdna-driver&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also works on other &lt;strong&gt;XDNA2&lt;/strong&gt; NPUs (Strix, Strix Halo, Kraken, Gorgon Point) with the same stack.&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%2Fii0s7099izm47zquyfky.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%2Fii0s7099izm47zquyfky.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Before you start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kernel requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux 7.0+&lt;/strong&gt; (Fedora 44 ships this) with in-tree &lt;code&gt;amdxdna&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;For Strix Halo (rev 11), prefer the &lt;strong&gt;out-of-tree DKMS driver&lt;/strong&gt; from &lt;code&gt;xdna-driver&lt;/code&gt; over the stock in-tree module&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IOMMU must be enabled&lt;/strong&gt; — see IOMMU section
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Check your kernel cmdline now
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cmdline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;amd_iommu=off&lt;/code&gt;, remove it &lt;strong&gt;before&lt;/strong&gt; spending time on driver builds. Details below.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Install build dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  git jq dkms &lt;span class="se"&gt;\&lt;/span&gt;
  kernel-devel-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; kernel-headers &lt;span class="se"&gt;\&lt;/span&gt;
  gcc gcc-c++ make cmake ninja-build &lt;span class="se"&gt;\&lt;/span&gt;
  boost-devel boost-filesystem boost-program-options boost-static &lt;span class="se"&gt;\&lt;/span&gt;
  elfutils-devel libdrm-devel libuuid-devel libcurl-devel &lt;span class="se"&gt;\&lt;/span&gt;
  openssl-devel zlib-static glibc-static libstdc++-static &lt;span class="se"&gt;\&lt;/span&gt;
  protobuf-devel protobuf-compiler &lt;span class="se"&gt;\&lt;/span&gt;
  json-glib-devel libyaml-devel libudev-devel &lt;span class="se"&gt;\&lt;/span&gt;
  rpm-build curl pciutils &lt;span class="se"&gt;\&lt;/span&gt;
  fftw-devel &lt;span class="se"&gt;\&lt;/span&gt;
  opencl-headers opencl-filesystem OpenCL-ICD-Loader-devel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run AMD's dependency scripts (optional but helpful):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--recursive&lt;/span&gt; https://github.com/amd/xdna-driver.git ~/repos/xdna-driver
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/repos/xdna-driver
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./tools/amdxdna_deps.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./xrt/src/runtime_src/tools/scripts/xrtdeps.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fedora OpenCL note:&lt;/strong&gt; Fedora 44 uses &lt;code&gt;OpenCL-ICD-Loader&lt;/code&gt;, not the older &lt;code&gt;ocl-icd&lt;/code&gt; package. If the XRT build fails on OpenCL ICD layout or RPM dependencies, see Fedora XRT build fixes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  cmake3 wrapper (Fedora ships CMake 4.x as &lt;code&gt;cmake&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;XRT build scripts look for &lt;code&gt;cmake3&lt;/code&gt; on Fedora. Create a local wrapper — no system symlink needed:&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="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/xrt-build/bin
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/bin/cmake ~/.local/xrt-build/bin/cmake3
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.local/xrt-build/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/xrt-build/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Build and install XRT
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/repos/xdna-driver/xrt/build

./build.sh &lt;span class="nt"&gt;-npu&lt;/span&gt; &lt;span class="nt"&gt;-opt&lt;/span&gt; &lt;span class="nt"&gt;-disable-werror&lt;/span&gt; &lt;span class="nt"&gt;-noinit&lt;/span&gt; &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the RPMs (version string may differ slightly):&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="nb"&gt;cd&lt;/span&gt; ~/repos/xdna-driver/xrt/build/Release
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; xrt-base-&lt;span class="k"&gt;*&lt;/span&gt;.rpm xrt-base-devel-&lt;span class="k"&gt;*&lt;/span&gt;.rpm xrt-npu-&lt;span class="k"&gt;*&lt;/span&gt;.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Register XRT libraries system-wide
&lt;/h3&gt;

&lt;p&gt;Without this, &lt;code&gt;flm&lt;/code&gt; fails with &lt;code&gt;libxrt_coreutil.so.2: cannot open shared object file&lt;/code&gt;:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'/opt/xilinx/xrt/lib64'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/ld.so.conf.d/xrt.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ldconfig &lt;span class="nt"&gt;-p&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;xrt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Build and install the NPU plugin (DKMS driver + XRT shim)
&lt;/h2&gt;

&lt;p&gt;This step provides &lt;strong&gt;&lt;code&gt;libxrt_driver_xdna.so&lt;/code&gt;&lt;/strong&gt; and replaces the in-tree kernel module with the DKMS build.&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/xrt-build/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/repos/xdna-driver/build
./build.sh &lt;span class="nt"&gt;-release&lt;/span&gt; &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the plugin RPM:&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="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; ~/repos/xdna-driver/build/Release/xrt_plugin.&lt;span class="k"&gt;*&lt;/span&gt;.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the DKMS module is active (path should contain &lt;code&gt;extra/&lt;/code&gt; or &lt;code&gt;updates/dkms/&lt;/code&gt;, &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;kernel/drivers/accel/&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;modinfo &lt;span class="nt"&gt;-F&lt;/span&gt; filename amdxdna
&lt;span class="c"&gt;# e.g. /lib/modules/7.0.12-201.fc44.x86_64/extra/amdxdna.ko.xz&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot if the module was just installed:&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="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Fix memlock limit
&lt;/h2&gt;

&lt;p&gt;The NPU needs locked memory. Check current limit:&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="nb"&gt;ulimit&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If not &lt;code&gt;unlimited&lt;/code&gt;:&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="nb"&gt;sudo tee&lt;/span&gt; /etc/security/limits.d/99-memlock.conf &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
*    soft    memlock    unlimited
*    hard    memlock    unlimited
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log out and back in (or reboot), then confirm:&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="nb"&gt;ulimit&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="c"&gt;# unlimited&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Critical: do NOT use &lt;code&gt;amd_iommu=off&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is &lt;code&gt;amd_iommu&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;IOMMU&lt;/strong&gt; (AMD-Vi on AMD platforms) mediates how PCIe devices access memory. The NPU driver uses &lt;strong&gt;PASID / SVA&lt;/strong&gt; (Shared Virtual Addressing) so the NPU can share your process's virtual address space — this requires IOMMU.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;amd_iommu=off&lt;/code&gt; disables IOMMU entirely. Strix Halo users often add it for &lt;strong&gt;5–12% faster GPU inference&lt;/strong&gt; in llama.cpp. That trade-off &lt;strong&gt;kills NPU support&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptoms with IOMMU off
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ERROR]  No NPU device found.
amdxdna_sva_init: SVA bind device failed, ret -19
PASID unavailable and carveout not configured
Open /dev/accel/accel0 failed (err=-22): Invalid argument
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/default/grub&lt;/code&gt; and &lt;strong&gt;remove&lt;/strong&gt; &lt;code&gt;amd_iommu=off&lt;/code&gt;:&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="nb"&gt;sudo &lt;/span&gt;nano /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRUB_CMDLINE_LINUX="... amd_iommu=off amdgpu.gttsize=24576 ..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To (keep your GPU tuning flags, drop only the IOMMU disable):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRUB_CMDLINE_LINUX="... amdgpu.gttsize=24576 ttm.pages_limit=6291456"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regenerate grub and reboot:&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="nb"&gt;sudo &lt;/span&gt;grub2-mkconfig &lt;span class="nt"&gt;-o&lt;/span&gt; /boot/grub2/grub.cfg
&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After reboot:&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="nb"&gt;cat&lt;/span&gt; /proc/cmdline | &lt;span class="nb"&gt;grep &lt;/span&gt;amd_iommu &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"OK: amd_iommu not disabled"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Optional middle ground:&lt;/strong&gt; Some users use &lt;code&gt;iommu=pt&lt;/code&gt; instead of &lt;code&gt;amd_iommu=off&lt;/code&gt; for slightly less IOMMU overhead while keeping NPU working. Note: &lt;code&gt;amd_iommu=pt&lt;/code&gt; is &lt;strong&gt;invalid&lt;/strong&gt; on AMD — use &lt;code&gt;iommu=pt&lt;/code&gt; (no &lt;code&gt;amd_&lt;/code&gt; prefix).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Build and install FastFlowLM
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  libavformat-devel libavutil-devel libavcodec-devel &lt;span class="se"&gt;\&lt;/span&gt;
  libswresample-devel libswscale-devel

git clone &lt;span class="nt"&gt;--recursive&lt;/span&gt; https://github.com/FastFlowLM/FastFlowLM.git ~/repos/FastFlowLM
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/repos/FastFlowLM/src
cmake &lt;span class="nt"&gt;--preset&lt;/span&gt; linux-default
&lt;span class="nb"&gt;cd &lt;/span&gt;build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;cmake &lt;span class="nt"&gt;--install&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;flm&lt;/code&gt; installs to &lt;code&gt;/opt/fastflowlm/bin/flm&lt;/code&gt; (symlinked to &lt;code&gt;/usr/local/bin/flm&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Make &lt;code&gt;xrt-smi&lt;/code&gt; available (optional but useful)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;xrt-smi&lt;/code&gt; lives in &lt;code&gt;/opt/xilinx/xrt/bin/&lt;/code&gt;. You can source the environment script:&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="nb"&gt;source&lt;/span&gt; /opt/xilinx/xrt/setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do not symlink&lt;/strong&gt; &lt;code&gt;xrt-smi&lt;/code&gt; to &lt;code&gt;/usr/local/bin&lt;/code&gt; — the wrapper script uses &lt;code&gt;dirname "$0"&lt;/code&gt; and breaks when symlinked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/local/bin/xrt-smi: line 46: /usr/local/bin/unwrapped/xrt-smi: No such file or directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, create a small wrapper:&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="nb"&gt;sudo tee&lt;/span&gt; /usr/local/bin/xrt-smi &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/bin/sh
exec /opt/xilinx/xrt/bin/xrt-smi "&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="sh"&gt;"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/xrt-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add XRT to PATH permanently in &lt;code&gt;~/.bashrc&lt;/code&gt;:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/xilinx/xrt/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Validate everything
&lt;/h2&gt;

&lt;p&gt;Run these in order:&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;# Kernel driver + firmware&lt;/span&gt;
flm validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Linux]  Kernel: 7.0.12-201.fc44.x86_64
[Linux]  NPU: /dev/accel/accel0 with 8 columns
[Linux]  NPU FW Version: 1.1.2.65
[Linux]  amdxdna version: 0.15
[Linux]  Memlock Limit: infinity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# XRT layer&lt;/span&gt;
xrt-smi examine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: one &lt;strong&gt;NPU Strix Halo&lt;/strong&gt; device at &lt;code&gt;[0000:c5:00.1]&lt;/code&gt;.&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;# Hardware self-test&lt;/span&gt;
xrt-smi validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: gemm, latency, and throughput tests &lt;strong&gt;PASSED&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; &lt;code&gt;flm validate&lt;/code&gt; checks the kernel DRM device. &lt;code&gt;flm run&lt;/code&gt; uses XRT. Both must pass before running models.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Run your first model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flm run gemma4-it:e4b
flm list
flm serve gemma4-it:e4b     &lt;span class="c"&gt;# OpenAI-compatible server on port 52625&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Models download from HuggingFace on first run. Default storage: &lt;code&gt;~/.config/flm/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside an interactive &lt;code&gt;flm run&lt;/code&gt; session, toggle performance reporting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/verbose    # per-turn TTFT, prefill tok/s, decoding tok/s
/status     # token counts and throughput summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formal benchmarks across context lengths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flm bench gemma4-it:e4b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Monitor NPU stats
&lt;/h2&gt;

&lt;p&gt;There is &lt;strong&gt;no Linux equivalent to &lt;code&gt;amdgpu_top&lt;/code&gt; or Windows Task Manager's NPU tab&lt;/strong&gt; yet. Use a combination of XRT (device-level) and FLM (inference-level) tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device info, firmware, topology&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xrt-smi examine&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power, partitions, platform&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xrt-smi examine -r all -d 0000:c5:00.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware benchmark (TOPS, latency)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xrt-smi validate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live-ish polling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;watch -n1 'xrt-smi examine -r all -d 0000:c5:00.1'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inference speed while chatting&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/verbose&lt;/code&gt; and &lt;code&gt;/status&lt;/code&gt; in &lt;code&gt;flm run&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formal model benchmarks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flm bench &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Replace &lt;code&gt;0000:c5:00.1&lt;/code&gt; with your NPU BDF from &lt;code&gt;xrt-smi examine&lt;/code&gt; if it differs.&lt;/p&gt;

&lt;h3&gt;
  
  
  XRT — device-level snapshots
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xrt-smi examine
xrt-smi examine &lt;span class="nt"&gt;-r&lt;/span&gt; all &lt;span class="nt"&gt;-d&lt;/span&gt; 0000:c5:00.1
xrt-smi validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Poll while a model runs in another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watch &lt;span class="nt"&gt;-n1&lt;/span&gt; &lt;span class="s1"&gt;'xrt-smi examine -r all -d 0000:c5:00.1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Power modes (some require root):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xrt-smi configure &lt;span class="nt"&gt;--pmode&lt;/span&gt; performance &lt;span class="nt"&gt;-d&lt;/span&gt; 0000:c5:00.1
&lt;span class="c"&gt;# modes: default, powersaver, balanced, performance, turbo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  FLM — inference metrics (most useful in practice)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Terminal 1&lt;/strong&gt; — run a model with verbose output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flm run gemma4-it:e4b
&lt;span class="c"&gt;# then type /verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 2&lt;/strong&gt; — watch the NPU device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watch &lt;span class="nt"&gt;-n1&lt;/span&gt; &lt;span class="s1"&gt;'xrt-smi examine -r all -d 0000:c5:00.1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 3&lt;/strong&gt; (optional) — GPU is separate from NPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;amdgpu_top    &lt;span class="c"&gt;# Radeon iGPU only, not the NPU&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Kernel debugfs (low-level, requires root)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ls&lt;/span&gt; /sys/kernel/debug/accel/
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; /sys/kernel/debug/dri/

&lt;span class="c"&gt;# When present (exact path varies by kernel/driver):&lt;/span&gt;
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/kernel/debug/dri/0/telemetry_profiling
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/kernel/debug/dri/0/powerstate
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/kernel/debug/dri/0/get_app_health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are read-on-demand debug interfaces, not a live dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does NOT show NPU utilization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;htop&lt;/code&gt; / &lt;code&gt;top&lt;/code&gt; — CPU and RAM only&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amdgpu_top&lt;/code&gt; / &lt;code&gt;radeontop&lt;/code&gt; — GPU only&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/sys/class/accel/accel0/&lt;/code&gt; — device node metadata, no utilization graph&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Real-world benchmark (ROG Flow Z13)
&lt;/h2&gt;

&lt;p&gt;Measured on the same machine as this guide after a successful setup (Fedora 44, Ryzen AI Max 390, NPU firmware 1.1.2.65, IOMMU enabled).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gemma4-it:e4b&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flm run gemma4-it:e4b
&lt;span class="c"&gt;# /verbose enabled during session&lt;/span&gt;
&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;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (time to first token)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.21 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefill speed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decoding speed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These numbers come from FLM's &lt;code&gt;/verbose&lt;/code&gt; output (prefill and decoding tokens/s). Your results will vary with prompt length, context size, power mode, and background load.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;xrt-smi validate&lt;/code&gt; on the same hardware reported &lt;strong&gt;4.4 TOPS&lt;/strong&gt; (gemm), &lt;strong&gt;52 µs&lt;/strong&gt; average latency, and &lt;strong&gt;~76k op/s&lt;/strong&gt; throughput — useful as a hardware sanity check, not directly comparable to LLM tok/s.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;libxrt_coreutil.so.2: cannot open shared object file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XRT libs not in loader cache&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;/opt/xilinx/xrt/lib64&lt;/code&gt; to &lt;code&gt;ld.so.conf.d&lt;/code&gt;, run &lt;code&gt;sudo ldconfig&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;No NPU device found&lt;/code&gt; + clean dmesg&lt;/td&gt;
&lt;td&gt;IOMMU disabled&lt;/td&gt;
&lt;td&gt;Remove &lt;code&gt;amd_iommu=off&lt;/code&gt;, reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PASID unavailable and carveout not configured&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same as above&lt;/td&gt;
&lt;td&gt;Enable IOMMU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Memlock limit is too low (8MB)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default ulimit too low&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/etc/security/limits.d/99-memlock.conf&lt;/code&gt;, re-login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xrt-smi: 0 devices found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Missing NPU plugin&lt;/td&gt;
&lt;td&gt;Install &lt;code&gt;xrt_plugin&lt;/code&gt; RPM from &lt;code&gt;xdna-driver/build&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/dev/accel/accel0&lt;/code&gt; exists but open fails (ENODEV)&lt;/td&gt;
&lt;td&gt;In-tree driver failed probe&lt;/td&gt;
&lt;td&gt;Install DKMS driver via &lt;code&gt;xrt_plugin&lt;/code&gt; RPM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;flm validate&lt;/code&gt; OK but &lt;code&gt;flm run&lt;/code&gt; fails with &lt;code&gt;No such device with index '0'&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;XRT can't see NPU&lt;/td&gt;
&lt;td&gt;Fix XRT plugin + &lt;code&gt;xrt-smi examine&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xrt-smi: unwrapped/xrt-smi: No such file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bad symlink&lt;/td&gt;
&lt;td&gt;Use wrapper script (see section 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmake3 is not installed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fedora CMake naming&lt;/td&gt;
&lt;td&gt;Create &lt;code&gt;cmake3&lt;/code&gt; wrapper pointing to &lt;code&gt;/usr/bin/cmake&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XRT build fails on OpenCL ICD&lt;/td&gt;
&lt;td&gt;Fedora OpenCL 3.0 layout&lt;/td&gt;
&lt;td&gt;See Fedora XRT build fixes below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link errors for &lt;code&gt;libfftw3&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Missing dev package&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo dnf install fftw-devel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Useful debug commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# NPU PCI device&lt;/span&gt;
lspci &lt;span class="nt"&gt;-nn&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;17f0

&lt;span class="c"&gt;# Device node&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /dev/accel/

&lt;span class="c"&gt;# Kernel messages&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s1"&gt;'amdxdna|xdna|pasid|firmware|17f0'&lt;/span&gt;

&lt;span class="c"&gt;# Which driver module is loaded&lt;/span&gt;
modinfo &lt;span class="nt"&gt;-F&lt;/span&gt; filename amdxdna
lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;amdxdna

&lt;span class="c"&gt;# Firmware files (rev 11 = 17f0_11)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/lib/firmware/amdnpu/17f0_11/

&lt;span class="c"&gt;# IOMMU status&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cmdline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fedora XRT build fixes
&lt;/h2&gt;

&lt;p&gt;Fedora 44 changed OpenCL packaging. Upstream XRT may fail to build or produce RPMs with wrong dependencies. Symptoms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile error in &lt;code&gt;ocl_icd_bindings.cpp&lt;/code&gt; (OpenCL 3.0 ICD struct layout)&lt;/li&gt;
&lt;li&gt;RPM dependency conflict between &lt;code&gt;ocl-icd&lt;/code&gt; and &lt;code&gt;OpenCL-ICD-Loader&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Workarounds applied in our build&lt;/strong&gt; (track upstream fix):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patch &lt;code&gt;xrt/src/runtime_src/xocl/api/icd/ocl_icd_bindings.cpp&lt;/code&gt; for OpenCL 3.0 ICD compatibility&lt;/li&gt;
&lt;li&gt;Patch &lt;code&gt;xrt/src/CMake/cpackLin.cmake&lt;/code&gt; to require &lt;code&gt;OpenCL-ICD-Loader &amp;gt;= 3.0&lt;/code&gt; on Fedora&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upstream issue: &lt;a href="https://github.com/Xilinx/XRT/issues/9163" rel="noopener noreferrer"&gt;Xilinx/XRT #9163&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install these before building if &lt;code&gt;xrtdeps.sh&lt;/code&gt; fails on OpenCL packages:&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="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; opencl-headers opencl-filesystem OpenCL-ICD-Loader-devel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build flags that helped on Fedora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./build.sh &lt;span class="nt"&gt;-npu&lt;/span&gt; &lt;span class="nt"&gt;-opt&lt;/span&gt; &lt;span class="nt"&gt;-disable-werror&lt;/span&gt; &lt;span class="nt"&gt;-noinit&lt;/span&gt; &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;-j $(nproc)&lt;/code&gt; with a &lt;strong&gt;space&lt;/strong&gt; — some build scripts break on &lt;code&gt;-j$(nproc)&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture: why so many pieces?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│  flm run / flm serve                    │  ← FastFlowLM (user-facing)
├─────────────────────────────────────────┤
│  libxrt_driver_xdna.so (XRT plugin)     │  ← xrt_plugin RPM
├─────────────────────────────────────────┤
│  libxrt_core.so (XRT base)              │  ← xrt-base RPM
├─────────────────────────────────────────┤
│  amdxdna.ko (DKMS kernel driver)        │  ← xrt_plugin RPM (postinst)
├─────────────────────────────────────────┤
│  NPU firmware (amdnpu/17f0_11/)       │  ← linux-firmware + plugin
├─────────────────────────────────────────┤
│  /dev/accel/accel0                      │  ← kernel DRM device node
└─────────────────────────────────────────┘
         ▲
         │ requires IOMMU (PASID/SVA)
         │ requires memlock = unlimited
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick re-setup checklist (future you)
&lt;/h2&gt;

&lt;p&gt;After a fresh Fedora install or kernel upgrade:&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. Confirm IOMMU is NOT disabled&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'amd_iommu=off'&lt;/span&gt; /proc/cmdline &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FIX GRUB FIRST"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"IOMMU OK"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Rebuild DKMS if kernel changed&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dkms autoinstall &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;depmod &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;# 3. Check memlock&lt;/span&gt;
&lt;span class="nb"&gt;ulimit&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# 4. Validate&lt;/span&gt;
flm validate &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; xrt-smi examine &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; xrt-smi validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/FastFlowLM/FastFlowLM" rel="noopener noreferrer"&gt;FastFlowLM&lt;/a&gt; — NPU-first LLM runtime&lt;/li&gt;
&lt;li&gt;&lt;a href="//./linux-getting-started.md"&gt;FastFlowLM Linux docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amd/xdna-driver" rel="noopener noreferrer"&gt;amd/xdna-driver&lt;/a&gt; — XRT + NPU plugin source&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lemonade-server.ai/flm_npu_linux.html" rel="noopener noreferrer"&gt;Lemonade NPU Linux guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Xilinx/XRT/issues/9163" rel="noopener noreferrer"&gt;XRT OpenCL Fedora issue #9163&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kyuz0/amd-strix-halo-toolboxes/issues/66" rel="noopener noreferrer"&gt;Strix Halo IOMMU discussion&lt;/a&gt; — GPU vs NPU trade-off&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written from a working Fedora 44 + ROG Flow Z13 setup. If AMD ships Fedora packages later, prefer those over building from source — but the troubleshooting sections above still apply.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>amd</category>
      <category>npu</category>
      <category>llm</category>
      <category>ai</category>
    </item>
    <item>
      <title>Kriya-Egocentric-100K: Action100M-style Annotations for Real-World Labor Videos</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Tue, 17 Mar 2026 05:22:36 +0000</pubDate>
      <link>https://dev.to/ankk98/kriya-egocentric-100k-action100m-style-annotations-for-real-world-labor-videos-42jd</link>
      <guid>https://dev.to/ankk98/kriya-egocentric-100k-action100m-style-annotations-for-real-world-labor-videos-42jd</guid>
      <description>&lt;p&gt;Just pushed a new preview dataset to Hugging Face: &lt;strong&gt;&lt;a href="https://huggingface.co/datasets/ankk98/kriya-egocentric-100k" rel="noopener noreferrer"&gt;Kriya-Egocentric-100K&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It contains &lt;strong&gt;Action100M-compatible hierarchical action annotations&lt;/strong&gt; for a small 5-video subset of &lt;a href="https://huggingface.co/datasets/builddotai/Egocentric-100K" rel="noopener noreferrer"&gt;Build AI’s Egocentric-100K&lt;/a&gt; — real first-person footage captured with a monocular head-mounted fisheye camera during manual labor 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi3kngo6f532vm339o9v.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.amazonaws.com%2Fuploads%2Farticles%2Fvi3kngo6f532vm339o9v.png" alt="Kriya Viz Screenshot" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What’s inside?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;One JSON file per video (&lt;code&gt;f001-w001-0001.json&lt;/code&gt; etc.)&lt;/li&gt;
&lt;li&gt;Full Action100M-style tree: root → sub-segments with precise start/end timestamps&lt;/li&gt;
&lt;li&gt;LLM-generated natural language captions + structured GPT outputs (brief/detailed summaries, action labels, actors)&lt;/li&gt;
&lt;li&gt;Everything generated 100 % automatically via the &lt;strong&gt;&lt;a href="https://mindandmotionlabs.com/api-docs.html" rel="noopener noreferrer"&gt;Kriya Full Automated Action Annotation API&lt;/a&gt;&lt;/strong&gt; (early preview)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The videos themselves are &lt;strong&gt;not&lt;/strong&gt; hosted here (you’ll need to pull them directly from Build AI under their license), but the annotations are MIT and drop-in compatible with the &lt;strong&gt;&lt;a href="https://ankk98.github.io/kriya-viz/" rel="noopener noreferrer"&gt;Kriya Visualizer&lt;/a&gt;&lt;/strong&gt; — just load the video + matching JSON and explore the timeline instantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why this matters
&lt;/h4&gt;

&lt;p&gt;After the EPIC-KITCHENS preview, this is the next step toward scaling automatic annotation to more diverse egocentric domains. Manual labor footage brings new challenges (occlusions, tool use, unstructured environments) — and the results already look strong for downstream tasks like video world models, VLMs, VLA policies, and embodied robotics.&lt;/p&gt;

&lt;p&gt;Visualizer demo, full pipeline details, and the previous Kriya-EPIC-KITCHENS release are all in the &lt;strong&gt;&lt;a href="https://dev.to/ankk98/kriya-tools-for-exploring-and-generating-action100m-style-video-annotations-46ee"&gt;original Kriya tools blog post&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is still an early preview — feedback and collaboration super welcome! Drop a comment or DM if you want to try the API on your own footage or discuss scaling plans.&lt;/p&gt;

&lt;p&gt;Excited to keep pushing the boundary of automatic video understanding .&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataset</category>
      <category>computervision</category>
      <category>egocentric</category>
    </item>
    <item>
      <title>Kriya: Tools for Exploring and Generating Action100M-style Video Annotations</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 14 Mar 2026 06:29:49 +0000</pubDate>
      <link>https://dev.to/ankk98/kriya-tools-for-exploring-and-generating-action100m-style-video-annotations-46ee</link>
      <guid>https://dev.to/ankk98/kriya-tools-for-exploring-and-generating-action100m-style-video-annotations-46ee</guid>
      <description>&lt;p&gt;After reading the excellent &lt;a href="https://arxiv.org/abs/2601.10592" rel="noopener noreferrer"&gt;Action100M paper&lt;/a&gt;, I became very excited about the potential of &lt;strong&gt;fully automated, large-scale video action annotation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;High-quality temporal action hierarchies open doors for training stronger video world models, video-language models (VLMs), vision-language-action models (VLAs), humanoid control policies, and physical reasoning systems.&lt;/p&gt;

&lt;p&gt;But two practical problems quickly appeared:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There was no convenient way to &lt;strong&gt;visualize&lt;/strong&gt; these rich, hierarchical annotations together with the video.&lt;/li&gt;
&lt;li&gt;Generating such annotations at scale for new/custom video datasets still felt out of reach for many researchers and engineers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built two tools to help move things forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Kriya Visualizer – See Action100M-style Annotations Come Alive
&lt;/h2&gt;

&lt;p&gt;I created a lightweight, static web-based visualizer specifically designed for Action100M-style temporal action trees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features (current version):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video player synced with the annotation timeline&lt;/li&gt;
&lt;li&gt;Hierarchical timeline (one row per level in the action tree)&lt;/li&gt;
&lt;li&gt;Nodes highlight at the current timestamp&lt;/li&gt;
&lt;li&gt;Side panel with metadata, full transcript, and raw JSON view&lt;/li&gt;
&lt;li&gt;Clean, single-screen layout (no installation needed)&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.amazonaws.com%2Fuploads%2Farticles%2Fpwxn9kxf3iclk3x8ggt7.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.amazonaws.com%2Fuploads%2Farticles%2Fpwxn9kxf3iclk3x8ggt7.png" alt="Kriya Viz Screenshot" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's open source under MIT license → feel free to fork, improve, or use it in your projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Here:&lt;/strong&gt; &lt;a href="https://ankk98.github.io/kriya-viz/" rel="noopener noreferrer"&gt;https://ankk98.github.io/kriya-viz/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/Ankk98/kriya-viz" rel="noopener noreferrer"&gt;https://github.com/Ankk98/kriya-viz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're working with Action100M data (or any similar dense temporal action hierarchy), give it a try and let me know what features would make it more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Kriya-EPIC-KITCHENS – Automatic Annotations on Egocentric Videos
&lt;/h2&gt;

&lt;p&gt;Next, I wanted to test how well fully automatic annotation works on real, challenging egocentric data.&lt;/p&gt;

&lt;p&gt;I ran the &lt;strong&gt;Kriya Full Automated Action Annotation API&lt;/strong&gt; (early preview) on a small subset of videos from the popular &lt;a href="https://epic-kitchens.github.io/2026" rel="noopener noreferrer"&gt;EPIC-KITCHENS-100&lt;/a&gt; dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; A preview Hugging Face dataset with ~6 videos fully annotated in Action100M style, no human labeling involved.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Temporal segments with hierarchical actions&lt;/li&gt;
&lt;li&gt;Natural language captions/descriptions per segment&lt;/li&gt;
&lt;li&gt;Ready to download and use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dataset link:&lt;/strong&gt; &lt;a href="https://huggingface.co/datasets/ankk98/kriya-epic-kitchens" rel="noopener noreferrer"&gt;https://huggingface.co/datasets/ankk98/kriya-epic-kitchens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Early results on kitchen egocentric videos look very promising. I'm excited to see if/how these annotations can feed downstream tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video world models&lt;/li&gt;
&lt;li&gt;VLM / VLA fine-tuning&lt;/li&gt;
&lt;li&gt;Robotic manipulation from egocentric views&lt;/li&gt;
&lt;li&gt;Physical AI reasoning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current API version deliberately follows the Action100M pipeline closely. An improved version that addresses some limitations is already in the works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API docs (early preview):&lt;/strong&gt; &lt;a href="https://mindandmotionlabs.com/api-docs.html" rel="noopener noreferrer"&gt;https://mindandmotionlabs.com/api-docs.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;
(You send videos → get back structured temporal action hierarchies)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Manual video annotation at scale is expensive and slow. If high-quality automatic annotation becomes reliable, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Train on orders-of-magnitude more grounded video data&lt;/li&gt;
&lt;li&gt;Build more general-purpose video understanding and action generation models&lt;/li&gt;
&lt;li&gt;Accelerate progress toward capable robotic and embodied AI systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two small releases are just early steps. Kriya Visualizer for inspection/debugging, and Kriya-EPIC-KITCHENS as a proof-of-concept dataset.&lt;/p&gt;

&lt;p&gt;Feedback, feature requests, collaboration ideas, or even just "I tried it and here's what broke" are very welcome!&lt;/p&gt;

&lt;p&gt;What are you building with video action data right now? Drop a comment below 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>computervision</category>
      <category>robotics</category>
      <category>dataset</category>
    </item>
    <item>
      <title>From Perception to Embodied Intelligence: Evolution, Architectures, and the Humanoid Gap</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sat, 14 Feb 2026 13:56:12 +0000</pubDate>
      <link>https://dev.to/ankk98/from-perception-to-embodied-intelligence-evolution-architectures-and-the-humanoid-gap-3dhi</link>
      <guid>https://dev.to/ankk98/from-perception-to-embodied-intelligence-evolution-architectures-and-the-humanoid-gap-3dhi</guid>
      <description>&lt;p&gt;Vision-Language-Action (VLA) models represent a paradigm shift from passive multimodal understanding to active embodied control. This brief maps the lineage from foundational Vision-Language Models (VLMs) like CLIP and BLIP to current state-of-the-art VLA systems, revealing critical architectural transitions, data strategies, and failure modes that define the frontier of humanoid manipulation.&lt;/p&gt;

&lt;p&gt;The analysis identifies three core evolutionary phases:&lt;/p&gt;

&lt;p&gt;(1) VLM pre-training for semantic understanding&lt;br&gt;
(2) action tokenization enabling end-to-end control&lt;br&gt;
(3) hybrid architectures balancing reasoning with real-time execution&lt;/p&gt;

&lt;p&gt;For humanoid robotics, fundamental gaps remain in proprioceptive reasoning, long-horizon planning, and physics-aware action generation, challenges that current open-source models address only partially.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Evolutionary Timeline: From VLMs to VLAs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Foundation (2021–2022) – VLMs as Semantic Engines
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CLIP (2021)&lt;/strong&gt; and &lt;strong&gt;BLIP (2022)&lt;/strong&gt; established contrastive learning as the dominant paradigm for aligning vision and language modalities. These models excelled at matching images to text descriptions but lacked any mechanism for action generation. Their legacy persists in modern VLAs: OpenVLA inherits SigLIP's vision encoder, while Pi0 leverages PaliGemma's VLM backbone. &lt;a href="https://hankyukim.com/openvla/" rel="noopener noreferrer"&gt;hankyukim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Limitation&lt;/strong&gt;: VLMs were fundamentally passive, optimized for retrieval and classification, not sequential decision-making. Early attempts like &lt;strong&gt;CLIPort&lt;/strong&gt; (2022) demonstrated that grafting CLIP representations onto robotic policies via imitation learning could achieve task-specific success but failed to generalize across embodiments or semantic concepts beyond the training distribution. &lt;a href="https://arxiv.org/html/2505.04769v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Tokenization Breakthrough (2023) – RT-2 and the Birth of VLAs
&lt;/h3&gt;

&lt;p&gt;Google DeepMind's &lt;strong&gt;RT-2 (July 2023)&lt;/strong&gt; catalyzed the field by reconceptualizing robot actions as text tokens. The architecture quantized continuous actions into discrete bins (typically 256 per dimension) and appended them to the vocabulary of a PaLM-E or PaLI-X VLM. This enabled training with standard next-token prediction objectives, unifying web-scale vision-language pre-training with robotic demonstrations. &lt;a href="https://madison-proceedings.com/index.php/aetr/article/view/4359" rel="noopener noreferrer"&gt;madison-proceedings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Leap&lt;/strong&gt;: RT-2 achieved 3× improvement in generalization over RT-1, demonstrating emergent capabilities like reasoning about object categories and improvising tools. The model could interpret novel commands ("place the apple on the 3") despite never observing such combinations in robot data. &lt;a href="https://deepmind.google/blog/rt-2-new-model-translates-vision-and-language-into-action/" rel="noopener noreferrer"&gt;deepmind&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Scaling and Open-Source (2024–2025) – OpenVLA, SmolVLA, and Pi0
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenVLA (2024)&lt;/strong&gt; democratized access with a 7B-parameter model trained on 970k demonstrations from the Open X-Embodiment dataset. Built on Llama 2 + DINOv2 + SigLIP, it outperformed closed models like RT-2-X (55B parameters) with 7× fewer parameters by leveraging more diverse training data and 27 training epochs (vs. typical 1-2 epochs for VLMs). &lt;a href="https://arxiv.org/html/2406.09246v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SmolVLA (2025)&lt;/strong&gt; pioneered efficiency, achieving OpenVLA-level performance with &amp;lt;0.5B parameters by employing a compact VLM backbone, flow matching action expert, and asynchronous inference stack. Its key insight: action generation quality depends more on architectural efficiency than raw parameter count. &lt;a href="https://www.youtube.com/watch?v=T1PhkCQDCcc" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pi0 Series (Physical Intelligence, 2024–2025)&lt;/strong&gt; introduced hybrid architectures combining autoregressive action tokens with continuous flow matching. Pi0.5 added temporal awareness through timestep conditioning, while Pi0.6 scaled to 5B parameters and incorporated knowledge insulation, training the VLM backbone on FAST tokens while isolating the action expert's gradients. &lt;a href="https://arxiv.org/html/2410.24164v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Thematic Deep Dives: What Worked vs. What Failed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Key Ideas That Worked
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Action Tokenization as Sequence Prediction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Treating actions as discrete tokens enabled direct transfer of LLM training infrastructure to robotics. RT-2's 256-bin quantization scheme remains the default in OpenVLA, providing a simple bridge between continuous control and autoregressive generation. This approach inherits powerful properties from language modeling: in-context learning, few-shot adaptation, and chain-of-thought reasoning. &lt;a href="https://arxiv.org/abs/2307.15818" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt;: OpenVLA achieves 95% action token accuracy after 27 training epochs, with performance correlating strongly to robot success rates. The discrete representation also simplifies multi-task training across heterogeneous robot embodiments. &lt;a href="https://arxiv.org/html/2406.09246v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Flow Matching for Continuous Control&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Diffusion-based action heads address the continuity problem inherent in tokenization. Pi0 and SmolVLA use flow matching to predict action chunks as continuous trajectories, avoiding quantization errors. This enables smoother, more precise control, critical for contact-rich manipulation. &lt;a href="https://www.youtube.com/watch?v=T1PhkCQDCcc" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Impact&lt;/strong&gt;: Pi0 outperforms tokenized baselines on action chunking tasks (e.g., folding laundry) where precise force modulation matters. Flow matching also supports variable horizon predictions, unlike fixed-length token sequences. &lt;a href="https://arxiv.org/html/2410.24164v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Knowledge Insulation and Modularity&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;VLA-Adapter and Pi0.6 demonstrate that decoupling VLM reasoning from action generation improves training efficiency. By freezing the VLM backbone and training only a lightweight action expert, these models avoid catastrophic forgetting of web-scale knowledge while specializing for robot control. &lt;a href="https://arxiv.org/abs/2509.09372" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficiency Gains&lt;/strong&gt;: VLA-Adapter trains a powerful VLA in 8 hours on a single consumer GPU, while Pi0.6's insulated gradients prevent performance degradation on vision-language benchmarks. &lt;a href="https://website.pi-asset.com/pi06star/PI06_model_card.pdf" rel="noopener noreferrer"&gt;website.pi-asset&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Key Ideas That Failed
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Naive Proprioception Integration&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Feeding raw robot state (joint angles, end-effector poses) directly as additional tokens creates shortcut learning. Policies overfit to state-action memorization rather than visual reasoning, degrading spatial generalization. In testing, models trained with proprioception fail when object positions deviate slightly from training trajectories. &lt;a href="https://arxiv.org/html/2509.18644v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure Mode&lt;/strong&gt;: A study on visuomotor policies found that proprioceptive states cause "shortcuts where the policy directly associates absolute configurations with actions," leading to 40-60% success rate drops under spatial perturbations. &lt;a href="https://arxiv.org/html/2509.18644v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Monolithic Scaling Without Architectural Innovation&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Simply increasing VLM backbone size (e.g., RT-2-X's 55B parameters) yields diminishing returns for robot control. The computational overhead, 15GB GPU memory for inference at 6Hz, makes real-time deployment impractical. Larger models also struggle with action token accuracy, as the vast parameter space prioritizes language modeling over control precision. &lt;a href="https://arxiv.org/html/2406.09246v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empirical Evidence&lt;/strong&gt;: OpenVLA's 7B model matches RT-2-X's performance despite 7× fewer parameters, suggesting data diversity and training recipe matter more than scale. &lt;a href="http://arxiv.org/pdf/2406.09246.pdf" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Single-Modality Action Generation&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Pure autoregressive or pure diffusion approaches each have blind spots. Autoregressive models struggle with continuous precision (quantization error), while diffusion models lack the reasoning depth of VLMs for long-horizon planning. HybridVLA attempted to combine both but introduced training interference between the two generation paradigms, requiring complex collaborative ensemble mechanisms that increased inference latency. &lt;a href="https://arxiv.org/abs/2503.10631" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Open Source Model Comparison: OpenVLA vs. SmolVLA vs. Pi0
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenVLA (7B)&lt;/th&gt;
&lt;th&gt;SmolVLA (&amp;lt;0.5B)&lt;/th&gt;
&lt;th&gt;Pi0.6 (5B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backbone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Llama 2 + DINOv2 + SigLIP&lt;/td&gt;
&lt;td&gt;Qwen 2.5 0.5B + custom ViT&lt;/td&gt;
&lt;td&gt;Gemma3 4B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Action Head&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autoregressive tokens (256 bins)&lt;/td&gt;
&lt;td&gt;Flow matching (continuous)&lt;/td&gt;
&lt;td&gt;Hybrid: FAST tokens + flow matching &lt;a href="https://website.pi-asset.com/pi06star/PI06_model_card.pdf" rel="noopener noreferrer"&gt;website.pi-asset&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Training Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;970k demos (OpenX dataset)&lt;/td&gt;
&lt;td&gt;Public community datasets&lt;/td&gt;
&lt;td&gt;Proprietary large-scale corpus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inference Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6 Hz on RTX 4090 &lt;a href="https://arxiv.org/html/2406.09246v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;12.5 Hz on L40s (2.5× faster than OpenVLA) &lt;a href="https://ai.stanford.edu/blog/minivla/" rel="noopener noreferrer"&gt;ai.stanford&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;5-10 Hz (denoising steps dependent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Innovation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-embodiment generalization&lt;/td&gt;
&lt;td&gt;Asynchronous inference stack&lt;/td&gt;
&lt;td&gt;Knowledge insulation + RL fine-tuning &lt;a href="https://www.pi.website/blog/pistar06" rel="noopener noreferrer"&gt;pi&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simulation Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;62% on LIBERO-90 &lt;a href="https://ai.stanford.edu/blog/minivla/" rel="noopener noreferrer"&gt;ai.stanford&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;77% on LIBERO-90 (w/ action chunks) &lt;a href="https://ai.stanford.edu/blog/minivla/" rel="noopener noreferrer"&gt;ai.stanford&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;State-of-the-art on LIBERO-5 (96.5%) &lt;a href="https://arxiv.org/abs/2508.19236" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-World Strength&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generalization across robots&lt;/td&gt;
&lt;td&gt;Deployment on consumer GPUs&lt;/td&gt;
&lt;td&gt;Long-horizon tasks (coffee making, laundry) &lt;a href="https://www.pi.website/blog/pistar06" rel="noopener noreferrer"&gt;pi&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Critical Weakness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slow inference, quantization error&lt;/td&gt;
&lt;td&gt;Limited long-horizon reasoning&lt;/td&gt;
&lt;td&gt;Proprietary, computationally intensive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Architectural Deep Dive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenVLA&lt;/strong&gt; follows the RT-2 blueprint faithfully: discretize actions, append to vocabulary, train with cross-entropy loss. Its strength lies in the curated OpenX dataset diversity, enabling zero-shot control of unseen robots. However, the autoregressive generation bottleneck limits real-time performance, 15GB GPU memory and 6Hz inference constrain deployment to high-end hardware. &lt;a href="http://arxiv.org/pdf/2406.09246.pdf" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SmolVLA&lt;/strong&gt; challenges the "bigger is better" orthodoxy. By using a compact VLM and flow matching action expert, it achieves comparable performance with 14× fewer parameters. The asynchronous inference stack decouples perception from action generation, allowing new chunks to be predicted while the robot executes previous commands. This is particularly impactful for dynamic environments where reaction time matters. &lt;a href="https://huggingface.co/blog/smolvla" rel="noopener noreferrer"&gt;huggingface&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pi0.6&lt;/strong&gt; represents the hybrid extreme: it trains the VLM backbone on FAST discrete tokens while the action expert predicts continuous flows. Knowledge insulation prevents gradient interference, and offline RL pre-training (Recap) doubles throughput on complex tasks. The model's hierarchical design supports heterogeneous prompts, enabling high-level task conditioning. The trade-off is accessibility, Pi0.6's training requires proprietary data and substantial compute, limiting reproducibility. &lt;a href="https://www.pi.website/blog/pistar06" rel="noopener noreferrer"&gt;pi&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Humanoid Gap Report: Missing Capabilities for Hand Manipulation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Proprioception and Tactile Integration
&lt;/h3&gt;

&lt;p&gt;Current VLAs treat proprioception as auxiliary inputs, leading to shortcut learning and poor spatial generalization. Humanoid hands require fine-grained force feedback and slip detection, capabilities absent in standard VLA pipelines. &lt;a href="https://arxiv.org/html/2509.18644v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gap&lt;/strong&gt;: No open-source VLA integrates tactile sensing end-to-end. ForceVLA and AnyTouch explore Mixture-of-Experts for contact-rich tasks, but these remain research prototypes. The lack of large-scale tactile datasets mirrors the early scarcity of robot demonstrations. &lt;a href="https://www.themoonlight.io/en/review/survey-of-vision-language-action-models-for-embodied-manipulation" rel="noopener noreferrer"&gt;themoonlight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opportunity&lt;/strong&gt;: Develop a "Tactile VLA" that fuses vision, language, and distributed pressure sensor arrays. The architecture should use tactile tokens analogous to image patches, enabling the VLM backbone to reason about contact forces and friction constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Long-Horizon Planning and Memory
&lt;/h3&gt;

&lt;p&gt;Humanoid manipulation tasks (e.g., assembling furniture) span 5–20 minutes and require remembering partial progress. Standard VLAs operate with Markovian assumptions and fixed context windows, causing failure when intermediate steps are ambiguous. &lt;a href="https://arxiv.org/html/2410.24164v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gap&lt;/strong&gt;: MemoryVLA demonstrates perceptual-cognitive memory banks for manipulation, but its evaluation is limited to tabletop tasks. Humanoid whole-body control introduces additional complexity: locomotion plans must be retained while hands execute fine manipulations. &lt;a href="https://arxiv.org/abs/2508.19236" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opportunity&lt;/strong&gt;: Implement a hierarchical memory system with (1) working memory for immediate action chunks and (2) episodic memory for task-level progress. The hippocampal-inspired consolidation mechanism from MemoryVLA could scale to humanoid tasks by encoding proprioceptive trajectories alongside visual observations. &lt;a href="https://arxiv.org/abs/2508.19236" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Physics-Aware Action Generation
&lt;/h3&gt;

&lt;p&gt;VLAs hallucinate physically implausible actions, predicting grasps that violate kinematic constraints or object trajectories that ignore gravity. This stems from the VLM backbone's pixel-space reasoning lacking 3D physical grounding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gap&lt;/strong&gt;: GeoVLA and 3D-VLA integrate point clouds and depth maps, but these are add-ons rather than core architectural features. The models still prioritize semantic alignment over physical feasibility. &lt;a href="https://arxiv.org/abs/2508.09071" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opportunity&lt;/strong&gt;: Embed a differentiable physics simulator within the VLA training loop. Actions could be penalized for violating Newtonian mechanics, similar to how RL uses physics-based rewards. The "visual foresight" approach in F1-VLA shows promise: predicting next visual states correlates with action reliability, suggesting that generative world models could enforce physical consistency. &lt;a href="https://arxiv.org/html/2509.06951v2" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Sim-to-Real for Humanoid Morphology
&lt;/h3&gt;

&lt;p&gt;Humanoid robots exhibit high-dimensional action spaces (30+ DOF) and complex contact dynamics. Current sim-to-real methods rely on domain randomization, which fails to capture the nuance of bipedal balance and bimanual coordination. &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12292580/" rel="noopener noreferrer"&gt;pmc.ncbi.nlm.nih&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gap&lt;/strong&gt;: HumanVLA demonstrates vision-language directed object rearrangement but requires privileged state information and hand-crafted finite state machines. The sim-to-real gap remains 17% failure rate in real-world experiments, primarily due to depth sensing errors and contact estimation delays. &lt;a href="https://arxiv.org/html/2406.19972v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opportunity&lt;/strong&gt;: Leverage human video data as an intermediate domain. EgoVLA extracts wrist and hand actions from egocentric videos, using inverse kinematics to retarget to robot hands. This "human-to-robot" transfer could bootstrap humanoid VLA training without expensive real robot data collection. &lt;a href="https://rchalyang.github.io/EgoVLA/" rel="noopener noreferrer"&gt;rchalyang.github&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Critical Disagreements and Uncertainties
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disagreement 1: Proprioception's Role&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proponents&lt;/strong&gt;: Proprioception provides compact, accurate state information essential for precise servo control. &lt;a href="https://arxiv.org/html/2509.18644v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critics&lt;/strong&gt;: End-to-end visuomotor policies without explicit state inputs achieve better spatial generalization, as they cannot memorize trajectories. &lt;a href="https://arxiv.org/html/2509.18644v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution&lt;/strong&gt;: The consensus is shifting toward &lt;em&gt;conditioned&lt;/em&gt; proprioception, using state inputs only for low-level control while keeping high-level reasoning vision-driven, as seen in Helix's dual-system architecture. &lt;a href="https://www.iotworldtoday.com/robotics/humanoid-robots-learn-to-work-together-natural-language-control" rel="noopener noreferrer"&gt;iotworldtoday&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disagreement 2: Action Representation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tokenization Camp&lt;/strong&gt;: Discrete tokens enable direct VLM transfer and chain-of-thought reasoning (OpenVLA, RT-2). &lt;a href="https://arxiv.org/html/2406.09246v1" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diffusion Camp&lt;/strong&gt;: Continuous flow matching captures action continuity and supports variable horizons (Pi0, SmolVLA). &lt;a href="https://www.youtube.com/watch?v=T1PhkCQDCcc" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution&lt;/strong&gt;: Hybrid approaches (Pi0.6, HybridVLA) are emerging as the synthesis, but training interference remains an open problem. &lt;a href="https://arxiv.org/abs/2503.10631" rel="noopener noreferrer"&gt;arxiv&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Uncertainty&lt;/strong&gt;: The optimal data mixture ratio for humanoid VLAs is unknown. RT-2 used 10% robotics data, while OpenVLA uses 100%. For humanoids, the scarcer data may require more aggressive web-scale pre-training, but this risks physics misalignment.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Conclusion
&lt;/h2&gt;

&lt;p&gt;VLA models have evolved from passive VLMs to active embodied agents, but the leap to reliable humanoid manipulation remains incomplete. The open-source ecosystem (OpenVLA, SmolVLA) has democratized access, yet critical gaps persist in proprioceptive reasoning, long-horizon memory, and physics-aware generation.&lt;/p&gt;

</description>
      <category>robotics</category>
      <category>vla</category>
      <category>ai</category>
      <category>computervision</category>
    </item>
    <item>
      <title>Teleoperation Data Quality for Imitation Learning: What Actually Breaks the Model</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Sun, 08 Feb 2026 13:53:43 +0000</pubDate>
      <link>https://dev.to/ankk98/teleoperation-data-quality-for-imitation-learning-what-actually-breaks-the-model-1abc</link>
      <guid>https://dev.to/ankk98/teleoperation-data-quality-for-imitation-learning-what-actually-breaks-the-model-1abc</guid>
      <description>&lt;p&gt;&lt;em&gt;Practical rubric design and failure modes from auditing robot teleop datasets (e.g. &lt;a href="https://github.com/huggingface/lerobot" rel="noopener noreferrer"&gt;LeRobot&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this post
&lt;/h2&gt;

&lt;p&gt;We audited teleoperation episodes for an imitation-learning pipeline. Removing poor-quality episodes (about 20–40% in our case) led to clearly better learning; the literature often reports ~10–15% policy improvement from similar filtering. This post covers &lt;strong&gt;rubric mistakes that cause inconsistent scores&lt;/strong&gt; and &lt;strong&gt;failure modes&lt;/strong&gt; we kept seeing.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Rubric mistakes and how to fix them
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Metrics that sound clear but aren’t.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Example: “Mistake-to-Recovery-Ratio.” People disagree: Is it (total mistakes)/(total recoveries) or (total mistakes)/(total recovery &lt;em&gt;attempts&lt;/em&gt;)? If a pick fails, then fails again, then succeeds, is that one recovery or two attempts?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it should be:&lt;/strong&gt; Define one ratio per episode. Count each &lt;em&gt;distinct&lt;/em&gt; mistake once (each new failure event). Count a &lt;em&gt;recovery&lt;/em&gt; only when the operator successfully got back on track; failed attempts in between don’t add extra recoveries. Write this in the rubric: “Count a recovery only when intended behavior has resumed; don’t count failed attempts as new mistakes unless it’s a new failure (e.g. new drop).” If you also want to penalize messy recoveries, add a separate “recovery attempts per mistake” number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: No rule for overall quality.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Scorers give High when most dimensions are High but one is Low. Then “high quality” is not strict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it should be:&lt;/strong&gt; Overall = &lt;strong&gt;Low&lt;/strong&gt; if any dimension is Low; &lt;strong&gt;High&lt;/strong&gt; only if all dimensions are High. One bad dimension pulls the episode down.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Failure modes we kept seeing
&lt;/h2&gt;

&lt;p&gt;Short name (formal term) with plain-language meaning. One line each; add a screenshot or GIF per item when you publish.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Post-task idle / run-on footage&lt;/strong&gt; (extra 10–15 s of video after the task is done). Dilutes the signal; policy can learn to linger.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Temporal misalignment&lt;/strong&gt; (sync issues between cameras or sensors). Bad for multi-view or fusion; causes inconsistent state.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-collision / kinematic clash&lt;/strong&gt; (arm hits itself or the body). Unsafe; don’t let the policy imitate it.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low contrast / poor observability&lt;/strong&gt; (white background, same-color object, or bad lighting). Object hard to see; weak visual signal.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rubric incompleteness&lt;/strong&gt; (scorers disagree or don’t know how to score). Add explicit rules and examples; flag “undefined” cases and fix the rubric before locking scores.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Repeated failures before success&lt;/strong&gt; (e.g. 3–5 pick attempts before one works). Noisy trajectory; can teach hesitation.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Over-ideal / low-complexity conditions&lt;/strong&gt; (too easy, no obstacles). Can bias the dataset; score complexity separately or down-weight.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Impact
&lt;/h2&gt;

&lt;p&gt;After fixing the rubric and removing Low-quality episodes (20–40%), retraining gave noticeably better results. Studies on filtering teleop data often report ~10–15% (or more) policy gain. &lt;strong&gt;Define metrics and overall quality clearly, then audit before scaling data.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rubric:&lt;/strong&gt; Define “mistake” and “recovery” in writing; one ratio per episode. Overall quality = Low if any dimension is Low.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure modes:&lt;/strong&gt; Post-task idle, sensor sync, arm clashes, poor visibility, rubric gaps, repeated failed attempts, over-ideal setup. Name them, add examples (screenshots/GIFs), score consistently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filtering&lt;/strong&gt; a chunk of bad episodes is high leverage; do it before collecting more&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>lerobot</category>
      <category>vla</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
