TTFT와 TPOT로 정의하는 LLM 추론 지연의 구조
일반적인 웹 애플리케이션의 지연 시간은 밀리초(1,000분의 1초) 단위로 측정되지만, 최적화하지 않은 LLM 추론 지연 시간은 수 초 이상으로 늘어난다. 이는 사용자가 서비스를 실시간 상호작용으로 느끼느냐 혹은 느린 로딩 과정으로 인식하느냐를 결정하며, 컴퓨팅 비용의 상승으로 이어진다. 추론 지연 시간(Inference Latency)은 학습된 모델이 입력 프롬프트를 처리하고 최종 응답을 생성하기까지 걸리는 전체 시간을 의미한다.
LLM의 응답 생성은 크게 두 가지 단계로 나뉜다. 첫 번째는 입력 프롬프트를 처리하는 Prefill(프리필) 단계다. 이 단계의 성능 지표인 TTFT(Time to First Token)는 사용자가 요청을 보낸 후 첫 번째 토큰이 화면에 나타나기까지 걸리는 시간이다. 모델은 프리필 단계에서 입력된 전체 프롬프트를 한꺼번에 분석하여 맥락을 파악한다. 프롬프트에 포함된 토큰의 양이 많아질수록 연산량이 증가하며, 결과적으로 TTFT가 길어진다.
첫 토큰 생성 이후에는 토큰을 하나씩 순차적으로 만들어내는 Decode(디코드) 단계가 이어진다. 이 과정의 속도는 TPOT(Time Per Output Token)로 관리하며, 이는 첫 토큰 이후 각 토큰이 생성되는 평균 시간을 의미한다. 디코드 단계는 이전 단계에서 생성된 토큰을 다시 입력으로 사용하는 반복적인 생성 과정을 거친다. TPOT는 사용자가 체감하는 텍스트 출력 속도의 직접적인 기준이 되며, 이 수치가 높을수록 응답 생성 속도가 느려진다.
LLM의 전체 추론 속도는 TTFT와 TPOT의 합으로 정의된다. 프리필 단계의 지연은 주로 입력 데이터의 양에 영향을 받고, 디코드 단계의 지연은 생성되는 텍스트의 길이에 비례하여 누적된다. 엔지니어는 이 두 지표를 분리하여 분석함으로써, 입력 프롬프트의 길이를 줄여 TTFT를 개선할지 혹은 생성 알고리즘을 최적화해 TPOT를 낮출지 결정한다.
양자화와 KV 캐싱을 통한 메모리 병목 해결
700억 개의 매개변수를 가진 모델을 16비트 부동 소수점(FP16 또는 BF16) 포맷으로 로드하면 약 140GB의 VRAM(비디오 램)이 필요하다. 모델이 토큰을 생성할 때마다 이 방대한 가중치 데이터를 GPU 메모리 사이에서 이동시켜야 하는데, 이때 데이터 전송 속도가 연산 속도를 따라가지 못하는 메모리 대역폭 병목 현상이 발생하며 이는 TPOT를 높이는 원인이 된다.
양자화(Quantization)는 가중치의 정밀도를 낮춰 8비트(INT8) 또는 4비트(INT4) 정수로 압축함으로써 모델의 메모리 점유율을 줄이는 기법이다. 4비트 양자화 모델은 FP16 모델 대비 데이터 크기가 4분의 1로 줄어들며 메모리 이동 속도가 4배 향상된다. 이는 동일한 시간 동안 더 많은 가중치를 처리하게 하여 디코드 지연 시간을 단축한다. 정밀도 하락으로 인한 품질 저하는 AWQ(Activation-aware Weight Quantization)나 GPTQ 같은 기법을 적용해 최소화한다.
KV 캐싱(Key-Value Caching)은 이전 단계에서 계산한 Key와 Value 행렬을 VRAM에 저장해 두었다가 다음 토큰 생성 시 재사용하는 방식이다. 모델이 새로운 토큰을 생성할 때마다 앞서 처리한 모든 토큰의 정보를 처음부터 다시 계산하는 중복 연산을 제거한다. 다만 생성하는 텍스트의 길이가 길어질수록 저장해야 할 행렬의 크기가 커지며 VRAM 소비량이 정비례하여 증가하는 트레이드오프가 발생한다.
투기적 디코딩과 연속 배칭의 생성 효율 비교
투기적 디코딩(Speculative Decoding)을 적용하면 출력 품질 저하 없이 생성 속도를 2배에서 3배까지 높일 수 있다. 연산량이 적은 초안 모델(Draft Model)이 다음에 올 토큰들을 먼저 생성하고, 규모가 큰 타겟 모델이 이를 한 번에 검증하는 구조다. 타겟 모델이 초안 모델의 예측이 옳다고 판단하면 여러 토큰을 한 번에 확정하므로, 토큰을 하나씩 생성할 때 발생하는 순차적 메모리 병목 현상을 우회한다. 허깅페이스(Hugging Face)에서는 타겟 모델의 `.generate()` 함수 호출 시 `assistant_model` 인자에 초안 모델을 전달하여 이 루프를 처리한다.
assistant_model=draft_model정적 배칭(Static Batching)은 여러 요청을 하나의 묶음으로 처리하지만, 배치 내 가장 긴 응답이 생성을 마칠 때까지 짧은 응답들이 메모리를 점유한 채 대기해야 하는 비효율이 있다. 이는 하드웨어 자원이 충분하더라도 전체 처리 속도가 가장 느린 요청에 맞춰 하향 평준화되는 결과를 초래한다.
연속 배칭(Continuous Batching)은 토큰 단위의 반복 수준 스케줄링을 도입해 이 문제를 해결한다. 특정 요청의 생성이 완료되는 즉시 해당 슬롯을 비우고 새로운 요청을 즉시 삽입한다. 개별 토큰 생성 단계마다 배치를 유동적으로 재구성하므로 유휴 자원을 최소화하고 전체 처리량을 극대화한다. 이는 요청 길이에 상관없이 하드웨어 가동률을 일정하게 유지하는 핵심 기법이다.
이러한 개별 최적화 기법들을 통합적으로 구현하여 제공하는 것이 추론 전용 프레임워크의 역할이다.
vLLM·TGI·TensorRT-LLM 프레임워크 도입 효과
표준 라이브러리의 `.generate()` 함수는 연구 목적의 유연성에 최적화되어 있어 고처리량과 저지연이 필수적인 서비스 환경의 요구사항을 충족하기 어렵다. 이를 해결하기 위해 TGI(Text Generation Inference)는 메모리 안전성이 높은 Rust와 Python을 혼합해 구현했다. vLLM은 Python의 생산성을 유지하며 연산 집약적인 부분에 최적화된 C++/CUDA 커널을 결합했다. NVIDIA의 TensorRT-LLM은 C++와 CUDA로 완전히 구현되어 GPU 하드웨어 가속 성능을 극대화한다.
세 프레임워크는 메모리 관리와 연산 효율을 높이는 공통 기술을 탑재하고 있다. PagedAttention(페이지드 어텐션)은 메모리를 페이지 단위로 나누어 할당함으로써 KV 캐시의 낭비를 줄이고 가용 메모리를 효율적으로 사용한다. 또한 하드웨어에 최적화된 커널을 사용하여 프리필 단계와 디코드 단계에서 발생하는 소프트웨어 오버헤드를 제거하고 데이터 이동 경로를 단축한다.
전용 프레임워크 도입은 모델 코드를 최소한으로 변경하면서 TTFT와 TPOT를 동시에 낮추는 실질적인 이득을 준다. 특히 동시 접속자가 많은 환경에서 효율적인 메모리 관리와 스케줄링은 개별 사용자의 응답 지연을 줄이는 동시에 서버 한 대가 처리할 수 있는 전체 요청 수를 늘린다.
프롬프트 최적화와 실무 도입을 위한 판단 기준
프롬프트 압축은 가벼운 자연어 처리 모델을 활용해 벡터 데이터베이스에서 핵심 문장만 추출하여 전달하는 방식이다. 검색 기반 생성 시스템(RAG)에서 관련성 높은 문장만 선별해 입력하면 모델이 초기에 처리해야 할 연산량이 줄어 프리필 부하를 낮출 수 있다. 프롬프트 캐싱은 정적인 시스템 프롬프트의 프리필 상태를 저장해 재계산을 생략하는 기술이다. 반복되는 시스템 프롬프트 연산을 건너뛰고 개별 쿼리만 처리하므로 TTFT를 즉각적으로 단축한다.
모델의 물리적 크기를 줄이는 프루닝(Pruning)은 연산 기여도가 낮은 가중치를 제거해 메모리 점유율을 낮춘다. 가중치 행렬에서 중요도가 낮은 값을 0으로 만들거나 삭제해 파라미터 수를 줄이는 방식으로 작동한다. 지식 증류(Knowledge Distillation)는 거대한 티처 모델의 출력 확률 분포를 작은 스튜던트 모델이 학습하게 하여, 모델 크기를 줄이면서도 추론 성능을 보존한다. 이 두 기법은 하드웨어 자원이 한정된 환경에서 배포 비용을 낮추기 위해 적용하며, 정확도 손실을 측정하며 모델 크기를 조정한다.
실무 최적화 스택은 INT8 양자화와 vLLM, 연속 배칭, 투기적 디코딩을 조합해 구성한다. 엔지니어는 인프라 비용, 처리량 상한선, 구현 복잡도 사이의 트레이드오프를 분석해 서비스 성격에 맞는 조합을 선택한다.
서비스의 병목이 메모리 대역폭인지 연산량인지 혹은 프롬프트 길이에 따라 vLLM, TGI, TensorRT-LLM 등 전용 추론 프레임워크의 선택 기준과 투기적 디코딩의 `assistant_model` 설정 우선순위를 결정해야 한다.



