We have been running YOLOv8 on Jetson Orin for an industrial vision client for a little over a year. Two cameras per line, 30 FPS, sub-50ms inference, weekly retrains, zero downtime. Here is what the rollout looks like in practice and the parts of the playbook that surprised us.

Quantization: FP16, INT8, and where each breaks

FP16 is the no-brainer default on Orin: almost free in accuracy, and roughly 1.6x faster than FP32. INT8 with TensorRT post-training quantization gets you another 1.8x on top, but only if your calibration set is representative. We've learned to calibrate with at least 500 production frames sampled across shifts and lighting conditions.

Dataset hygiene

The model is only as honest as the labels. We use a tight loop: production frames flow into a labeling tool with weak labels from the current model, human reviewers correct what they need to, and corrections are appended to the training set tagged with date and reviewer.

Once a month we audit a random 200-frame slice, checking for label drift, missed corrections, and any class imbalance creeping in.

Retraining without downtime

Two devices per line. Deploys are A/B: one device gets the new weights, runs in parallel for an hour, and the supervisor compares predictions per frame. If divergence stays inside the expected envelope, the second device updates. If not, the new weights get rolled back automatically.

The boring thing that matters most

Lens cleaning. The single largest source of accuracy regressions on this deployment, ahead of model changes, ahead of lighting, ahead of seasonality. We added a daily lens-check checklist.

What we would do differently

Start with a smaller model. We launched with YOLOv8m. YOLOv8s would have been fine for the throughput we needed, faster to retrain, and cheaper to run.

Related reading