Ultralytics YOLO27: 대기자 명단에 등록하세요.
Get Started
프로덕션 환경의 Ultralytics YOLO·런타임 선택·레슨 1/9
강의중급

배포 대상 선택

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

해 질 녘 도시 고속도로 위의 교통 카메라 화면. Ultralytics YOLO가 차량, 밴, 트럭을 추적하고 있으며, 각 객체에 클래스와 ID가 표시되어 있습니다.

YOLO26 벤치마크에서 동일한 YOLO26n은 ONNX Runtime을 사용하는 CPU에서 이미지당 38.9ms, TensorRT를 사용하는 T4 GPU에서 1.7ms가 걸립니다. 잘못된 런타임을 선택하면 필요한 것보다 훨씬 많은 하드웨어 비용을 지불하거나 처리 속도를 따라가지 못하는 카메라를 배포하게 됩니다. 이 강의에서는 실제 디바이스에서 측정한 수치로 판단 근거를 제시할 수 있도록 10분 안에 선택하는 방법을 안내합니다.

학습 성과

디바이스에 맞는 런타임과 format= 값을 선택하고, FPS 목표를 밀리초 예산으로 환산한 다음, 반복 벤치마크로 선택을 확인하세요.

속성 과정
이미 사용법을 알고 계신다면, 간단히 요약해 드리겠습니다.
  1. NVIDIA GPU 또는 Jetson → TensorRT(engine), 대상 장치에서 빌드합니다. Intel CPU, iGPU 또는 NPU → OpenVINO(openvino).

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

  3. 그 외의 경우 → ONNX Runtime(onnx). 서버를 원하지 않는다면 관리형 Ultralytics Platform 엔드포인트를 사용하세요.

  4. 예산 = 1000 ÷ FPS에서 디코딩과 후처리 시간을 뺀 값입니다. 디바이스에서 후보를 측정하고 평균이 아니라 p95를 기준으로 판단하세요.

실습형

디바이스에서 시작하기#

런타임은 습관이 아니라 추론이 실행되는 위치에 따라 결정됩니다. 위에서부터 분기 조건을 따라가며 처음 일치하는 항목에서 멈추세요:

각 런타임은 내보내기 모드의 format= 값 하나에 대응합니다:

목표런타임format=주의할 점
NVIDIA GPU, JetsonTensorRTengine엔진은 해당 엔진을 빌드한 GPU 제품군과 TensorRT 버전에서만 실행됩니다
Intel CPU, iGPU, NPUOpenVINOopenvinoIntel에 맞게 최적화되어 있으므로 다른 환경에서 사용하기 전에 측정하세요
모든 CPU 또는 GPUONNX Runtimeonnx실행 공급자를 명시적으로 선택하세요
iPhone, iPad, MacCoreMLcoreml내보내기는 Windows가 아닌 macOS 또는 Linux에서 실행됩니다
Android, 임베디드LiteRTlitertINT8에는 보정 data이 필요합니다
Snapdragon NPUQualcomm QNNqnn양자화된 내보내기만 지원합니다. Hexagon 타깃을 name으로 전달하세요.
Raspberry Pi, ARM CPUNCNNncnnRaspberry Pi 가이드에서 가장 빠른 형식
브라우저ONNX Runtime Webonnxn 또는 s 모델을 사용하세요.

최신 Apple 플랫폼에서는 Apple의 새로운 Core AI 형식(format=coreai, macOS 26+ Apple silicon 또는 x86-64 Linux에서 내보냄)으로도 내보낼 수 있습니다. 내보내기가 처음이신가요? 배포를 위한 내보내기 강의에서 기본 사항을 다룹니다.

추론 서버를 전혀 실행하고 싶지 않다면 Ultralytics Platform에서 모델을 42개 리전 중 하나의 전용 엔드포인트로 배포할 수 있으며, 프로필의 Deployments 탭에서 각 엔드포인트가 실행되는 위치를 확인할 수 있습니다:

배포 리전 세계 지도와 활성 배포, HTTP 요청, 오류율, P95 지연 시간 개요 카드가 표시된 Ultralytics Platform 프로필의 Deployments 탭

이 경로는 엔드포인트 배포 및 호출에서 다룹니다. 이 과정의 나머지 내용은 모델을 직접 실행하는 경우를 위한 것입니다.

FPS 목표를 밀리초 예산으로 변환하기#

“실시간”은 요구사항이 아닙니다. 필요한 것은 수치입니다. 벤치마크를 수행하기 전에 계산해 보세요:

단계예시: 카메라당 20 FPS
프레임 예산 = 1000 ÷ FPS50 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=onnx

format=을 생략하면 시스템에서 지원하는 모든 형식을 비교합니다. COCO8에는 검증 이미지가 4장뿐이므로 mAP 열은 기본 동작 점검용으로만 보고, 정확도 판단에는 자체 데이터셋 YAML을 사용하세요.

주의할 점#

잘못된 장치에서 벤치마크하기

증상: 워크스테이션에서 모델이 60 FPS를 기록했지만 장치에서는 프레임을 놓칩니다. 해결 방법: 배포 하드웨어 또는 구할 수 있는 가장 유사한 시스템에서 벤치마크하고, 프로덕션에서 발생할 부하(다른 프로세스, 다른 카메라)를 적용해 실행합니다.

TensorRT 엔진은 장치별로 다름

증상: 데이터센터 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 이미지를 사용하면 장치 구성을 일관되게 유지할 수 있습니다.
사용해 보기

실제 프로젝트나 계획 중인 프로젝트를 대상으로 5줄의 배포 요약을 작성하세요. 타깃 장치, 카메라당 FPS, 장치당 카메라 수, 호출 언어, 플릿 규모를 기재합니다. 이를 밀리초 단위의 모델 예산으로 변환하고, 의사결정 트리에서 후보를 선택한 다음, 타깃 장치나 보유한 장치 중 가장 유사한 장치에서 모델 및 후보와 함께 pick_runtime.py을 실행하세요.

완료 조건
다음 조건을 모두 충족하면 레슨을 완료한 것입니다.
  • 요약에 장치, 런타임, 정확한 format= 값이 명시되어 있습니다.

  • FPS 목표에서 모델의 밀리초 예산을 도출하고, 차감한 항목을 표시했습니다.

  • 장치에서 측정한 각 후보의 p50 및 p95 추론 시간과 예산 대비 평가 결과가 있습니다.

정답 보기

리테일 분석 배포 프로젝트의 요약 예시:

질문답변
장치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 = 30

OpenVINO 문서의 Core Ultra 7 155H CPU 벤치마크에 따르면 YOLO26n은 OpenVINO FP32에서 13.4 ms가 걸리므로 yolo26n은 충분한 여유를 두고 예산을 충족할 것으로 예상됩니다. 두 카메라 파이프라인을 모두 실행하는 실제 장치에서 p95가 30 ms 미만이면 OpenVINO를 배포하세요. 예산을 초과하면 하드웨어를 구매하기 전에 해당 장치의 내장 GPU에서 device="intel:gpu"을 시도하세요.

다음 단계

타깃을 정했으니 다음 강의에서는 ONNX로 내보내고, 내보낸 모델이 PyTorch와 동일한 결과를 내는지 확인합니다.