The AY-Robots try page showing three ways to start without owning a robot: drive a real arm, compare models, rent a GPU
jetson-orinedge-inferencetensorrtvla-deploymentrobot-hardware

Jetson Orin for Local VLA Inference: Memory, TensorRT, Speed

AY-Robots ResearchAugust 23, 202618 min read

What actually fits on a Jetson Orin, what TensorRT does to GR00T N1.7 on it, and the measured throughput you get. With the memory numbers that decide it first.

What you need to know

  • Memory filters the model list before speed does. Isaac-GR00T asks for 16 GB+ VRAM, which removes every 8 GB Orin before you run a benchmark.
  • NVIDIA publishes two Jetson Orin tables for GR00T N1.7. Both start near 350 ms per action step in PyTorch eager; the model card's DiT-only TensorRT lands at 216.5 ms, the deployment README's full-pipeline export at 150.9 ms. That is 2.8 Hz to 6.6 Hz.
  • The N1.7 TensorRT pipeline exports bf16 and nothing else. FP8 and NVFP4 builds fail on Orin, and the script can leave a half-written engine directory instead of failing loudly.
  • SmolVLA is the model that fits a small Orin: 450 M parameters and roughly 2 GB at inference per the LeRobot docs.
  • Action chunking is why a 4 Hz policy can drive a 30 Hz arm. Without it, no Jetson is fast enough for anything reactive.
  • AY-Robots trains on rented cloud GPUs and serves inference from a cloud pod. The Jetson path is yours to assemble from the checkpoint.

There is one honest reason to put an NVIDIA Jetson Orin next to a robot arm: the network round trip disappears. Every other argument is weaker than it sounds. An Orin will not turn a 3 B parameter vision-language-action model into a real-time controller, and getting a policy running on it takes a day of build tooling. What it does is remove the public internet sitting between a cloud endpoint and your servos.

Four things decide whether that trade is worth it: module memory, which policies fit, what TensorRT speeds up, and the throughput NVIDIA publishes for its own model on its own board. External numbers below were fetched in August 2026. Platform numbers come from the policy catalog.

The Orin lineup, in the numbers that decide things

Jetson modules are sold on TOPS figures, which are near useless here. What matters for a policy is how much memory the module has and how fast it is: a VLA is a memory-bandwidth problem long before a compute problem. Here is the Orin family as NVIDIA lists it, TOPS included only so you can ignore it deliberately.

ModuleMemoryBandwidthGPUPower modesSparse INT8 TOPS
Orin Nano 4GB4 GB 64-bit LPDDR551 GB/s512-core Ampere, 16 tensor cores7W / 10W / 25W34
Orin Nano 8GB8 GB 128-bit LPDDR5102 GB/s1024-core Ampere, 32 tensor cores7W / 15W / 25W67
Orin NX 8GB8 GB 128-bit LPDDR5102.4 GB/s1024-core Ampere, 32 tensor cores10W / 15W / 25W / 40W117
Orin NX 16GB16 GB 128-bit LPDDR5102.4 GB/s1024-core Ampere, 32 tensor cores10W / 15W / 25W / 40W157
AGX Orin 32GB32 GB 256-bit LPDDR5204.8 GB/s1792-core Ampere, 56 tensor cores15W to 60W200
AGX Orin 64GB64 GB 256-bit LPDDR5204.8 GB/s2048-core Ampere, 64 tensor cores15W to 60W275
One memory number, two consumers

Each module lists a single memory figure because CPU and GPU draw from the same LPDDR5 pool. The 8 GB on an Orin Nano covers Ubuntu, camera buffers, the Python process, the CUDA context and the weights together. Budget against roughly 6 GB, not 8. On the AGX modules this stops mattering, which is much of why they show up in the deployment guides.

The Orin Nano Super needs a note because its numbers changed under it: in December 2024 NVIDIA repriced the developer kit to 249 USD and shipped a software update raising the 8 GB module to 67 sparse INT8 TOPS and lifting memory bandwidth 50 percent to 102 GB/s. Any benchmark quoting 68 GB/s for an Orin Nano 8GB predates that and measures a slower board than the one you can buy.

Which of the five policies actually fit

This is where most Jetson plans die. The five policies you can train on AY-Robots span 80 M to 3 B parameters, exactly the range between an Orin Nano and an AGX Orin 64GB. Published memory requirements disagree between projects, so the table gives a source per figure.

The AY-Robots policies page: comparison table of the five trainable policies with parameters, GPU tier, latency and minimum episodes
The /policies comparison table. Parameter counts and per-step latencies are what you carry into the Jetson sizing question.
PolicyParamsInference memorySmallest Orin that fitsSource for the memory figure
ACT~80 Mnot publishedOrin Nano 4GBAY-Robots catalog
SmolVLA~450 Mabout 2 GBOrin Nano 8GBLeRobot async docs
Pi0 / Pi0.5~3 B14 GB, or more than 8 GBAGX Orin 32GBLeRobot docs / openpi
GR00T N1.5~3 B16 GB+ VRAMAGX Orin 32GBIsaac-GR00T README
GR00T N1.7~3 B16 GB or more of VRAMAGX Orin 32GBIsaac-GR00T README

The Pi0 row disagrees with itself. The LeRobot async guide says Pi0 occupies 14 GB at inference and SmolVLA about 2 GB; the openpi repository lists it as more than 8 GB with an RTX 4090 as the example. Both are true of different implementations and dtypes. Plan against 14 GB: being wrong the other way costs you a board. That repo also says it has only been tested on Ubuntu 22.04 and mentions Jetson nowhere, which tells you what upstream support to expect for Pi0.5 on an edge module.

The 16 GB line is where a day gets eaten

Isaac-GR00T's README lists inference hardware as "1 GPU with 16 GB+ VRAM (e.g., RTX 4090, L40, H100, Jetson AGX Thor/Orin, DGX Spark)". An Orin NX 16GB sits exactly on that line with the OS already inside it. People buy the NX because the number matches, then meet the failure the TensorRT guide lists under "Out of memory during build" and spend the day trading workspace size against a build that finishes. If you want GR00T N1.7, buy an AGX. If your budget is an NX, plan for SmolVLA or ACT.

Measured throughput: GR00T N1.7 on a Jetson Orin

NVIDIA publishes a per-device latency breakdown on the GR00T-N1.7-3B model card, at 4 denoising steps with one camera. Read the Jetson Orin rows column by column, because the columns say where the time goes.

ModeDataBackboneAction headEnd to endHz
PyTorch eager9.45 ms127.6 ms205.39 ms342.8 ms2.9 Hz
torch.compile9.45 ms128.59 ms78.94 ms217.0 ms4.6 Hz
TensorRT (DiT-only)9.45 ms128.38 ms78.6 ms216.5 ms4.6 Hz

Look at the backbone column. It does not move. TensorRT in that configuration compiles the diffusion transformer action head and leaves the vision-language backbone in PyTorch, so it buys what torch.compile already bought and nothing more. The Isaac-GR00T TensorRT page states it in those words: TensorRT optimizes only the DiT action head. The model card gives the reason it is the Orin setting specifically, which is that TensorRT 10.3 does not support the backbone engine on that board.

The deployment README in the same repo publishes a second table, from a newer full-pipeline export, and that one does move the backbone. Same board, same 4 denoising steps, same single camera. Which of the two you get on your own board depends on whether your TensorRT can build the backbone engine at all.

ModeDataBackboneAction headEnd to endHzSpeedup
PyTorch eager9.03 ms134.39 ms210.41 ms354.0 ms2.8 Hz1.00x
torch.compile9.03 ms135.68 ms82.24 ms227.1 ms4.4 Hz1.56x
TensorRT full pipeline9.03 ms63.62 ms78.16 ms150.9 ms6.6 Hz2.35x
Which TensorRT are you being sold?

The difference between 216.5 ms and 150.9 ms on one board is entirely which parts of the model got compiled. The TensorRT page itself, still written around the older N1.6 export, reports Orin going from 300 ms to 173 ms. Three numbers, three builds, one board. When someone quotes a TensorRT speedup for a VLA, ask which subgraphs it covers and which model version. The figures above are GR00T N1.7 as documented in August 2026.

For scale: the AY-Robots catalog lists GR00T N1.7 at 152 ms per action step on its A100 or H100 tier, and a properly compiled Orin lands at 150.9 ms. That is not a claim that an Orin equals an A100; the figures come from different harnesses. It is a claim that at this model size the compute gap is far smaller than the price gap, and that the reason to go local is the network, not the silicon.

How TensorRT actually gets built on an Orin

The Isaac-GR00T Orin guide, as of August 2026, targets JetPack 7.2 with Jetson Linux 39.2, CUDA 13.2 and Python 3.12, on PyTorch 2.13.0 from the cu132 index. JetPack 6.x is no longer supported, so on an older image that flash is step zero.

  1. 1
    Confirm the L4T baseline and unlock the clocks

    Check which Jetson Linux you are on, then move the module off its default power mode. Mode 0 is MAXN on AGX Orin, but on Orin Nano and Orin NX mode 0 is just a wattage default, so read the mode list before you pick one. Set the power mode first: after jetson_clocks runs, Jetson Linux requires a reboot before the mode can change again.

    bash
    cat /etc/nv_tegra_release
    sudo nvpmodel -q            # current mode; /etc/nvpmodel.conf lists them all
    sudo nvpmodel -m 0          # MAXN on AGX Orin; on Nano and NX pick the top mode id instead
    sudo jetson_clocks          # pin clocks to maximum, after the mode is set
    sudo tegrastats             # watch RAM, GPU load and thermals live
  2. 2
    Install the Orin dependencies

    The repo ships a platform-specific installer. The Docker profile is recommended because it pins the CUDA and PyTorch combination for you.

    bash
    # bare metal
    bash scripts/deployment/orin/install_deps.sh
    
    # or the container
    cd docker && bash build.sh --profile=orin && cd ..
  3. 3
    Activate the environment the aarch64 way

    The step people skip. On aarch64, do not use uv run: it re-syncs against the x86_64 root configuration and quietly replaces your locally built flash-attn wheel.

    bash
    source .venv/bin/activate
    source scripts/activate_orin.sh
    
    # then plain python, never `uv run python`
    python -c "import gr00t; print('ok')"
  4. 4
    Build the TensorRT pipeline

    The build takes a checkpoint plus a sample dataset to trace real input shapes. The deployment guide puts the engine build at roughly 2 to 5 minutes depending on the GPU; the ONNX export in front of it is what makes the first run long. The export defaults to bf16 and bakes batch size 1 in statically.

    bash
    python scripts/deployment/build_trt_pipeline.py \
      --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \
      --dataset-path demo_data/libero_demo \
      --embodiment-tag LIBERO_PANDA
  5. 5
    Run and compare the two modes

    Run the same trajectories through PyTorch and through the engines. If TensorRT is not meaningfully faster than torch.compile, your build did not cover the backbone and you have the 216 ms number, not the 150 ms one. On a TensorRT that cannot build the backbone engine, --inference-mode tensorrt (DiT-only) is the mode that will load.

    bash
    python scripts/deployment/standalone_inference_script.py \
      --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \
      --dataset-path demo_data/libero_demo \
      --embodiment-tag LIBERO_PANDA \
      --traj-ids 0 1 2 3 4 \
      --inference-mode trt_full_pipeline \
      --trt-engine-path ./gr00t_trt_deployment/engines
The FP8 trap, and it fails quietly

Orin's GPU is Ampere-class. Ask TensorRT for FP8 and the builder refuses with "Networks with FP8 Q/DQ layers require hardware with FP8 support"; ask for NVFP4 and it reports "Cannot find plugin: TRT_FP4DynamicQuantize". The nasty part, in Isaac-GR00T issue 575 and still open, is that the script does not stop there: it writes a half-populated engine directory holding only the FP16-compatible subgraphs, and the missing ones surface as a file-not-found error at runtime. Stick to bf16, which is the only precision build_trt_pipeline.py accepts for N1.7, and check that every expected .engine file exists.

  • Engines are GPU-specific and have to be rebuilt for a different GPU. The docs' own example is that an engine built on an RTX 4090 will not work on an H100, so the one you built while prototyping is not the one you ship.
  • Batch size is baked into the export and cannot be changed at runtime.
  • Orin and Thor share one flash-attn wheel carrying kernels for both sm_87 and sm_110, so a wheel that looks wrong for your board may be right.
  • If the module boots from eMMC, point HF_HOME at an NVMe SSD before downloading a 3 B checkpoint.

The models that are genuinely comfortable on an Orin

The honest Orin shortlist is two models. ACT is roughly 80 M parameters, trains from scratch on your task, and the catalog puts it at 20 ms per action step on a 24 GB card. SmolVLA is 450 M parameters, about 100 M of that the action expert, on a SmolVLM-2 backbone. Its paper says it was designed to be trained on a single GPU and deployed on consumer-grade GPUs or even CPUs, and reports 40 percent faster training and 6x less memory than Pi0.

Third-party Orin measurement is thin. The NanoVLA paper benchmarks on a Jetson Orin Nano Super developer kit, the 8 GB 67 TOPS board, using SmolVLA at 50 action-chunk steps as its baseline and reporting 43.8 percent higher FPS than it, plus 52x higher FPS than OpenVLA on LIBERO-Goal. Take the baseline choice as the finding: SmolVLA is what people get running on the small board.

Putting the policy on an Orin instead of a cloud pod
Advantages
  • The public internet leaves the control loop. That is the point.
  • Latency becomes deterministic. A cloud endpoint has a tail; a local board has a distribution you measure once.
  • The arm keeps working when the link drops, which matters for anything unattended.
  • Power and footprint: 15W to 60W for an AGX Orin, 7W to 25W for an Orin Nano.
  • No per-hour billing and no idle watchdog to forget about.
Trade-offs
  • The build is aarch64. Wheels are scarcer, flash-attn compiles locally, and much of the ecosystem assumes x86_64.
  • Engines are not portable, so every board and model revision means another build plus validation.
  • Fine-tuning still happens elsewhere. NVIDIA recommends 40 GB-plus GPUs for GR00T fine-tuning; no Orin has that.
  • For 3 B models you are buying an AGX, which costs more than months of the spot GPU hours it replaces.
  • Thermals and power mode silently change your numbers. A benchmark at 15W is not the one you get at 60W.

The latency arithmetic that actually governs the arm

One action per 150 ms forward pass gives a 6.6 Hz arm, which is visibly hesitant. What rescues it is action chunking: each pass emits a whole horizon of future actions and the robot plays them out at its own rate while the next chunk computes. The AY-Robots ACT trainer defaults to a chunk size of 100 with 100 action steps, so one inference covers over three seconds of 30 Hz motion.

PolicyPer-step latencyCeiling unchunkedAt 30 Hz
ACT20 msabout 50 Hzchunking optional
GR00T N1.7152 msabout 6.6 Hz~4.5 actions per call
GR00T N1.5165 msabout 6.1 Hzsame regime as N1.7
SmolVLA245 msabout 4.1 Hzneeds chunk blending
Pi0.5485 msabout 2.1 Hzchunking mandatory

The ceiling column is 1000 divided by the catalog latency, and those latencies came from the platform's cloud tiers, not an Orin. Use them as the shape of the problem, not as Jetson numbers. Either way, everything except ACT depends on chunking, and how you stitch chunks together separates smooth motion from a stutter every time one lands. That looks like a policy freezing mid-motion, so rule out the boring cause before blaming the model.

LeRobot ships two answers and they compose. Async inference splits a PolicyServer from a RobotClient over gRPC so the arm keeps executing while the next chunk computes, defaulting to actions_per_chunk=50 and a chunk_size_threshold the docs list as 0.7 while recommending 0.5 to 0.6. Real-Time Chunking, from Black, Galliker and Levine (arXiv 2506.07339), blends the start of each new chunk into the tail of the one already running. On an Orin you want both, and both can run on the same board.

bash
# Run a trained policy on the arm with real-time chunking,
# with the policy on the Orin's own GPU.
lerobot-rollout \
  --strategy.type=base \
  --inference.type=rtc \
  --inference.rtc.execution_horizon=10 \
  --inference.rtc.max_guidance_weight=10.0 \
  --policy.path=/home/nvidia/checkpoints/smolvla_so100 \
  --robot.type=so100_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}" \
  --task="Put the lego brick into the box" \
  --fps=30 \
  --duration=120 \
  --device=cuda
lerobot-rollout on the Orin itself. --fps defaults to 30 and --inference.type defaults to sync; rtc is what you want for SmolVLA and Pi0.5.

What makes this debuggable is that lerobot-rollout reports what the loop achieved rather than what you asked for: effective cadence, the share of cycles that blew the per-tick budget, a per-step breakdown, and pacing headroom. A high infer share points at the policy or the device; a high observe share points at your cameras, which on a Jetson is more common than people expect.

text
Cadence summary - whole run, 2 episodes - target 30 Hz (33.3 ms budget per tick)
  effective cadence: 29.84 Hz policy over 40.2 s measured
  cycles over the 33.3 ms work budget: 12/1197 (1.0%) - work mean 18.7 ms, worst 48.1 ms
  loop-body steps (share of measured work):
    observe      mean   3.13 ms - worst   9.00 ms -  31.7% of work
    infer        mean   5.18 ms - worst  40.00 ms -  52.4% of work
    send         mean   0.40 ms - worst   0.40 ms -   4.1% of work
  pacing headroom: 7.4 ms slept per tick on average - near zero means the loop is saturated
The cadence report lerobot-rollout prints when a run ends, trimmed to the lines that matter here. Pacing headroom near zero means nothing is left to absorb a slow tick.

Two routes to the same running policy

Everything on one bench, from raw arm to compiled engine. The route if you own the hardware and want no cloud dependency.

  1. 1
    Record a dataset on the arm

    Record episodes in LeRobot format with the cameras you will run inference with. At least 50 for ACT or GR00T, 30 for SmolVLA.

    bash
    lerobot-record \
      --robot.type=so100_follower \
      --robot.port=/dev/ttyACM0 \
      --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
      --teleop.type=so100_leader \
      --teleop.port=/dev/ttyACM1 \
      --dataset.repo_id=${HF_USER}/brick-into-box \
      --dataset.num_episodes=50 \
      --dataset.single_task="Put the lego brick into the box"
  2. 2
    Train somewhere with a real GPU

    Not on the Orin. NVIDIA recommends 40 GB-plus for GR00T fine-tuning and openpi wants 70 GB-plus for a full Pi0 fine-tune. A 4090 covers the small models.

    bash
    lerobot-train \
      --policy.path=lerobot/smolvla_base \
      --dataset.repo_id=${HF_USER}/brick-into-box \
      --batch_size=64 \
      --steps=20000 \
      --output_dir=outputs/train/smolvla_so100 \
      --job_name=smolvla_so100 \
      --policy.device=cuda
  3. 3
    Flash JetPack 7.2 and install the runtime

    Get the board onto the supported baseline: JetPack 7.2, CUDA 13.2, Python 3.12. JetPack 6.x is no longer supported by the deployment scripts.

    bash
    cat /etc/nv_tegra_release
    sudo nvpmodel -m 0 && sudo jetson_clocks
    bash scripts/deployment/orin/install_deps.sh
  4. 4
    Copy the checkpoint and compile it

    Move the checkpoint onto the board, then export ONNX and build the engines. The engine build itself is 2 to 5 minutes; the first run also pays for the ONNX export and, on a fresh install, a locally compiled flash-attn wheel.

    bash
    export HF_HOME=/mnt/nvme/.cache/huggingface
    rsync -av outputs/smolvla_so100/checkpoints/last/ nvidia@orin:/home/nvidia/checkpoints/smolvla_so100/
  5. 5
    Close the loop and read the cadence report

    Run lerobot-rollout on the board and read the pacing headroom line before trusting anything the arm does.

    bash
    lerobot-rollout --strategy.type=base --inference.type=rtc \
      --policy.path=/home/nvidia/checkpoints/smolvla_so100 \
      --robot.type=so100_follower --robot.port=/dev/ttyACM0 \
      --task="Put the lego brick into the box" --fps=30 --duration=60 --device=cuda
The AY-Robots CLI page showing install and run commands for the terminal client
The /cli page. The practical way to pull a trained checkpoint down to a headless board over SSH, which is how an Orin usually gets talked to.

One note for working from a terminal on the Orin: the operations exposed by the CLI are also exposed to AI agents through the MCP server. Neither runs inference on your board; both move datasets, runs and checkpoints around.

The AY-Robots MCP server page listing operations exposed to AI agents
The /mcp page: same operations as the CLI, addressed by an agent.

When an Orin is the wrong answer

The case against deserves stating, because the failure mode is spending the price of an AGX and three days of build tooling to move a policy from 5 Hz to 6.6 Hz.

  • You are still iterating on the dataset. Every checkpoint change means a fresh engine build. Iterate against a cloud pod; move to the Orin when the policy stops changing.
  • Your task is slow pick-and-place. A remote endpoint is genuinely viable there.
  • You picked Pi0.5 or GR00T and your budget is an 8 GB board. Change the model, not the board.
  • Your bottleneck is the cameras. If observe dominates the cadence report, a faster GPU changes nothing.
  • You want to fine-tune on the same machine. No Orin has 40 GB, and out-of-memory during training is the most predictable failure here.

The counter-case: a frozen checkpoint on a SO-100 on a repetitive task where the round trip matters. That is the Orin's job. If you are not that far yet, run your first policy against a cloud pod, or drive a real arm at /live with no signup first. Background on the model families is in the VLA overview, and the hardware side in the SO-100 guide.

No arm on your desk yet?

Drive a real SO-100 over the internet with no signup, compare 85 VLA models on real benchmark numbers, or rent a GPU for a run costing 1 to 3 USD. Work out what you need before buying a Jetson.

Try it without hardware
Can a Jetson Orin Nano 8GB run GR00T N1.7?

Not as shipped. The Isaac-GR00T README lists inference hardware as a GPU with 16 GB or more of VRAM, naming AGX Thor and AGX Orin as the Jetson examples. On an 8 GB module the OS, camera buffers and CUDA context are already inside that 8 GB. Use SmolVLA or ACT there, or an AGX Orin for a 3 B model.

How much faster does TensorRT make a VLA on Orin?

It depends which subgraphs get compiled, and NVIDIA publishes two Orin tables. In the model card table, compiling only the diffusion action head takes GR00T N1.7 from 342.8 ms to 216.5 ms per action step, essentially what torch.compile already achieved. In the deployment README table the full-pipeline export, which also compiles the backbone, goes from 354.0 ms to 150.9 ms: 2.35x end to end, 6.6 Hz. Both are at 4 denoising steps with one camera.

Why does my TensorRT build fail with a missing .engine file?

Usually because you asked for a precision the board cannot do. Orin is Ampere-class, so an FP8 build stops with "Networks with FP8 Q/DQ layers require hardware with FP8 support" and an NVFP4 build stops on the missing TRT_FP4DynamicQuantize and TRT_FP4QDQ plugins. The script does not stop cleanly: it leaves only the FP16-compatible engines behind, so the first symptom is a file-not-found error at runtime. Build in bf16, which is what the N1.7 pipeline exports by default, and verify the directory.

Is local inference necessary, or is a cloud endpoint fine?

For slow pick-and-place a cloud endpoint is fine and much less work. The control loop already costs 20 to 485 ms per action step, and internet round trips on top turn a working policy into a hesitant one. The threshold is reactivity: if the task needs the policy to react to something that moved, put the compute next to the servos. Otherwise do not buy the board.

Can I fine-tune on the Jetson to avoid renting a GPU?

No. NVIDIA recommends 40 GB or more for GR00T fine-tuning and suggests H100 or L40 nodes; openpi lists 70 GB-plus for a full Pi0 fine-tune and 22.5 GB for LoRA. No Orin reaches that. Rent for a few dollars a run and deploy locally.

Which Jetson board should I buy for an SO-100 arm?

For ACT or SmolVLA, an Orin Nano 8GB Super is enough, and its 102 GB/s of bandwidth is what makes it enough; NVIDIA repriced the Orin Nano Super Developer Kit built around that module to 249 USD in December 2024. For GR00T N1.7 or Pi0.5 you want an AGX Orin, 32 GB or 64 GB at 204.8 GB/s. There is no useful middle: the NX 16GB sits exactly on the GR00T memory line.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started