샘플레이아웃 검증용 더미 원고입니다. 내용은 실제 글이 아니며 검색엔진 색인에서 제외됩니다.

모델이 도는 것과 서비스가 되는 것

1장 · 전체 5장·

로컬에서 model.generate() 한 줄이 돌았다고 서빙이 끝난 것은 아니다. 그 한 줄은 요청이 하나일 때의 이야기다. 요청이 서른 개 동시에 들어오면 같은 코드가 전혀 다르게 행동한다.

벤치마크가 숨기는 것

공개된 추론 속도는 대개 배치 크기 1, 입력 길이 고정, 워밍업 이후의 숫자다. 실제 트래픽은 세 조건 모두를 어긴다. 입력 길이가 요청마다 다르고, 요청이 몰리는 시점이 있고, 첫 요청은 항상 차갑다.

그래서 벤치마크 숫자를 그대로 용량 계획에 넣으면 대체로 두세 배 낙관적인 값이 나온다.

지연은 하나의 숫자가 아니다

사용자가 체감하는 지연은 최소 두 구간으로 쪼개야 한다.

  • 첫 토큰까지의 시간: 프롬프트를 한 번에 계산하는 구간. 입력 길이에 비례한다.
  • 토큰 사이 간격: 이후 토큰을 하나씩 뽑는 구간. 입력 길이와는 거의 무관하다.

이 둘을 합쳐 평균 지연으로 보고하면 문제를 못 본다. 긴 프롬프트를 받는 서비스는 첫 구간에서 무너지고, 긴 답변을 내는 서비스는 두 번째 구간에서 무너진다.

무엇을 먼저 측정할지

측정 순서를 잘못 잡으면 엉뚱한 곳을 고친다. 다음 순서를 권한다.

  1. 요청 하나의 첫 토큰 시간과 토큰 간격을 따로 기록한다.
  2. 동시 요청을 늘려가며 두 값이 각각 어디서 꺾이는지 본다.
  3. 꺾이는 지점에서 GPU 사용률과 메모리 점유를 같이 본다.

세 번째가 핵심이다. 사용률이 낮은데 지연이 늘면 배치 문제이고, 메모리가 꽉 찼으면 캐시 문제다. 이 책의 나머지는 이 두 갈래를 따라간다.