Inference Latency
추론 지연 시간은 모델이 입력 하나를 예측 결과로 변환하는 데 걸리는 시간입니다. 지연 시간에 영향을 주는 요소, 측정 방법, 처리량과의 상충 관계를 다룹니다.
추론 지연 시간은 학습된 머신러닝 모델이 카메라 프레임이나 텍스트 프롬프트와 같은 입력 하나를 예측으로 변환하는 데 걸리는 시간입니다. 보통 밀리초(ms) 단위로 표시하며 시스템의 반응 속도를 결정합니다. 초당 30프레임으로 작동하는 카메라는 33.3 ms마다 새 프레임을 전달하므로, 더 많은 시간이 필요한 탐지기는 스트림을 따라가지 못해 더 이상 실시간 추론을 지원할 수 없습니다. 지연 시간은 순전파만 측정하거나 원시 입력부터 사용 가능한 출력까지 종단 간으로 측정하며, 프로덕션 시스템은 몇 번의 느린 응답도 평균만큼 중요할 수 있으므로 중앙값(p50)과 99번째 백분위수(p99) 같은 백분위수를 추적합니다.
추론 지연 시간에 영향을 주는 요소#
예측 하나는 여러 단계를 거칩니다. 전처리에서는 입력을 디코딩하고 크기를 조정한 뒤 정규화합니다. 순전파는 네트워크를 실행하며, 계산 비용은 모델의 FLOPs, 입력 해상도 및 숫자 정밀도에 따라 증가하고, 속도는 CPU, GPU 또는 신경망 처리 장치(NPU)와 같은 프로세서에 따라 달라집니다. 후처리는 원시 출력을 결과로 변환하며, 탐지기의 경우 박스를 디코딩하고 비최대 억제(NMS)를 실행합니다. 클라우드 API는 네트워크 왕복 시간과 요청이 대기열에서 기다리는 시간을 추가합니다. 따라서 엣지 AI는 데이터를 캡처하는 장치에서 모델을 실행합니다. 또한 프레임워크가 메모리를 할당하고 가중치를 캐시에 로드하며 처음 사용할 때 커널을 선택하기 때문에 첫 호출은 이후 호출보다 느립니다.
하드웨어와 런타임에 따라 순전파 속도가 10배 이상 달라집니다. Ultralytics YOLO26 nano는 CPU에서 ONNX를 사용하면 COCO 640픽셀 이미지당 평균 38.9ms가 걸리고, NVIDIA T4 GPU에서 TensorRT를 사용하면 1.7ms가 걸립니다. Ultralytics YOLO는 모든 예측의 단계별 시간을 결과의 speed 속성에 기록하며, 벤치마크 모드는 각 내보내기 형식에서 측정을 반복합니다.
from ultralytics import YOLO
# Load the smallest YOLO26 detection model
model = YOLO("yolo26n.pt")
# Predict on one image
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Per-image time in milliseconds for each stage of the pipeline
for stage, ms in result.speed.items():
print(f"{stage}: {ms:.1f} ms")루프는 전처리, 추론 및 후처리 시간을 출력하며, 이 시간의 합은 현재 장치에서 해당 이미지에 대한 모델의 지연 시간입니다.
지연 시간 정확하게 측정하기#
지연 시간 수치는 동일한 방식으로 측정한 경우에만 비교할 수 있습니다. 신뢰할 수 있는 측정에서는 준비 실행을 몇 차례 제외하고 여러 번 실행 시간을 측정한 뒤, 단일 실행 값 대신 중앙값과 꼬리 백분위수를 보고합니다. GPU에서는 커널이 비동기적으로 실행되므로 장치의 작업이 끝날 때까지 타이머가 기다려야 합니다. 예를 들어 torch.cuda.synchronize()을 사용해야 하며, 너무 일찍 시계를 읽으면 작업이 끝나기 전에 측정이 중단됩니다. 모델의 데이터 센터 GPU 지연 시간은 휴대폰에서의 지연 시간과 큰 관련이 없으므로 입력 크기, 배치 크기, 정밀도 및 장치는 배포 환경과 모두 일치해야 합니다. FLOPs는 하드웨어와 무관하게 계산 비용을 추정하지만, FLOPs가 같은 모델도 동일한 장치에서 실행 속도가 뚜렷하게 다를 수 있습니다.
추론 지연 시간과 처리량#
처리량은 시스템이 단위 시간당 처리하는 입력 수로, 초당 이미지 수나 초당 토큰 수로 나타냅니다. 처리량은 지연 시간과 반대 방향으로 움직이는 경우가 많습니다. 배치 크기가 커지면 하드웨어를 더 많이 활용하므로 처리량은 높아지지만, 배치의 모든 입력은 전체 배치 처리가 끝날 때까지 기다려야 하므로 각 요청에 응답하는 시간도 늘어납니다:
import time
import torch
import torchvision
# A ResNet-18 image classifier in inference mode on the CPU
model = torchvision.models.resnet18().eval()
for batch in [1, 2, 4, 8]:
x = torch.randn(batch, 3, 224, 224)
with torch.inference_mode():
model(x) # warmup run, not timed
times = []
for _ in range(20):
start = time.perf_counter()
model(x)
times.append(time.perf_counter() - start)
latency = sorted(times)[len(times) // 2] # median seconds per batch
print(f"batch {batch}: {latency * 1e3:5.1f} ms per batch, {batch / latency:4.0f} images/s")노트북 CPU에서 배치 크기를 1에서 8로 늘리자 처리량은 초당 이미지 168장에서 220장으로 증가했지만, 배치를 반환하는 데 걸리는 시간은 6 ms에서 36 ms로 늘었습니다. 따라서 운전자 보조와 음성 비서 같은 인터랙티브 시스템은 배치 크기 1로 실행하고, 비디오 아카이브 인덱싱과 같은 오프라인 작업은 배치를 적극적으로 활용합니다. LLM 서버는 연속 배칭을 사용해 실행 중인 배치에 요청을 추가하고 제거하므로, 각 사용자가 전체 배치를 기다리지 않으면서도 높은 처리량을 유지합니다.
추론 지연 시간 줄이기#
대부분의 경우 계산량을 줄이면 가장 큰 성능 향상을 얻을 수 있습니다. 더 작은 모델 변형을 사용하거나 입력 해상도를 낮추거나 모델 프루닝으로 가중치 수를 줄일 수 있습니다. 모델 양자화를 통해 FP16 또는 INT8을 사용하면 저정밀도 연산 장치가 빠른 하드웨어에서 남은 연산의 비용을 낮출 수 있습니다. TensorRT, OpenVINO 또는 ONNX Runtime과 같은 최적화된 추론 엔진으로 내보내면 레이어를 융합하고 장치에 가장 빠른 커널을 선택합니다. 모델을 장치 자체에서 실행하면 네트워크 왕복이 없어지며, 모바일 연결에서는 이 왕복에 보통 수십 밀리초가 걸립니다.
지연 시간이 중요한 분야#
- 대규모 언어 모델(LLM): 채팅 서비스는 사용자가 반응성으로 체감하는 첫 토큰까지의 시간과 스트리밍 속도를 결정하는 출력 토큰당 시간을 추적합니다. 추측 디코딩은 한 번의 순전파에서 초안 토큰 여러 개를 검증하여 두 번째 시간을 줄입니다.
- 산업 검사: 컨베이어 위의 카메라는 부품이 불량품 배출 장치에 도달하기 전에 각 부품을 분류해야 하므로, 지연 시간이 최대 생산 라인 속도를 결정합니다.
- 자율주행차: 인지, 계획 및 제어는 제한된 시간 예산을 공유하며, 시속 100 km로 주행하는 자동차는 지연이 100 ms 발생할 때마다 2.8 m를 이동합니다.










