Prefill 노드가 계산을 마치면 KV 캐시를 Decode 노드로 전송해야 한다. 이 전송이 얼마나 걸리느냐가 PD 분리의 손익을 가른다. NVLink 환경에서는 4K 컨텍스트 하나에 1.4 ms, 100GbE 이더넷에서는 102 ms — 같은 아키텍처인데 인프라에 따라 TTFT 추가 비용이 73배 달라진다.
KV 전송량은 어떻게 결정되는가
KV 캐시 크기는 레이어 수, KV 헤드 수, 헤드 차원, 컨텍스트 길이의 곱이다.
KV_bytes = num_layers × 2 × num_kv_heads × head_dim × sizeof(dtype) × seq_len
LLaMA-2 70B 기준(80 레이어, GQA 8 KV 헤드, 헤드 차원 128, FP16)으로 계산하면:
= 80 × 2 × 8 × 128 × 2 × seq_len
= 320 KB/token × seq_len
컨텍스트 길이별 전송량:
| 컨텍스트 길이 | GQA 8헤드 (FP16) | MHA 64헤드 (FP16) |
|---|---|---|
| 1K tokens | 320 MB | 2.5 GB |
| 4K tokens | 1.28 GB | 10.2 GB |
| 32K tokens | 10.2 GB | 81.6 GB |
GQA 적용 여부만으로 전송량이 8배 차이난다. 최신 모델 대부분이 GQA를 채택한 이유가 KV 메모리 절약뿐만이 아니다 — PD 분리 환경에서 전송 비용도 8분의 1로 줄어든다.
인터커넥트 토폴로지별 전송 시간
| 인터커넥트 | 실효 대역폭 | 1K (320 MB) | 4K (1.28 GB) | 32K (10.2 GB) |
|---|---|---|---|---|
| NVLink 4 (인트라노드) | 900 GB/s | 0.4 ms | 1.4 ms | 11 ms |
| PCIe 5.0 | 64 GB/s | 5 ms | 20 ms | 160 ms |
| InfiniBand NDR | ~50 GB/s | 6.4 ms | 26 ms | 205 ms |
| 100GbE 이더넷 | 12.5 GB/s | 26 ms | 102 ms | 819 ms |
NVLink는 H100 인트라노드에서만 쓸 수 있다. Prefill 노드와 Decode 노드가 같은 NVSwitch 패브릭 안에 있을 때의 숫자다. 노드가 분리되면 InfiniBand나 이더넷으로 떨어진다.
DistServe(OSDI 2024)에서 OPT-66B, 512 토큰 기준 단일 요청 KV 크기가 약 1.13 GB로 측정됐다. 평균 10 req/s 워크로드에서 이걸 소화하려면 초당 11.3 GB, 약 90 Gbps의 전송 대역폭이 필요하다고 계산했다. 이더넷 100 Gbps 링크 한 개가 KV 전송만으로 꽉 차는 규모다.
Splitwise(ISCA 2024)는 InfiniBand가 갖춰진 클러스터에서 KV 전송이 전체 latency의 0.1% 미만이라고 보고했다. InfiniBand NDR 환경에서 95%의 요청이 30 ms 이하의 전송 지연을 경험했다. 조건이 갖춰졌을 때의 이야기다.
손익분기: 어떤 조건에서 PD 분리가 역효과인가
PD 분리의 net gain을 단순화하면:
순이득 = Prefill 계산 시간 단축 이득 - KV 전송 latency
KV 전송 latency가 Prefill 단독 실행 대비 절약된 시간보다 크면 분리가 역효과다.
이더넷 + 1K 컨텍스트가 가장 나쁜 조합이다. 전송 시간 26 ms에 비해 1K 토큰의 Prefill 계산 자체가 수 ms 단위다. 분리로 아낄 수 있는 게 없는데 26 ms를 고정 추가하는 셈이다. 배치 크기가 작으면 GPU 활용률 충돌도 심하지 않아 분리 이득이 더 줄어든다.
이더넷 + 32K 컨텍스트도 위험하다. 전송만 819 ms다. Prefill 계산이 수 초를 넘는 워크로드가 아니라면 분리 이득이 전송 비용을 만회하기 어렵다. IB NDR + 8K 컨텍스트의 경우 전송 시간은 약 51 ms다. Prefill이 100 ms를 넘는 워크로드라면 분리가 의미 있지만, 그 이하라면 전송 비용이 이득을 잠식한다.
NVLink 인트라노드가 이 문제를 가장 깔끔하게 해소한다. 32K 컨텍스트에서도 11 ms. 어지간한 Prefill 계산 시간보다 훨씬 짧아 손익분기를 계산할 필요가 거의 없다. 다만 이 구성은 Prefill과 Decode 인스턴스가 같은 NVSwitch 패브릭 안에 묶여야 하므로, 두 GPU 풀을 완전히 독립 스케일링하는 disaggregated 서빙으로 보기 어렵다 — 장비 분리의 자유도를 일부 포기하는 트레이드오프가 있다.
Mooncake(Moonshot AI, 2024)는 CPU/DRAM/SSD/NIC를 활용한 분산 KV 캐시로 이 문제를 우회했다. 전송 병목 대신 KV를 근거리에 미리 캐싱해두는 방식으로, Kimi 서비스에서 실효 요청 처리 용량을 최대 498% 개선했다고 보고한다.
KV 전송을 줄이는 기법
KV 양자화 (FP8 / INT8)
FP16 → FP8 전환만으로 전송량이 절반이 된다. 100GbE에서 4K 컨텍스트 전송 시간이 102 ms → 51 ms로 줄어든다. 품질 측면에서 FP8은 사실상 모든 태스크에서 안전하다는 것이 현재 공통된 평가다. INT8도 대부분 모델에서 무난하다. INT4부터 모델별 편차가 심해진다 — Qwen2.5-7B는 INT4에서 품질이 급락하는 반면 Mistral-7B는 상대적으로 안정적이다.
vLLM에서는 --kv-cache-dtype fp8 하나로 적용된다.
SpectrumKV는 attention sink 토큰은 FP16, 중요도 낮은 토큰은 INT4로 처리하는 혼합 정밀도를 써서 전송량 50% 절감 시 perplexity 변화를 +2% 이내로 잡았다. 비교 기법인 PDTrim이 같은 조건에서 +25%를 보인 것과 대조된다.
비동기 파이프라인
NVIDIA NIXL이 비동기 포인트-투-포인트 전송 라이브러리로 설계된 이유가 여기 있다. KV를 전송하는 동안 Decode 측에서 이미 도착한 레이어부터 처리를 시작하면 전송 대기 시간의 일부를 첫 토큰 생성과 겹칠 수 있다. 이더넷 환경에서 실질 TTFT를 줄이는 데 유효하다.
선택적 레이어 전송
전체 80 레이어가 아닌 품질에 크게 영향을 미치는 레이어만 전송하는 연구도 진행 중이다. 현재는 연구 단계이며 프로덕션에서 바로 쓸 수 있는 기법은 아니지만, PD 분리 전송 비용을 더 줄이는 방향으로 수렴하고 있다.
vLLM NIXL로 직접 재보기
vLLM NixlConnector로 PD 분리를 로컬에서 띄울 수 있다.
Prefill 워커:
export UCX_TLS=all
export UCX_NET_DEVICES=all
CUDA_VISIBLE_DEVICES=0 \
VLLM_NIXL_SIDE_CHANNEL_PORT=5600 \
vllm serve <MODEL> --port 8100 \
--kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_producer"}'
Decode 워커:
CUDA_VISIBLE_DEVICES=1 \
VLLM_NIXL_SIDE_CHANNEL_PORT=5601 \
vllm serve <MODEL> --port 8200 \
--kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_consumer"}'
TTFT를 Prefill 계산 시간과 전송 대기 시간으로 분해하려면 vLLM이 주기적으로 출력하는 전송 latency percentile 로그를 확인하거나, Prometheus로 내보낸 전송 throughput 메트릭을 Grafana에서 보면 된다. torch.profiler로 전송 시작/완료 이벤트를 직접 캡처해 구간을 쪼갤 수도 있다.
도입 결정 전에
인터커넥트 대역폭을 먼저 확인한다. 100GbE 환경에서 FP8 양자화 없이 PD 분리만 올리면 TTFT가 나빠질 가능성이 높다. FP8을 함께 적용하면 이더넷에서도 실용적인 범위로 들어올 수 있다.
평균 컨텍스트 길이가 ≤1K를 주로 처리하는 서비스라면 Prefill 계산 절약분 자체가 작아 분리 이득이 거의 없다. QPS가 낮고 배치가 작은 서비스도 마찬가지다 — monolithic 구성에서 Prefill과 Decode가 자주 충돌하지 않는다면 분리할 이유가 없다.
100GbE 클러스터에 PD 분리를 올렸다가 TTFT가 오히려 나빠진 케이스는 이 계산을 건너뛴 결과다. 대역폭과 컨텍스트 길이 두 수치만 넣으면 손익분기는 5분이면 나온다.