<?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>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>
    <item>
      <title>Ghibli moment for 3D Printing</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Thu, 05 Feb 2026 12:11:19 +0000</pubDate>
      <link>https://dev.to/ankk98/ghibli-moment-for-3d-printing-1lh1</link>
      <guid>https://dev.to/ankk98/ghibli-moment-for-3d-printing-1lh1</guid>
      <description>&lt;p&gt;I bought my first 3D printer this week to make parts for the robot I'm building.&lt;br&gt;
Even though I've seen 3D prints online for years, watching it work on my desk feels completely different.&lt;/p&gt;

&lt;p&gt;The print head moves slowly, laying down each thin line of plastic.&lt;br&gt;
At the start it looks like nothing, just squiggles.&lt;br&gt;
But layer by layer, an actual object appears, as if the room is quietly drawing in 3D.&lt;/p&gt;

&lt;p&gt;It is strangely calming to watch.&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%2F35paqsgbig9d9dq90s1h.jpg" 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%2F35paqsgbig9d9dq90s1h.jpg" alt="3D printer" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I keep thinking about all the little things I’ve wanted over the years like headphone stands, cable holders, desk gadgets.&lt;br&gt;
Earlier, they were just “nice to have” ideas that I would forget about.&lt;br&gt;
Now I feel like I have this small superpower to do &lt;em&gt;&lt;strong&gt;shaka laka boom boom&lt;/strong&gt;&lt;/em&gt; and make them real.&lt;/p&gt;

&lt;p&gt;Friends who visit are equally fascinated.&lt;br&gt;
Everyone has one object they’ve always wanted: a custom mount, a tiny figurine, some organizer for their setup.&lt;br&gt;
The printer is already “booked” for the next many days with all these requests.&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%2Fc3qcmzybsdjo320lfa8d.jpg" 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%2Fc3qcmzybsdjo320lfa8d.jpg" alt="Benchy Boat" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What still surprises me is how affordable this has become.&lt;br&gt;
The printer itself cost around 15k INR, which is not that far from what people pay for a regular home printer.&lt;br&gt;
It feels like we quietly crossed a line where this stopped being a futuristic toy and became just another tool.&lt;/p&gt;

&lt;p&gt;Before buying it, I had reached out to more than 20 printing vendors to get my robot parts made.&lt;br&gt;
Most of them took 3-4 days just to reply.&lt;br&gt;
Then they needed another 10 days or so for the actual printing.&lt;br&gt;
The quotes I got were between 70k and 120k INR, and this was before GST and delivery.&lt;/p&gt;

&lt;p&gt;In the end, I bought the printer for about 15k, spent around 5k on filament, another 10k on a few big parts I still outsourced, and finished everything for under 30k.&lt;br&gt;
The cost difference alone almost forced the decision.&lt;/p&gt;

&lt;p&gt;Now I keep noticing new machines that can even turn 2D photos into 3D models.&lt;br&gt;
The ecosystem already feels quite mature and surprisingly accessible.&lt;br&gt;
It seems like we’re just one Studio Ghibli style moment away from this becoming completely mainstream.&lt;/p&gt;

&lt;p&gt;For now, though, it still feels like a niche hobby.&lt;br&gt;
Most people I know have heard of 3D printing, but have never actually used it.&lt;br&gt;
Someone just needs to make the whole experience a bit simpler, tell the right story, and this will explode.&lt;/p&gt;

</description>
      <category>3dprinting</category>
    </item>
    <item>
      <title>The Hardest Part of Physical AI isn't the Brain</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Thu, 22 Jan 2026 14:00:17 +0000</pubDate>
      <link>https://dev.to/ankk98/the-hardest-part-of-physical-ai-isnt-the-brain-1d1j</link>
      <guid>https://dev.to/ankk98/the-hardest-part-of-physical-ai-isnt-the-brain-1d1j</guid>
      <description>&lt;p&gt;Software engineers entering robotics often make a fundamental category error: they treat humanoids like servers with legs. In the cloud, "move fast and break things" is a mantra. In the physical world, breaking things costs $50,000 and sets your timeline back by quarters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/ankk98/status/2014331393103552608" rel="noopener noreferrer"&gt;The physical constraints dictate the solution space more than the algorithm ever will.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consider the battle between &lt;strong&gt;Tesla and Waymo&lt;/strong&gt;. Tesla won the early race for scale because they optimized aggressively around hardware constraints. They built their AI stack to run on compute designed specifically for their cars, leveraging the existing fleet. Waymo, while technically brilliant, relied on expensive, complex sensor suites that were harder to mass-produce. Tesla understood that to win, you don't just add software to a car; you design the car &lt;em&gt;for&lt;/em&gt; the software.&lt;/p&gt;

&lt;p&gt;The same principle applies to &lt;strong&gt;mobile phones&lt;/strong&gt;. Every OS feature is strictly bounded by battery life and thermal throttling. The hardware shapes the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Humanoids, however, will be 10x harder.&lt;/strong&gt; Unlike a car (wheels) or a phone (static), a humanoid has dozens of moving parts—joints, actuators, and fingers—all requiring high torque and low latency. The complexity of maintaining physical reliability scales exponentially with every degree of freedom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ola Electric&lt;/strong&gt; offers a cautionary tale. They applied a "software iteration" speed to hardware manufacturing. The result? Thermal issues, panel gaps, and recalls. They learned the hard way that you cannot "refactor" a battery or "hot-patch" a motor. A software bug is a quick fix; a hardware bug is a logistical nightmare.&lt;/p&gt;

&lt;p&gt;This is why the recent partnership between &lt;strong&gt;Google and Boston Dynamics&lt;/strong&gt; is so significant. Google historically struggles with the physical friction of hardware (see Nest/Stadia), while Boston Dynamics has mastered the "Body"—the durability, balance, and actuation. By combining Google’s "Brain" (AI/Cloud) with BD’s physical capability, they create a force multiplier. They acknowledge that physical engineering is a distinct discipline from data science.&lt;/p&gt;

&lt;p&gt;To succeed in Physical AI, we must prioritize reliability over intelligence. Before optimizing the LLM, we must optimize the cooling, the battery density, and the sensor durability. If you can’t keep the body alive, the code doesn't matter.&lt;/p&gt;

</description>
      <category>robotics</category>
      <category>humanoid</category>
      <category>ai</category>
    </item>
    <item>
      <title>Can a Humanoid Robot Recognize and Remember My Face?</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Mon, 19 Jan 2026 21:45:17 +0000</pubDate>
      <link>https://dev.to/ankk98/can-a-humanoid-robot-recognize-and-remember-my-face-23ek</link>
      <guid>https://dev.to/ankk98/can-a-humanoid-robot-recognize-and-remember-my-face-23ek</guid>
      <description>&lt;p&gt;&lt;em&gt;A student walks into a robotics lab with a simple question. The expert smiles and begins unraveling the mystery.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: The Question
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Can a humanoid robot recognize my face?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, &lt;em&gt;right now&lt;/em&gt;. Face recognition (FaceNet, InsightFace) is ~99% accurate in controlled settings.[19][21] But come back in 5 minutes? The robot has completely forgotten you exist.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why does it forget me?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because its brain (Vision-Language-Action models, or VLAs) only sees 1-2 seconds of reality at a time - just 2-4 video frames.[3][15] Imagine having amnesia every second.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why can't it just look at more frames?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because transformer attention - the math that makes VLAs work - is O(T²) where T = frames. Doubling frames costs 4× more computation. 30 frames needs 100× the power of 3 frames (30²/3² = 900/9).[3][4] The robot would need a nuclear reactor to think.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"So the real problem is compute?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exactly. But here's the plot twist: you don't &lt;em&gt;need&lt;/em&gt; all frames. You only need the &lt;em&gt;important&lt;/em&gt; ones. And you don't store pixels - just compact features. That's 100-1000× compression without losing recognition ability.[2][6][26]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Wait... is there actually a way to solve this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Researchers have already solved the individual pieces (smart frame selection, compression, efficient attention). But nobody has stitched them together into a working robot. That's the frontier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Face Recognition 101
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Okay, so how does face recognition actually work?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The robot converts your face into an "embedding" - a number vector where similar faces have similar coordinates. FaceNet uses 128 dimensions; InsightFace uses 512. Your face in sunlight and your face at night live in nearby neighborhoods of this abstract space.[19][21]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"That's... beautiful? But how did it learn this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trained on millions of face pairs with a technique called "triplet loss": push embeddings of the same person together, push embeddings of different people far apart. After seeing enough examples, patterns emerge.[19][21]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"How accurate is it, really?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a lab with good lighting: 99%. In the real world with varying lighting, makeup, sunglasses: 85-92%. After 1 month, accuracy remains high (&amp;gt;90%) for adults with stable appearance; degradation is minimal over short intervals.[5][14] Studies show 98%+ accuracy even after 6 months for adults, with larger drops occurring over years.[30]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What trips it up?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lighting changes, occlusion (masks, sunglasses), makeup, aging, and crowded scenes where extracting faces is messy. Basically, anything that changes how the pixels look.[5][14] But some changes hit harder: growing a beard can drop accuracy 10-25× for mismatched facial hair styles.[33] Sunglasses (upper-face occlusion) can drop accuracy from ~93% to ~37%.[34] Growing children face even bigger challenges - infants under 1 year show only ~30% accuracy over 6-month gaps.[35]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Can we make it more robust?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sort of. Ensemble methods (run multiple models, vote on the answer) help. Confidence thresholds work. Training with diverse appearances (beards, glasses, different ages) improves robustness.[33][34] For children, systems need age-invariant features or regular re-enrollment every 6-12 months.[35] But the honest answer: ask the human if you're uncertain: "Are you Alice? You look similar to someone I know."[19][21]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about growing beards, glasses, or children?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beard changes: Adding or removing facial hair can cause 10-25× increase in false non-match rates, especially mustaches.[33] Glasses: Upper-face occlusion (sunglasses) drops accuracy from ~93% to ~37% - worse than masks.[34] Growing children: Infants (0-1 year) show only ~30% accuracy over 6 months; toddlers (2-3 years) improve to ~65%.[35] For children, systems need frequent re-enrollment or age-invariant modeling.[35]&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: The VLA Bottleneck
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"What exactly is a VLA?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vision-Language-Action model. A neural network that takes three inputs: camera frames, language instructions ("pick up the red cup"), and outputs robot commands (move arm, open gripper).[15][18]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Examples?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RT-2 (DeepMind, closed). OpenVLA (Carnegie Mellon, open-source 7B). Qwen-VL (Alibaba). VideoVLA (2025, understands motion). OpenVLA is the best starting point for building your own system.[11][15][28]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Wait - can VLAs recognize faces?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. VLAs (OpenVLA, SmolVLA, Pi 0.6) are trained for manipulation tasks, not person identification. They understand objects and scenes, not individual faces. You need a separate face recognition module (InsightFace, FaceNet) that extracts face embeddings, then integrate those into the robot's memory system. The VLA handles actions; face recognition handles identity.[11][15]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why do they only process 2-4 frames?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Control loops run at 50 Hz (20ms per cycle). Optimized VLAs on high-end GPUs achieve 20-40ms inference; typical systems take 50-150ms.[31] That leaves little time for deep video analysis when processing many frames.[24][26][28]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What if we optimize VLA inference?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even with optimization: KV cache tricks (reuse computation), sparse attention (skip unimportant tokens), quantization (use 4-bit math instead of 32-bit): 30 frames still takes 100+ ms. Too slow.[1][4][29]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"So we can never extend context?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wrong assumption. CronusVLA (2025) uses a clever trick: extract &lt;em&gt;motion features&lt;/em&gt; instead of processing raw pixels, caching past features to avoid recomputing the vision backbone.[26] This enables multi-frame context with minimal overhead compared to naive frame stacking.[26]&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: Extending Context
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"How do we extend context efficiently?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three independent tricks that stack: (1) Select only important frames (not all frames). (2) Compress frames to features (not pixels). (3) Use efficient attention patterns (not full attention).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Trick 1: Which frames matter?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Motion-based selection: keep frames with high optical flow (stuff is changing), skip static frames. 15-20× compression with minimal accuracy loss. Or use learned importance (VLM scores which frames matter for your task).[2][5][12]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Any other selection methods?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multi-armed bandit for constrained budgets (2025 research). Or hierarchical: keep recent frames densely, older frames sparsely. Or genetic algorithms (academic, not practical). Motion-based works well in practice.[2][12][14]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Trick 2: Compress frames?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't store 6 MB per frame (RGB pixels). Store pooled features (50 KB, 120× smaller) using max-pooling. Motion features from optical flow can compress temporal information, but face recognition typically requires appearance features combined with motion for best results.[10][13][15]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"How does max-pooling work?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take every 2×2 grid of pixels, keep the strongest signal, discard the rest. Repeat 2-3 times: 1080p → ~64×64 → 32×32. Lose spatial detail, preserve what matters for recognition. At 64×64, expect 5-15% accuracy drop; at 32×32, expect 20-40% drop depending on conditions.[10][13][32]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about temporal compression?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TempMe (2025 paper): cluster similar consecutive frames, keep 1 representative per cluster. Result: 95% token reduction in video. Faster inference. Sometimes even better accuracy (less noise).[6]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Trick 3: Efficient attention?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Standard: query attends to every past token (O(T²) cost). Efficient: (a) KV cache - reuse computation from previous steps. (b) Grouped Query Attention - multiple query heads share one KV head (4× smaller cache). (c) Sparse attention - only attend to important positions.[1][4][29]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Combining all three?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Motion frame selection (15×) + temporal token merging (95%) + GQA + sparse = 100-1000× compression. Optimized systems can achieve 20-40ms latency on high-end GPUs.[31] Accuracy loss varies by compression level and task.[2][6][1]&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: The Memory Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Okay, frames are compressed. Where do we &lt;em&gt;store&lt;/em&gt; them?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the hard part: limited RAM on the robot (8-16 GB shared with OS). Can't query disk fast enough for real-time. Need &lt;em&gt;multiple&lt;/em&gt; storage tiers, each optimized for different timescales.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Layers?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 0&lt;/strong&gt; (2 sec): Current frames in RAM. Real-time VLA inference. &amp;lt;1ms access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1&lt;/strong&gt; (60 sec): Compressed motion features on fast SSD. &amp;lt;20ms access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2&lt;/strong&gt; (1 hour): Face embeddings in vector database (Milvus). Similarity search in &amp;lt;100ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 3&lt;/strong&gt; (months): Person identities in PostgreSQL. SQL queries in &amp;lt;10ms.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why separate tiers?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each tier optimizes for its job. Tier 0 is tiny and fast. Tier 3 is huge but doesn't need real-time speed. Together they cover seconds to months without exceeding your latency budget.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"How much storage?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tier 0: 0 MB (flushed). Tier 1: 100 MB. Tier 2: 500 MB per hour. Tier 3: 1 MB per 1000 people. Total for 1 month of operation: ~600 MB. Fits on a USB stick.[18][20]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about privacy? Is storing face data ethical?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, with consent and transparency. Users should opt-in, know what's stored, and be able to delete their data. Best practice: store embeddings (not raw images), encrypt at rest, allow deletion. Some jurisdictions (EU GDPR, some US states) require explicit consent for biometric data. Build privacy-by-design: minimal data, local-first storage, user control.[18]&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: Real-Time Recognition Challenge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"So here's the hard part: when the robot sees someone, it needs to know &lt;em&gt;instantly&lt;/em&gt; who they are."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right. At 30 FPS, you're getting 30 faces per second. You can't query the vector database 30 times per second. That's 50 round-trips to disk. Game over.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What do we do?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart caching. The robot's most-used people (family, frequent visitors) stay hot in memory. Tier 0 gets an LRU cache of embeddings it's seen recently. Tier 1 tracks faces from the past hour.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Can you walk through this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Robot sees someone:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extract face embedding (lightweight, ~5ms, can happen on spare GPU cycles)&lt;/li&gt;
&lt;li&gt;Check local cache (Tier 0): "Have I seen this embedding in the last 60 seconds?" If yes: instant match&lt;/li&gt;
&lt;li&gt;Cache miss? Check Tier 1 (motion features, faces from past hour): "Any motion features correlate with this face?" If yes: probably the same person&lt;/li&gt;
&lt;li&gt;Still no match? Query vector DB (Tier 2) &lt;em&gt;asynchronously&lt;/em&gt;. Don't block action loop.&lt;/li&gt;
&lt;li&gt;Query result arrives 50-100ms later. Robot incorporates into next decision.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;"But what if the person hasn't been seen in 3 months?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exactly the query you're worried about. Robot can't afford synchronous queries. Solution: (a) Query Tier 3 in background thread. (b) Meanwhile, robot acts conservatively ("Hello! What's your name?"). (c) When query completes, update memory: "Oh! That was Alice!"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"So the robot makes a guess while waiting for the database?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Correct. It's a reasonable tradeoff. Perfect accuracy takes 100ms. Approximate accuracy takes 20ms. For most tasks, approximate is fine, and you can refine later.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about false positives?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confidence thresholds + fallback. If embedding similarity is &amp;gt;0.9: "Welcome back, Alice!" If similarity is 0.75-0.9: "Are you Alice?" If &amp;lt;0.75: "Hello, new person!"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"How do we avoid querying vector DB 50 times per second?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Several strategies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Batch queries&lt;/strong&gt;: Accumulate 10 faces, query once (amortizes latency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloom filters&lt;/strong&gt;: Quick "definitely not in database" check before expensive query&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locality&lt;/strong&gt;: Faces in same location likely same person (temporal coherence)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clustering&lt;/strong&gt;: Group embeddings into ~100 clusters, query cluster representative, not individual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache hottest 1000 people&lt;/strong&gt;: 99% of queries hit cache (pareto principle)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;"Which works best?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Combination. Always check local cache first (0.1ms). Batch queries when cache misses (10ms per 10 faces). Cluster embeddings in vector DB (10× fewer distance calculations). Query Tier 3 asynchronously.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What's the latency real-time impact?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tier 0 cache hit: &amp;lt;1ms (recognition instant). Tier 1 batch query: ~15ms (30 FPS, can handle). Tier 2/3 async: 50-100ms (doesn't block control).&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 7: Memory Updates and Consolidation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"After 3 months, the database is full of duplicate faces. Alice has been seen 500 times. How do we consolidate?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Periodic background job (runs every 30 minutes): cluster faces by similarity (embedding distance), compute centroid of each cluster, update Tier 3 with centroid + metadata.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What metadata gets updated?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;person_id, name, face_embedding_centroid (average of recent embeddings), last_seen, interaction_count, behavior_summary (LLM-generated), context_tags (where/when usually seen).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why centroid instead of keeping all 500 embeddings?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Storage: 500 embeddings × 512 dims × 4 bytes = 1 MB per person. Scaling to 10k people: 10 GB. But centroid: 512 dims × 4 bytes = 2 KB. 10k people: 20 MB. Also faster queries.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about people you haven't seen in a year?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Archive them. Move centroid to cold storage (cloud). Keep recent 1000 people in hot database. When someone reappears after 1 year: warm up their embeddings, integrate into Tier 3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 8: The Technical Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"What libraries should I actually use?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Face detection/embedding: &lt;strong&gt;InsightFace&lt;/strong&gt; (accurate, fast, open-source, 512-dim vectors).&lt;br&gt;
Vector DB: &lt;strong&gt;Milvus&lt;/strong&gt; or &lt;strong&gt;Qdrant&lt;/strong&gt; (HNSW indexing, fast search, Python API).&lt;br&gt;
Person DB: &lt;strong&gt;PostgreSQL + pgvector&lt;/strong&gt; (SQL + vector similarity, scales to millions).&lt;br&gt;
VLA inference: &lt;strong&gt;HuggingFace Transformers&lt;/strong&gt; (OpenVLA-7B).&lt;br&gt;
Video I/O: &lt;strong&gt;OpenCV&lt;/strong&gt; (standard, efficient).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why InsightFace?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;20-50ms per face (fast). 95%+ detection accuracy. Open-source. Produces 512-dimensional embeddings proven for recognition. Easy to fine-tune.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why Milvus over other vector DBs?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supports HNSW (hierarchical approximate search), in-memory + SSD persistence, Python API, easy deployment on Jetson. Qdrant is also good (Rust-based, slightly faster). Pick either.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Why PostgreSQL + pgvector?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQL for complex queries (names, timestamps, context). Vector similarity search in same database. Scales to millions of records. pgvector is mature (stable since 2023).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Wait - why both Milvus and PostgreSQL? Can't I use just one?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can! &lt;strong&gt;PostgreSQL + pgvector&lt;/strong&gt; can handle both: vector similarity search (like Milvus) AND SQL queries with metadata. Many systems use just PostgreSQL. The two-DB setup separates concerns: Milvus (Tier 2) optimized for fast vector search on recent faces, PostgreSQL (Tier 3) for long-term storage with rich metadata. But if you want simplicity, use PostgreSQL + pgvector for everything - it's mature and handles both workloads well.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about the VLA model?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenVLA-7B&lt;/strong&gt; is your best bet. Open-source, fine-tuneable with LoRA, good community. RT-2 (DeepMind) is better but closed-source. VideoVLA (2025) supports multi-frame but less mature.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 9: Practical Constraints
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"What hardware do I actually need?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Minimum: &lt;strong&gt;Jetson Orin Nano Super&lt;/strong&gt; ($249, 8 GB RAM, 67 TFLOPS GPU). Processes ~5 FPS with constraints. Can run lightweight models (smolVLA 450M at 8-12 Hz) but struggles with larger 7B models (~0.3 Hz).[39]&lt;/p&gt;

&lt;p&gt;Recommended: 16 GB RAM, 256 GB NVMe SSD, 100+ TFLOPS GPU. For production-quality multi-model stacks, consider Jetson AGX Orin (32-64 GB) or newer architectures that can handle VLA + perception models simultaneously at real-time rates.[39]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Is 5-15 FPS enough?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For humanoid robots? Yes. You don't need 30 FPS every second. Key is asynchronous architecture: memory queries happen in background, don't block the control loop.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What's the latency budget?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frame capture: 1-2ms. Optimized VLA inference (3 frames): 20-40ms on high-end GPUs; typical systems 50-150ms.[31] Action generation: 2-3ms. Memory cache lookups: &amp;lt;1ms. Async queries (don't block): 50-100ms. Total real-time path: 25-50ms for optimized systems. Meets 20-30 Hz control requirement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What about on low-power devices like Jetson Orin Nano?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unoptimized CPU-only: 150-300ms per frame. With GPU + TensorRT INT8 quantization + tracking: 25-40ms per frame for 1-5 faces. Memory is the bottleneck - 8 GB shared RAM limits model size and batch processing.[36][37]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What if I need to run multiple models simultaneously?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A full humanoid stack (VLA, object detection, SLAM, depth, speech) competing for shared 8 GB RAM makes real-time performance challenging. Jetson Orin Nano Super is not yet sufficient for production-quality multi-model deployments.[38]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What recognition accuracy should I expect?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Face detection: 95-98%. Recognition same day: 92-95%. After 1 week: 90-93%. After 1 month: 90-95% for adults with stable appearance (minimal degradation over short intervals).[30] Accuracy remains high (&amp;gt;90%) for months; larger drops occur over years. But appearance changes matter: beard growth can drop accuracy 10-25×; sunglasses drop to ~37%; children under 1 year show ~30% over 6 months.[33][34][35] Improves with recency-weighted averaging, ensemble models, and diverse training data.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What if I need higher accuracy?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use confidence thresholds (only match if &amp;gt;0.85 instead of 0.75). Ask for confirmation on borderline cases. Use ensemble (run 2-3 face recognition models, vote). Improves but costs latency.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 10: Current Research (2025)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"What actually broke through this year?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CronusVLA&lt;/strong&gt;: Multi-frame VLA using motion features with cached past frames, avoiding recomputation of the vision backbone.[26] Achieves 12.7% improvement on LIBERO benchmark with efficient multi-frame processing.[26]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VideoVLA&lt;/strong&gt;: Diffusion-based approach. Predicts future frames AND continuous actions. Better generalization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-context LLMs&lt;/strong&gt;: Claude 200k tokens. Enables semantic memory integration directly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"What's still unsolved?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uncertainty calibration (robot knowing when it's uncertain). Privacy-preserving embeddings (encrypted vector search). Continual learning without forgetting old skills. Cross-modal grounding (explaining what it knows). And making all this work on a low powered device in real-time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 11: The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Why does robot memory actually matter?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For care robots: remember patient health status, preferences, medication. For home robots: understand family dynamics, relationships. For workplace: coordinate with individuals, learn workflows. Memory = personalization = trust.&lt;/p&gt;

&lt;p&gt;Imagine a Jarvis that can't recognise Tony Stark.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Who actually needs this? What's the market?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three segments: (1) &lt;strong&gt;Healthcare&lt;/strong&gt;: care robots in hospitals/nursing homes ($2B+ market, growing 25% annually). (2) &lt;strong&gt;Consumer&lt;/strong&gt;: home assistant robots ($5B+ by 2030). (3) &lt;strong&gt;Enterprise&lt;/strong&gt;: warehouse/logistics robots ($15B+). Early adopters are healthcare (regulatory compliance, patient safety) and high-end consumer (personalization premium). The "remember me" feature becomes a differentiator when robots are commodity.[18][20]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Is this going to be solved?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Partially, yes. In 1-3 years, robots will recognize and remember faces across months. In 3-7 years, they'll have super-human memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"So what's the summary?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Face recognition works. VLAs are bottlenecked. Compression techniques exist, but nobody has integrated them into a working robot yet. The four-tier memory system solves the storage problem - each tier optimized for its job. Caching prevents query explosion (LRU cache + batch queries + async). Most robots don't have this capability yet, humanoids are incomplete without it. In 3 years, this will likely be standard.&lt;/p&gt;




&lt;p&gt;Are you building in robotics-ai space, how are you tackling these challenges? Do you wish if someone could have built the memory layer for robots? Should I take up the project &lt;code&gt;yaadeinDB&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Feel free to share your thoughts or feedback in the comments section.&lt;/p&gt;




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

&lt;p&gt;[1] &lt;a href="https://developer.nvidia.com/blog/optimizing-inference-for-long-context-and-large-batch-sizes-with-nvfp4-kv-cache/" rel="noopener noreferrer"&gt;Optimizing Inference for Long Context with NVFP4 KV Cache&lt;/a&gt; - NVIDIA Developer Blog, Dec 2025&lt;br&gt;
[2] &lt;a href="https://openaccess.thecvf.com/content/CVPR2025/html/Hu_M-LLM_Based_Video_Frame_Selection_for_Efficient_Video_Understanding_CVPR_2025_paper.html" rel="noopener noreferrer"&gt;M-LLM Based Video Frame Selection for Efficient Video Understanding&lt;/a&gt; - CVPR 2025&lt;br&gt;
[3] &lt;a href="https://arxiv.org/abs/2412.19442" rel="noopener noreferrer"&gt;A Survey on Large Language Model Acceleration based on KV Cache&lt;/a&gt; - ArXiv 2024&lt;br&gt;
[4] &lt;a href="https://sebastianraschka.com/blog/2025/coding-the-kv-cache-in-llms.html" rel="noopener noreferrer"&gt;Understanding and Coding the KV Cache in LLMs&lt;/a&gt; - Sebastian Raschka's Magazine, Jun 2025&lt;br&gt;
[5] &lt;a href="https://openaccess.thecvf.com/content_cvpr_2018/html/Huang_What_Makes_a_CVPR_2018_paper.html" rel="noopener noreferrer"&gt;Analyzing Temporal Information in Video Understanding&lt;/a&gt; - CVPR 2018&lt;br&gt;
[6] &lt;a href="https://arxiv.org/abs/2409.01156" rel="noopener noreferrer"&gt;TempMe: Video Temporal Token Merging for Efficient Video Understanding&lt;/a&gt; - ICLR 2025&lt;br&gt;
[10] &lt;a href="https://www.giskard.ai/glossary/pooling-layers-in-cnn" rel="noopener noreferrer"&gt;Pooling Layers in CNN&lt;/a&gt; - Giskard AI Glossary, 2025&lt;br&gt;
[11] &lt;a href="https://antonwohlgemuth.com/p/foundation-models-in-robotics-unlocking-new-frontiers-7cc1" rel="noopener noreferrer"&gt;Foundation Models for Robotics: Vision-Language-Action&lt;/a&gt; - Blog Post, Dec 2024&lt;br&gt;
[12] &lt;a href="https://arxiv.org/abs/2510.27280" rel="noopener noreferrer"&gt;FOCUS: Efficient Keyframe Selection for Long Videos&lt;/a&gt; - ArXiv 2025&lt;br&gt;
[13] &lt;a href="https://blog.milvus.io/ai-quick-reference/what-is-the-role-of-pooling-layers-in-cnns" rel="noopener noreferrer"&gt;Role of Pooling Layers in CNNs&lt;/a&gt; - Milvus.io Blog, 2025 (Note: URL redirects but page is accessible)&lt;br&gt;
[14] &lt;a href="https://arxiv.org/abs/2509.16635" rel="noopener noreferrer"&gt;A Review of Recent Techniques for Person Re-Identification&lt;/a&gt; - ArXiv, Sep 2025&lt;br&gt;
[15] &lt;a href="https://deepmind.google/blog/rt-2-new-model-translates-vision-and-language-into-action" rel="noopener noreferrer"&gt;RT-2: New model translates vision and language into action&lt;/a&gt; - DeepMind Blog, Jul 2023&lt;br&gt;
[18] &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6452248/" rel="noopener noreferrer"&gt;Memory and mental time travel in humans and social robots&lt;/a&gt; - PMC, Mar 2019&lt;br&gt;
[19] &lt;a href="https://pyimagesearch.com/2023/01/09/face-recognition-with-siamese-networks-keras-and-tensorflow/" rel="noopener noreferrer"&gt;Understanding Face Recognition: FaceNet vs Siamese Networks&lt;/a&gt; - Blog Post, 2024&lt;br&gt;
[20] &lt;a href="https://openreview.net/forum?id=BBgDA4y0B9" rel="noopener noreferrer"&gt;Episodic Memory Banks for Lifelong Robot Learning&lt;/a&gt; - OpenReview&lt;br&gt;
[21] &lt;a href="https://pyimagesearch.com/2023/01/09/face-recognition-with-siamese-networks-keras-and-tensorflow/" rel="noopener noreferrer"&gt;Face Recognition with Siamese Networks, Keras, and TensorFlow&lt;/a&gt; - PyImageSearch, Jan 2023&lt;br&gt;
[24] &lt;a href="https://arxiv.org/abs/2506.07339" rel="noopener noreferrer"&gt;Real-Time Execution of Action Chunking Flow Policies&lt;/a&gt; - ArXiv 2025&lt;br&gt;
[26] &lt;a href="https://arxiv.org/abs/2506.19816" rel="noopener noreferrer"&gt;CronusVLA: Towards Efficient and Robust Manipulation via Transferring Latent Motion Across Time&lt;/a&gt; - ArXiv 2025&lt;br&gt;
[28] &lt;a href="https://huggingface.co/papers/2511.05936" rel="noopener noreferrer"&gt;Vision-Language-Action Models: Concepts, Progress&lt;/a&gt; - Blog/Docs, 2025&lt;br&gt;
[29] &lt;a href="https://www.emergentmind.com/topics/kv-cache-optimization" rel="noopener noreferrer"&gt;KV Cache Optimization in Transformers&lt;/a&gt; - Emergent Mind, Nov 2025&lt;br&gt;
[30] &lt;a href="https://arxiv.org/abs/2204.01760" rel="noopener noreferrer"&gt;Face Recognition in Children: A Longitudinal Study&lt;/a&gt; - ArXiv 2022; &lt;a href="https://pubmed.ncbi.nlm.nih.gov/28114700/" rel="noopener noreferrer"&gt;Longitudinal Analysis of Mugshots&lt;/a&gt; - PubMed 2017&lt;br&gt;
[31] &lt;a href="https://www.emergentmind.com/topics/kv-cache-optimization" rel="noopener noreferrer"&gt;Running VLAs at Real-Time Speed&lt;/a&gt; - Emergent Mind 2025; &lt;a href="https://arxiv.org/abs/2512.20276" rel="noopener noreferrer"&gt;ActionFlow: Real-Time Vision-Language-Action&lt;/a&gt; - ArXiv 2025&lt;br&gt;
[32] &lt;a href="https://arxiv.org/abs/2107.03769" rel="noopener noreferrer"&gt;Susceptibility to Image Resolution in Face Recognition&lt;/a&gt; - ArXiv 2021; Low-resolution face recognition studies - Multiple sources&lt;br&gt;
[33] &lt;a href="https://openaccess.thecvf.com/content/WACV2024W/DVPBA/html/Wu_Facial_Hair_Area_in_Face_Recognition_Across_Demographics_Small_Size_WACVW_2024_paper.html" rel="noopener noreferrer"&gt;Facial Hair Area in Face Recognition Across Demographics&lt;/a&gt; - ArXiv 2024; Effects of Facial Hair on Face Recognition - IEEE 2025&lt;br&gt;
[34] &lt;a href="https://arxiv.org/abs/2311.11512" rel="noopener noreferrer"&gt;Impact of Partial Occlusion on Face Recognition&lt;/a&gt; - ArXiv 2023; &lt;a href="https://pubmed.ncbi.nlm.nih.gov/36922579/" rel="noopener noreferrer"&gt;Glasses and Sunglasses Effects&lt;/a&gt; - PubMed 2023&lt;br&gt;
[35] &lt;a href="https://arxiv.org/abs/2204.01760" rel="noopener noreferrer"&gt;Face Recognition in Children: A Longitudinal Study&lt;/a&gt; - ArXiv 2022; Young Face Aging Dataset Studies - ArXiv 2022&lt;br&gt;
[36] &lt;a href="https://forums.developer.nvidia.com/t/face-detection-post-processing-not-working-in-deepstream-6-2-on-jetson-orin-nano/337401" rel="noopener noreferrer"&gt;Face Recognition on Jetson Orin Nano&lt;/a&gt; - NVIDIA Developer Forums 2024; &lt;a href="https://www.ijert.org/robust-multi-sensor-facial-recognition-in-real-time-using-nvidia-deepstream" rel="noopener noreferrer"&gt;Robust Multi-Sensor Facial Recognition in Real-Time using NVIDIA DeepStream&lt;/a&gt; - IJERT&lt;br&gt;
[37] &lt;a href="https://forums.developer.nvidia.com/t/jetson-orin-nanos-ram-keeps-getting-full-the-board-crashes/321270" rel="noopener noreferrer"&gt;Jetson Orin Nano RAM Issues and Memory Optimization&lt;/a&gt; - NVIDIA Developer Forums 2024; &lt;a href="https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/" rel="noopener noreferrer"&gt;NVIDIA Jetson Orin Nano Developer Kit Specifications&lt;/a&gt; - NVIDIA.com&lt;br&gt;
[38] &lt;a href="https://dev.to/ankk98/multi-model-ai-resource-allocation-for-humanoid-robots-a-survey-on-jetson-orin-nano-super-310i"&gt;Multi-Model AI Resource Allocation for Humanoid Robots: A Survey on Jetson Orin Nano Super&lt;/a&gt; - DEV Community, ankk98, 2025&lt;br&gt;
[39] &lt;a href="https://dev.to/ankk98/humanoid-compute-price-vs-performance-842"&gt;Humanoid Compute: Price vs. Performance&lt;/a&gt; - DEV Community, ankk98, 2025&lt;/p&gt;

</description>
      <category>humanoid</category>
      <category>ai</category>
      <category>robotics</category>
      <category>vla</category>
    </item>
    <item>
      <title>Multi-Model AI Resource Allocation for Humanoid Robots: A Survey on Jetson Orin Nano Super</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Mon, 19 Jan 2026 13:06:12 +0000</pubDate>
      <link>https://dev.to/ankk98/multi-model-ai-resource-allocation-for-humanoid-robots-a-survey-on-jetson-orin-nano-super-310i</link>
      <guid>https://dev.to/ankk98/multi-model-ai-resource-allocation-for-humanoid-robots-a-survey-on-jetson-orin-nano-super-310i</guid>
      <description>&lt;p&gt;&lt;em&gt;Building efficient multi-model AI pipelines for humanoid robotics on resource-constrained edge hardware, with a focus on Jetson Orin Nano Super.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status disclaimer&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Everything in this article is &lt;strong&gt;mostly theoretical today&lt;/strong&gt;. A Jetson Orin Nano Super–class board (8 GB LPDDR5, ~102 GB/s memory bandwidth, ~67 INT8 TOPS &lt;a href="https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/" rel="noopener noreferrer"&gt;NVIDIA Jetson Orin Nano Super Developer Kit&lt;/a&gt;) is &lt;strong&gt;underpowered for running a full Vision-Language-Action (VLA) model plus several heavy vision models concurrently&lt;/strong&gt; in production. Making this truly viable will require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: more memory bandwidth, more VRAM, and higher sustained TOPS within a tight power envelope
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models&lt;/strong&gt;: lighter, edge-optimized VLA / YOLO26 variants (pruned, quantized, distilled)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software stack&lt;/strong&gt;: better kernel-level scheduling, more mature CUDA Green Contexts, and more predictable multi-tenant GPU runtimes
The architectures and strategies below are what you should &lt;strong&gt;aim for&lt;/strong&gt;, but today they remain a mix of research prototypes and partial production deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have ordered the device so I will do some testing once I get it. Stay tuned for empirical results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Suppose you want to run multiple AI models simultaneously on edge hardware:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;Vision-Language-Action (VLA)&lt;/strong&gt; model like &lt;strong&gt;&lt;a href="https://huggingface.co/blog/smolvla" rel="noopener noreferrer"&gt;SmolVLA&lt;/a&gt;&lt;/strong&gt; for robot control,&lt;/li&gt;
&lt;li&gt;a recent &lt;strong&gt;YOLO26&lt;/strong&gt; model for comprehensive perception (object detection, instance segmentation, pose estimation, oriented detection, and image classification) (&lt;a href="https://www.ultralytics.com/news/ultralytics-redefines-state-of-the-art-vision-ai-with-yolo26" rel="noopener noreferrer"&gt;Ultralytics YOLO26 announcement&lt;/a&gt;, &lt;a href="https://blog.roboflow.com/yolo26-in-roboflow/" rel="noopener noreferrer"&gt;Roboflow YOLO26 support&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;plus other specialized models (e.g., SLAM, depth, speech).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these must share limited GPU memory and compute resources on an embedded platform like &lt;strong&gt;Jetson Orin Nano Super&lt;/strong&gt; (8 GB LPDDR5 @ ~102 GB/s, 6-core Arm CPU, Ampere GPU with 1,024 CUDA cores and 32 Tensor Cores &lt;a href="https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/" rel="noopener noreferrer"&gt;NVIDIA Jetson Orin Nano Super Developer Kit&lt;/a&gt;, &lt;a href="https://docs.nvidia.com/jetson/archives/r36.4.4/DeveloperGuide/SD/PlatformPowerAndPerformance/JetsonOrinNanoSeriesJetsonOrinNxSeriesAndJetsonAgxOrinSeries.html" rel="noopener noreferrer"&gt;Jetson Orin Nano/NX/AGX power modes&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;We’ll survey &lt;strong&gt;three major resource allocation strategies&lt;/strong&gt; for running multiple AI models on edge devices: hardware partitioning, priority-based scheduling, and offloading. Then we'll focus on the &lt;strong&gt;event-driven architecture&lt;/strong&gt; that production robotics systems actually use for reliable, real-time multi-model execution.&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%2Fil5vzddt3s8prl7wupvm.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%2Fil5vzddt3s8prl7wupvm.png" alt="NVIDIA Jetson Orin Nano Super Developer Kit Specs" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Design Criteria for Multi-Model Edge AI Systems
&lt;/h2&gt;

&lt;p&gt;Before diving into specific strategies, it's crucial to understand the fundamental design criteria that shape resource allocation decisions for multi-model AI on edge devices. These criteria directly influence which approach will work for your specific use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Time Performance Requirements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Latency budgets&lt;/strong&gt;: Critical models (VLA for robot control) typically target a &lt;strong&gt;desired frequency of 24 Hz&lt;/strong&gt; for end-to-end control loops (sensor → action), while perception models (e.g., YOLO26 detection/segmentation) can tolerate at lower frequencies (5 Hz). Missing deadlines can cause instability or safety issues in mobile robots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jitter tolerance&lt;/strong&gt;: Real-time systems need &lt;strong&gt;predictable&lt;/strong&gt; latency. User reports show &lt;strong&gt;10–40% latency increases&lt;/strong&gt; even with per-client limits, and sometimes much worse when misconfigured (&lt;a href="https://docs.nvidia.com/deploy/mps/" rel="noopener noreferrer"&gt;NVIDIA MPS docs&lt;/a&gt;, &lt;a href="https://forums.developer.nvidia.com/t/mps-interference-problem/312930" rel="noopener noreferrer"&gt;MPS interference report&lt;/a&gt;, &lt;a href="https://forums.developer.nvidia.com/t/mps-vs-no-mps-drastic-increase-in-kernel-latency/336175" rel="noopener noreferrer"&gt;MPS latency outlier report&lt;/a&gt;). That makes naive multi-process sharing a bad fit for tight 24 Hz+ control loops unless carefully profiled and constrained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Throughput vs. latency trade-offs&lt;/strong&gt;: Background models can use batching for efficiency, but critical models prioritize low-latency single-inference execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Constraints
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Power envelope&lt;/strong&gt;: On Jetson Orin Nano Super, low-power modes operate around &lt;strong&gt;7–8 W&lt;/strong&gt;, with higher modes up to ~25 W in &lt;code&gt;MAXN_SUPER&lt;/code&gt; (&lt;a href="https://docs.nvidia.com/jetson/archives/r36.4.4/DeveloperGuide/SD/PlatformPowerAndPerformance/JetsonOrinNanoSeriesJetsonOrinNxSeriesAndJetsonAgxOrinSeries.html" rel="noopener noreferrer"&gt;Jetson power/performance modes&lt;/a&gt;). Multi-model execution must stay within these thermal budgets or the device will downclock aggressively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory hierarchy&lt;/strong&gt;: The Orin Nano Super’s &lt;strong&gt;8 GB LPDDR5&lt;/strong&gt; is a &lt;strong&gt;unified memory pool&lt;/strong&gt; for CPU and GPU. Models compete for both GPU and system memory, and memory pressure can cause allocator fragmentation, cache thrashing, and even swapping if you’re not careful with container limits and tensor lifetimes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute asymmetry&lt;/strong&gt;: GPU cores excel at parallel inference, CPU cores handle preprocessing/serialization. Resource allocation must balance both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliability and Fault Tolerance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Graceful degradation&lt;/strong&gt;: Non-critical models should drop frames or reduce frequency under resource pressure, not crash the entire system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model priority levels&lt;/strong&gt;: Critical perception (VLA control) &amp;gt; Essential perception (YOLO detection) &amp;gt; Background tasks (pose estimation, classification).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure isolation&lt;/strong&gt;: A single model's crash shouldn't bring down the entire pipeline. Containerization and process isolation are essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  System-Level Considerations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Communication overhead&lt;/strong&gt;: Inter-model data sharing (JSON serialization, queue management) adds latency that must be budgeted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring requirements&lt;/strong&gt;: Real-time metrics collection for latency, utilization, and thermal state enables adaptive resource allocation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalability needs&lt;/strong&gt;: Will you add more models later? Choose architectures that support horizontal scaling without complete rearchitecting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment constraints&lt;/strong&gt;: Edge devices often run in remote locations with limited network access, requiring self-contained solutions.&lt;/p&gt;

&lt;p&gt;These design criteria explain why simple partitioning approaches fail on edge devices: the fundamental constraints (thermal limits, unified memory, power budgets) make static allocation inefficient. Production systems instead use adaptive, priority-aware resource sharing with explicit failure modes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approach 1: Partitioning – Static Slices of Compute and Memory
&lt;/h2&gt;

&lt;p&gt;Partitioning tries to make multi-model systems predictable by &lt;strong&gt;reserving fixed resources per model&lt;/strong&gt;. On edge hardware, this usually means partitioning GPU SMs, constraining CPU cores, or pinning memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 GPU Resource Partitioning (NVIDIA Green Contexts)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Hardware-level SM (Streaming Multiprocessor) allocation. You split the GPU’s SMs into subsets and bind different workloads to different subsets using &lt;strong&gt;CUDA Green Contexts&lt;/strong&gt; (&lt;a href="https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GREEN__CONTEXTS.html" rel="noopener noreferrer"&gt;CUDA Green Contexts driver API&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;On Jetson Orin Nano Super (Ampere, compute capability 8.7), the GPU exposes &lt;strong&gt;8 SMs&lt;/strong&gt; with a total of &lt;strong&gt;1,024 CUDA cores&lt;/strong&gt; (see &lt;a href="https://www.techpowerup.com/gpu-specs/jetson-orin-nano-8-gb.c4082" rel="noopener noreferrer"&gt;Jetson Orin Nano GPU spec&lt;/a&gt;). Green Contexts enforce &lt;strong&gt;minimum SM counts and alignment constraints&lt;/strong&gt; per context (e.g., minimum 4 SMs, counts in multiples of 2 for 8.x architectures).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware-enforced &lt;strong&gt;SM isolation&lt;/strong&gt; (clean separation at the compute level)&lt;/li&gt;
&lt;li&gt;Official NVIDIA support on Orin (compute capability 8.7)&lt;/li&gt;
&lt;li&gt;Streams and kernels under different Green Contexts are scheduled from separate queues, which can improve isolation in some workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt; (critical on Orin Nano–class devices):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequency is still global&lt;/strong&gt;: GPU clock is governed by the Jetson power mode and thermal headroom, &lt;strong&gt;not&lt;/strong&gt; by Green Contexts. All contexts share the same global GPU frequency (&lt;a href="https://docs.nvidia.com/jetson/archives/r36.4.4/DeveloperGuide/SD/PlatformPowerAndPerformance/JetsonOrinNanoSeriesJetsonOrinNxSeriesAndJetsonAgxOrinSeries.html" rel="noopener noreferrer"&gt;Jetson power modes&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No memory isolation&lt;/strong&gt;: Contexts share L2 cache, memory controllers, and the same 8 GB LPDDR5 DRAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thermal throttling&lt;/strong&gt;: In 7–8 W modes, sustained heavy use across contexts still causes downclocking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited partition granularity&lt;/strong&gt;: With 8 SMs and a 4-SM minimum per context on cc 8.7, you can have at most &lt;strong&gt;two partitions of 4 SMs&lt;/strong&gt; each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observed behavior can be surprising&lt;/strong&gt;: Users have reported &lt;strong&gt;little to no runtime change&lt;/strong&gt; when varying SM allocations via Green Contexts on Jetson Orin, suggesting that other bottlenecks (memory, front-end, scheduling) may dominate (&lt;a href="https://forums.developer.nvidia.com/t/green-context-sm-allocation-not-affecting-kernel-runtime-in-jetson-orina/332343" rel="noopener noreferrer"&gt;NVIDIA forum: Green Contexts on Orin&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world latency impact (today)&lt;/strong&gt;: You may get some improved isolation in synthetic benchmarks, but on Orin Nano–class devices the main constraints are &lt;strong&gt;power mode, memory bandwidth, and thermal limits&lt;/strong&gt;, which Green Contexts do &lt;strong&gt;not&lt;/strong&gt; solve. For most embedded robotics use cases, the complexity is hard to justify unless you have a very specific multi-tenant requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: On Orin Nano–class devices, use Green Contexts only when you absolutely need &lt;strong&gt;hard SM isolation&lt;/strong&gt; between tenants and can afford the engineering complexity. For single-robot stacks, it’s usually better to rely on &lt;strong&gt;priority-based scheduling and event-driven architectures&lt;/strong&gt; instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Software Partitioning: CUDA MPS (Multi-Process Service)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: A software layer that allows &lt;strong&gt;multiple processes to share a single GPU context&lt;/strong&gt;, time-multiplexing kernels from different processes through the &lt;strong&gt;CUDA MPS server&lt;/strong&gt; (&lt;a href="https://docs.nvidia.com/deploy/mps/" rel="noopener noreferrer"&gt;CUDA MPS guide&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works on all Jetson platforms today (no driver updates needed)&lt;/li&gt;
&lt;li&gt;Per-process thread budget and pinned memory limits&lt;/li&gt;
&lt;li&gt;Simple to enable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared L2 cache and bandwidth&lt;/strong&gt;: Models can still thrash each other’s L2 lines and DRAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel serialization and interference&lt;/strong&gt;: Under contention, one client’s kernel launches can delay another’s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpredictable latency without careful tuning&lt;/strong&gt;: Reports show latency increases of &lt;strong&gt;10–40%&lt;/strong&gt; under moderate contention even with 50/50 SM splits, and in misconfigured scenarios, giant outliers (e.g., a kernel going from ~65 µs to ~100 ms) (&lt;a href="https://forums.developer.nvidia.com/t/mps-interference-problem/312930" rel="noopener noreferrer"&gt;MPS interference report&lt;/a&gt;, &lt;a href="https://forums.developer.nvidia.com/t/mps-vs-no-mps-drastic-increase-in-kernel-latency/336175" rel="noopener noreferrer"&gt;MPS latency outlier report&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory accounting is per-process, not global&lt;/strong&gt;: Per-process limits don’t give you a global “cap”; two 1 GB limits still allow 2 GB total in use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world issue&lt;/strong&gt;: For multi-model pipelines (VLA + YOLO26 detection/segmentation/pose) targeting &lt;strong&gt;24 Hz control loops&lt;/strong&gt;, this kind of latency variability is unacceptable unless you design around it very conservatively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: Reasonable for batch or non-real-time workloads; a poor fit for tight control loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 OS-Level Partitioning: Linux cgroups + CPU Affinity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Kernel-level control over CPU time and system RAM. You pin CPU cores, set CPU shares, and enforce memory limits per cgroup or container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to implement&lt;/strong&gt;: Create CPU and memory control groups, pinning specific cores to each workload. Use Docker's &lt;code&gt;cpuset_cpus&lt;/code&gt; and &lt;code&gt;mem_limit&lt;/code&gt; for containerized isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean OS-level isolation (CPU and system RAM)&lt;/li&gt;
&lt;li&gt;Prevents CPU contention between processes&lt;/li&gt;
&lt;li&gt;Works on all platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Doesn’t isolate GPU&lt;/strong&gt;: Both processes still compete for GPU memory bandwidth (on Orin Nano Super that’s ~102 GB/s shared across all clients &lt;a href="https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/" rel="noopener noreferrer"&gt;NVIDIA Jetson Orin Nano Super Developer Kit&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incomplete solution&lt;/strong&gt;: If VLA runs on GPU but YOLO's CPU thread is blocked, latency still spikes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory overhead&lt;/strong&gt;: Tight system RAM means early swapping, crashing your "fixed" allocation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world issue&lt;/strong&gt;: Critical model deadlines (24 Hz for VLA, real-time pose estimation) might still be missed if system RAM swaps to disk or GPU bandwidth is saturated by multiple concurrent models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: Useful as a supporting tool (especially with containers), but not sufficient alone for real-time multi-model GPU workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4 Where Partitioning Fits
&lt;/h3&gt;

&lt;p&gt;Partitioning is attractive when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need strong isolation&lt;/strong&gt; (multi-tenant scenarios, safety domains)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You care more about fairness than minimum latency&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can afford reduced peak performance&lt;/strong&gt; due to thermal limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But on small edge devices with unified memory and tight power envelopes, &lt;strong&gt;hard partitions tend to underutilize the hardware&lt;/strong&gt; and amplify thermal problems. That’s why most modern robotics stacks use partitioning only as a &lt;strong&gt;supporting tool&lt;/strong&gt;, not the primary strategy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approach 2: Prioritization and Event-Driven Scheduling – Shared Resources, Explicit Priorities
&lt;/h2&gt;

&lt;p&gt;Prioritization assumes all models share the same GPU/CPU pool, but &lt;strong&gt;who runs when&lt;/strong&gt; is controlled carefully using priorities, async queues, and backpressure. This is the pattern used by OM1, LeRobot, Reachy 2, and most modern robotics systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Why Prioritization Wins on Edge Devices
&lt;/h3&gt;

&lt;p&gt;The fundamental limitation of edge devices: &lt;strong&gt;Unified memory architectures and thermal constraints make static resource partitioning inefficient.&lt;/strong&gt; Production robotics systems avoid strict partitions and instead use event-driven patterns that dynamically allocate resources based on priority and system state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight&lt;/strong&gt;: Reliable multi-model execution comes from &lt;strong&gt;adaptive resource sharing&lt;/strong&gt; and &lt;strong&gt;graceful degradation&lt;/strong&gt;, not rigid slicing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Core Principles
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shared compute with explicit priorities&lt;/strong&gt;: Multiple models share GPU/CPU resources, but execution priority is clearly defined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUDA streams for kernel scheduling&lt;/strong&gt;: High-priority streams for critical models, normal priority for background tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async event communication&lt;/strong&gt;: Message queues decouple model timing and enable graceful degradation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System state awareness&lt;/strong&gt;: Monitor thermal/power limits and adapt resource allocation dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadline-aware scheduling&lt;/strong&gt;: Soft deadlines for non-critical models, hard deadlines for essential perception.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2.3 Architecture: Prioritized CUDA Streams + Async Event Bus
&lt;/h3&gt;

&lt;p&gt;One concrete template looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────┐
│   Critical Model Thread (e.g., VLA @ 24Hz)         │
│   Priority: HIGH                                   │
│   Target frequency: 24 Hz                           │
└────────────────────────────────────────────────────┘
         ↓ (sensor inputs)
┌────────────────────────────────────────────────────┐
│   CUDA High-Priority Stream (GPU)                  │
│   Critical inference, never preempted              │
└────────────────────────────────────────────────────┘
         ↓ (outputs → Action/Event queues)
┌────────────────────────────────────────────────────┐
│   Event Bus (Redis/Zenoh/ROS2)                     │
│   Async communication between models               │
└────────────────────────────────────────────────────┘
         ↓ (decoupled messaging)
┌────────────────────────────────────────────────────┐
│   Background Models (YOLO, segmentation, etc.)     │
│   Priority: NORMAL/BACKGROUND                      │
│   Graceful degradation under load                  │
│   Runs in normal-priority CUDA streams             │
└────────────────────────────────────────────────────┘
         ↓ (context updates → Decision fusion)
┌────────────────────────────────────────────────────┐
│   Decision Fusion &amp;amp; Action Execution               │
│   Combines all model outputs                       │
└────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.4 Implementation Patterns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker / Docker Compose + ROS 2 / Zenoh (containerized event-driven architecture)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Each AI model (or subsystem) runs in its own container, communicating over async message buses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containerize each model service with NVIDIA runtime.&lt;/li&gt;
&lt;li&gt;Use async message queues (ZMQ/ROS2/Zenoh) for inter-service communication.&lt;/li&gt;
&lt;li&gt;Prioritize VLA at 24Hz with strict deadlines while YOLO runs at 5Hz with graceful degradation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools &amp;amp; libraries&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ROS 2&lt;/strong&gt;: Native deadline/lifespan QoS policies atop DDS (&lt;a href="https://design.ros2.org/articles/qos_deadline_liveliness_lifespan.html" rel="noopener noreferrer"&gt;ROS 2 QoS design&lt;/a&gt;). Used heavily in &lt;strong&gt;Reachy 2&lt;/strong&gt;’s core ROS 2 workspace (&lt;a href="https://github.com/pollen-robotics/reachy2_core" rel="noopener noreferrer"&gt;&lt;code&gt;reachy2_core&lt;/code&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zenoh (OM1’s choice)&lt;/strong&gt;: Low-latency pub/sub and key/value messaging, lighter than full ROS 2 middleware. OM1 integrates Zenoh for cross-component data exchange (&lt;a href="https://github.com/OpenMind/OM1" rel="noopener noreferrer"&gt;OM1 repo&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis + Lua&lt;/strong&gt;: Simple pub/sub and atomic operations for single-host deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick start template&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create prioritized CUDA streams for each model based on real-time requirements (&lt;a href="https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#stream-priorities" rel="noopener noreferrer"&gt;CUDA stream priorities&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Use Python &lt;code&gt;asyncio&lt;/code&gt; (&lt;a href="https://docs.python.org/3/library/asyncio.html" rel="noopener noreferrer"&gt;docs&lt;/a&gt;) or ROS 2 callbacks for concurrent execution and queue-based communication.&lt;/li&gt;
&lt;li&gt;Start with critical models at high priority (e.g., 24 Hz), background models at normal priority (e.g., 5 Hz).&lt;/li&gt;
&lt;li&gt;Add Prometheus/Grafana or equivalent monitoring for latency, queue depths, and thermal throttling.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2.5 Real-World Example: OM1 (OpenMind)
&lt;/h3&gt;

&lt;p&gt;OM1 (“OpenMind Modular AI Runtime for Robots”) demonstrates mode-based multi-model execution in a &lt;strong&gt;single Dockerized runtime&lt;/strong&gt;, orchestrating LLMs, VLMs, and robotics stacks together (&lt;a href="https://github.com/OpenMind/OM1" rel="noopener noreferrer"&gt;OM1 repo&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single Docker Container (OM1 Runtime)
  ├─ Multiple operational modes (welcome, slam, navigation, etc.)
  ├─ Concurrent LLM execution (Fast Action + Core + Mentor LLMs)
  ├─ Zenoh pub/sub for inter-component communication
  ├─ Background processes (SLAM, navigation, face recognition)
  └─ Input orchestrators (VLM, ASR, sensors)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No GPU partitioning.&lt;/strong&gt; Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple LLMs run concurrently with different roles and priorities (e.g., fast-reactive vs. deliberative).&lt;/li&gt;
&lt;li&gt;Vision models (VLM variants) provide continuous perception.&lt;/li&gt;
&lt;li&gt;SLAM and navigation models run in background with graceful degradation.&lt;/li&gt;
&lt;li&gt;All components communicate via &lt;strong&gt;Zenoh pub/sub&lt;/strong&gt; messaging and ROS 2 where appropriate.&lt;/li&gt;
&lt;li&gt;Dynamic mode transitions reallocate resources based on context and intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: OM1 shows &lt;strong&gt;production-grade multi-model AI orchestration&lt;/strong&gt; (LLMs + VLMs + SLAM + navigation) using event-driven, priority-based scheduling rather than hard GPU partitioning.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.6 Prioritization: Pros, Cons, When to Use
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production-proven patterns (LeRobot async inference, OM1 runtime, Reachy 2 ROS 2 workspace).&lt;/li&gt;
&lt;li&gt;Graceful degradation (non-critical models adapt to resource constraints).&lt;/li&gt;
&lt;li&gt;Easy to debug (message introspection, queue monitoring, logging).&lt;/li&gt;
&lt;li&gt;Scales horizontally (add models without rearchitecting core systems).&lt;/li&gt;
&lt;li&gt;Platform-agnostic (works with NVIDIA, ROCm, CPU-only).&lt;/li&gt;
&lt;li&gt;Adaptive resource allocation (responds to thermal/power limits).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared GPU bandwidth contention (models can still interfere).&lt;/li&gt;
&lt;li&gt;Message serialization overhead (~1–2ms per inter-model communication).&lt;/li&gt;
&lt;li&gt;Requires understanding async patterns and queue management.&lt;/li&gt;
&lt;li&gt;Not suitable for strict multi-tenant isolation guarantees.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Need guaranteed low-latency for critical model": Docker + ROS 2 + prioritized CUDA streams.&lt;/li&gt;
&lt;li&gt;"Running multiple YOLO26 variants (detect/segment/pose)": Event-driven architecture with async queues.&lt;/li&gt;
&lt;li&gt;"Building production robotics system": Docker Compose + Zenoh + mode-based execution.&lt;/li&gt;
&lt;li&gt;"Rapid prototyping on single device": Python &lt;code&gt;asyncio&lt;/code&gt; + CUDA streams.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Approach 3: Offloading – Pushing Work Off the Edge Device
&lt;/h2&gt;

&lt;p&gt;Offloading moves some or all model computation off the edge device to &lt;strong&gt;separate GPU servers or cloud infrastructure&lt;/strong&gt;. This eliminates local contention at the cost of network latency and extra infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Remote Inference Offloading (LeRobot-Style Pattern)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Run &lt;strong&gt;policy inference or heavy model inference&lt;/strong&gt; on a separate GPU server, while the robot (edge device) handles sensors and low-level control. Communication happens over &lt;strong&gt;gRPC streaming&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the pattern used in &lt;strong&gt;LeRobot’s async inference stack&lt;/strong&gt;, where a &lt;code&gt;PolicyServer&lt;/code&gt; runs on a workstation GPU and a &lt;code&gt;RobotClient&lt;/code&gt; runs on the robot, exchanging observations and actions via gRPC (&lt;a href="https://github.com/huggingface/lerobot" rel="noopener noreferrer"&gt;LeRobot repo&lt;/a&gt;, see &lt;code&gt;lerobot/async_inference/policy_server.py&lt;/code&gt; and &lt;code&gt;robot_client.py&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to implement&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy policies and heavy models on a dedicated inference server with a larger GPU.&lt;/li&gt;
&lt;li&gt;Use gRPC streaming for low-latency communication between the robot and the inference server (&lt;a href="https://grpc.io/docs/languages/python/" rel="noopener noreferrer"&gt;gRPC Python docs&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero GPU contention on the edge&lt;/strong&gt;: Edge resources are freed for additional models or real-time control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable inference&lt;/strong&gt;: Upgrade server GPUs independently of edge hardware constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable latency&lt;/strong&gt;: Often more predictable network latency vs. highly variable local multi-model GPU sharing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete isolation&lt;/strong&gt;: Models run on separate hardware, eliminating interference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network dependency&lt;/strong&gt;: Requires reliable low-latency network connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth overhead&lt;/strong&gt;: Camera frames must be compressed and transmitted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional infrastructure&lt;/strong&gt;: Need dedicated inference servers and monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher complexity&lt;/strong&gt;: Distributed system management, failure handling, and observability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world use&lt;/strong&gt;: LeRobot uses this client–server architecture for &lt;strong&gt;RL policy inference&lt;/strong&gt; and async action streaming. The same pattern generalizes to VLA + YOLO26 pipelines, but for those, you must account for much higher bandwidth (video frames) and tighter latency budgets.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Orchestrated Offloading with Triton and Microservices
&lt;/h3&gt;

&lt;p&gt;NVIDIA Triton Inference Server provides &lt;strong&gt;process-level isolation and scheduling&lt;/strong&gt; for multi-model deployments, often on a central server:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Multi-model serving platform with built-in queuing, batching, and per-model scheduling policies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to implement&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure separate model repositories with dedicated GPU instances and per-model batching policies with different latency deadlines.&lt;/li&gt;
&lt;li&gt;Expose models over gRPC/HTTP to edge clients.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production-grade scheduling and queuing.&lt;/li&gt;
&lt;li&gt;Per-model deadlines and batching policies.&lt;/li&gt;
&lt;li&gt;High resource efficiency on server GPUs.&lt;/li&gt;
&lt;li&gt;Can mix NVIDIA-stack and non-NVIDIA models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning curve (gRPC, model configs).&lt;/li&gt;
&lt;li&gt;Overhead from HTTP/gRPC serialization (5–10ms per request).&lt;/li&gt;
&lt;li&gt;Still subject to GPU bandwidth contention on the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Distributed edge deployment with network": Remote offloading + gRPC streaming.&lt;/li&gt;
&lt;li&gt;"Enterprise ML pipeline with model versioning": Triton Inference Server + model ensembles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3 When Offloading Makes Sense
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You cannot meet latency or throughput targets within the edge device's power/thermal envelope.&lt;/li&gt;
&lt;li&gt;You need to run many heavy models simultaneously, but only a subset of them require strict real-time guarantees on the robot.&lt;/li&gt;
&lt;li&gt;Your deployment environment has reliable wired or high-quality wireless connectivity.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Putting It Together: Comparing the Three Approaches
&lt;/h2&gt;

&lt;p&gt;In practice, &lt;strong&gt;production systems mix these&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;cgroups and containers&lt;/strong&gt; for basic isolation.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;prioritized CUDA streams and event buses&lt;/strong&gt; for real-time behavior.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;offloading&lt;/strong&gt; for heavyweight or non-real-time models that don't fit on the edge box.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Given today’s hardware, &lt;strong&gt;a single Jetson Orin Nano Super is not yet a comfortable platform for running a large VLA plus multiple heavy YOLO26 variants and other models concurrently&lt;/strong&gt; at strict real-time rates. You can prototype pieces of this stack, but for production you will almost certainly need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More capable edge hardware&lt;/strong&gt; (Orin NX/AGX, Thor, or similar), or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Significant offloading&lt;/strong&gt; to nearby GPU servers, and/or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggressively optimized models&lt;/strong&gt; (distillation, pruning, quantization, ONNX/TensorRT deployment).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, the architectural lessons are already clear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: For multi-model AI on edge devices, avoid static hardware partitioning as your primary tool. Favor &lt;strong&gt;event-driven architectures&lt;/strong&gt; with prioritized CUDA streams and async messaging, and treat partitioning and offloading as &lt;strong&gt;supporting levers&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have questions or suggestions? Drop them in the comments below.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OM1 Architecture&lt;/strong&gt; (event-driven multimodal runtime): &lt;code&gt;https://github.com/OpenMind/OM1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LeRobot&lt;/strong&gt; (RL + async inference + gRPC): &lt;code&gt;https://github.com/huggingface/lerobot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reachy 2 Core (ROS 2 workspace)&lt;/strong&gt;: &lt;code&gt;https://github.com/pollen-robotics/reachy2_core&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reachy 2 Python SDK&lt;/strong&gt;: &lt;code&gt;https://github.com/pollen-robotics/reachy2-sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA Jetson Deployment with Triton&lt;/strong&gt;: &lt;code&gt;https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/jetson.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUDA Green Contexts&lt;/strong&gt;: &lt;code&gt;https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GREEN__CONTEXTS.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUDA MPS Guide&lt;/strong&gt;: &lt;code&gt;https://docs.nvidia.com/deploy/mps/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MPS Interference Discussion&lt;/strong&gt;: &lt;code&gt;https://forums.developer.nvidia.com/t/mps-interference-problem/312930&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MPS Latency Outlier Discussion&lt;/strong&gt;: &lt;code&gt;https://forums.developer.nvidia.com/t/mps-vs-no-mps-drastic-increase-in-kernel-latency/336175&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROS 2 Real-Time QoS&lt;/strong&gt;: &lt;code&gt;https://design.ros2.org/articles/qos_deadline_liveliness_lifespan.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python asyncio&lt;/strong&gt;: &lt;code&gt;https://docs.python.org/3/library/asyncio.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose for robotics&lt;/strong&gt;: &lt;code&gt;https://fenilsonani.com/articles/docker-compose-multi-container-orchestration&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YOLO 26 Family&lt;/strong&gt;: &lt;code&gt;https://www.ultralytics.com/news/ultralytics-redefines-state-of-the-art-vision-ai-with-yolo26&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>robotics</category>
      <category>vla</category>
      <category>ai</category>
      <category>gpu</category>
    </item>
    <item>
      <title>Insights from Sergey Levine’s appearance on the Dwarkesh Patel podcast</title>
      <dc:creator>Ankit Khandelwal</dc:creator>
      <pubDate>Mon, 19 Jan 2026 09:10:46 +0000</pubDate>
      <link>https://dev.to/ankk98/insights-from-sergey-levines-appearance-on-the-dwarkesh-patel-podcast-36bi</link>
      <guid>https://dev.to/ankk98/insights-from-sergey-levines-appearance-on-the-dwarkesh-patel-podcast-36bi</guid>
      <description>&lt;p&gt;Just finished an incredible deep dive into the future of robotics with Sergey Levine of Physical Intelligence. The "Robotics Flywheel" is much closer than people realize.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://youtu.be/48pxVdmkMIE?si=UamP4IMBoI0jOyMB" rel="noopener noreferrer"&gt;https://youtu.be/48pxVdmkMIE?si=UamP4IMBoI0jOyMB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are my top 10 takeaways on the path to general-purpose robots:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The 5-Year Horizon:&lt;/strong&gt; The median estimate for robots performing complex, autonomous home tasks and blue-collar work is just &lt;strong&gt;five years&lt;/strong&gt;. It’s a "single-digit" year problem, not a multi-decade one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Representation Problem:&lt;/strong&gt; Video is harder than text because text is already abstracted into meaning, while video is just "compressed pixels". To scale, robots need to ignore "noise" (like moving clouds) and focus only on goal-relevant changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hardware vs. Software:&lt;/strong&gt; Smarter AI actually makes hardware &lt;strong&gt;cheaper&lt;/strong&gt;. High-quality visual feedback allows robots to use "cheap," less precise parts because the AI can sense and correct mechanical errors in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Inference Trilemma:&lt;/strong&gt; There is a constant trade-off between &lt;strong&gt;Inference Speed (Hz)&lt;/strong&gt;, &lt;strong&gt;Model Size (Parameters)&lt;/strong&gt;, and &lt;strong&gt;Context Length (Memory)&lt;/strong&gt;. The goal is to move toward the human brain's "extreme parallelism," where perception and planning run at different rates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imitation Before RL:&lt;/strong&gt; You can’t start with Reinforcement Learning (RL) from scratch, it takes too long. You must use supervised learning (imitation) first to provide the "prior knowledge" and common sense the robot needs to eventually learn on the job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emergent Compositionality:&lt;/strong&gt; Robots are starting to show "emergent" skills. Levine noted a robot that learned to clear an obstacle before folding laundry without being specifically trained for that sequence, it’s "compositional generalization".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Moravec’s Paradox:&lt;/strong&gt; This is the core of robotics, the things humans find easy (folding a T-shirt) are the hardest for AI, while things we find hard (calculus) are easy. Physical proficiency is a massive computational challenge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Externalized Brain:&lt;/strong&gt; For robots to be affordable, we might see "off-board inference". A robot might be in a "dumber" reactive mode if offline but become significantly smarter when connected to a high-speed data center.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The goal isn't just to build "mechanical people", it's to build heterogeneous systems that can be 100 feet tall or tiny, all powered by the same foundational intelligence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The 24Hz Benchmark:&lt;/strong&gt; The human mind processes visual information and reacts at roughly &lt;strong&gt;24 frames per second (24Hz)&lt;/strong&gt;. To achieve human-level proficiency, robots must match this high-frequency inference while simultaneously managing the "trilemma" of increasing model size and memory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The 1-Second Context Paradox:&lt;/strong&gt; Current state-of-the-art VLA models often operate with only a &lt;strong&gt;one-second context window&lt;/strong&gt;. It is "shocking" that they can execute minute-long tasks by only observing the immediate past, but true autonomy will require scaling this to the minutes, hours, or even &lt;strong&gt;"decades of context"&lt;/strong&gt; that humans use to inform their plans.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emergent Meta-Learning:&lt;/strong&gt; Meta-learning, the ability for a model to "learn how to learn" is an &lt;strong&gt;emergent property&lt;/strong&gt; seen in large foundation models. A sufficiently smart model can evaluate its own performance and figure out how to leverage auxiliary data, like &lt;strong&gt;simulations or synthetic experience&lt;/strong&gt;, to improve its success on real-world objectives.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mastering Counterfactuals:&lt;/strong&gt; The "key" to optimal decision-making is the ability to answer &lt;strong&gt;counterfactuals&lt;/strong&gt;: "If I did this instead of that, would it be better?". Whether a robot uses a learned simulator, a reward model, or a value function, the core of intelligence is having a mechanism to &lt;strong&gt;evaluate these alternative futures&lt;/strong&gt; and pick the best one.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>robotics</category>
      <category>ai</category>
      <category>humanoids</category>
    </item>
  </channel>
</rss>
