추론 지표 — TTFT, TPOT, ITL, Goodput, P99
네 가지 지표가 추론 배포(inference deployment)가 제대로 동작하는지 결정합니다. TTFT는 프리필(prefill), 큐 대기(queue), 네트워크(network)를 합친 값입니다. TPOT, 또는 동등한 표현인 ITL은 토큰(token)당 메모리 바운드 디코드 비용(memory-bound decode cost)입니다. 종단 간 지연(end-to-end latency)은 TTFT에 TPOT 곱하기 출력 길이(output length)를 더한 값입니다. 처리량(throughput)은 플릿(fleet) 전체에서 집계한 초당 토큰 수(tokens/sec)입니다. 하지만 제품 관점에서 실제로 중요한 것은 굿풋(goodput)입니다. 굿풋은 모든 SLO를 동시에 만족한 요청의 비율입니다. 처리량은 높은데 굿풋이 낮다면, 사용자에게 제때 도달하지 못할 토큰을 처리하고 있다는 뜻입니다. 2026년 TRT-LLM의 Llama-3.1-8B-Instruct 기준 참조 수치(reference number)는 평균 TTFT 162ms, 평균 TPOT 7.33ms, 평균 E2E 1,093ms입니다. 항상 P50, P90, P99를 함께 보고해야 합니다. 평균만 보고하면 안 됩니다. 그리고 측정 함정(measurement trap)을 조심하세요. GenAI-Perf는 ITL 계산에서 TTFT를 제외하고, LLMPerf는 포함합니다. 같은 실행(run)에서도 두 도구는 TPOT에 대해 서로 다른 숫자를 냅니다.
유형: Learn
언어: Python(표준 라이브러리, 장난감 백분위수 계산기(percentile calculator)와 굿풋 리포터(goodput reporter))
선수 지식: Phase 17 · 04(vLLM Serving Internals)
예상 시간: 약 60분
학습 목표
- TTFT, TPOT, ITL, E2E, 처리량, 굿풋을 정확히 정의하고 각각이 어느 구성요소(component)를 측정하는지 말할 수 있습니다.
- LLM 서빙(serving)에서 평균(mean)이 왜 잘못된 통계량(statistic)인지 설명하고 P50/P90/P99를 읽을 수 있습니다.
- 예를 들어 TTFT < 500ms AND TPOT < 15ms AND E2E < 2s 같은 SLO 다중 제약(multi-constraint)을 구성하고, 이에 대한 굿풋을 계산할 수 있습니다.
- 같은 실행에 대해 TPOT이 다르게 나오는 벤치마크 도구(benchmark tool) 두 가지를 이름 붙이고 그 이유를 설명할 수 있습니다.
문제
"우리 처리량은 초당 15,000 토큰입니다." 그래서요? 요청의 40%가 종단 간 2초를 넘겨 사용자가 세션(session)을 떠났다면, 처리량만으로는 제품이 동작하는지 알 수 없습니다.
추론에는 지연(latency) 축이 여러 개 있고, 각각 다르게 실패합니다. 프리필은 연산 바운드(compute-bound)이며 프롬프트 길이(prompt length)에 따라 커집니다. 디코드(decode)는 메모리 바운드이며 배치 크기(batch size)에 따라 커집니다. 큐 대기 지연(queuing delay)은 운영 문제입니다. 네트워크는 물리적 거리 문제입니다. 각각을 위한 별도 지표가 필요하고, 백분위수(percentile)가 필요하며, "사용자가 기대한 것을 받았는가"를 말해주는 단일 종합 지표(composite)가 필요합니다. 그것이 굿풋입니다.
개념
TTFT — 첫 토큰까지의 시간(time to first token)
TTFT = queue_time + network_request + prefill_time
프롬프트가 길면 프리필이 지배합니다. H100에서 Llama-3.3-70B FP8을 실행할 때 32k 프롬프트는 순수 프리필만 약 800ms가 걸립니다. 큐 대기 시간(queue time)은 부하 상태에서의 스케줄러 동작(scheduler behavior)에 좌우됩니다. 네트워크 요청(network request)은 TLS를 포함한 전송 시간(wire time)입니다. TTFT는 스트리밍(streaming)이 시작되기 전 사용자가 체감하는 지연입니다.
TPOT / ITL — 토큰 간 지연(inter-token latency)
하나의 양에 여러 이름이 있습니다. TPOT(time per output token), ITL(inter-token latency), 토큰당 디코드 지연(decode latency per token)은 모두 같은 의미로 쓰입니다. 첫 토큰 이후 연속으로 스트리밍되는 토큰 사이의 시간입니다.
TPOT = (decode_forward_time + scheduler_overhead) / tokens_produced
같은 Llama-3.3-70B H100 스택(stack)에서 청크 프리필(chunked prefill)을 쓰면 평균 TPOT은 약 7ms입니다. 청크 프리필이 없으면 이웃 시퀀스(sequence)에서 긴 프리필이 도는 동안 TPOT이 50ms까지 튈 수 있습니다. 평균이 아니라 P99를 봐야 합니다.
E2E 지연(latency)
E2E = TTFT + TPOT * output_tokens + network_response
긴 출력, 예를 들어 500 토큰을 넘는 출력에서는 E2E가 TPOT에 지배됩니다. 긴 프롬프트에 짧은 출력이라면 E2E는 TTFT에 지배됩니다. 출력 길이 조건별로 E2E를 나누어 보고해야 합니다.
처리량(throughput)
throughput = total_output_tokens / elapsed_time
처리량은 집계 지표(aggregate metric)입니다. 플릿 효율(fleet efficiency)을 알려줍니다. 개별 요청의 건강 상태는 알려주지 않습니다.
굿풋(goodput) — 실제로 신경 써야 하는 지표
goodput = fraction of requests meeting (TTFT <= a) AND (TPOT <= b) AND (E2E <= c)
SLO는 다중 제약입니다. 요청 하나가 "정상(good)"으로 인정되려면 모든 제약을 만족해야 합니다. 굿풋은 그 비율입니다. 처리량이 높아도 굿풋이 60%라면 실패입니다. 처리량이 조금 낮아도 굿풋이 99%라면 목표에 가깝습니다.
2026년 기준 굿풋은 MLPerf Inference v6.0 제출과 AI 플랫폼 사업자(AI platform provider)의 내부 SLA 추적(internal SLA tracking)에서 쓰는 지표입니다.
왜 평균은 잘못된 통계량인가
LLM 지연 분포(latency distribution)는 오른쪽으로 치우친(right-skewed) 분포입니다. 긴 프리필을 수행하는 이웃 시퀀스 하나가 있는 디코드 배치(decode batch)는 토큰 500개를 TPOT 약 7ms로 내보내다가, 20개 토큰을 TPOT 약 60ms로 내보낼 수 있습니다. 평균 TPOT은 9ms입니다. P99 TPOT은 65ms입니다. 사용자는 P99를 실제로 자주 만납니다. 그래서 떠납니다.
항상 P50, P90, P99 세 값을 보고하세요. 사용자 경험에서는 P99가 최적화 대상입니다.
참조 수치 — TRT-LLM의 Llama-3.1-8B-Instruct, 2026
- 평균 TTFT: 162ms
- 평균 TPOT: 7.33ms
- 평균 E2E: 1,093ms
- P99 TPOT: 청크 프리필 설정(chunked-prefill configuration)에 따라 10-25ms.
이 숫자는 NVIDIA가 공개한 참조점(reference point)입니다. 모델 크기, 예를 들어 70B에서는 3-5배 달라지고, 하드웨어, 예를 들어 H100 대비 B200에서는 약 3배 달라지며, 부하(load)에 따라서도 달라집니다.
측정 함정(measurement trap)
2026년에 가장 많이 쓰이는 벤치마크 도구 두 개가 같은 실행에서도 TPOT에 대해 서로 다른 값을 냅니다.
- NVIDIA GenAI-Perf: ITL 계산에서 TTFT를 제외합니다. ITL은 두 번째 토큰부터 시작합니다.
- LLMPerf: TTFT를 포함합니다. ITL은 첫 번째 토큰부터 시작합니다.
TTFT가 500ms이고 출력 토큰 100개가 총 디코드 700ms 안에 나온 요청을 생각해봅시다. GenAI-Perf는 ITL = 700/99 = 7.07 ms를 보고합니다. LLMPerf는 ITL = 1200/100 = 12.00 ms를 보고합니다. 도구 선택이 숫자를 바꿉니다.
항상 어떤 도구를 썼는지 밝히세요. 항상 정의(definition)를 함께 공개하세요.
SLO 만들기
2026년의 70B 챗 모델(chat model)에 대한 합리적인 소비자용(consumer-facing) SLO는 다음과 같습니다.
- TTFT P99 <= 800ms.
- TPOT P99 <= 25ms.
- 300 토큰 미만 출력에서 E2E P99 <= 3s.
- 굿풋 목표 >= 99%.
엔터프라이즈(enterprise) SLO는 TTFT를 200-400ms로 더 빡빡하게 잡고, E2E는 조금 느슨하게 둘 수 있습니다. 핵심은 이를 명시적으로 적어두고, 세 지표를 모두 측정하고, 굿풋을 단일 종합 지표로 추적하는 것입니다.
측정 방법
- 실제 트래픽(traffic) 또는 현실적인 합성 부하(synthetic)를 사용합니다. 예: LLMPerf에서
--mean-input-tokens 800 --stddev-input-tokens 300 --mean-output-tokens 150.
- 벤치마크 실행은 최대 동시성(peak concurrency)의 2배를 목표로 잡습니다.
- 30-50회 반복(iteration)을 실행하고, 합쳐진 표본(combined sample)의 백분위수를 계산합니다.
- 도구 이름, 도구 버전, 모델, 하드웨어, 동시성(concurrency), 프롬프트 분포(prompt distribution)를 함께 공개합니다.
사용해보기
code/main.py는 장난감 굿풋 계산기입니다. 합성 지연 분포를 생성하고 SLO를 적용해 굿풋을 계산합니다. 같은 트레이스(trace)에서 GenAI-Perf와 LLMPerf의 TPOT 차이도 함께 보여줍니다.
산출물 만들기
이 lesson은 outputs/skill-slo-goodput-gate.md를 만듭니다. 워크로드(workload)와 SLO가 주어지면 처리량이 아니라 굿풋을 기준으로 배포를 게이팅(gating)하는 CI/CD 적용 가능한 벤치마크 레시피를 생성합니다.
연습문제
- 쉬움:
code/main.py를 실행하세요. 1% 꼬리 스파이크(tail spike)가 있는 분포를 만드세요. P99 TPOT 기준을 30ms에서 15ms로 조이면 굿풋이 어떻게 바뀝니까?
- 중간: 어떤 벤더(vendor)가 "Llama 3.3 70B H100에서 15,000 tok/s"라고 말합니다. 이를 신뢰하기 전에 물어야 할 질문 세 가지를 말하세요.
- 중간: 청크 프리필은 왜 평균 TPOT이 아니라 P99 TPOT을 보호합니까?
- 어려움: 음성 비서(voice assistant)를 위한 소비자용 SLO를 구성하세요. 첫 토큰은 읽히는 것이 아니라 들리는 것입니다. 어떤 지표가 사용자에게 가장 잘 보이는(user-visible) 지표입니까?
- 어려움: LLMPerf README와 GenAI-Perf 문서를 읽으세요. 두 도구가 서로 다르게 정의하는 다른 지표 세 가지를 찾으세요.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| TTFT | "첫 토큰까지의 시간(time to first token)" | 큐 대기 + 네트워크 + 프리필. 긴 프롬프트에서는 프리필이 지배함 |
| TPOT | "출력 토큰당 시간(time per output token)" | 첫 토큰 이후 토큰당 메모리 바운드 디코드 비용 |
| ITL | "토큰 간 지연(inter-token latency)" | 대부분의 도구에서 TPOT과 같음. 단 GenAI-Perf 같은 예외가 있음 |
| E2E | "종단 간(end to end)" | TTFT + TPOT * output_len. 응답 측 네트워크(response-side network)가 그 위에 더해짐 |
| Throughput | "tok/s" | 플릿 효율. 지연 백분위수가 없으면 쓸모가 거의 없음 |
| Goodput | "SLO 충족률(SLO-met rate)" | 모든 SLO 제약을 동시에 만족한 요청 비율 |
| P99 | "꼬리(tail)" | 100개 중 최악 1개에 해당하는 지연. 사용자 경험 지표 |
| SLO multi-constraint | "결합 조건(joint)" | 세 지연 한계의 AND. 하나라도 위반하면 요청은 실패 처리됨 |
| GenAI-Perf vs LLMPerf | "도구 함정(tool trap)" | ITL에 TTFT를 포함하는지 여부가 도구마다 다름 |
더 읽을거리