Disaggregated prefill and decode for LLM inference on SageMaker HyperPod
Quick Summary
긴 프롬프트의 사전 채우기와 토큰 생성을 별도 GPU 풀로 분리하고 KV 캐시를 EFA 기반 RDMA로 전달해, 대규모 LLM 스트리밍 추론의 첫 토큰 시간과 토큰 간 지연을 독립적으로 최적화하는 방법을 설명한다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
긴 프롬프트의 사전 채우기와 토큰 생성을 별도 GPU 풀로 분리하고 KV 캐시를 EFA 기반 RDMA로 전달해, 대규모 LLM 스트리밍 추론의 첫 토큰 시간과 토큰 간 지연을 독립적으로 최적화하는 방법을 설명한다.
📌 핵심 요약
- 분리형 사전 채우기·디코딩(DPD)은 계산 집약적인 사전 채우기와 메모리 대역폭 집약적인 디코딩을 서로 다른 GPU 풀에서 실행해, 긴 프롬프트가 진행 중인 토큰 생성을 방해하는 문제를 제거한다.
- 라우터는 프롬프트의 토큰 수와 설정된 임계값을 비교해 긴 요청은 프리필러와 디코더를 순서대로 거치게 하고, 짧은 요청은 KV 캐시 전송 비용을 피하도록 디코더로 직접 보낸다.
- 프리필러와 디코더 사이의 KV 캐시는 LMCache, NIXL, libfabric, EFA로 구성된 전송 계층을 통해 이동하며, 계산과 계층별 전송을 겹쳐 실행하고 호스트 CPU를 데이터 경로에서 제외한다.
- DPD는 긴 문맥, 높은 동시성, 스트리밍 응답, 장단문 혼합 트래픽에 특히 적합하지만, 낮은 동시성이나 짧은 프롬프트 중심의 작업에서는 단일 배치 방식이 더 단순할 수 있다.
- HyperPod Inference Operator 3.2 이상에서 역할별 복제본·자원·vLLM 인수를 정의한 배포 매니페스트를 적용하면 프리필러, 디코더, 라우터가 생성되며, 각 파드의 실행 상태를 확인해 배포를 검증할 수 있다.
🧩 주요 포인트
- 분리형 사전 채우기·디코딩(DPD)은 계산 집약적인 사전 채우기와 메모리 대역폭 집약적인 디코딩을 서로 다른 GPU 풀에서 실행해, 긴 프롬프트가 진행 중인 토큰 생성을 방해하는 문제를 제거한다.
- 라우터는 프롬프트의 토큰 수와 설정된 임계값을 비교해 긴 요청은 프리필러와 디코더를 순서대로 거치게 하고, 짧은 요청은 KV 캐시 전송 비용을 피하도록 디코더로 직접 보낸다.
- 프리필러와 디코더 사이의 KV 캐시는 LMCache, NIXL, libfabric, EFA로 구성된 전송 계층을 통해 이동하며, 계산과 계층별 전송을 겹쳐 실행하고 호스트 CPU를 데이터 경로에서 제외한다.
- DPD는 긴 문맥, 높은 동시성, 스트리밍 응답, 장단문 혼합 트래픽에 특히 적합하지만, 낮은 동시성이나 짧은 프롬프트 중심의 작업에서는 단일 배치 방식이 더 단순할 수 있다.
- HyperPod Inference Operator 3.2 이상에서 역할별 복제본·자원·vLLM 인수를 정의한 배포 매니페스트를 적용하면 프리필러, 디코더, 라우터가 생성되며, 각 파드의 실행 상태를 확인해 배포를 검증할 수 있다.
🧠 상세 정리
1. 사전 채우기와 디코딩을 함께 실행할 때의 문제
대규모 언어 모델 추론은 입력 프롬프트 전체를 병렬 처리해 최초의 키-값 캐시를 만드는 사전 채우기 단계와, 해당 캐시와 모델 가중치를 읽으며 한 번에 한 토큰씩 생성하는 디코딩 단계로 나뉜다. 사전 채우기는 계산 자원에 크게 의존하지만 디코딩은 메모리 대역폭의 영향을 많이 받기 때문에, 두 단계가 동일한 GPU를 공유하면 자원 특성이 충돌한다. 특히 긴 프롬프트가 들어오면 해당 사전 채우기가 GPU를 점유하면서 동시에 처리 중인 다른 요청들의 토큰 생성까지 지연시켜 토큰 간 지연이 급격히 커질 수 있다. DPD는 두 단계를 별도의 GPU 풀에서 실행해 이러한 간섭을 구조적으로 제거하고, 첫 토큰까지 걸리는 시간과 이후 토큰 사이의 지연을 서로 독립적으로 조정할 수 있게 한다. 또한 긴 문맥의 사전 채우기가 진행되더라도 이미 스트리밍 중인 디코딩 요청의 토큰 전달이 방해받지 않도록 한다.
2. DPD가 적합한 작업과 라우팅 임계값
DPD의 효과가 가장 큰 대상은 긴 문맥과 높은 동시성을 함께 요구하는 스트리밍 작업으로, 대화형 도우미, 에이전트형 파이프라인, 문서 분석 엔드포인트, 검색 결과가 긴 검색 증강 생성 등이 이에 해당한다. 원문은 입력 프롬프트가 정기적으로 4,096토큰을 넘거나, 여러 사용자의 요청이 동시에 들어오거나, 일정한 속도의 스트리밍 응답이 중요하거나, 긴 요청과 짧은 요청이 섞이는 경우 DPD를 고려하라고 제시한다. 반대로 낮은 동시성, 짧은 프롬프트 전용 트래픽, 첫 토큰 시간 중심의 배치 또는 오프라인 작업에서는 함께 배치하는 구성이 더 단순하다. 짧은 요청은 EFA 기반 RDMA를 통한 KV 캐시 전송의 고정 비용이 단계 분리의 이점보다 커질 수 있으므로, 라우터가 설정된 토큰 임계값 아래의 요청을 디코더로 바로 보낸다. 이에 따라 하나의 엔드포인트가 별도의 수동 분기 로직 없이도 긴 요청은 분리 처리하고 짧은 요청은 직접 처리하는 혼합 트래픽 운영이 가능하다.
3. 라우터 중심의 전체 아키텍처
HyperPod의 DPD 구현은 vLLM 프로덕션 스택 라우터를 중심으로 구성되며, LMCache가 NIXL과 EFA 위에서 KV 캐시 전달 계층을 제공한다. 전체 배포는 지능형 라우터, 프리필러 파드, 디코더 파드라는 세 구성 요소와 이들을 연결하는 전송 스택으로 이루어진다. 라우터는 각 프롬프트를 토큰화한 뒤 설정된 토큰 수 임계값을 적용해, 요청을 분리 경로로 보낼지 디코더에서 처음부터 끝까지 처리할지 결정한다. 긴 요청에는 선택한 프리필러가 KV 캐시를 계산해 디코더로 보내도록 지시한 다음, 실제 생성을 위해 동일 요청을 해당 디코더로 전달한다. 또한 프리필러 복제본 사이에서 캐시 지역성을 높일 수 있도록 접두사 인식, KV 인식, 세션, 라운드 로빈과 같은 라우팅 전략을 설정할 수 있다.
4. 프리필러의 계산·전송 중첩과 CPU 캐시
프리필러는 LMCacheConnectorV1을 KV 커넥터로 사용하는 vLLM 작업자로, 긴 프롬프트를 처리해 생성한 KV 캐시를 선택된 디코더로 전송한다. LMCache의 사전 채우기·디코딩 송신 백엔드는 KV 캐시를 계층별로 보내며, 프리필러의 계산과 네트워크 전송을 겹쳐 실행해 GPU가 쉬는 시간을 줄인다. 각 프리필러에는 L1 CPU 캐시도 제공되므로 시스템 프롬프트, 다중 대화 이력, 검색 문맥처럼 동일한 접두사가 반복될 때 GPU에서 다시 계산하지 않고 CPU 메모리의 결과를 활용할 수 있다. 이 캐시 재사용은 반복되는 긴 입력의 사전 채우기 부담을 줄여 첫 토큰까지 걸리는 시간을 개선하는 데 기여한다. InferenceEndpointConfig에서 DPD를 활성화하면 운영자가 커넥터와 캐시를 각각 수동 구성하지 않아도 관련 요소가 함께 프로비저닝된다.
5. 디코더 격리와 KV 캐시 전송 계층
디코더는 LMCache 수신기로 동작하는 vLLM 작업자이며, PD_BUFFER_SIZE로 정해지는 GPU 메모리 영역을 외부에서 들어오는 KV 캐시 전송용 버퍼로 예약한다. 캐시 전송이 끝나면 전체 CUDA 그래프를 사용하는 디코딩 커널로 생성을 시작하며, 자체적으로 사전 채우기를 실행하지 않기 때문에 높은 동시성에서도 디코딩 지연을 안정적으로 유지할 수 있다. KV 캐시는 LMCache PD, NIXL, libfabric, EFA로 이어지는 네 계층을 통해 전달되고, NIXL은 GPU·CPU·원격 피어를 아우르는 메모리 추상화와 적절한 RDMA 연산 선택을 담당한다. libfabric 제공자는 EFA를 커널 우회 및 GPU 직접 RDMA 경로로 노출해 호스트 CPU가 데이터 전달 경로에 개입하지 않도록 한다. 원문이 제시한 ml.p5.48xlarge와 3,200Gbps EFA 환경에서는 Llama 3.3 70B의 8,000토큰 KV 전송이 한 자릿수 밀리초에 이르러, 사전 채우기 계산에 비해 전송 비용이 작다고 설명한다.
6. 운영자 버전과 네트워크 선행 조건
DPD 배포에는 최소 한 대의 사전 채우기 노드와 한 대의 디코딩 노드가 필요하며, 두 노드는 RDMA를 지원하는 EFA 네트워크를 사용할 수 있어야 한다. 설치 전에는 AWS 명령줄 인터페이스, HyperPod 클러스터에 접근 가능한 kubectl 구성, HuggingFace 토큰, 충분한 서비스 할당량을 준비해야 한다. DPD 기능에는 HyperPod Inference Operator 3.2 이상이 요구되며, 신규 HyperPod EKS 클러스터에는 운영자가 기본 설치되어 있다고 설명한다. 현재 버전은 hyperpod-inference-system 네임스페이스의 컨트롤러 관리자 배포에서 컨테이너 이미지 참조를 조회하고, 이미지 태그에 포함된 버전 번호를 확인하는 방식으로 검증한다. 확인된 버전이 기준보다 낮다면 엔드포인트 배포를 계속하기 전에 운영자 릴리스 안내에 따라 업그레이드해야 한다.
7. 인스턴스·작업자 이미지·모델 체크포인트 준비
예시는 두 대의 ml.p5.48xlarge 인스턴스에 Meta Llama 3.3 70B 모델을 배포하며, 해당 인스턴스가 HyperPod 클러스터의 인스턴스 그룹에서 사용 가능한지 먼저 확인하도록 한다. DPD용 인스턴스는 NVLink와 EFA를 모두 지원하고 EFA가 RDMA 읽기와 쓰기를 처리할 수 있어야 하며, 고대역폭 통신을 위해 같은 가용 영역에 위치해야 한다. P5와 P6 계열이 조건을 충족하고, G6·G6e·G7e도 EFA의 RDMA 읽기·쓰기를 지원하지만 다중 GPU 구성에서는 PCIe 기반 GPU 간 통신이 병목이 될 수 있다고 지적한다. 작업자 이미지에는 vLLM, LMCache, NVIDIA NIXL, EFA libfabric 제공자가 포함되어야 하며, 작성 시점의 선택지로 LMCache의 vllm-openai 0.4.3 이미지와 SageMaker 심층 학습 컨테이너 이미지가 제시된다. 모델 체크포인트는 S3, FSx, HuggingFace 직접 다운로드, 인스턴스 NVMe 등에서 불러올 수 있고, 예시에서는 클러스터와 같은 리전의 S3 버킷에 Llama 3.3 70B Instruct 체크포인트를 동기화해 사용한다.
8. DPD 매니페스트 설정과 배포 검증
배포 매니페스트에서 spec.pdSpec의 존재는 엔드포인트를 분리형으로 만드는 핵심이며, 운영자는 이를 바탕으로 사전 채우기와 디코딩용 배포 객체를 별도로 만들고 라우터 및 LMCache 백엔드와 연결한다. 역할별 replicas와 resources를 통해 프리필러와 디코더를 독립적으로 확장하고 자원을 지정할 수 있으며, DPD 파드에서는 최상위 worker.resources가 무시되고 각 역할의 값이 적용된다. routingThreshold는 분리 경로를 사용할 토큰 길이의 경계이고, 역할별 args는 공통 worker.args와 병합되면서 중복 플래그를 역할별 값으로 대체한다. 공통 environmentVariables는 프리필러와 디코더에 동일하게 적용되므로 역할별 동작 차이는 pdSpec의 prefillSpec 또는 decodingSpec 아래 인수로 지정해야 한다. 매니페스트를 kubectl로 적용하면 사용자 네임스페이스에 프리필러와 디코더 배포가, hyperpod-inference-system 네임스페이스에 라우터 배포가 생성되며, 원문의 예시는 관련 파드를 조회해 프리필러와 디코더 컨테이너가 각각 3/3 준비 상태와 Running 상태에 도달했는지 확인한다.
🧾 핵심 주장 / 시사점
- DPD의 핵심은 모든 요청을 무조건 분리하는 것이 아니라 토큰 임계값을 기준으로 긴 요청만 프리필러에 보내는 데 있으며, 이 방식이 짧은 요청의 불필요한 KV 캐시 전송 비용과 긴 요청의 디코딩 간섭을 동시에 줄인다.
- 프리필러와 디코더를 별도 복제본과 자원 설정으로 확장할 수 있으므로, 계산량이 큰 사전 채우기와 메모리 대역폭 중심의 디코딩을 같은 비율로 증설하지 않고 실제 트래픽 특성에 맞춰 각각 조정할 수 있다.
- DPD의 지연 개선은 GPU 분리만으로 완성되는 것이 아니라 계층별 계산·전송 중첩, 반복 접두사의 CPU 캐시 재사용, GPU 직접 RDMA를 통한 KV 캐시 전달이 함께 작동할 때 실현된다.
✅ 액션 아이템
- 긴 요청은 프리필러와 디코더를 순차 통과시키고, 짧은 요청은 디코더 직접 경로로 보내는 토큰 수 임계값 라우팅 기준을 정의한다.
- 사전 채우기와 디코딩을 분리해 GPU 풀을 분할 배치하고, KV 캐시를 LMCache·NIXL·libfabric·EFA 계층으로 이동시켜 CPU를 데이터 경로에서 제외한다.
- HyperPod Inference Operator 3.2 이상 배포 매니페스트에서 역할별 복제본·자원·vLLM 인수를 설정한 뒤 프리필러·디코더·라우터 파드 기동 상태를 점검한다.
❓ 열린 질문
- 긴 문맥·고동시성 스트리밍 트래픽에서 DPD가 단일 배치 대비 실제로 언제 첫 토큰 지연과 토큰 간 지연 개선을 주도하는가?
- 프리필러 임계값은 워크로드 특성에 따라 어떤 기준으로 조정해야 장단문 혼합 처리에서 KV 캐시 전송 오버헤드를 최소화할 수 있는가?
- SageMaker HyperPod에서 LMCache·NIXL·libfabric·EFA 기반 KV 이동이 병목이 되어 성능이 정체될 때 이를 탐지하는 기준은 무엇인가?