Elige un destino de despliegue
A partir del dispositivo, el presupuesto de latencia y la flota, elige un entorno de ejecución y un formato de exportación; después, confírmalo en el dispositivo.

El mismo YOLO26n tarda 38.9 ms por imagen en una CPU con ONNX Runtime y 1.7 ms en una GPU T4 con TensorRT, según las pruebas comparativas de YOLO26. Si eliges el entorno de ejecución equivocado, pagarás por mucho más hardware del necesario o desplegarás cámaras que no podrán seguir el ritmo. Esta lección convierte la elección en una decisión de diez minutos que podrás justificar con cifras medidas en el propio dispositivo.
Práctico
Empieza por el dispositivo#
El entorno de ejecución depende de dónde se realice la inferencia, no de la costumbre. Sigue el árbol desde arriba y detente en la primera opción que coincida:
Cada entorno de ejecución corresponde a un valor de format= en el modo de exportación:
| Objetivo | Entorno de ejecución | format= | Ten cuidado con |
|---|---|---|---|
| GPU NVIDIA, Jetson | TensorRT | engine | Un motor solo funciona en la familia de GPU y con la versión de TensorRT con que se compiló |
| CPU, iGPU o NPU Intel | OpenVINO | openvino | Optimizado para Intel; mídelo antes de usarlo en otros dispositivos |
| Cualquier CPU o GPU | ONNX Runtime | onnx | Elige explícitamente el proveedor de ejecución |
| iPhone, iPad, Mac | CoreML | coreml | La exportación se ejecuta en macOS o Linux, no en Windows |
| Android, dispositivos integrados | LiteRT | litert | INT8 necesita datos de calibración data |
| NPU Snapdragon | Qualcomm QNN | qnn | Solo exportación cuantizada; pasa el destino Hexagon como name |
| Raspberry Pi, CPU ARM | NCNN | ncnn | El formato más rápido de la guía de Raspberry Pi |
| Navegador | ONNX Runtime Web | onnx | Limítate a los modelos n o s |
En las plataformas Apple recientes también puedes exportar al nuevo formato Core AI de Apple (format=coreai, exportado en macOS 26+ con Apple silicon o en Linux x86-64). ¿Es tu primera exportación? La lección Exportar para la implementación explica los conceptos básicos.
Si prefieres no ejecutar servidores de inferencia, Ultralytics Platform implementa un modelo como endpoint dedicado en una de sus 42 regiones, y la pestaña Deployments de tu perfil muestra dónde se ejecuta cada uno:

Ese proceso se explica en Implementar y llamar a un endpoint. El resto de este curso trata de ejecutar tú mismo el modelo.
Convierte el objetivo de FPS en un presupuesto de milisegundos#
«Tiempo real» no es un requisito; un número sí. Calcúlalo antes de medir nada:
| Paso | Ejemplo: 20 FPS por cámara |
|---|---|
| Presupuesto por fotograma = 1000 ÷ FPS | 50 ms |
| Menos la decodificación (RTSP, 1080p) | unos 10 ms |
| Menos el seguimiento, el recuento y las salidas | unos 5 ms |
| Menos un 20 % de margen para los picos | 10 ms |
| Disponible para el modelo | unos 25–30 ms |
Aplica estas reglas de decisión:
- Si YOLO26n tarda más que el presupuesto de tu modelo en la CPU del dispositivo, pasa a un acelerador (GPU, iGPU, NPU) o reduce
imgszantes de hacer cualquier otra cosa; las pruebas de rendimiento de YOLO26 indican que YOLO26n tarda 38,9 ms en una CPU con ONNX y 1,7 ms en una T4 con TensorRT. - Si un dispositivo tiene que atender varias cámaras, divide el presupuesto del modelo entre el número de cámaras.
- Si la flota tiene más de unos pocos tipos de dispositivos, prioriza los entornos de ejecución que no requieran compilaciones por dispositivo o planifica una compilación por clase de dispositivo.
- Si el código que llama al modelo está escrito en Swift, Kotlin o C++, consulta el SDK del entorno de ejecución para ese lenguaje antes de decidirte.
Mide el rendimiento de las opciones en el dispositivo#
Las especificaciones técnicas y las pruebas de rendimiento de otras personas son un punto de partida. La decisión se toma en el hardware donde vas a implementar el modelo y teniendo en cuenta los fotogramas lentos, no la media: un entorno de ejecución que es rápido en la mediana, pero se atasca en uno de cada veinte fotogramas, seguirá perdiendo fotogramas. Este script exporta cada opción, mide 100 inferencias en un fotograma real y evalúa cada una según su percentil 95 (p95):
from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download
BUDGET_MS = 30 # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino") # runtimes the decision tree allows on this machine
if __name__ == "__main__": # exports and inference can start worker processes on macOS and Windows
frame = str(safe_download("https://ultralytics.com/images/bus.jpg")) # use a real frame from your camera
for fmt in CANDIDATES:
model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
for _ in range(5): # warm up: the first calls include one-time setup
model(frame, verbose=False)
runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
p50, p95 = runs[49], runs[94]
verdict = "meets" if p95 <= BUDGET_MS else "misses"
print(f"{fmt:9s} p50 {p50:5.1f} ms p95 {p95:5.1f} ms {verdict} the {BUDGET_MS} ms budget")En el portátil con Apple silicon utilizado para probar este curso, mientras otros trabajos compartían la CPU:
onnx p50 30.0 ms p95 46.4 ms misses the 30 ms budget
openvino p50 22.8 ms p95 113.5 ms misses the 30 ms budgetLéelo línea por línea:
speed["inference"]es el tiempo que tarda el modelo en procesar ese fotograma, sin decodificar ni dibujar, así que permite comparar los entornos de ejecución en igualdad de condiciones.- OpenVINO gana en la mediana y pierde en el p95 por un factor superior a dos. Si valoraras las medias, implementarías el entorno de ejecución que se atasca en los momentos de mayor carga; según el p95, ONNX Runtime es la opción más estable en esta máquina.
- Ninguna de las dos opciones cumple el presupuesto, así que el siguiente paso aquí es usar un
imgszmás pequeño, un acelerador o menos cámaras por dispositivo; no probar otro entorno de ejecución de CPU.
Para comparar rápidamente la precisión y la velocidad de distintos formatos, el modo Benchmark exporta, valida y mide cada uno:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxQuita format= para probar todos los formatos compatibles con la máquina. COCO8 solo tiene cuatro imágenes de validación, así que considera su columna mAP una prueba básica y usa el YAML de tu propio conjunto de datos para tomar decisiones sobre precisión.
Errores habituales#
Síntoma: el modelo alcanzó 60 FPS en tu estación de trabajo, pero pierde fotogramas en el dispositivo. Solución: evalúa el rendimiento en el hardware de despliegue, o en la máquina más parecida que puedas conseguir, y ejecútalo con la carga que tendrá en producción (otros procesos y otras cámaras).
Síntoma: un .engine compilado en una GPU de centro de datos no se carga en un Jetson Orin. Solución: compílalo en el dispositivo de destino durante la instalación (una compilación FP16 de YOLO26n tarda unos 5 minutos en un Jetson Orin, según la documentación de exportación de Platform), o conserva una compilación por clase de dispositivo y versión de TensorRT, y distribuye el .pt o .onnx para que cualquier dispositivo pueda volver a compilarlo.
yolo benchmark mide con el valor de imgsz que le pases. Si en producción se ejecuta con imgsz=1280, evalúa el rendimiento a 1280: el cálculo aumenta con el número de píxeles, así que las cifras a 640 subestiman aproximadamente 4 veces el coste de un despliegue a 1280.
Los dispositivos periféricos plantean cuatro preguntas más#
Las guías de Raspberry Pi, NVIDIA Jetson y DeepStream en Jetson explican en detalle los destinos más habituales. Antes de decidirte por un dispositivo periférico, responde a estas preguntas:
- Arranque en frío: ¿dónde se compila el motor TensorRT y quién espera a que termine?
- Consumo y temperatura: ¿puede la carcasa mantener el modelo funcionando a FPS máximos durante todo el día?
- Memoria: ¿hay espacio para los búferes de fotogramas y el estado del rastreador junto al modelo? INT8 reduce a la mitad la memoria que ocupa el modelo.
- Actualizaciones: ¿cómo llega un nuevo
best.pta 1000 dispositivos? Una imagen de Docker los mantiene coherentes.
Mostrar solución
Ejemplo de resumen para una implementación de análisis comercial:
| Pregunta | Respuesta |
|---|---|
| Dispositivo | 40 mini-PC de tiendas con CPU Intel Core Ultra, sin GPU dedicada |
| FPS y cámaras | 10 FPS por cámara, 2 cámaras por equipo |
| Llamada | Servicio Python en Linux |
| Flota | 40 equipos, actualizados desde una imagen de Docker |
Presupuesto: 1000 ÷ 10 = 100 ms por fotograma; al restar unos 15 ms para la decodificación y el seguimiento, más un margen del 20 %, quedan unos 65 ms, compartidos por dos cámaras, es decir, unos 30 ms por inferencia. El árbol de decisión recomienda OpenVINO (CPU Intel), con ONNX Runtime como alternativa; así que, en un equipo de una tienda:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30La prueba de rendimiento de la CPU Core Ultra 7 155H en la documentación de OpenVINO indica que YOLO26n tarda 13,4 ms con OpenVINO FP32, así que yolo26n debería caber holgadamente; si el p95 en el equipo real, con las dos canalizaciones de cámara en ejecución, es inferior a 30 ms, implementa OpenVINO. Si no cumple, prueba la GPU integrada del equipo con device="intel:gpu" antes de comprar hardware.