LLM 추론 서버나 API의 성능을 비교할 때, 다음 5가지 지표가 자주 언급됩니다.
| 지표 | 정식 명칭 | 한마디로 설명하면 | 단위 |
|---|
| TTFT | Time To First Token | 첫 글자가 나올 때까지의 대기 시간 | 초 / 밀리초 |
| ITL | Inter-Token Latency | 토큰과 토큰 사이의 간격 | 밀리초 |
| TTLT | Time To Last Token | 마지막 글자가 나올 때까지의 시간 (전체 소요 시간) | 초 |
| TPS | Tokens Per Second | 1 요청당 출력 속도 | tok/s |
| Throughput | 처리량 (Throughput) | 서버 전체에서 처리 가능한 양 | tok/s (또는 req/s) |
이름이 비슷하여 혼동하기 쉬우므로, 이 글에서는 **다이어그램과 영상으로 '시간 축의 어느 부분을 측정하는지'**를 정리합니다.
01_timeline.png
LLM은 텍스트를 한 번에 반환하는 것이 아니라, 토큰을 하나씩 순차적으로 생성합니다. 따라서 1회의 요청은 크게 2개의 단계로 나뉩니다.
Prefill (프리필): 입력 프롬프트 전체를 읽고 계산하는 단계입니다. 이 단계가 끝날 때까지 첫 토큰이 나오지 않습니다. -
Decode (디코드): 토큰을 하나씩 생성해 나가는 단계입니다.
이 시간 축 위에서 각 지표는 다음 구간을 측정합니다.
TTFT = 요청 전송 → 첫 번째 토큰 -
ITL = 특정 토큰 → 다음 토큰 -
TTLT = 요청 전송 → 마지막 토큰 -
TPS = 디코드 단계에서 1초당 몇 개의 토큰이 나왔는지
GIF는 보기 쉽게 시간을 과장했습니다 (TTFT 0.6초, ITL 0.15초).
요청을 보내고 나서 첫 번째 토큰이 도착할 때까지의 시간입니다.
ChatGPT 등에서 전송 버튼을 누른 후, 첫 글자가 표시될 때까지 걸리는 '생각 중...' 시간이 이에 해당합니다. 사용자가 '반응이 빠르다/느리다'라고 느끼는 정도를 가장 크게 좌우하는 지표입니다.
TTFT에 포함되는 요소:
- 네트워크 왕복 시간
- 서버의 큐 대기 시간 (혼잡할수록 길어짐)
- Prefill 계산 시간 (프롬프트가 길수록 길어짐)
TTFT = t(첫 토큰 수신) − t(요청 전송)
연속된 2개의 토큰이 도착하는 간격입니다.
ITL이 작을수록 글자가 부드럽게 흘러나오는 것처럼 표시됩니다. 반대로 ITL이 들쭉날쭉하면, 표시가 '끊기는' 것처럼 보일 수 있습니다.
ITL_i = t(i번째 토큰) − t(i−1번째 토큰)
ITL은 1개의 요청 내에서도 토큰마다 값이 변하기 때문에, 평균값뿐만 아니라 p50 / p90 / p99 값도 보는 것이 권장됩니다.
ITL과 함께 자주 언급되는 것이 TPOT입니다. 이는 1개 요청 단위로 '2번째 토큰 이후의 평균 생성 시간'을 구한 것입니다.
TPOT = (TTLT − TTFT) / (출력 토큰 수 − 1)
ITL은 '토큰 간격 하나하나', TPOT은 '해당 요청 내의 평균'으로 기억하면 구분하기 쉽습니다.
요청을 보내고 나서 마지막 토큰이 도착할 때까지의 시간입니다. E2E(End-to-End) 레이턴시라고도 불립니다.
TTLT = TTFT + Σ ITL
≒ TTFT + TPOT × (출력 토큰 수 − 1)
스트리밍하지 않고 결과를 모아서 받는 사용 방식(배치 처리, 에이전트의 툴 호출, JSON 생성 등)에서는, TTFT보다 TTLT가 더 중요합니다.
TTLT는 출력이 길수록 늘어나는 경향이 있으므로, 비교할 때는 출력 토큰 수를 맞추는 것이 중요합니다.
1개의 요청으로 1초당 몇 개의 토큰이 생성되었는지입니다. 사용자 1인 시점에서 본 '문장이 나오는 속도'를 나타냅니다.
TPS는 계산 방법이 2가지가 있어 주의해야 합니다.
# 디코드 속도 (TTFT 미포함) … ITL/TPOT의 역수
TPS = (출력 토큰 수 − 1) / (TTLT − TTFT) = 1 / TPOT
# 전체 속도 (TTFT 포함)
...
벤치마크 결과를 비교할 때는, 어떤 정의를 사용했는지 반드시 확인해야 합니다. TTFT가 긴 환경일수록, 두 값의 차이가 커집니다.
서버 전체에서 1초당 몇 개의 토큰(또는 요청)을 처리할 수 있는지를 의미합니다.
TPS가 '사용자 1인의 체감 속도'인 반면, Throughput은 '서버의 처리 능력'을 나타냅니다. 추론 서버는 여러 요청을 모아서(배치로) 처리하기 때문에, 동시에 생성 중인 요청이 많아질수록 전체 처리량도 증가합니다.
영상에서는 각 사용자의 TPS가 4 tok/s로 유지되지만, 동시에 생성하는 사용자가 늘어날수록 Throughput은 4 → 8 → 12 → 16 tok/s로 증가합니다.
Throughput (출력 토큰) = 측정 시간 내 전체 요청의 출력 토큰 합계 / 측정 시간
Throughput (요청) = 완료된 요청 수 / 측정 시간
(대략적으로) Throughput ≈ 1인당 TPS × 동시에 생성 중인 요청 수
입력 토큰을 포함하여 계산하는 경우도 있으므로, '출력 토큰만인지' 또는 '입력 + 출력인지'도 확인해야 합니다.
여기서 가장 중요한 포인트입니다. Throughput을 높이려고 하면, 1인당 경험(TPS・TTFT)은 나빠지기 쉽습니다.
04_tradeoff.png
- 배치 크기(동시 요청 수)를 늘리면 → GPU를 효율적으로 사용할 수 있으므로
Throughput은 상승합니다 - 그 대신, 1단계 계산이 무거워집니다 →
ITL이 길어지고, 1인당 TPS는 하락합니다 - 게다가 혼잡도가 높아지면 큐에서 대기하게 됩니다 →
TTFT도 증가합니다
따라서 용도에 따라 중요하게 생각하는 지표가 달라집니다.
| 용도 | 중시하는 지표 |
|---|
| 채팅 UI・대화 앱 | TTFT (첫 반응), ITL (표시의 부드러움) |
| ... | |
| 다음과 같은 요청을 가정합니다. | |
- TTFT = 0.5초
- ITL = 20밀리초(매 토큰 일정하다고 가정)
- 출력 토큰 수 = 500
TTLT = 0.5 + 0.02 × (500 − 1) = 0.5 + 9.98 = 10.48초
TPOT = (10.48 − 0.5) / (500 − 1) = 0.02초 = 20밀리초
TPS (디코딩) = 1 / 0.02 = 50 tok/s
...
이 상태의 요청이 20개 동시에 흐른다면, 출력 Throughput은 대략 50 × 20 = 1,000 tok/s입니다 (실제로는 배치가 커지면 ITL이 길어지기 때문에 단순 곱셈보다 작아집니다).
TTFT: 첫 토큰까지의 대기 시간. 체감하는 '반응 속도' -
ITL: 토큰 간의 간격. 표시의 '부드러움'(평균은 TPOT) -
TTLT: 마지막 토큰까지 걸리는 시간. 결과가 '모일 때까지'의 시간 -
TPS: 1요청의 출력 속도. 정의가 두 가지라 주의 필요 -
Throughput: 서버 전체의 처리량. 너무 높으면 1인당 경험이 악화됨
벤치마크 결과를 볼 때는 '어떤 구간을 측정했는지', '평균인지 분위수(분위점)인지', '동시 실행 수(배치 크기)가 몇 개인지' 세 가지를 확인하면 숫자의 의미를 정확하게 읽을 수 있습니다.