배포 대상 선택
디바이스, 지연 시간 예산 및 플릿을 하나의 런타임과 내보내기 형식으로 연결한 다음, 디바이스에서 확인하세요.

YOLO26 벤치마크에서 동일한 YOLO26n은 ONNX Runtime을 사용하는 CPU에서 이미지당 38.9ms, TensorRT를 사용하는 T4 GPU에서 1.7ms가 걸립니다. 잘못된 런타임을 선택하면 필요한 것보다 훨씬 많은 하드웨어 비용을 지불하거나 처리 속도를 따라가지 못하는 카메라를 배포하게 됩니다. 이 강의에서는 실제 디바이스에서 측정한 수치로 판단 근거를 제시할 수 있도록 10분 안에 선택하는 방법을 안내합니다.
실습형
디바이스에서 시작하기#
런타임은 습관이 아니라 추론이 실행되는 위치에 따라 결정됩니다. 위에서부터 분기 조건을 따라가며 처음 일치하는 항목에서 멈추세요:
각 런타임은 내보내기 모드의 format= 값 하나에 대응합니다:
| 목표 | 런타임 | format= | 주의할 점 |
|---|---|---|---|
| NVIDIA GPU, Jetson | TensorRT | engine | 엔진은 해당 엔진을 빌드한 GPU 제품군과 TensorRT 버전에서만 실행됩니다 |
| Intel CPU, iGPU, NPU | OpenVINO | openvino | Intel에 맞게 최적화되어 있으므로 다른 환경에서 사용하기 전에 측정하세요 |
| 모든 CPU 또는 GPU | ONNX Runtime | onnx | 실행 공급자를 명시적으로 선택하세요 |
| iPhone, iPad, Mac | CoreML | coreml | 내보내기는 Windows가 아닌 macOS 또는 Linux에서 실행됩니다 |
| Android, 임베디드 | LiteRT | litert | INT8에는 보정 data이 필요합니다 |
| Snapdragon NPU | Qualcomm QNN | qnn | 양자화된 내보내기만 지원합니다. Hexagon 타깃을 name으로 전달하세요. |
| Raspberry Pi, ARM CPU | NCNN | ncnn | Raspberry Pi 가이드에서 가장 빠른 형식 |
| 브라우저 | ONNX Runtime Web | onnx | n 또는 s 모델을 사용하세요. |
최신 Apple 플랫폼에서는 Apple의 새로운 Core AI 형식(format=coreai, macOS 26+ Apple silicon 또는 x86-64 Linux에서 내보냄)으로도 내보낼 수 있습니다. 내보내기가 처음이신가요? 배포를 위한 내보내기 강의에서 기본 사항을 다룹니다.
추론 서버를 전혀 실행하고 싶지 않다면 Ultralytics Platform에서 모델을 42개 리전 중 하나의 전용 엔드포인트로 배포할 수 있으며, 프로필의 Deployments 탭에서 각 엔드포인트가 실행되는 위치를 확인할 수 있습니다:

이 경로는 엔드포인트 배포 및 호출에서 다룹니다. 이 과정의 나머지 내용은 모델을 직접 실행하는 경우를 위한 것입니다.
FPS 목표를 밀리초 예산으로 변환하기#
“실시간”은 요구사항이 아닙니다. 필요한 것은 수치입니다. 벤치마크를 수행하기 전에 계산해 보세요:
| 단계 | 예시: 카메라당 20 FPS |
|---|---|
| 프레임 예산 = 1000 ÷ FPS | 50 ms |
| 디코딩 비용 차감(RTSP, 1080p) | 약 10 ms |
| 트래킹, 카운팅, 출력 처리 비용 차감 | 약 5 ms |
| 피크에 대비한 여유분 20% 차감 | 10 ms |
| 모델에 남는 시간 | 약 25–30 ms |
그런 다음 다음 의사결정 규칙을 적용하세요:
- YOLO26n이 장치의 CPU에서 모델 예산보다 오래 걸리면, 먼저 가속기(GPU, iGPU, NPU)로 전환하거나
imgsz의 크기를 줄이세요. YOLO26 벤치마크에 따르면 YOLO26n은 CPU ONNX에서 38.9 ms, TensorRT를 사용하는 T4에서 1.7 ms가 걸립니다. - 한 장치에서 여러 카메라를 처리해야 한다면, 모델 예산을 카메라 수로 나누세요.
- 플릿에 다양한 장치 유형이 여러 개 있다면, 장치별 빌드가 필요하지 않은 런타임을 우선 고려하거나 장치 유형별 빌드를 계획하세요.
- 호출 코드가 Swift, Kotlin 또는 C++로 작성되어 있다면, 런타임을 결정하기 전에 해당 언어용 SDK를 확인하세요.
장치에서 후보 모델 벤치마크하기#
사양표와 다른 사람들의 벤치마크는 출발점일 뿐입니다. 실제 배포할 하드웨어에서 느린 프레임을 기준으로 판단해야 하며, 평균을 기준으로 해서는 안 됩니다. 중앙값 기준으로는 빠르지만 20개 프레임 중 하나에서 지연되는 런타임은 여전히 프레임을 놓칩니다. 다음 스크립트는 각 후보를 내보내고 실제 프레임에서 추론 100회를 측정한 뒤, 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")이 과정을 테스트하는 데 사용한 Apple silicon 노트북에서 다른 작업이 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각 항목을 하나씩 살펴보겠습니다.
speed["inference"]은 디코딩이나 그리기 없이 해당 프레임을 처리하는 모델 자체의 시간으로, 런타임을 공정하게 비교할 수 있습니다.- OpenVINO는 중앙값에서는 앞서지만 p95에서는 두 배 넘게 느립니다. 평균으로 판단하면 사용량이 몰리는 순간에 지연되는 런타임을 배포하게 됩니다. p95를 기준으로 판단하면 이 장치에서는 ONNX Runtime이 더 안정적인 선택입니다.
- 두 런타임 모두 예산을 초과합니다. 따라서 여기서 다음으로 할 일은 다른 CPU 런타임을 시도하는 것이 아니라 더 작은
imgsz을 사용하거나, 가속기를 쓰거나, 장치당 카메라 수를 줄이는 것입니다.
형식별 정확도와 속도를 빠르게 비교하려면 벤치마크 모드에서 각 형식을 내보내고, 검증하고, 측정하세요:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxformat=을 생략하면 시스템에서 지원하는 모든 형식을 비교합니다. COCO8에는 검증 이미지가 4장뿐이므로 mAP 열은 기본 동작 점검용으로만 보고, 정확도 판단에는 자체 데이터셋 YAML을 사용하세요.
주의할 점#
증상: 워크스테이션에서 모델이 60 FPS를 기록했지만 장치에서는 프레임을 놓칩니다. 해결 방법: 배포 하드웨어 또는 구할 수 있는 가장 유사한 시스템에서 벤치마크하고, 프로덕션에서 발생할 부하(다른 프로세스, 다른 카메라)를 적용해 실행합니다.
증상: 데이터센터 GPU에서 빌드한 .engine을 Jetson Orin에서 로드할 수 없습니다. 해결 방법: 설치 시 대상 장치에서 빌드하거나(Jetson Orin에서 YOLO26n FP16 빌드는 Platform 내보내기 문서에 따르면 약 5분 소요), 장치 유형과 TensorRT 버전별로 빌드를 하나씩 유지하고, 모든 장치에서 다시 빌드할 수 있도록 .pt 또는 .onnx를 함께 배포합니다.
yolo benchmark은 전달한 imgsz에서 측정합니다. 프로덕션에서 imgsz=1280를 사용한다면 1280에서 벤치마크하세요. 연산량은 픽셀 수에 비례해 증가하므로, 640에서 측정한 수치는 1280 배포의 연산량을 약 4배 낮게 산정합니다.
엣지 장치에서 고려할 네 가지 질문#
Raspberry Pi, NVIDIA Jetson, Jetson의 DeepStream 가이드에서 일반적인 타깃을 자세히 다룹니다. 엣지 장치를 결정하기 전에 다음 질문에 답하세요:
- 콜드 스타트: TensorRT 엔진은 어디서 빌드하며, 누가 그동안 기다려야 합니까?
- 전력 및 발열: 인클로저가 하루 종일 최대 FPS로 모델을 실행할 수 있습니까?
- 메모리: 모델과 함께 프레임 버퍼 및 트래커 상태를 저장할 공간이 있습니까? INT8을 사용하면 모델이 차지하는 메모리가 절반으로 줄어듭니다.
- 업데이트: 새
best.pt을 장치 1,000대에 어떻게 전달합니까? Docker 이미지를 사용하면 장치 구성을 일관되게 유지할 수 있습니다.
정답 보기
리테일 분석 배포 프로젝트의 요약 예시:
| 질문 | 답변 |
|---|---|
| 장치 | Intel Core Ultra CPU가 탑재된 매장 내 미니 PC 40대, 별도 GPU 없음 |
| FPS 및 카메라 | 카메라당 10 FPS, 장치당 카메라 2대 |
| 호출자 | Linux에서 실행되는 Python 서비스 |
| 플릿 | Docker 이미지로 업데이트하는 장치 40대 |
예산: 1000 ÷ 10 = 프레임당 100 ms입니다. 디코딩 및 트래킹에 약 15 ms를 빼고 여유분 20%를 확보하면 약 65 ms가 남으며, 이를 카메라 2대가 나눠 쓰므로 추론당 약 30 ms입니다. 의사결정 트리에서는 OpenVINO(Intel CPU)를 권장하고, 대안으로 ONNX Runtime을 제시합니다. 따라서 매장 장치 한 대에서:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30OpenVINO 문서의 Core Ultra 7 155H CPU 벤치마크에 따르면 YOLO26n은 OpenVINO FP32에서 13.4 ms가 걸리므로 yolo26n은 충분한 여유를 두고 예산을 충족할 것으로 예상됩니다. 두 카메라 파이프라인을 모두 실행하는 실제 장치에서 p95가 30 ms 미만이면 OpenVINO를 배포하세요. 예산을 초과하면 하드웨어를 구매하기 전에 해당 장치의 내장 GPU에서 device="intel:gpu"을 시도하세요.