gpumode · 강의 아카이브
《GPU Mode》 L058 2025 · Disaggregated High priority transcript · failed

Disaggregated LLM Inference

LLM 서빙에서 prefill 과 decode 의 자원 형태가 본질적으로 다르다는 관찰 위에서, 두 단계를 별도의 GPU pool 에 분리해 각자 다른 batch / parallel / scheduling 으로 돌리고 KV cache 를 PCIe·NVLink 로 옮긴다. Splitwise(MS) 와 DistServe(UCSD) 가 같은 결론에 도달했다는 사실, 그리고 옮기는 비용이 분리의 이득을 거의 잡아먹지 않는 이유 — 그 산수를 다시 깐 노트.

prefill / decode split KV cache migration Splitwise DistServe vLLM SLO-aware scheduling NVLink / PCIe continuous batching
J
Speaker
Junda Chen
UCSD · DistServe 공저자 (확인 필요)
강의 번호
L058
스피커
Junda Chen
학습 우선순위
High · 정독
자료 상태
transcript 없음 · 논문 기반
§ 01강의가 풀려는 문제· why disaggregate

같은 GPU 안에서 prefill 과 decode 가 서로의 latency 를 망가뜨린다

2024 년 LLM 서빙 시스템(vLLM, TensorRT-LLM, SGLang…)이 대부분 continuous batching 위에 서 있다. 한 GPU 가 prefill 토큰과 decode 토큰을 같은 forward 안에 섞는다. 이 강의는 그 “섞는다” 가 — 두 단계의 자원 형태가 다르기 때문에 — TTFT 와 TPOT 둘 다를 동시에 최적화하지 못한다고 진단하고, 두 단계를 다른 GPU 로 보내는 길을 깐다.

강의 자체의 transcript 가 비어 있으므로 이 노트는 두 편의 논문과 production 자료를 base 로 재구성한다. 두 논문이 핵심이다.

발표자 Junda Chen 은 DistServe 공저자로 알려져 있다 (확인 필요 — 강의 transcript 없음). 두 시스템 모두 같은 결론에 도달한다 — 같은 GPU 안에서는 prefill 의 큰 batch 가 decode 의 latency 를 잡아먹는다. 강의의 인지적 frame 은 그 자리부터 시작한다.

핵심 frame

LLM inference 의 두 단계는 같은 모델을 돌린다는 점만 같다. compute / memory bandwidth / batch dynamics / latency target 이 전부 다르다. 같은 자원을 공유하면 두 단계의 SLO 가 서로를 깎아먹는 negative-sum 게임이 된다. 분리 = 두 단계가 각자의 최적점에서 도는 것을 허용한다.

“Prefill 은 GPU 의 compute 를 거의 다 쓰고, decode 는 HBM 대역폭을 거의 다 쓴다 — 이 둘을 같은 forward 에 섞는 순간 어느 쪽도 자기 peak 에 도달하지 못한다.”disaggregation 의 일반적 frame · 확인 필요

그래서 강의의 서사는 이 흐름이다 — (§02) 두 단계의 자원 형태가 다른지 산수로 보고 → (§03) 같은 GPU 에 두면 어떤 interference 가 발생하는지 → (§04–05) 분리하면 KV cache 를 옮겨야 하는데 그 비용이 얼마인지 → (§07) 결과적으로 같은 SLO 아래에서 얼마나 더 많은 요청을 받을 수 있는지.

§ 02prefill vs decode· compute-bound vs memory-bound

같은 transformer 가 한쪽은 GEMM 머신이 되고 한쪽은 HBM 펌프가 된다

두 단계의 차이를 한 줄로 요약하면 — prefill 은 토큰을 한꺼번에 본다, decode 는 한 번에 한 토큰. 같은 attention/FFN 이 한쪽에서는 큰 GEMM 으로 돌고 한쪽에서는 GEMV 의 연속이 된다. 이 비대칭이 disaggregation 의 산수적 출발점이다.

전형적 LLM 의 한 layer 비용을 분해해보자. seq length 가 L, hidden 이 d, batch 가 B 일 때:

  • Prefill — 모든 토큰을 동시에 처리. attention 의 Q·K^TB · L · L · d, FFN 이 B · L · d². compute-bound. arithmetic intensity 가 충분히 커서 Tensor Core 가 saturate 된다.
  • Decode — 한 번에 token 1개. QB · 1 · d 짜리 vector. K, V 는 KV cache 에 누적된 모든 과거 토큰 → 매 step 마다 B · L_past · d 를 HBM 에서 읽어야 한다. memory-bound. arithmetic intensity 가 거의 1 토큰당 1 GEMV.

그러면 두 단계의 GPU 활용 패턴이 완전히 다르다 — prefill 은 SM 의 Tensor Core 가 100% 가까이 도는 동안 HBM 대역폭은 절반 정도. decode 는 정반대 — HBM 이 95%+ 도는 동안 Tensor Core 는 절반도 못 채운다.

FIG · 두 단계의 자원 사용 형태같은 H100 · 같은 70B 모델
Prefill · Compute
96%
Prefill · HBM BW
48%
Decode · Compute
18%
Decode · HBM BW
92%
두 막대 패턴이 완전히 반전. 같은 GPU 에 둘을 같이 두면 — compute 자원 절반과 HBM 자원 절반이 항상 어느 한 단계에서 idle 이다. 수치 예시는 일반적 70B Llama-style 모델 (확인 필요).
FIG · 한 step 안 두 단계의 GPU timelinecontinuous batching · co-located
Tensor Core compute lane
prefill GEMM (saturate)
decode GEMV
— idle (decode 가 HBM 에 막혀 있는 동안)
~55%
HBM bandwidth memory lane
— idle (prefill 은 BW 적게 씀)
decode KV-cache load (saturate)
~58%
같은 시점에 두 lane 이 모두 100% 에 도달하는 구간이 거의 없다. 자원이 연속해서 절반씩 놀고 있다는 게 핵심 관찰. 분리하면 두 GPU 모두 자기 lane 만 100% 로 끌어쓸 수 있다.

이 관찰은 latency 메트릭에도 그대로 박힌다 — TTFT (time to first token) 는 prefill 비용에 묶이고 (compute / FLOPS), TPOT (time per output token) 는 decode 비용에 묶인다 (HBM bandwidth). 한 GPU 안에서 둘을 같이 돌리는 한, batch 를 늘려서 하나를 살리면 다른 하나가 죽는다.

§ 03분리 동기· interference · SLO

continuous batching 이 prefill 토큰을 끼워넣는 순간 decode latency 가 튄다

vLLM 의 continuous batching 은 매 step 마다 새 요청의 prefill 을 진행 중인 decode batch 와 함께 돈다. 평균 throughput 은 좋아지지만 — 그 step 의 decode 토큰이 prefill 의 거대한 GEMM 끝나기를 기다린다. 한 step 의 latency 가 boundary 에서 spike. 이게 disaggregation 이 풀려는 첫 번째 구체적 문제다.

FIG · co-located continuous batching 의 latency spikestep 별 wall-clock
step 1 · decode onlybatch=64 decode
decode
~30 ms
step 2 · prefill 끼어듦batch=64 + 1 long prefill
2K-token prefill GEMM
decode
~280 ms
step 3 · decode onlybatch=65 (새 요청 합류)
decode
~32 ms
기존 64 개 활성 요청의 decode latency 가 step 2 에서 거의 10배 튄다. 평균은 OK 처럼 보이지만 p99 TPOT 가 처참하다. SLO-bound serving 에서는 곧 SLO 위반.

이 “끼어들기” 비용은 prefill 길이가 길수록 비례해서 커진다. context 가 긴 RAG / agent / 코딩 어시스턴트 워크로드에서는 한 prefill 이 4K~32K 토큰이라 — decode batch 가 한 step 에 수백 ms 멈춘다.

운영자가 이걸 막으려면 결국 두 가지 중 하나다.

  1. prefill 토큰을 따로 chunk 해서 잘게 자른다 — chunked prefill (vLLM v0.4+, SGLang). 끼어들기 비용을 분산시키지만 prefill 자체의 throughput 은 떨어진다.
  2. prefill 을 다른 GPU 에 보낸다 — disaggregation. 끼어들기를 원천적으로 없앤다.
SLO 두 개의 분리

p99 TTFT 는 prefill GPU 의 큐잉 / FLOPS 한계로 독립적으로 다듬을 수 있고, p99 TPOT 는 decode GPU 의 batch / HBM 한계로 독립적으로 다듬을 수 있다. 한 변수에 두 SLO 를 묶는 co-located 시스템보다 자유도가 곱으로 늘어난다.

DistServe 논문의 핵심 표현 — “decoupling these two phases lets us tune their parallelism / batch / placement independently for goodput, instead of throughput.” goodput = SLO 안에서 받은 요청 수. 평균 throughput 이 아니라 SLO 만족한 요청의 throughput 을 본다는 게 disaggregation 의 metric 정의 자체다.

§ 04KV cache migration· PCIe vs NVLink

분리하면 prefill 결과를 decode GPU 로 옮겨야 한다 — 그 비용 산수

prefill GPU 가 만든 결과는 KV cache다 — layer 별로 K, V 두 텐서. decode GPU 가 attention 을 돌리려면 이 KV 가 그 GPU 의 HBM 에 있어야 한다. 그래서 옮겨야 한다. 이 비용이 분리의 이득을 잡아먹지 않는지가 disaggregation 의 운명을 결정한다.

한 요청의 KV cache 크기 산수 (Llama-3 70B 기준, FP16):

  • layers L = 80, head dim × heads → GQA 로 KV head = 8, head_dim = 1281024 bytes/token/layer × 2 (K,V) = 2048 bytes/token/layer.
  • layer 80개 → ~160 KB/token. 한 요청 prompt 가 L_in = 2048 이면 KV cache ≈ 320 MB.

이 320 MB 를 prefill GPU → decode GPU 로 옮기는 시간:

  • NVLink (H100, 900 GB/s): 320 MB / 900 GB/s ≈ 0.36 ms.
  • PCIe Gen4 (32 GB/s): 320 MB / 32 GB/s ≈ 10 ms.
  • PCIe Gen5 (64 GB/s): ≈ 5 ms.

비교 기준 — 같은 prompt 의 prefill 자체가 H100 70B 에서 ~150 ms 정도. 즉 NVLink 이면 KV migration 은 prefill 의 0.2%, PCIe Gen4 도 7%. 분리의 이득(>30%)이 이 비용보다 훨씬 크다.

FIG · KV migration 시간이 prefill 시간 안에서 차지하는 비중L_in = 2048 · 70B
Prefill 자체
150 ms
+ NVLink migration
0.4 ms
+ PCIe Gen5
5 ms
+ PCIe Gen4
10 ms
NVLink 가 같은 노드에 있으면 migration 은 거의 공짜. cross-node 로 가면 InfiniBand (200~400 Gb/s) 로 떨어지고 PCIe 와 비슷한 비용. 그래서 production 에서는 prefill/decode pool 을 같은 노드 안에 두려는 압력이 생긴다.
중요한 산수

KV cache 크기 = L_in × layers × 2 × n_kv_heads × head_dim × dtype_size. GQA 가 KV head 수를 줄이면 migration 비용도 그 비율로 줄어든다. Llama-3 같이 GQA 8:1 인 모델은 같은 dense MHA 모델 대비 migration 이 8배 싸다. 이게 disaggregation 의 implicit 친화성.

긴 context 모델 — 32K, 128K — 에서는 KV cache 가 4 GB, 16 GB 까지 커진다. 그러면 PCIe 라도 100ms+ 의 migration 이 prefill 시간 (~수백 ms) 의 상당 부분이 된다. 이 영역은 chunked-migration / overlapping (§05) 으로만 풀린다.

§ 05통신 오버헤드· layer-by-layer · async

migration 을 prefill 의 마지막에 몰지 말고, layer 단위로 흘려보낸다

naive 한 구현은 prefill 을 끝까지 다 돌린 뒤 KV cache 80 layer 를 통째로 보낸다. Splitwise / DistServe 둘 다 같은 트릭을 쓴다 — layer i 의 KV 가 만들어지는 즉시 layer i 를 send 한다. prefill 의 layer i+1 GEMM 이 도는 동안 layer i 의 KV 가 PCIe / NVLink 위로 흐른다. compute 와 통신이 겹친다.

FIG · naive vs layer-pipelined migration80-layer prefill
naive — 통째로prefill 끝나고 send
prefill (80 layers)
KV migrate (320 MB)
160 ms
layer-pipelinedcompute · send overlap
prefill (80 layers)
KV migrate (layer-by-layer · 동시 진행)
tail
152 ms
migration 이 prefill 안에 거의 완전히 hide. 마지막 layer 한 개 분량만 critical path 에 남는다 — 320 MB → 4 MB 로 줄어든 효과. 이게 분리의 비용을 1% 이하로 누르는 메커니즘.

구현 디테일은 두 가지가 핵심이다.

  1. NCCL stream / CUDA stream 분리 — 통신을 default stream 이 아닌 별도 stream 에서 하면 compute 와 진짜로 겹친다. torch.distributed.send/recv 위에서는 이게 자동이지 않으므로 직접 nccl group + side stream 을 띄운다.
  2. address handshake — decode GPU 가 prefill GPU 의 KV 를 받으려면 어디에 쓸지 알려야 한다. KV slot 매핑(=block table)을 사전에 교환. vLLM block manager 의 paging 기반 KV 가 이 합치에 친화적인 이유.
NIXL / KV transfer library

NVIDIA 가 2024 말 발표한 NIXL (NVIDIA Inference Transfer Library) 가 정확히 이 disaggregation 의 KV transfer 를 표준화한다. vLLM, TRT-LLM 모두 채택 중. 같은 노드 / cross-node 모두에서 RDMA + GPUDirect 로 zero-copy.

# 의사코드 — layer-pipelined KV send (prefill 측)
comm_stream = torch.cuda.Stream()

for i, layer in enumerate(model.layers):
    h, kv_i = layer.forward(h)         # default stream
    with torch.cuda.stream(comm_stream):
        comm_stream.wait_stream(
            torch.cuda.current_stream())
        kv_send_async(
            kv_i,                      # {K_i, V_i}
            dst=decode_rank,
            tag=(req_id, i),
        )
# 마지막 layer 만 sync 대기
torch.cuda.current_stream().wait_stream(comm_stream)

decode 측에서는 layer i 가 도착해야 layer i 의 attention 을 돌릴 수 있다 — 일반적으로 decode 는 모든 layer 가 이미 들어와 있을 때 시작되므로, prefill 마지막 layer 의 도착이 critical path.

§ 06분리 vs 통합· co-located baseline

같은 8-GPU 노드를 어떻게 쓸 것인가 — 모든 GPU 가 같은 모델 vs 4+4 분리

분리의 가치는 같은 자원 예산 안에서 비교해야 보인다. “8장 GPU 가 있으면 다 같이 prefill+decode 를 하는 게 좋은가, 아니면 4장은 prefill, 4장은 decode 로 묶는 게 좋은가?” 두 시스템 모두 같은 비교를 한다. 결과는 모델 / SLO / 워크로드 mix 에 따라 다르지만 — 긴 prompt + 짧은 output 일수록 분리가 이긴다.

Prefill pool

4× H100 · TP=4

큰 batch · short-burst · compute-bound 으로 도는 편 좋아함
batch policyprompt-pack
parallelTP4
SLOTTFT p99
목표FLOPS 99%
KV cache NVLink/PCIe
Decode pool

4× H100 · TP=4

큰 batch · sustained · memory-bound 으로 도는 편 좋아함
batch policycontinuous
parallelTP4
SLOTPOT p99
목표HBM BW 95%
메트릭
co-located 8 GPU
disagg 4+4 GPU
TTFT p99 ~1.8 s ~0.6 s
TPOT p99 ~95 ms ~38 ms
평균 throughput 100% (baseline) +30~80% goodput
decode batch 안정성 spike 잦음 flat
KV migration 비용 0 ~0.5 ms / req (NVLink)

위 수치는 일반적 70B/8GPU 비교를 재구성한 예시. DistServe 논문 Table 3 / Splitwise eval 의 트렌드를 기준으로 — 절대값은 모델·SLO·워크로드 mix 에 따라 크게 변함. 확인 필요.

“같은 8장으로 같은 SLO 를 만족시키면서 30~80% 더 많은 요청을 받았다 — 즉 같은 cluster 가 30~80% 더 큰 traffic 을 무료로 처리한 것과 같다.”DistServe / Splitwise 공통 결론 (확인 필요)
§ 07Splitwise · DistServe· SLO 안에서 throughput

두 논문의 같은 결론 · 다른 강조점

두 논문은 같은 시기 (2024) 에 같은 아이디어를 다른 각도로 구현했다. Splitwise 가 Azure 의 production 워크로드를 실제 분석해 분리의 정당성을 깔았고, DistServe 가 SLO 기반 자동 placement / parallel sweep 을 형식화했다. 같이 보면 — 한쪽은 시스템 설계의 outer envelope, 다른 쪽은 inner optimization.

Splitwise (MS · ISCA 2024)

  • 관찰: Azure 의 LLM 서빙에서 prefill 시간이 token 수에 정확히 선형, decode 시간이 batch / KV 크기에 선형. 두 단계의 utilization 패턴이 정반대.
  • 설계: prompt machine + token machine 으로 명시적 분리. 같은 H100 노드 안에서 NVLink 로 KV 전송. 다른 노드 간에는 InfiniBand.
  • SKU 다양성: prompt machine 은 H100 으로, token machine 은 (싸면 OK) A100 으로. 모델별로 다른 GPU 세대를 섞어 cluster cost 를 최적화.
  • 결과: 같은 cost 예산에서 ~1.4× throughput, p99 SLO 만족 trace 20% 증가 (논문 abstract — 확인 필요).

DistServe (UCSD · OSDI 2024)

  • 관찰: prefill 과 decode 가 다른 parallel 전략을 좋아한다. prefill 은 TP, decode 는 (KV 가 클수록) PP / 더 큰 batch. 한 묶음이면 둘 다 최적이 안 됨.
  • 설계: placement algorithm — 모델 / SLO / GPU 수가 주어지면 prefill pool / decode pool 의 GPU 수와 parallel 차원을 자동 선택. 시뮬레이터로 sweep.
  • scheduler: prefill 큐와 decode 큐 분리. KV cache 의 layer-pipelined transfer.
  • 결과: chat 워크로드에서 same-SLO 에서 ~7.4× 더 많은 rate, code completion 에서 ~12.6× rate (논문 Figure 1 — 확인 필요).
두 논문이 공통으로 강조하는 것

(1) workload 의 input/output 길이 분포가 분리 이득의 크기를 결정한다. prompt 가 길고 output 이 짧을수록 분리 효과가 크다 — 그런 워크로드에서 prefill 비중이 올라가서 interference 가 더 강해지기 때문. (2) 같은 노드 안 NVLink 면 KV migration 은 사실상 공짜. cross-node 로 갈 때 비용이 본격적으로 보인다. (3) SLO 안에서의 goodput 이 평균 throughput 보다 의미 있는 metric.

§ 08production trade-off· 실제 클러스터 구성

분리가 항상 이기지는 않는다 — 작은 모델 · 짧은 prompt · uneven traffic

disaggregation 을 production 에 도입하기 전에 짚을 trade-off. 그저 “분리하면 빨라진다” 가 아니라 — 어떤 워크로드 / 어떤 모델 / 어떤 토폴로지에서 이득이 있고 어디서 잃는가.

상황
분리 이득
long prompt · short output
(RAG, code, agent)
크다 (3~10×) prefill 이 dominant. interference 가 가장 큰 워크로드.
short prompt · long output
(creative writing, reasoning)
중간 (1.2~2×) decode 가 dominant. prefill 이 작아서 분리해도 자유도가 적게 늘어남.
balanced (chat) 중상 (2~4×) interference 가 평균적으로 발생. 분리가 큰 변동성을 잡아줌.
작은 모델 (<7B) 작거나 음 prefill 이 너무 빨라 interference 가 작음. 분리 오버헤드(KV migration·관리)가 더 큼.
cross-node (PCIe/IB) 중하 migration 비용이 prefill 의 5~15% 수준으로 올라감. layer-pipelined hide 가 필수.
매우 uneven traffic 작음 한쪽 pool 이 노는 시간이 잦아짐 → 자원 낭비. 자동 rebalancing 이 어려움.
실전 결정 기준

(1) 워크로드의 median prompt length 가 1K 이상 → 분리 후보. (2) 모델이 30B+ 이면서 GQA 사용 → KV migration 싸므로 분리 친화적. (3) 같은 노드 안에서 NVLink 8장 → 즉시 시도. cross-node 로 가야 하면 NIXL / GPUDirect 가 필요. (4) traffic 이 시간대별로 8× 변동 → 분리 + 자동 pool resize (또는 hybrid) 가 필요. 정적 4+4 배치는 비효율.

또 하나의 production 관찰 — prefill GPU 의 utilization 이 떨어질 때가 잦다. prefill 은 burst 형태 (요청이 들어올 때만 발생) 인데 decode 는 sustained (요청이 살아있는 한 계속). 같은 4+4 라도 prefill GPU 가 idle 인 시간이 길다면 — 그 GPU 를 일시적으로 decode 로 합류시키는 elastic reconfig 가 다음 단계. SGLang / vLLM v1 의 disagg 기능이 이 방향.

§ 09다음 발전· chunked prefill · attention disagg

분리의 다음 단계 — 더 잘게 자르고, attention 만 따로 분리한다

2024 후반부터 disaggregation 의 두 갈래가 진행 중이다. (a) chunked prefill + 분리 hybrid — 단순 분리의 자원 활용 단점을 chunked 로 보완. (b) attention 자체 분리 — 모델의 attention layer 를 KV-heavy machine 으로, FFN/MLP 를 compute-heavy machine 으로.

(a) chunked prefill 위에서의 분리

SGLang 이 채택한 패턴 — prefill 을 큰 GEMM 한 번이 아니라 고정 크기 chunk (예: 1024 토큰) 로 자른다. chunk 단위로 prefill GPU 가 도는 동안 decode 도 같이 끼어 들어가 일을 한다. 그러면서도 chunk 의 KV 가 만들어지는 즉시 decode pool 로 stream.

장점 — 긴 prompt 가 들어와도 decode latency spike 없이 SLO 안에서 처리. 단점 — chunk 마다 GEMM 이 작아져서 prefill throughput 자체가 좀 떨어진다 (5~10%).

(b) attention 자체 분리 (Mooncake 등)

Mooncake (Moonshot AI, 2024) 는 한 단계 더 — attention 만 KV-heavy GPU pool 에 두고 FFN 은 다른 pool 에 둔다. attention 은 KV cache 를 들고 있는 GPU 가 매번 도는 게 자연스럽다. layer 마다 hidden state 가 두 pool 사이를 왕복.

이건 KV cache reuse (prefix caching) 와 결합될 때 특히 강력하다 — 같은 prefix 의 KV 가 한 곳에 살아 있으면 여러 요청이 그 KV 를 “찾아가서” attention 만 돌리고 돌아온다.

FIG · disaggregation 의 진화 단계2023 → 2025
2023
co-located
vLLM v0 · continuous batching
2024 H1
prefill ↔ decode
Splitwise · DistServe
2024 H2
+ chunked hybrid
SGLang · vLLM v1
2025
+ attention disagg
Mooncake · prefix-aware
미래
layer-level disagg
layer-별 GPU pool · 확인 필요
분리의 단위가 점점 작아진다 — request → phase → chunk → operator → layer. 각 단계에서 KV / activation 의 transfer 비용을 줄이기 위한 새 hardware feature (NIXL, GPUDirect, NVLink Switch) 가 같이 진화한다.
“disaggregation 은 결국 같은 모델의 다른 부분을 다른 hardware 가 잘 돌릴 수 있다는 사실의 일반화다 — 그 부분이 phase 인지 operator 인지 layer 인지가 진화의 축.”학습 노트
§ 10기억할 메모와 코드· key takeaways · papers

다시 열었을 때 5분 안에 손으로 잡혀야 할 것

disaggregation 의 핵심 사실들과 직접 읽어야 할 자료들을 묶어둔다.

prefill = compute-bound
큰 GEMM 으로 도는 phase. Tensor Core saturate, HBM 절반. TTFT 가 SLO.
decode = memory-bound
GEMV 의 연속. HBM saturate, compute 절반. TPOT 가 SLO.
interference
co-located 시 prefill 이 decode 를 한 step 동안 멈춘다. p99 TPOT spike.
KV migration 비용
L_in × layers × 2 × n_kv_heads × head_dim × dtype. 70B/2K-prompt = 320 MB. NVLink 0.4 ms · PCIe 5~10 ms.
layer-pipelined transfer
layer i 의 KV 를 만들자마자 send. compute 와 통신 overlap. 마지막 layer 만 critical path.
goodput
SLO 만족한 요청 수 / 초. 평균 throughput 대신 봐야 할 metric.
GQA 친화성
KV head 가 적을수록 KV cache 작음 → migration 작음 → disagg 친화적.
workload 의존성
long prompt + short output 에서 분리 이득 가장 크다. 작은 모델 / 짧은 prompt 면 이득 작음.
Mooncake github.com/kvcache-ai/Mooncake · KV-centric disaggregation
vLLM disagg vllm 문서 / disagg_prefill (확인 필요 · 페이지 위치는 변동)
NIXL github.com/ai-dynamo/nixl · NVIDIA inference transfer library

손에 새기기 — 실습 시퀀스

  1. KV cache 크기 산수 — 가지고 있는 모델의 layer / n_kv_heads / head_dim 을 곱해 KV bytes/token 을 계산. prompt 평균 길이를 곱해 한 요청당 KV 크기, 평균 active req 수를 곱해 cluster KV footprint 를 추정.
  2. vLLM 으로 co-located baseline — 8-GPU 노드에서 70B 를 TP=8 로 띄우고 sweep. --max-num-batched-tokens--max-num-seqs 를 바꿔가며 TTFT/TPOT 분포 측정. p99 spike 가 어디서 생기는지 확인.
  3. vLLM disagg 옵션 켜기 — 같은 cluster 에서 --kv-transfer-config 으로 prefill/decode 분리. 4+4 배치. 같은 trace 로 비교.
  4. chunked prefill 와 비교 — SGLang 의 chunked prefill 모드와 disagg 의 4+4 모드를 같은 trace 로 돌리고 — 어떤 워크로드 mix 에서 어느 쪽이 이기는지 표.
  5. NCCL trace 로 transfer 시각화NCCL_DEBUG=INFO 로 KV transfer 의 실제 시간을 timeline 위에 찍어 본다. layer-pipelined hide 가 잘 일어났는지 직접 확인.
  6. cross-node 시도 — 두 노드 사이에 InfiniBand 로 disagg. 같은 노드 NVLink 와 비교해 latency 추가분 측정. 200 Gb/s vs 400 Gb/s 의 영향.
§ 11다른 강의로 이어지는 길· connections

이 강의의 frame 이 다음에 어디에 다시 등장하는지

disaggregation 은 LLM serving 의 큰 frame 이라 GPU Mode 의 여러 강의와 직접 닿는다. 어떤 강의가 같은 trade-off 의 다른 면을 다루는지를 묶어둔다.

§ 12열린 질문· open questions

transcript 가 비어 있어 직접 검증해야 할 것들

이 강의는 video transcript 추출이 실패한 상태라 — 본문은 두 논문(Splitwise, DistServe)과 production 자료 위에서 재구성했다. 강의에서만 등장했을 가능성이 있는 사실들을 직접 영상에서 검증해야 한다.

검증 메모

이 노트의 모든 수치 (KV migration 시간, throughput 배수, p99 latency) 는 두 논문의 그래프와 일반적 70B-class 산수에서 재구성한 예시값이다. 자기 클러스터 / 자기 모델에서 직접 측정하지 않은 절대값은 그대로 인용하지 말 것. 특히 cross-node 의 경우 InfiniBand 세대(NDR / HDR / EDR)에 따라 5×까지 차이.

← Lecture 057 앞 강의 — 같은 inference frame 의 다른 면 Lecture 059 → FastVideo — 비슷한 자원 분리 frame 이 video diffusion 에서 어떻게 다른지