---
id: "authored/bab12b80-dee2-425f-8b7f-3231072f0b8e"
title: "AI 서빙의 지연과 용량을 읽는 법"
description: "TTFT와 TTFA, RTF, CUDA Graph, KV 라우팅, 분리 서빙과 시뮬레이션의 공식 자료 및 성능 해석 기준."
kind: "llm-wiki"
published: "2026-10-21T04:47:32.149Z"
tags: ["AI","GPU","성능 최적화"]
url: "https://www.readiz.com/llm-wiki/ai-serving-latency-capacity-cuda-kv-source-guide/"
markdownUrl: "https://www.readiz.com/llm-wiki/ai-serving-latency-capacity-cuda-kv-source-guide/index.md"
generatedBy: "llm"
humanReviewed: false
wikiFolder: "개발·기술/AI"
folderUrl: "https://www.readiz.com/llm-wiki/?folder=%EA%B0%9C%EB%B0%9C%C2%B7%EA%B8%B0%EC%88%A0%2FAI"
---

# AI 서빙의 지연과 용량을 읽는 법

AI 서빙의 성능을 읽을 때는 첫 응답 지연, 생성 중 속도, 전체 처리량을 나누어 봐야 한다. GPU 연산량이 같아도 CPU의 호출 비용과 대기열, KV 캐시의 위치, 워커 배치에 따라 사용자가 기다리는 시간은 달라진다. 이 문서는 그 차이를 확인할 공식 자료와 지표의 해석 기준을 모은다.

## 지연과 처리량의 단위

| 지표          | 읽는 방법                       | 함께 남길 조건                            |
| ----------- | --------------------------- | ----------------------------------- |
| TTFT        | 요청 후 첫 토큰까지의 시간             | 네트워크와 큐 대기 포함 여부, 입력 길이, p50 또는 p99 |
| TPOT 또는 ITL | 출력 토큰당 시간 또는 토큰 사이 간격       | 계산 정의, 출력 길이, 스트리밍 방식               |
| TTFA        | 요청 후 첫 오디오까지의 시간            | 첫 오디오 조각의 기준과 길이, 전처리 포함 여부         |
| RTF         | 오디오 생성 시간 ÷ 생성된 음성의 재생 길이   | 모델, 음성 길이, 스트리밍과 동시 부하 조건           |
| 처리량         | 단위 시간에 완료하거나 생성한 요청 또는 토큰 수 | 요청/초, 요청/분, 토큰/초 등 단위와 입력/출력 구분     |
| 동시성         | 한 시점에 진행 중인 요청 수            | 클라이언트 동시성인지 엔진 활성 시퀀스인지             |

RTF는 작을수록 빠르고 1 미만이면 재생 길이보다 짧은 시간에 생성한다. 반대로 NVIDIA AIPerf의 음성 전사 지표 **RTFx**는 `음성 길이 ÷ 요청 지연`으로 정의되므로 클수록 빠르다. 이름이 비슷해도 분자와 분모를 먼저 확인한다. [AIPerf 지표 정의](https://docs.nvidia.com/aiperf/reference/ai-perf-metrics-reference)

TTFT에는 큐 대기와 입력 처리 등이 포함될 수 있다. p50은 중앙값이고, p99는 느린 꼬리 구간의 지연을 보여 준다. 사용자당 생성 속도가 개선된 배율과 시스템 전체 처리량의 개선 배율은 같은 값일 필요가 없다.

## CPU 호출 병목과 CUDA Graph

GPU에서 실행하는 커널이 짧으면 CPU가 다음 커널을 준비하고 호출하는 비용의 비중이 커질 수 있다. CUDA Graph는 반복 작업을 기록하고 그래프 단위로 재실행해 호출 오버헤드를 줄인다. GPU 계산 자체가 가장 오래 걸리는지, 커널 사이가 비어 있는지를 프로파일링으로 구분할 때 유용한 개념이다.

![각 GPU 작업을 따로 호출하는 방식과 그래프 단위 재실행. 시간 비율은 측정값이 아닌 설명용 도식](https://www.readiz.com/assets/authored/bab12b80-dee2-425f-8b7f-3231072f0b8e/0c386622-20ee-4ab4-b9cc-065313e016d8.webp)

*각 GPU 작업을 따로 호출하는 방식과 그래프 단위 재실행. 시간 비율은 측정값이 아닌 설명용 도식. [PyTorch 공식 글, 2021-10-26](https://pytorch.org/blog/accelerating-pytorch-with-cuda-graphs/)*

[PyTorch 2.14 CUDA semantics](https://docs.pytorch.org/docs/2.14/notes/cuda.html#cuda-graphs)는 재실행 시 같은 메모리 주소를 사용하고 텐서 형태가 고정돼야 한다고 설명한다. CPU 코드는 캡처 후 재실행되는 대상이 아니다. 입력을 정해진 버퍼에 복사하고, 동적 부분은 별도 실행 경로로 처리하는 등 엔진 설계가 필요하다. CUDA Graph와 커널 fusion도 구분한다. 전자는 작업 호출을 묶고, 후자는 여러 연산을 하나의 커널로 합쳐 중간 메모리 접근과 실행 비용을 줄인다.

## KV 재사용, 요청 수용, 워커 확장

KV 캐시는 이미 처리한 토큰의 어텐션 상태를 재사용하기 위한 데이터다. KV-aware router는 같은 접두부의 캐시를 가진 워커를 선호해 prefill 계산을 줄일 수 있다. 캐시가 많은 워커가 바쁘면 대기 비용도 고려해야 한다.

[Dynamo v1.5.1 라우터 설정 문서](https://docs.nvidia.com/dynamo/knowledge-base/modular-components/router/configuration-and-tuning)는 캐시 중복에 주는 가점과 활성 부하를 함께 조정하는 방법을 설명한다. 캐시 적중률, 워커별 활성 부하, TTFT와 ITL을 함께 봐야 라우팅 변경의 효과를 읽을 수 있다. 구체적인 플래그와 기본값은 사용 중인 버전 문서에 맞춘다.

세 가지 제어는 담당하는 문제가 다르다.

| 계층                | 결정                    | 확인할 결과                              |
| ----------------- | --------------------- | ----------------------------------- |
| 라우팅               | 어느 워커로 보낼지            | 캐시 재사용과 부하 쏠림, 대기 시간                |
| Admission control | 지금 받아들일지, 대기시키거나 거절할지 | 큐 길이, 시간 예산, 거절률과 수용한 요청의 지연        |
| Autoscaling       | 워커를 얼마나 늘리고 줄일지       | prefill과 decode의 부하, 준비 시간, GPU 사용량 |

[Planner](https://docs.nvidia.com/dynamo/v1.5.1/knowledge-base/modular-components/planner/overview)는 부하 또는 지연 목표를 이용해 워커 수를 조정한다. [Grove](https://developer.nvidia.com/grove)는 역할이 다른 추론 구성요소들의 구조와 생명주기를 Kubernetes에서 표현한다. 요청 수용과 워커 확장은 반응 시간도 다르므로, 과부하 경계에서의 제어를 확장 기능 하나로 대체할 수는 없다.

## Prefill과 decode를 분리할 때의 비교

Aggregated serving에서는 같은 워커가 입력 처리와 생성을 맡는다. Disaggregated serving에서는 prefill과 decode 워커를 나누고, 계산한 KV 상태를 전달한다. 독립적인 용량 조절과 역할별 최적화가 장점이며, KV 전송과 통신 경로가 추가 비용이 된다.

비교할 때는 모델과 정밀도, 입력 및 출력 길이 분포, 요청률, GPU 종류와 수, 네트워크를 맞춘다. 분리 전후의 TTFT만으로 끝내지 말고 출력 중 지연과 총 처리량, 전송 비용을 함께 본다. 캐시 재사용이 많은 트래픽과 긴 입력 위주의 트래픽에서도 결과가 달라질 수 있다. [Dynamo 분리 서빙 문서](https://docs.nvidia.com/dynamo/knowledge-base/modular-components/router/disaggregated-serving)

## Speculative decoding의 결과를 읽는 법

후보를 만드는 proposer와 그 후보를 검증하는 target 모델을 구분한다. 여러 후보가 검증을 통과하면 한 번의 target 실행에서 여러 출력 토큰을 확정할 수 있다. 후보 생성에도 비용이 있으므로, 수락 길이와 검증 비용을 함께 측정해야 한다.

[vLLM 공식 문서](https://docs.vllm.ai/en/latest/features/speculative_decoding/)는 제안 방식과 검증 설정, 지원 조건을 정리한다. 표준 rejection sampler를 통한 분포 보존과 검증을 완화하는 변형은 구분해야 한다. 특정 모델의 성능 향상을 재사용할 때는 draft 모델, target 모델, 병렬화와 엔진 버전, 입력 길이와 부하를 함께 남긴다.

## 시뮬레이션과 실제 검증

[NVIDIA AISimulate](https://github.com/ai-dynamo/aisimulate)는 GPU 서빙 클러스터를 띄우기 전에 성능을 예측하고 배포 구성을 탐색하는 도구다. 저장소는 후보 구성을 실제 목표 하드웨어에서 벤치마크한 뒤 용량과 SLA를 결정하도록 명시한다. 예측값은 탐색 범위를 줄이는 데 사용하고, 실측값과 같은 열에 표시할 때는 구분한다.

AIConfigurator를 쓰던 자료를 따라갈 경우 [AIConfigurator 저장소](https://github.com/ai-dynamo/aiconfigurator)와 AISimulate의 이전 안내를 함께 확인한다. 2026년 10월 확인한 저장소는 AISimulate로의 전환을 안내하고 있다. 이름만 보고 오래된 예제와 최신 CLI를 섞지 않는다.

## 토스 SlashLive 사례의 수치와 범위

[토스 챌린저스의 발표](https://www.youtube.com/watch?v=t_35VpGYgiY)는 2026년 10월 14일 발표, 10월 19일 업로드로 확인된다. 다음은 발표에 제시된 구성의 측정 결과다.

| 사례                | 발표값                                 | 해석 범위                               |
| ----------------- | ----------------------------------- | ----------------------------------- |
| TTS RTF           | 1.40 → 0.31                         | 해당 기존 vLLM-Omni 구성과 자체 엔진 비교        |
| TTS TTFA          | 6,305ms → 107ms                     | 약 58.9배의 지연 감소, 발표에서는 약 60배로 표현     |
| AR 추론 스텝의 비용      | 프레임워크 약 104ms, GPU 약 5ms            | TTFA 전체가 아니라 표시된 스텝의 프로파일링          |
| TTS 처리량           | 27K 요청/분                            | 단위 시간당 요청 수                         |
| Gemma 4 26B       | TTFT p50 42.1ms, 출력 503.25 tokens/s | 발표의 내부 구성, 외부 서비스와의 통제된 비교로 사용하지 않음 |
| GLM-5.3-Flash 최적화 | 유저당 생성 속도 5.2배, 전체 처리량 2.2배         | 발표의 전후 구성 비교, 단일 기법만의 효과로 분리하지 않음   |

수치 확인 구간은 [4:30 기존 TTS](https://www.youtube.com/watch?v=t_35VpGYgiY\&t=270s), [5:20 병목](https://www.youtube.com/watch?v=t_35VpGYgiY\&t=320s), [6:45 최적화 결과](https://www.youtube.com/watch?v=t_35VpGYgiY\&t=405s), [12:40 Gemma](https://www.youtube.com/watch?v=t_35VpGYgiY\&t=760s), [14:05 GLM](https://www.youtube.com/watch?v=t_35VpGYgiY\&t=845s)다.

다른 구성과 비교하려면 GPU와 엔진 버전, 정밀도, 요청 길이와 부하, 측정 위치를 추가로 맞춰야 한다. 사례에서 재사용하기 좋은 부분은 수치 자체보다, 프로파일링으로 수정할 계층을 좁히고 실제 서비스 목표로 개선을 판정하는 절차다.

---

> LLM이 작성하고 사람의 검토 없이 게시한 문서다. 부정확한 내용이 있을 수 있다.
