LLM 꼬리 지연(tail latency), 요청을 두 번 보내면 해결된다
A simple fix for LLM tail latency
TL;DR Highlight
우선순위 티어 대신 같은 요청을 두 번 보내 최악 응답을 9.8초→3.5초로 줄였다
Who Should Read
음성 에이전트처럼 실시간 LLM 응답이 필요한데 가끔 10초 넘게 걸리는 지연 때문에 고민인 백엔드 개발자
Core Mechanics
- 드물게 10~20초 걸리는 응답이 문제다
- 대부분의 응답은 1.5초 안에 오지만 가끔 10~20초가 걸린다.
- 전화 통화에서는 이 침묵 때문에 상대가 끊어 버린다.
- 턴이 많을수록 느린 응답을 만날 확률이 커진다
- 통화 한 번은 20~30턴이다.
- 요청의 1%가 극단적으로 느리면 25턴 통화는 약 22% 확률로 긴 침묵을 겪는다.
- 해법은 모든 요청을 두 번 보내고 빠른 쪽을 쓰는 것
- 표준 티어에서 같은 요청을 두 번 보내 먼저 오는 응답을 택했다.
- OpenAI priority 티어는 토큰당 2배 비용이라 이와 비교했다.
- 첫 토큰 시간은 priority 티어보다 좋았다
- 실제 프로덕션 요청 50개를 재현해 측정했다.
- 중앙값 0.61s→0.58s, p95 1.04s→0.68s, p99 4.2s→1.2s였다(priority 대비 두 번 보내기).
- 전체 응답 시간은 최악이 크게 줄었다
- 중앙값은 1.35s로 같았고 p95는 3.4s→2.0s, p99는 9.8s→3.5s였다.
- 최악 값은 9.8s→3.5s였다(priority 대비).
Community Reactions
- hedged request로 비용을 줄이자는 의견
- 모든 요청을 복제하지 말고 p95 같은 임계값을 넘긴 요청만 백업 요청을 보내라는 의견이 있었다.
- Google이 이를 hedged request라 부른다며 The Tail at Scale 논문을 링크했다.
- 첫 토큰 대기 후 재전송하자는 의견
- 1초 안에 첫 토큰이 안 오면 두 번째 요청을 보내자는 의견이 있었다.
- 병렬 이중 전송은 비용이 두 배가 된다는 지적도 함께 나왔다.
- 비용 대비 성능 비교가 빠졌다는 반론
- 성능 대비 비용을 보여 주지 않아 반쪽짜리 글이라는 의견이 있었다.
- priority 티어 자체에 대한 의문
- 가격이 2배라면 속도도 2배 이상 빨라야 한다고 기대한다는 의견이 있었다.
- 직접 호스팅하면 예측 가능하다는 의견도 있었다.
How to Apply
- 지연 로그에서 p95·p99 먼저 뽑기
- 오늘 프로덕션 LLM 호출의 첫 토큰·전체 응답 시간을 p50/p95/p99로 집계하라.
- p99가 p50의 5배 이상이면 이중 전송 후보로 표시하라.
- 실시간 경로에 이중 전송 실험 붙이기
- 음성·채팅 등 지연에 민감한 호출에만 같은 요청을 병렬로 두 번 보내라.
- 먼저 완료된 응답을 쓰고 나머지는 취소하라.
- 실제 트래픽 요청으로 priority와 비교 측정하기
- 실제 요청 50개 이상을 priority 티어와 이중 전송에 각각 재생하라.
- 지연 지표와 토큰 비용을 함께 기록해 비교하라.
- 임계값 후 재전송 버전도 시험하기
- 첫 토큰이 p95 시간 안에 오지 않을 때만 두 번째 요청을 보내라.
- 중복 비용과 p99 개선폭을 이중 전송과 비교하라.
Try It
# Python 3.9+ (pip install openai) — 이중 전송 간이 예시. 모델명과 프롬프트는 바꿔 쓰세요
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def call(messages):
r = await client.chat.completions.create(model="{{모델명}}", messages=messages)
return r.choices[0].message.content
async def hedged(messages):
tasks = [asyncio.create_task(call(messages)) for _ in range(2)]
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
for p in pending:
p.cancel()
return done.pop().result()
print(asyncio.run(hedged([{"role": "user", "content": "{{질문}}"}])))
# 이어서 해 볼 것: 100번 돌려 단일 호출과 p95/p99를 비교하고, 토큰 비용도 함께 기록해 보세요.Terminology
관련 논문
Mercury 3: 규모를 키운 diffusion LLM, 초당 1,000토큰 이상
Diffusion LLM을 40배 키웠더니 속도 4~8배, 품질은 속도 특화 모델 수준
Timestral: Mistral의 시계열 파운데이션 모델
209M 파라미터 시계열 모델이 3대 벤치마크 1위, CPU에서도 돌아간다
DeepSeek V4.1 Flash 1017 (Max) 성능·속도·가격 분석
DeepSeek V4.1 Flash 1017 Max는 지능 지수 45에 211 tok/s, 입력 $0.30
LLM 프록시를 직접 안 돌리면 무슨 일이 벌어지는지 어떻게 아나
자체 LLM 프록시를 세웠더니 키·모델·캐시 미스를 직접 볼 수 있다
DeepSeek V4.1 Flash 1017: 싼 가격에 1M 컨텍스트를 주는 에이전트용 모델
DeepSeek V4.1 Flash 1017은 입력 $0.05/M, 1M 컨텍스트의 에이전트용 모델
DeepSeek-V4.1-Flash-1017 공개: 더 짧게 생각하고 더 빠르게 일하는 에이전트용 모델
DeepSeek V4.1 Flash 마이너 업데이트로 코딩·에이전트 벤치 점수↑, 실행 시간·출력 길이↓
Llmspeed: 로컬 LLM 속도를 하드웨어 구매 전에 체감해 보는 시뮬레이터
GPU·모델을 고르면 로컬 LLM 속도를 미리 체감하게 해 주는 시뮬레이터