Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Ultralytics YOLO en producción·Elige un entorno de ejecución·Lección 1/9
Lecciónintermedio

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.

Cámara de tráfico sobre una autopista urbana al atardecer, con Ultralytics YOLO siguiendo coches, una furgoneta y camiones, cada uno etiquetado con una clase y un identificador

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.

Resultado

Elige el entorno de ejecución y el valor de format= para un dispositivo, convierte un objetivo de FPS en un presupuesto en milisegundos y confirma la elección con pruebas comparativas repetidas.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. GPU NVIDIA o Jetson → TensorRT (engine), compilado en el dispositivo de destino. CPU, iGPU o NPU Intel → OpenVINO (openvino).

  2. Apple → CoreML (coreml). Android → LiteRT (litert). NPU Snapdragon → QNN (qnn). Raspberry Pi → NCNN (ncnn).

  3. Cualquier otro caso → ONNX Runtime (onnx). Si no quieres servidores, usa un endpoint gestionado de Ultralytics Platform.

  4. Presupuesto = 1000 ÷ FPS, menos la decodificación y el posprocesamiento. Mide las opciones en el dispositivo y evalúa el percentil 95, no la media.

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:

ObjetivoEntorno de ejecuciónformat=Ten cuidado con
GPU NVIDIA, JetsonTensorRTengineUn motor solo funciona en la familia de GPU y con la versión de TensorRT con que se compiló
CPU, iGPU o NPU IntelOpenVINOopenvinoOptimizado para Intel; mídelo antes de usarlo en otros dispositivos
Cualquier CPU o GPUONNX RuntimeonnxElige explícitamente el proveedor de ejecución
iPhone, iPad, MacCoreMLcoremlLa exportación se ejecuta en macOS o Linux, no en Windows
Android, dispositivos integradosLiteRTlitertINT8 necesita datos de calibración data
NPU SnapdragonQualcomm QNNqnnSolo exportación cuantizada; pasa el destino Hexagon como name
Raspberry Pi, CPU ARMNCNNncnnEl formato más rápido de la guía de Raspberry Pi
NavegadorONNX Runtime WebonnxLimí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:

Pestaña Deployments del perfil de Ultralytics Platform, con un mapa mundial de las regiones de implementación y tarjetas de resumen de las implementaciones activas, las solicitudes HTTP, la tasa de errores y la latencia P95

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:

PasoEjemplo: 20 FPS por cámara
Presupuesto por fotograma = 1000 ÷ FPS50 ms
Menos la decodificación (RTSP, 1080p)unos 10 ms
Menos el seguimiento, el recuento y las salidasunos 5 ms
Menos un 20 % de margen para los picos10 ms
Disponible para el modelounos 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 imgsz antes 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 budget

Lé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 imgsz má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=onnx

Quita 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#

Hacer pruebas de rendimiento en el equipo equivocado

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).

Los motores de TensorRT dependen del dispositivo

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.

Evalúa el rendimiento con el tamaño que vayas a servir

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.pt a 1000 dispositivos? Una imagen de Docker los mantiene coherentes.
Pruébalo

Redacta un resumen de implementación de cinco líneas para un proyecto real o previsto: dispositivo de destino, FPS por cámara, cámaras por dispositivo, lenguaje desde el que se llama al modelo y tamaño de la flota. Conviértelo en un presupuesto del modelo en milisegundos, elige opciones del árbol de decisión y ejecuta pick_runtime.py (con tu modelo y las opciones) en el dispositivo de destino o en la máquina más parecida que tengas.

Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • El resumen especifica el dispositivo, el entorno de ejecución y el valor exacto de format=.

  • Has calculado el presupuesto del modelo en milisegundos a partir del objetivo de FPS y has indicado qué has restado.

  • Tienes los tiempos de inferencia p50 y p95 de cada opción, medidos en el dispositivo, y una evaluación frente al presupuesto.

Mostrar solución

Ejemplo de resumen para una implementación de análisis comercial:

PreguntaRespuesta
Dispositivo40 mini-PC de tiendas con CPU Intel Core Ultra, sin GPU dedicada
FPS y cámaras10 FPS por cámara, 2 cámaras por equipo
LlamadaServicio Python en Linux
Flota40 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 = 30

La 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.

Qué viene después

Una vez elegido el destino, en la siguiente lección exportarás a ONNX y comprobarás que la exportación produce los mismos resultados que PyTorch.