KV 캐시 계층화와 프리필-디코드 분리, 같이 쓰면 H200 MoE 서빙 비용이 내려갈까
프리필과 디코드를 분리해 서빙하는 팀, 그리고 LMCache 같은 도구로 KV 캐시를 GPU 밖으로 계층화해 재사용률을 높이려는 팀 모두에게 도움이 되는 글입니다. 두 기법은 각자 따로 검증된 최적화지만, 같이 쓰면 무슨 일이 벌어지는지는 거의 다뤄진 적이 없습니다. 이 글에서 소개하는 논문은 그 결합 효과를 수식으로 구조화하고, 실제로 H200 클러스터에서 측정을 시도했다가 vLLM 엔진이 두 번 죽어버린 경험까지 감추지 않고 보고합니다. 결론을 미리 말하면, 두 기법을 합치는 게 항상 이득은 아니고, 어느 쪽이 이기는지는 하드웨어가 아니라 워크로드의 재사용 패턴이 정합니다.
프리필과 디코드를 나누고, 캐시를 계층으로 쌓는 두 가지 최적화
LLM 서빙 비용은 성격이 전혀 다른 두 단계에서 결정됩니다. 프리필은 프롬프트 전체를 한 번에 처리해 KV 캐시를 채우는 연산 집약적이고 순간적인 작업이고, 디코드는 그 캐시와 모델 가중치를 계속 읽어가며 토큰을 하나씩 뽑아내는 메모리 대역폭 집약적이고 오래 지속되는 작업입니다. 이 둘을 한 GPU 풀에 같이 태우면 하나의 배치 정책이 서로 다른 두 목표(최초 토큰 응답 시간과 토큰당 처리 시간)를 동시에 만족시켜야 해서 결국 둘 다 손해를 봅니다. DistServe가 제안한 프리필-디코드(P/D) 분리는 이 문제를 두 단계를 독립된 GPU 풀로 쪼개고 그 사이에서 KV 캐시를 옮기는 방식으로 풀었습니다.
한편 LMCache 같은 도구는 전혀 다른 낭비를 공략합니다. vLLM의 PagedAttention이 만든 블록 단위 KV 관리 위에서, GPU 메모리(HBM)에만 있던 KV 블록을 호스트 DRAM과 로컬 디스크까지 이어지는 계층으로 흘려보내 요청이 끝나도 버리지 않고 재사용합니다. 문제는 이 두 기법이 서로의 전제를 건드린다는 점입니다. 프리필과 디코드가 한 GPU에 같이 있을 때는 프리필이 만든 KV가 이미 디코드가 쓸 HBM에 그대로 있으니 계층화는 요청 간 재사용에만 도움이 됩니다. 반면 분리된 상태에서는 디코드 워커가 그 KV를 가지고 있지 않으므로 모든 요청이 전송 비용을 물어야 하고, 계층 조회는 여유가 있을 때 참고하는 게 아니라 지연시간에 직접 걸리는 임계 경로가 됩니다. 그 때문에 이 논문은 두 기법을 단순히 더하는 대신, 결합했을 때 실제로 무슨 일이 일어나는지를 분석 모델로 먼저 풀어냅니다.
분리는 캐시의 가치를 높이는 동시에 가장 느린 계층을 못 쓰게 만든다
핵심 관찰은 두 가지이고, 방향이 서로 반대입니다. 첫째, 분리된 프리필 풀은 서버마다 따로 있던 캐시를 하나의 논리적 도메인으로 묶습니다. 인기 있는 프리픽스를 서버마다 중복으로 들고 있을 필요가 없어지므로, 재사용 분포가 한쪽으로 쏠려 있을수록(꼬리가 무거울수록) 같은 용량에서도 적중률이 확실히 올라갑니다. 즉 분리는 계층화의 가치를 끌어올립니다. 둘째, 최초 토큰 응답 시간(TTFT)에는 서비스 수준 목표가 있고, 그 안에서 캐시 조회에 쓸 수 있는 여유 시간은 정해져 있습니다. 분리가 도입한 전송 시간은 정확히 그 여유를 갉아먹고, 계층별 대역폭 차이가 워낙 크기 때문에(아래 그림처럼 HBM과 NVMe 사이에 대략 1,600배 차이가 납니다) 가장 느린 계층부터 임계 경로에서 탈락합니다. 분리를 도입해서 캐시가 더 값어치 있어졌는데, 정작 그 값어치를 실현할 가장 느린 계층은 같은 이유로 못 쓰게 됩니다.
H200 NVL 공개 하드웨어 스펙을 바탕으로 계산한 분석 모델(실측이 아님). 1GB의 KV 캐시를 각 계층에서 복구하는 데 걸리는 시간을 로그 스케일로 비교했습니다. HBM은 약 0.21밀리초, NVMe는 약 333밀리초로 약 1,600배 차이가 나며, 이 격차가 어떤 계층이 지연시간에 민감한 경로에 남을 수 있는지를 사실상 결정합니다.
논문은 실제 수치도 붙입니다. 어텐션 레이어 32개, KV 헤드 8개, 헤드 차원 128, 요소당 2바이트 같은 전형적인 설정에서 토큰당 KV 바이트는 약 13만 바이트로 계산되고, 이는 대략 8,000토큰의 프리픽스가 KV 캐시 1GB에 해당한다는 뜻입니다. HBM에서는 그 1GB를 밀리초 이하로 회수하지만 NVMe에서는 3분의 1초 가까이 걸리므로, 수백 밀리초 단위인 일반적인 TTFT 목표 안에서는 전송에 이미 여유를 소진한 시점에 디스크 계층이 임계 경로에서 자동으로 탈락합니다. 결과적으로 디스크 계층은 동기적으로 조회하는 대상이 아니라 미리 DRAM으로 당겨놓는 비동기 프리페치 역할로 강등해야 한다는 결론이 나옵니다. 두 관찰의 부호가 반대이므로, 최종 효과는 워크로드가 적중률에 의해 제한되는지(이 경우 시너지) 아니면 여유 시간에 의해 제한되는지(이 경우 상쇄)에 따라 갈립니다.
계층 하나를 더 놓을 가치가 있는지 판단하는 손익분기 공식
여기서 실무적으로 중요한 질문은 “DRAM이나 디스크 계층에 용량을 얼마나 투자해야 하는가”입니다. 논문은 재사용 분포가 꼬리가 무거운 멱법칙을 따른다고 가정하고, 용량을 늘릴 때마다 얻는 적중률 증가분이 체감한다는 전제 아래 손익분기 용량을 유도합니다. 매 바이트를 추가할 때 얻는 편익은 그만큼 아끼는 프리필 재계산 비용이고, 잃는 비용은 그 바이트를 유지하는 임대료입니다. 이 둘을 같게 놓으면 계층 t의 경제적으로 최적인 용량이 재사용 분포의 꼬리 지수(베타)에 대해 1/(1-베타) 승수로 나타나는데, 이 지수가 1에 가까워질수록(재사용이 고르게 퍼져 있을수록) 필요한 용량이 초선형으로 폭증합니다.
요청률·프리필 재계산 비용·GPU 단가·저장 임대료를 예시 값으로 고정하고 계산한 분석 모델(실측이 아님). 재사용 꼬리 지수 베타가 1에 가까워질수록 손익분기 용량이 로그 스케일에서도 가파르게 치솟는 모습을 보여줍니다.
이 민감도가 뜻하는 바는 분명합니다. 계층화 용량은 하드웨어보다 워크로드의 성질에 훨씬 크게 좌우되므로, 같은 H200 클러스터라도 서비스마다 필요한 DRAM·NVMe 용량이 한 자릿수 이상 다를 수 있고, 한 배포에서 얻은 프로비저닝 가이드를 다른 배포에 그대로 옮겨 쓸 수 없습니다. 게다가 이 최적 용량은 앞서 나온 여유 시간 제약과 별개로 검증되어야 합니다. 분리를 공격적으로 해서 여유 시간이 이미 좁아진 상태라면, 손익분기 공식이 아무리 큰 용량을 정당화해도 디스크 계층은 임계 경로에 올라갈 수 없고, 남는 선택은 그 계층을 프리페치로 돌리는 두 계층 구성뿐입니다.
H200에서 실제로 측정하려다 vLLM 엔진이 두 번 죽었습니다
여기까지가 분석 모델이고, 논문의 원래 목표는 여기에 실측 지연시간-비용 곡선을 얹어 Metis 인퍼런스 서빙 스택의 프로비저닝을 결정하는 것이었습니다. 실제로 2026년 7월 27일, 사내 H200 클러스터(tkai-prod-compute-h200, 노드 tk-ai-wkld-wk-gpu-003)에서 단일 H200 NVL GPU로 검증을 시도했습니다. MoE 스윕에 GPU 시간을 쓰기 전에 하네스와 이미지, LMCache 커넥터, 지표 수집 경로가 제대로 도는지만 먼저 확인하려고, MoE가 아닌 작은 밀집 모델(Qwen2.5-0.5B-Instruct)을 카나리아로 골랐습니다. 가중치 다운로드는 148.7초 만에 정상적으로 끝났지만, 그 다음 vLLM 엔진 코어 초기화가 실패했습니다. 그것도 두 번입니다. 한 번은 KV 블록 예산을 강제로 제한하는 옵션을 켠 채로, 한 번은 그 옵션을 끈 채로 재시도했는데도 똑같이 실패했습니다.
에러 메시지는 “엔진 코어 초기화 실패, 근본 원인은 위를 참조”라는 형태로, 정작 그 근본 원인이 담긴 로그 줄은 하네스가 캡처하지 못한 엔진 자체 로그 스트림 쪽에 있었고 실패한 코어 프로세스 목록도 빈 채로 보고되었습니다. 실제 원인은 특정할 수 없었고, 지연시간이든 처리량이든 비용이든 성능 샘플은 단 하나도 나오지 않았습니다. 공개된 vLLM 이슈들을 뒤져보니 이 정확히 동일한 문구가 최소 네 건의 서로 무관한 이슈(체크포인트 불일치, GPU 메모리·캐시 블록 고갈, 텐서 병렬 설정 문제, 플랫폼별 문제)에서 반복적으로 나타났습니다. 이 예외 문구 자체가 원인을 구분해주지 못하는, 사실상 진단 가치가 거의 없는 포괄 예외였다는 뜻입니다. KV 블록 예산 강제 옵션이 LMCache 커넥터의 계층 크기 계획과 충돌했을 수 있다는 가설도 세워봤지만, 그 옵션을 뺀 재시도도 똑같이 실패했다는 사실이 이 가설을 스스로 약화시켰기 때문에 논문은 이를 확인된 결론이 아니라 검증되지 못한 가설로만 남겨둡니다. 이전에 발표한 동적 배치 튜닝 보고서에서도 좁은 범위의 무효 결과를 그대로 보고했던 전례를 따라, 이번에도 측정치를 대신 채워 넣지 않고 실패 그 자체를 결과로 보고했습니다.
이 논문이 회사, 사회, 과학 각각에 남기는 것
회사 입장에서 이 논문의 실질적 가치는 성능 수치가 아니라 의사결정 프레임워크와 위험 신호입니다. 손익분기 공식과 여유 시간 제약식은 Metis 인퍼런스 서빙 팀이 DRAM·NVMe 계층 용량을 벤더 주장이 아니라 우리 자신의 재사용 분포로 판단해야 한다는 근거를 줍니다. 그리고 실험 실패는 그 자체로 하나의 경고입니다. 엔진의 메모리 크기 설정과 서드파티 KV 커넥터의 계층 계획 로직 사이의 시작 시점 계약은 실제로 취약하고 관측하기 어려운 실패 지점이었고, 본격적인 용량 투자 전에 로그 스트림까지 제대로 캡처하는 카나리아 검증이 필수라는 것을 이번 사고로 직접 확인했습니다.
사회적으로 보면, KV 캐시 재계산으로 낭비되는 GPU 시간은 실제 에너지 낭비이고, 토큰당 비용이 낮아지면 더 작은 조직도 LLM 추론에 접근하기 쉬워집니다. 다만 이 효과는 조건부입니다. 계층화는 손익분기 조건을 만족할 때만 비용을 낮추고, 그 지점을 넘어서 과잉 투자하면 한 종류의 낭비를 다른 종류의 낭비로 바꿀 뿐입니다. 그래서 이 논문이 던지는 공익적 메시지는 “계층화를 무조건 켜라”가 아니라 “투자하기 전에 재사용 분포부터 재라”에 가깝습니다.
과학적으로는 프리필-디코드 분리 문헌과 KV 캐시 계층화 문헌이 각각 성숙했음에도 둘을 하나의 변수 공간에서 같이 다룬 연구가 없었다는 공백을 메웁니다. 분리가 캐시의 가치를 높이는 동시에 가장 느린 계층의 가용성을 낮춘다는, 부호가 반대인 두 힘이 공존한다는 사실을 명시적으로 보여주고 그 균형점이 하드웨어가 아니라 워크로드의 성질(재사용 꼬리 분포)로 결정된다는 것을 비용-지연시간 파레토 프론티어 논의에 추가된 축으로 제시합니다.
한계, 그리고 다음에 확인해야 할 것들
이 논문의 가장 근본적인 한계는 이미 밝힌 대로 성능이든 비용이든 실측치가 하나도 없다는 점입니다. 재사용 분포를 멱법칙으로 가정한 모델도 실제 워크로드가 시간에 따라 인기 프리픽스가 바뀌는 비정상성을 가진다면 꼬리 지수 자체가 흔들려 손익분기 공식의 정밀한 형태가 무너질 수 있습니다. 설령 실험이 성공했더라도 검증용으로 고른 모델이 작고 밀집형이라 MoE의 비용 구조를 전혀 반영하지 못했을 것이고, 단일 GPU 구성이라 분리가 만드는 전송 비용 항목도 실제로는 검증하지 못했을 것입니다. vLLM 이슈 진단도 우리가 직접 재현한 게 아니라 공개된 보고를 참고한 것이라 신중하게 좁혀서 해석해야 합니다.
다음 단계는 논문이 순서까지 구체적으로 제시합니다. 먼저 하네스가 엔진의 자식 프로세스 로그까지 전부 캡처하도록 고치고 이미지 태그도 고정해 재현성을 확보해야 합니다. 그 다음 KV 블록 예산 옵션과 LMCache 커넥터 활성화 여부를 교차한 2x2 실험으로 이번 실패의 진짜 원인을 좁히고, 계층별 고정 오버헤드를 프리픽스 길이를 바꿔가며 실측하고, 실제 프로덕션 프롬프트 트레이스를 캐시 시뮬레이터에 흘려 재사용 분포의 꼬리 지수를 GPU 없이 오프라인으로 추정합니다. 이 네 단계가 끝난 뒤에야 비로소 실제 MoE 모델과 멀티 노드 구성으로 프리필-디코드 비율과 계층 구성을 조합한 스윕을 돌려 지연시간-비용 프론티어를 얻고, 그 실측 결과를 이 논문의 분석 공식과 대조해 어긋난 정도를 보고하는 순서입니다.
논문 상세 페이지는 여기에서 확인할 수 있습니다: https://huggingface.co/datasets/thaki-AI/daily-paper-2026-07-28-kv-cache-tiering-pd-disagg-cost
관련 슬라이드
본문 내용을 NotebookLM(structured_mint 스타일)으로 요약한 슬라이드입니다.



