지금까지 다룬 연속 배치, 청크 프리필, 페이지 단위 KV, 프리픽스 캐시, 양자화, 투기적 디코딩, 텐서 병렬은 대부분 추론 엔진 안에 구현돼 있다. 운영자는 이 기능들을 직접 만들지 않고 엔진을 골라 설정한다. 엔진은 빠르게 바뀌므로 어느 엔진이 더 빠르다는 일반적인 결론은 몇 달이면 낡는다. 이 장은 결론 대신 고를 때 확인할 항목과 비교하는 방법을 다룬다.
후보
널리 쓰이는 오픈소스 엔진은 다음과 같다.
| 엔진 | 출발점 | 문서 |
|---|---|---|
| vLLM | PagedAttention 논문(SOSP 2023)의 구현 | docs.vllm.ai |
| SGLang | RadixAttention과 구조화된 생성 프로그램을 다룬 논문(NeurIPS 2024)의 구현 | docs.sglang.io |
| TensorRT-LLM | NVIDIA의 추론 최적화 라이브러리. 연속 배치를 in-flight batching이라는 이름으로 제공 | TensorRT-LLM 문서 |
세 엔진 모두 연속 배치와 페이지 단위 KV 캐시를 기본으로 갖추고 있고, 나머지 기능도 서로를 빠르게 따라잡는다. 그래서 기능 목록의 있고 없음보다 자기 모델, 장비, 부하에서 그 기능이 얼마나 잘 동작하는지가 차이를 만든다.
모델과 장비 지원
- 쓰려는 모델 구조(어텐션 종류, MoE 여부, 멀티모달 입력)를 지원하는가. 새 모델은 엔진마다 지원 시점이 다르다
- 쓰려는 GPU 세대에 맞는 커널이 있는가. 같은 엔진도 GPU 세대에 따라 쓰는 어텐션 백엔드와 지원하는 양자화 형식이 다르다
- 필요한 병렬 방식(텐서 병렬, 파이프라인 병렬, 서버 간 분할)을 지원하는가
기능 지원
| 기능 | 확인할 것 |
|---|---|
| 청크 프리필 | 기본으로 켜져 있는가. 토큰 예산을 조정할 수 있는가 |
| 프리픽스 캐시 | 일치 단위(블록, 토큰), 축출 정책, 적중률 지표, 캐시 공간을 나누는 방법 |
| 양자화 | 가중치 형식(FP8, INT8, INT4와 GPTQ·AWQ 체크포인트), KV 캐시 형식 |
| 투기적 디코딩 | 초안 방식(별도 모델, EAGLE, n-gram), 배치가 클 때의 동작 |
| 스케줄링 | 우선순위 지원, 선점 방식, 동시 처리 상한 설정 |
| 분리 서빙 | 프리필·디코드 분리와 KV 전송 지원 여부 |
API와 관측
- OpenAI 호환 API처럼 클라이언트가 이미 쓰는 형식의 서버를 제공하는가. 스트리밍, 구조화된 출력(JSON 스키마), 도구 호출 형식을 지원하는가
- 대기 중인 요청 수, KV 캐시 사용률, TTFT·TPOT 히스토그램, 선점 횟수, 프리픽스 캐시 적중률 같은 지표를 내보내는가. 라우팅과 오토스케일이 이 지표에 기댄다
운영 부담
- 모델을 올리기 전에 별도의 변환이나 엔진 빌드 단계가 필요한가. 필요하다면 모델이나 설정을 바꿀 때마다 그 단계를 다시 거친다
- 서버가 뜨는 데 걸리는 시간. 오토스케일의 콜드 스타트에 그대로 더해진다
- 릴리스 주기와 호환성. 버전이 자주 바뀌는 엔진은 기능이 빨리 들어오지만 설정 이름과 기본값도 자주 바뀐다
비교 실험
엔진 비교는 공개 벤치마크 대신 자기 부하로 한다. 공개 결과는 모델, 장비, 길이 분포, 설정이 자기 환경과 다르고, 측정한 시점의 버전에 묶여 있다.
- 조건을 고정한다. 같은 모델 체크포인트, 같은 정밀도, 같은 GPU, 같은 병렬 구성으로 맞춘다. 한 엔진만 FP8을 쓰면 엔진이 아니라 정밀도를 비교하게 된다
- 각 엔진을 조정한 뒤 비교한다. 기본 설정끼리 비교하면 기본값을 비교하는 것이다. 엔진마다 토큰 예산, 동시 처리 상한, 메모리 비율을 지연 목표에 맞게 조정한 최선의 설정으로 비교한다
- 같은 부하를 쓴다. 운영 로그에서 뽑은 길이 분포와 프리픽스 공유 정도, 열린 루프 도착 과정으로 같은 요청 집합을 재생한다
- 굿풋으로 비교한다. 최대 처리량이 아니라 TTFT·TPOT 목표를 지키는 최대 요청률을 나란히 놓는다
- 출력을 확인한다. 같은 요청에서 나온 출력이 품질 기준을 만족하는지 본다. 엔진마다 기본 샘플링 설정, 채팅 템플릿 처리, 종료 토큰 처리가 달라 출력이 바뀔 수 있다
결과에는 엔진 버전과 전체 설정을 함께 남긴다. 몇 달 뒤 다시 비교할 때 무엇이 바뀌었는지 알 수 있어야 한다.
고른 뒤
엔진을 골랐다고 끝나지 않는다. 엔진 버전을 올릴 때마다 같은 부하 테스트를 다시 돌려 굿풋과 출력 품질이 나빠지지 않았는지 확인한다. 기본값이 바뀌어 지연 분포가 달라지는 일이 흔하다. 엔진을 감싸는 라우터, 오토스케일러, 지표 수집은 엔진에 덜 묶이게 만들어 두면, 나중에 더 나은 엔진이 나왔을 때 바꾸는 비용이 줄어든다.
어떤 엔진을 쓰든 판단의 기준은 이 책 전체에서 쓴 것과 같다. 지연 목표를 먼저 정하고 그 목표를 지키는 범위에서 GPU 한 장이 얼마나 많은 요청을 처리하는지를 잰다.