YOLO on Jetson with TensorRT: FP16 vs INT8 Benchmarks & Export Gotchas (2026)
Last updated: August 2026
A YOLO model running in PyTorch on a Jetson is leaving most of the board's performance on the table. TensorRT with the right precision often triples throughput — but the export path is full of traps. Here's what FP16 vs INT8 actually costs, real FPS across Orin modules, and the gotchas that waste an afternoon.
Quick Answer
Export your YOLO model to a TensorRT engine and run FP16 by default — it roughly doubles throughput over FP32 with negligible accuracy loss. Move to INT8 only when camera count or power forces it, and validate the mAP drop on your own footage first. TensorRT delivers 2–3× the throughput of native PyTorch by fusing layers and auto-tuning kernels for your specific GPU. The two traps that burn people: on JetPack 6, TensorRT 10.3 blocks INT8 end-to-end builds (upgrade to 10.7+), and the DLA improves efficiency, not single-stream latency. Always rebuild the engine on the exact target module — engines aren't portable across hardware or TensorRT versions.
Planning Takeaway
Precision is a throughput-vs-accuracy dial, not a free upgrade. FP32 is for reference only; FP16 is the production default; INT8 is the throughput/power play that costs measurable mAP and demands real calibration. Pick the precision your camera count and power budget require, then prove the accuracy is still acceptable on your deployment footage — not on a COCO sample. And never ship a prebuilt .engine across different Jetsons: rebuild on the target.
Who This Page Is For
- Engineers deploying YOLO (v8, v11, or newer) on Jetson who are still running PyTorch and wondering why FPS is low.
- Anyone choosing a precision and needing to know what INT8 actually costs in accuracy before committing.
- Builders sizing camera count per module who need real TensorRT FPS, not theoretical TOPS.
- People stuck on a failing INT8 export on JetPack 6 who want the fix, not another forum thread.
How to Use This Page
- Confirm you're on a GPU export path. TensorRT or TorchScript use the GPU; TFLite, NCNN, and plain ONNX runtime fall back to CPU and are far slower.
- Pick a precision from the trade-off table. Start at FP16; consider INT8 only if you're throughput- or power-bound.
- Read the gotchas before you export. The TensorRT 10.3 INT8 issue and DLA fallback behavior will save you hours.
- Size camera count from real FPS. Use the benchmark figures, then apply your detect-fps target.
- Validate with tools. Run your model and stream count through GPU Sizing and the System Designer to confirm headroom before buying hardware.
Why TensorRT At All
TensorRT is NVIDIA's inference compiler. It takes your trained model — exported to ONNX — and rebuilds it into a .engine optimized for one specific GPU through three mechanisms: layer fusion (collapsing consecutive operations into single kernels), precision calibration (running in FP16 or INT8 instead of FP32), and kernel auto-tuning (picking the fastest implementation for your hardware). The net effect on Jetson is commonly 2–3× the throughput of the same model in native PyTorch, and a fraction of the per-frame latency.
This is why a YOLO model that feels sluggish in Python is not a hardware problem — it's a deployment-format problem. The Jetson's GPU is idling while PyTorch overhead and the Python interpreter throttle the pipeline. The fix is to get off the PyTorch inference path and onto a compiled TensorRT engine. The only real questions are which precision to compile for and how to dodge the export traps.
FP32 vs FP16 vs INT8: The Trade-off
| Precision | Relative speed | Accuracy impact | Calibration needed | Use when |
|---|---|---|---|---|
| FP32 | Baseline (1×) | None (reference) | No | Accuracy reference only — don't deploy |
| FP16 | ~2× | Negligible | No | Production default — best balance |
| INT8 | ~3–4× | Measurable mAP drop | Yes (~1000 images) | Throughput- or power-bound deployments |
The headline numbers: on AGX Orin, YOLOv8s through trtexec runs around 139 FPS at FP32 and around 313 FPS at INT8 — more than double. FP16 sits comfortably in between with effectively no accuracy cost, which is why it's the default recommendation. INT8 is the fastest path and the only one that needs calibration: you feed TensorRT ~1000 representative images so it can learn the activation ranges to quantize against. Skip good calibration and the accuracy drop is worse than it needs to be. The mantra: FP16 unless you're forced to INT8, and prove the INT8 accuracy on your own data.
Real FPS Benchmarks
Representative TensorRT figures from vendor and community benchmarks (single stream, 640×640 input, YOLOv8-class models). Treat as planning approximations — exact numbers vary with model variant, JetPack/TensorRT version, and power mode.
| Module | Model | Precision | Approx. FPS |
|---|---|---|---|
| AGX Orin | YOLOv8s | FP32 | ~139 |
| AGX Orin | YOLOv8s | INT8 | ~313 |
| AGX Orin 32GB | YOLOv8x (largest) | INT8 | ~75 |
| Orin NX 16GB | YOLOv8n | INT8 | ~65 |
| Orin Nano (Super) | YOLO11n / YOLOv8n | FP16/INT8 | Real-time (30+) single stream |
Power for lightweight YOLO under TensorRT on Orin Nano / Orin NX typically lands in the 7–14W range. The takeaway isn't the exact FPS — it's the shape: even the smallest Orin runs a nano-class YOLO comfortably in real time once it's on TensorRT, and the bigger modules have enormous headroom at INT8. The bottleneck in a real deployment is usually decode and stream count, not single-model inference.
The Export Workflow
The path is short once you know it:
- Flash JetPack (JetPack 7.2 is current as of mid-2026; much of the Orin YOLO toolchain still targets the legacy 6.x line) so CUDA, cuDNN, and TensorRT — including the
trtexectool — are present. - Use the prebuilt JetPack 6 Docker container for your YOLO toolchain rather than fighting ARM64 pip wheels — the pip-installed PyTorch/Torchvision are not compatible with aarch64 Jetson, so the container saves the manual wheel dance.
- Export PyTorch → ONNX → TensorRT engine, choosing FP16 or INT8 at export time. For INT8, point the exporter at your calibration image folder and batch size so it builds a calibration table.
- Benchmark with
trtexecto get a clean mean-latency number (then FPS = 1000 / latency_ms), independent of any display sink cap. - Run inference from the resulting
.engine. Enable max-performance power mode for benchmarking.
For multi-stream production rather than a single feed, pair the engine with DeepStream — see the DeepStream vs Frigate guide linked below for when to reach for it.
The Gotchas That Waste an Afternoon
- The TensorRT 10.3 INT8 bug (JetPack 6). TensorRT 10.3, which ships with JetPack 6, has a known issue that blocks INT8 engine builds when the end-to-end (NMS-included) branch is enabled. Some toolchains silently disable the end2end branch so the export at least succeeds; to keep end2end INT8, upgrade TensorRT to 10.7+ via the CUDA apt repo and re-run. This is the single most common "my INT8 export fails" cause on JP6.
- Engines aren't portable. A
.engineis compiled for a specific GPU architecture and TensorRT version. Build it on an AGX Orin and it won't load on an Orin Nano; build it under one JetPack and it may fail under another. Rebuild on the target, or script the build at first boot. - CPU-only export formats look fine and run slow. TFLite, NCNN, MNN, and plain ONNX runtime export without error but run on the CPU. If your FPS is mysteriously low, confirm you're actually on TensorRT or TorchScript, not a CPU path.
- Newer YOLO architectures can break the TensorRT graph. Some experimental YOLO releases export with post-processing subgraphs that don't convert cleanly, producing bounding-box drift or bad confidence scores in the engine. Validate detections after export; don't assume a clean export means correct output.
- Display-capped FPS. If you benchmark through a live display sink, you may read the monitor's refresh rate (e.g. 60 FPS) instead of true throughput. Use
trtexecor a headless sink for real numbers.
When to Use the DLA
Orin modules include Deep Learning Accelerator (DLA) cores alongside the GPU, and YOLO can export to run on a DLA core (FP16 or INT8 only). The common misconception is that the DLA is "faster." It isn't — its purpose is throughput per watt and GPU offload, not lower latency. In fact, some layers aren't DLA-supported and fall back to the GPU, which can add latency. So the DLA is the right tool when you want to cut power draw or free the GPU to run a second model or other pipeline work concurrently — not when you're chasing the lowest single-stream latency. For a power-constrained battery or sealed deployment, routing detection to the DLA can be a meaningful efficiency win; for a plugged-in box that just needs maximum FPS, keep it on the GPU.
Turning FPS Into Camera Count
Single-model FPS is only step one. For a multi-camera deployment the useful number is how many streams the module sustains, which depends on your detect-fps target and whether you run one shared model or one model per stream. As a reference point, an Orin NX 16GB running a single shared YOLOv8s INT8 model can feed on the order of dozens of cameras at a low detect rate, but switching to a separate model per stream drops that sharply because each model instance consumes RAM. A bare Orin Nano 8GB realistically supports a handful of streams; an Orin NX 16GB roughly triples that.
And remember the perennial caveat: detection is not decode. Your camera-count ceiling is often set by how many H.264/H.265 streams the host can hardware-decode, not by inference. Size both. The GPU Sizing and System Designer tools turn your model, precision, and stream count into a concrete capacity check.
Decision Framework
Use FP16 if:
- You want the production default with no meaningful accuracy cost
- Your camera count and power budget aren't pushing the module to its limit
- You'd rather not maintain a calibration dataset
Use INT8 if:
- You're throughput-bound (high camera count) or power-bound (battery, sealed enclosure)
- You can assemble ~1000 representative calibration images and validate the mAP drop
- The extra ~1.5–2× over FP16 changes whether the deployment fits
Route to the DLA if:
- You need to lower power draw or offload the GPU for a second workload
- You can tolerate slightly higher latency from GPU fallback on unsupported layers
- Efficiency, not peak single-stream FPS, is the goal
Stop and check if:
- Your INT8 export fails on JP6 — upgrade TensorRT past 10.3
- FPS is suspiciously low — confirm you're on a GPU export path, not CPU
- Detections look wrong after export — validate the graph converted cleanly
Frequently Asked Questions
Should I use FP16 or INT8 for YOLO on Jetson?
FP16 is the best balance of speed and accuracy and is the safe default — it roughly doubles throughput over FP32 with negligible accuracy loss. INT8 is the fastest, often another 1.5-2x over FP16, but it requires calibration on representative images and costs measurable mAP, so reserve it for when you are genuinely throughput- or power-bound. A common pattern is to ship FP16 unless camera count or power forces INT8, then validate the accuracy drop on your own footage before committing.
How much faster is TensorRT than PyTorch on Jetson?
TensorRT typically delivers 2-3x higher inference throughput than native PyTorch or plain ONNX on the same Jetson, because it applies layer fusion, precision calibration, and kernel auto-tuning for the specific GPU. As a concrete reference, YOLOv8s on AGX Orin runs around 139 FPS at FP32 via trtexec and around 313 FPS at INT8. Exports that only use the CPU (TFLite, NCNN, plain ONNX runtime) are far slower; the GPU paths (TensorRT, TorchScript) are what you want.
Why does my INT8 TensorRT export fail on JetPack 6?
TensorRT 10.3, which ships with JetPack 6, has a known issue that prevents INT8 engine builds when the end-to-end (NMS-included) branch is enabled. Some toolchains auto-disable the end2end branch so the export succeeds. To restore end2end INT8 exports, upgrade TensorRT to a newer release such as 10.7 or later via the CUDA apt repository, then re-run the export. A version mismatch like this is the most common cause of a confusing INT8 export failure.
Does the DLA make YOLO faster on Jetson?
Not faster — more efficient. The Deep Learning Accelerator (DLA) increases throughput per watt and offloads the GPU, but it is not designed to reduce latency versus running entirely on the GPU, and some layers fall back to the GPU when unsupported, which can add latency. Use the DLA to lower power draw or free GPU headroom for other work, not to win a single-stream speed contest. DLA export requires FP16 or INT8.
How many calibration images do I need for INT8?
Around 1000 representative images is the common rule of thumb. The set should resemble your deployment conditions — same camera angles, lighting, and object types — not just generic COCO images, because INT8 calibration is only as good as the distribution it sees. Point the calibration step at your image folder and batch size, build the calibration table once, then reuse it for the engine build. Poor calibration is the usual reason INT8 accuracy drops more than expected.
Will a TensorRT engine built on one Jetson work on another?
No. A TensorRT engine is compiled for a specific GPU architecture, TensorRT version, and often JetPack release. An engine built on an AGX Orin will not load on an Orin Nano, and one built under one JetPack may fail under another. Always rebuild the engine on the target module with its installed TensorRT version, or script the build as part of first-boot provisioning rather than shipping a prebuilt .engine across different hardware.
The Bottom Line
If your YOLO model is running in PyTorch on a Jetson, you're using a fraction of the board. Export to a TensorRT engine, run FP16 by default, and reach for INT8 only when camera count or power demands it — with real calibration and an accuracy check on your own footage. Dodge the two big traps (the TensorRT 10.3 INT8 issue on JP6, and the DLA-is-efficiency-not-speed misconception), never ship an engine across different hardware, and remember that decode, not inference, usually sets your camera ceiling.
Size your model, precision, and stream count against the target module with the tools below before you commit hardware.
Recommended Reading
- DeepStream vs Frigate (2026) — Which multi-stream analytics stack to wrap around your TensorRT engine.
- Best Hardware for Frigate NVR (2026) — Detector selection if you'd rather use a turnkey NVR than build a pipeline.
- Jetson Orin Nano vs Orin NX (2026) — Choosing the module for your camera count and model size.
- Jetson Orin Nano Power Modes — How power mode interacts with TensorRT throughput.
- GPU Sizing Tool — Estimate inference throughput for your model and precision on a target Jetson.
- System Designer — Turn model, precision, and stream count into a capacity check and BOM.
- Hardware Selector — Filter platforms by task, power, and memory with ranked alternatives.