14. 추론 지표
핵심 질문
- TTFT·ITL·TPOT·latency·throughput·goodput은 각각 어떤 이벤트를, 어떻게 집계하고, 분모가 무엇인지로 정의되는가?
- 정의가 흔들리면 왜 이후 모든 비교가 무의미해지는가?
목표
- 각 지표를 이벤트·집계(reduction)·분모(denominator)로 못 박는다.
- 평균 vs 꼬리(P99), 요청 단위 vs 토큰 단위 집계의 차이를 이해한다.
왜 정의가 먼저인가
15장에서 벤치마크를 비판하려면, 그 전에 지표 자체가 흔들리지 않아야 합니다. 같은 이름(예: TTFT)이라도 "무엇을 이벤트로 보고, 어떻게 모으고, 무엇으로 나누는가"가 다르면 숫자가 달라집니다. 이 장은 그 세 가지 — 이벤트·집계·분모 — 를 각 지표마다 명시합니다.
02장에서 정의한 출력 이벤트(첫 토큰·이후 토큰·completion)가 여기서 지표의 재료가 됩니다.
지표 정의표
| 지표 | 어떤 이벤트 | 집계(reduction) | 분모(denominator) | 반영하는 phase |
|---|---|---|---|---|
| TTFT (Time To First Token) | 요청 도착 → 첫 토큰 도달 | 요청별 값 → 평균/P95/P99 | (없음; 시간 자체) | prefill + 큐·네트워크 포함 |
| ITL (Inter-Token Latency) | 인접한 두 출력 토큰 사이 간격 | 토큰별 간격 → 평균/분포 | 토큰 간 간격 수 | decode(스트리밍 부드러움) |
| TPOT (Time Per Output Token) | 첫 토큰 이후 생성 시간 | 요청 내 평균 | 출력 토큰 수(첫 토큰 제외) | decode |
| E2E latency (end-to-end) | 요청 도착 → 마지막 토큰 | 요청별 → 평균/P99 | (없음; 시간 자체) | 전체 |
| throughput (TPS/RPS) | 처리된 토큰/요청 | 합계 | 경과 시간(초) | 전체(시스템) |
| goodput | SLO를 만족한 요청 | SLO 통과분만 계수 | 경과 시간(초) | 전체(품질 필터) |
🔎 약어·개념 풀이
- P95/P99(꼬리 지연): 하위 95%/99%가 이 값 이하라는 뜻. 평균이 좋아도 P99가 나쁘면 일부 사용자는 크게 느립니다.
- SLO(Service Level Objective, 서비스 수준 목표): "TTFT ≤ 200ms이고 TPOT ≤ 50ms를 90% 이상 만족" 같은 목표치.
- TPS/RPS: 초당 토큰/요청 수(throughput의 단위).
직접 체감해 보기
아래 위젯에서 첫 토큰 대기(TTFT)와 출력 속도를 바꾸면, 같은 응답이 어떻게 다르게 느껴지는지 확인할 수 있습니다. TTFT는 첫 글자가 나오기까지의 대기이고, 출력 속도는 그 뒤 글자가 흘러나오는 속도입니다. 이 출력 속도는 이 요청 하나가 체감하는 값으로, 정의표의 TPOT(초당 토큰으로 환산하면 대략 그 역수)에 가깝습니다. TPOT의 분모는 요청 하나의 출력 토큰 수이고 throughput(TPS)의 분모는 경과 시간이라는 점이 다릅니다 — 앞은 한 요청을, 뒤는 여러 요청을 함께 처리하는 시스템 전체를 잽니다. 이 차이는 바로 아래 "분모 — TPOT vs throughput의 혼동" 절에서 다시 짚습니다. TTFT와 출력 속도는 위젯 안에서 서로 독립적으로 움직입니다.
추론 지표는 이벤트·집계·분모 세 가지로 정의합니다. TTFT는 요청이 도착해 첫 토큰이 사용자에게 닿기까지의 시간이고, 여기에는 큐 대기와 네트워크가 함께 들어갑니다. 출력 속도는 첫 글자가 나온 뒤 이 요청 하나가 체감하는 초당 토큰 수로, 시스템 전체의 throughput과는 다른 값입니다. 같은 응답이라도 이 두 값의 조합에 따라 체감은 크게 달라집니다.
세 가지를 못 박는 것이 왜 결정적인가
이벤트 — TTFT의 함정
TTFT의 "첫 토큰"은 사용자에게 도달한 첫 토큰입니다. 즉 prefill 계산뿐 아니라 큐 대기·스케줄러 지연·네트워크가 다 들어갑니다(02장에서 예고). "TTFT=prefill 시간"으로 읽으면 틀립니다.
집계 — ITL의 함정
ITL을 "요청별로 먼저 평균 낸 뒤 그 평균들을 다시 평균"낼지, "모든 토큰 간격을 다 모아 한꺼번에" 통계 낼지에 따라 분포와 꼬리값이 달라집니다. 한 자료는 요청별 평균을 먼저 내면 이상치(outlier)가 묻히고, 원시 간격을 모두 모아야 진짜 분포가 보인다고 지적합니다(확인일 2026-07-20). 같은 "ITL"이 집계 방식으로 달라지는 것입니다.
분모 — TPOT vs throughput의 혼동
TPOT의 분모는 한 요청의 출력 토큰 수(첫 토큰 제외)입니다 — 개별 사용자 체감. throughput의 분모는 경과 시간입니다 — 시스템 처리량. 이 둘은 종종 반대로 움직입니다(배치를 키우면 throughput↑ 하지만 개별 TPOT·TTFT↑ 가능, 07장).
goodput — 품질로 거른 throughput
goodput은 "SLO를 만족하면서 처리한" 비율입니다. 원 개념은 DistServe(UCSD) 계열에서 형식화된 것으로 설명되며, TTFT와 TPOT(또는 E2E) SLO를 둘 다 만족하는 요청만 셉니다.
⚖️ 절충: raw throughput만 좇으면 꼬리 지연이 나빠져 goodput이 무너질 수 있습니다. goodput은 "얼마나 많이"가 아니라 "얼마나 많이 제대로"를 묻습니다.
🔬 증거 읽기: 지표 정의·집계 방식은 도구·자료마다 다릅니다(예: vLLM benchmark_serving.py, genai-perf, Prometheus 히스토그램). "이 시스템의 TTFT가 낮다"는 주장을 볼 때, 어느 도구로·어떤 집계로·무엇을 분모로 쟀는지 없이는 비교가 성립하지 않습니다. 이는 15장의 핵심 무기입니다.
📌 핵심
- 모든 지표는 이벤트 · 집계(reduction) · 분모(denominator)로 정의된다 — 이 셋이 흔들리면 숫자가 흔들린다.
- TTFT엔 큐·네트워크가 포함(≠prefill), ITL은 집계 방식에 민감, TPOT는 요청 내 토큰당·throughput은 시간당.
- throughput(시스템)과 TTFT/ITL(사용자)은 종종 반대로 움직인다.
- goodput은 SLO를 만족한 처리량 — "제대로 된" 처리량.
🔎 이 장의 '지지하지 않는 결론'
- 지표 이름만으로 두 시스템을 비교할 수 없습니다 — 이벤트·집계·분모·도구가 같아야 합니다.
- 높은 throughput만으로 "좋은 서비스"라고 말할 수 없습니다 — goodput·꼬리 지연이 필요합니다.
✍️ 확인 문제
- TTFT·TPOT·throughput을 각각 이벤트·집계·분모로 정의하세요. TTFT가 prefill 시간과 같지 않은 이유는?
- (조건 유형) "우리 시스템 TTFT가 더 낮다"는 주장을 신뢰하려면 무엇을 함께 밝혀야 합니까? 최소 세 가지.
- raw throughput은 높은데 goodput은 낮은 상황이 어떻게 생기는지 설명하세요.
다음 장: 15 · 벤치마크 주장 비판하기 — 조건표로 순위를 판정하기.