본문 바로가기

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)처리된 토큰/요청합계경과 시간(초)전체(시스템)
goodputSLO를 만족한 요청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장).

⚠️ 흔한 실수
흔한 오해: "throughput이 높으니 사용자 경험도 좋다" — 아닙니다. throughput은 시스템 관점, TTFT·ITL은 사용자 관점입니다. 그래서 goodput이 등장합니다.

goodput — 품질로 거른 throughput

goodput은 "SLO를 만족하면서 처리한" 비율입니다. 원 개념은 DistServe(UCSD) 계열에서 형식화된 것으로 설명되며, TTFT와 TPOT(또는 E2E) SLO를 둘 다 만족하는 요청만 셉니다.

📌 핵심
예: SLO가 "TTFT<200ms 그리고 TPOT<50ms를 90% 이상"일 때, goodput은 그 조건이 유지되는 최대 요청률입니다. raw throughput 10 req/s라도 70%가 지연 예산을 넘기면 goodput은 3에 그칠 수 있습니다 — 나머지는 사용자 관점에서 버려진 처리량입니다.
⚖️ 절충: 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·꼬리 지연이 필요합니다.

✍️ 확인 문제

  1. TTFT·TPOT·throughput을 각각 이벤트·집계·분모로 정의하세요. TTFT가 prefill 시간과 같지 않은 이유는?
  2. (조건 유형) "우리 시스템 TTFT가 더 낮다"는 주장을 신뢰하려면 무엇을 함께 밝혀야 합니까? 최소 세 가지.
  3. raw throughput은 높은데 goodput은 낮은 상황이 어떻게 생기는지 설명하세요.
다음 장: 15 · 벤치마크 주장 비판하기 — 조건표로 순위를 판정하기.