Escolha um destino de implantação
Defina o dispositivo, o orçamento de latência e a frota para escolher um runtime e um formato de exportação; em seguida, confirme a escolha no dispositivo.

O mesmo YOLO26n leva 38.9 ms por imagem em uma CPU com ONNX Runtime e 1.7 ms em uma GPU T4 com TensorRT nos benchmarks do YOLO26. Escolher o runtime errado faz você pagar por muito mais hardware do que precisa ou implantar câmeras que não conseguem acompanhar o ritmo. Esta lição transforma a escolha em uma decisão de dez minutos, que você pode justificar com números medidos no próprio dispositivo.
Prático
Comece pelo dispositivo#
O runtime depende de onde a inferência é executada, não do hábito. Percorra a árvore desde o início e pare na primeira opção correspondente:
Cada runtime corresponde a um valor format= em Modo de exportação:
| Meta | Runtime | format= | Atenção a |
|---|---|---|---|
| GPU NVIDIA, Jetson | TensorRT | engine | Um engine só funciona na família de GPUs e na versão do TensorRT usadas para compilá-lo |
| CPU, iGPU, NPU Intel | OpenVINO | openvino | Otimizado para Intel; faça medições antes de usá-lo em outros dispositivos |
| Qualquer CPU ou GPU | ONNX Runtime | onnx | Escolha explicitamente o provedor de execução |
| iPhone, iPad, Mac | CoreML | coreml | A exportação é executada no macOS ou Linux, não no Windows |
| Android, dispositivos embarcados | LiteRT | litert | INT8 requer dados de calibração data |
| NPU Snapdragon | Qualcomm QNN | qnn | Apenas exportação quantizada; passe o destino Hexagon como name |
| Raspberry Pi, CPU ARM | NCNN | ncnn | O formato mais rápido no guia do Raspberry Pi |
| Navegador | ONNX Runtime Web | onnx | Limite-se aos modelos n ou s |
Nas plataformas Apple recentes, também podes exportar para o novo formato Core AI da Apple (format=coreai, exportado no macOS 26+ em Apple silicon ou Linux x86-64). É a primeira vez que exportas? A lição Exportar para implantação aborda os conceitos básicos.
Se preferires não executar servidores de inferência, a Ultralytics Platform implanta um modelo como endpoint dedicado numa das 42 regiões, e o separador Deployments do teu perfil mostra onde cada um é executado:

Esse caminho é abordado em Implantar e chamar um endpoint. O restante deste curso é para quando executas o modelo por conta própria.
Transforma a meta de FPS num orçamento em milissegundos#
«Tempo real» não é um requisito; um número é. Calcula-o antes de fazer qualquer benchmark:
| Passagem | Exemplo: 20 FPS por câmara |
|---|---|
| Orçamento por frame = 1000 ÷ FPS | 50 ms |
| Menos a descodificação (RTSP, 1080p) | cerca de 10 ms |
| Menos rastreamento, contagem e destinos | cerca de 5 ms |
| Menos 20% de margem para picos | 10 ms |
| Restante para o modelo | cerca de 25–30 ms |
Em seguida, aplica estas regras de decisão:
- Se o YOLO26n precisar de mais tempo do que o orçamento do teu modelo na CPU do dispositivo, muda para um acelerador (GPU, iGPU, NPU) ou reduz
imgszantes de qualquer outra coisa; os benchmarks do YOLO26 indicam 38.9 ms para o YOLO26n com ONNX na CPU e 1.7 ms numa T4 com TensorRT. - Se um dispositivo tiver de atender várias câmaras, divide o orçamento do modelo pelo número de câmaras.
- Se a frota tiver mais do que alguns tipos de dispositivo, prefere runtimes que não exijam compilações específicas para cada dispositivo ou planeia uma compilação por classe de dispositivo.
- Se o código que faz as chamadas estiver em Swift, Kotlin ou C++, verifica o SDK do runtime para essa linguagem antes de te comprometeres.
Faz o benchmark dos candidatos no dispositivo#
As fichas técnicas e os benchmarks de outras pessoas são um ponto de partida. A decisão é tomada no hardware em que vais implantar e com base nos frames lentos, não na média: um runtime rápido na mediana, mas que bloqueia num em cada vinte frames, continuará a perder frames. Este script exporta cada candidato, mede o tempo de 100 inferências num frame real e avalia cada um pelo 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")No portátil com Apple silicon usado para testar este curso, enquanto outros trabalhos partilhavam a 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ê linha a linha:
speed["inference"]é o tempo gasto pelo próprio modelo nesse frame, sem descodificação nem desenho, permitindo comparar os runtimes de forma justa.- O OpenVINO vence na mediana e perde no p95 por um fator superior a dois. Se avaliares pelas médias, vais disponibilizar o runtime que bloqueia nos momentos de maior atividade; se avaliares pelo p95, o ONNX Runtime é a opção mais estável nesta máquina.
- Ambos excedem o orçamento, por isso, neste caso, o próximo passo é usar um
imgszmenor, um acelerador ou menos câmaras por dispositivo, não outro runtime de CPU.
Para comparar rapidamente a precisão e a velocidade entre formatos, o modo Benchmark exporta, valida e mede o tempo de cada um:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxRemove format= para testar todos os formatos suportados pela máquina. O COCO8 tem apenas quatro imagens de validação; considera a coluna mAP como um teste básico e usa o YAML do teu próprio conjunto de dados para decidir sobre a precisão.
Armadilhas#
Sintoma: o modelo atingiu 60 FPS na sua estação de trabalho, mas perde quadros no dispositivo. Solução: faça o benchmark no hardware de implantação, ou na máquina mais próxima que conseguir, e execute-o sob a carga que terá em produção (outros processos, outras câmeras).
Sintoma: um .engine compilado em uma GPU de data center não carrega em um Jetson Orin. Solução: compile no dispositivo de destino durante a instalação (uma compilação YOLO26n FP16 leva cerca de 5 minutos em um Jetson Orin, segundo a documentação de exportação da Platform) ou mantenha uma compilação por classe de dispositivo e versão do TensorRT, e envie o .pt ou .onnx para que qualquer dispositivo possa recompilar.
yolo benchmark mede no imgsz que você informar. Se a produção for executada em imgsz=1280, faça o benchmark em 1280: o custo computacional cresce com o número de pixels, então os números para 640 subestimam em cerca de 4× uma implantação em 1280.
Os dispositivos de edge acrescentam quatro questões#
Os guias de Raspberry Pi, NVIDIA Jetson e DeepStream no Jetson abordam em detalhe os alvos mais comuns. Antes de te decidires por um dispositivo de edge, responde:
- Arranque a frio: onde é criado o mecanismo TensorRT e quem fica à espera?
- Energia e calor: a caixa consegue manter o modelo na velocidade máxima de FPS durante todo o dia?
- Memória: há espaço para os buffers de frames e o estado do rastreador junto ao modelo? O INT8 reduz para metade a parcela do modelo.
- Atualizações: como é que um novo
best.ptchega a 1.000 dispositivos? Uma imagem Docker mantém-nos consistentes.
Mostrar solução
Um exemplo de resumo para uma implantação de análise de retalho:
| Pergunta | Resposta |
|---|---|
| Dispositivo | 40 mini PCs de loja com CPUs Intel Core Ultra, sem GPU dedicada |
| FPS e câmaras | 10 FPS por câmara, 2 câmaras por caixa |
| Cliente | Serviço Python no Linux |
| Frota | 40 caixas, atualizadas a partir de uma imagem Docker |
Orçamento: 1000 ÷ 10 = 100 ms por frame; menos cerca de 15 ms para descodificação e rastreamento e 20% de margem, sobram cerca de 65 ms, partilhados por duas câmaras, ou seja, cerca de 30 ms por inferência. A árvore de decisão indica OpenVINO (CPU Intel), com ONNX Runtime como alternativa, portanto, numa caixa de uma loja:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30O benchmark da CPU Core Ultra 7 155H na documentação do OpenVINO indica 13.4 ms para o YOLO26n com OpenVINO FP32, por isso yolo26n deverá caber com margem; se o p95 na caixa real, com os dois pipelines de câmara em execução, ficar abaixo de 30 ms, disponibiliza o OpenVINO. Se exceder esse limite, experimenta a GPU integrada da caixa com device="intel:gpu" antes de comprar hardware.