StorageReview.com

장기 컨텍스트 추론을 위한 토큰 효율적인 경로: KV 캐시를 플래시로 오프로드

AI  ◇  기업

기업 AI 인프라는 학습 모델 최적화에서 모델 서비스 제공으로 전환되었으며, 이는 경제성에 변화를 가져왔습니다. 학습은 최종 목표가 있는 자본 투자 프로젝트입니다. 반면 추론은 서비스가 운영되는 동안 지속적으로 실행되는 프로덕션 워크로드이며, 출력은 토큰으로 측정됩니다. 이것이 바로 현재 AI 운영자들이 직면한 토큰 경제 문제입니다. GPU를 설치하고 전력 예산을 설정하면, 비즈니스는 하드웨어가 생성하는 토큰의 양에 따라 좌우됩니다.

길고 복잡한 대화 처리 작업에서는 대화가 진행됨에 따라 동일한 컨텍스트가 모델을 통해 반복적으로 전달됩니다. GPU는 이미 해당 토큰을 한 번 처리하는 데 비용을 지불했지만, 키-값 캐시가 비워지면 시스템은 해당 컨텍스트를 다시 채워야 합니다. 이는 시스템이 재계산을 수행하게 만드는 원인이 됩니다. 어떤 규모에서든 이는 단순한 오차가 아닙니다. 전력 소모, GPU 시간, 대기열 증가 또는 추가 하드웨어 비용 증가로 이어집니다.

kv 캐시 오프로드 델 xe7740

즉각적인 해결책은 랙에서 가장 비싼 리소스, 즉 더 많은 GPU와 DRAM을 구매하는 것입니다. 하지만 재계산은 이미 재사용 가능한 결과를 만들어냈습니다. KV 캐시는 단순한 데이터일 뿐이며, 저렴하게 저장하고 검색할 수 있습니다. 따라서 약간의 재로드 비용만 지불하면 값비싼 사전 채우기 연산을 피할 수 있습니다. 그러므로 문제는 캐시를 유지할지 여부가 아니라 어디에 저장할지이며, 이는 성능 문제만큼이나 비용 문제이기도 합니다. VRAM은 가장 빠른 계층이지만 가장 희소합니다. VRAM이 포화되면 추론 서버는 캐시에서 데이터를 제거하기 시작합니다. DRAM은 가격이 급격히 상승하지만 여유 공간을 확보할 수 있습니다. 플래시 메모리는 상황을 바꿀 수 있는 지점입니다. DRAM보다 속도는 느리지만 테라바이트당 가격이 훨씬 저렴하며, 빠른 계층에서 버려야 하는 컨텍스트를 저장할 수 있는 충분한 용량을 제공합니다. 이는 전체 대화를 재처리하는 것과 단순히 읽어오는 것 사이의 차이를 만듭니다.

영향을 측정하기 위해 Dell PowerEdge XE7740에서 멀티턴 에이전트 테스트 워크로드를 구축하고 모델, GPU 및 서비스 스택을 고정했습니다. 시스템 규모를 결정하는 데 중요한 수치는 메모리 계층이 가득 찬 후의 상황입니다. 그 지점을 넘어서자 플래시 메모리는 초당 약 30,000개의 토큰을 처리하며 DRAM의 17,000개보다 높은 성능을 보였고, 자체 피크 용량의 94%를 유지한 반면 DRAM 계층은 42%까지 떨어졌습니다. 두 오프로드 계층 모두 피크 시점에서 VRAM만 사용하는 기준선보다 훨씬 높은 성능(DRAM 2.9배, 플래시 2.2배)을 보였지만, 피크 시점은 DRAM 계층의 용량이 거의 바닥나는 시점과 정확히 일치합니다. 가장 비싼 메모리가 피크 시점을 감당하는 반면, 플래시 메모리는 컨텍스트가 계속 증가함에 따라 피크 용량을 유지합니다.

결과를 살펴보기 전에 KV 캐시가 무엇인지, 왜 캐시가 가득 차는지, 그리고 시스템에 캐시를 저장할 더 저렴한 곳이 없을 때 추론 성능이 왜 급격히 저하되는지 정확히 짚어볼 필요가 있습니다.

주요 요점

  • 플래시 메모리는 DRAM이 유지할 수 없는 것을 유지합니다. 세 가지 구성 모두 메모리 부족으로 인해 데이터가 강제로 제거될 때까지 동일한 성능을 보입니다. VRAM이 먼저 포화 상태에 이르고, 512GB DRAM 계층은 실행 시작 후 약 45분 만에 가득 차서 데이터 제거가 시작됩니다. 그 시점 이후에는 플래시 메모리가 초당 약 30,000개의 토큰을 처리하는 반면 DRAM은 17,000개에 그치며, 플래시 메모리는 최대 처리량의 94%를 유지하는 반면 DRAM은 42%까지 떨어집니다.
  • 오프로드를 통해 재계산으로 인해 손실된 처리량을 복구할 수 있습니다. 최대치에서 KV 캐시 오프로드는 DRAM 계층에서 VRAM만 사용했을 때보다 전체 서비스 처리량을 최대 2.9배, 플래시에서는 2.2배까지 향상시켰습니다. 이러한 성능 향상은 GPU가 이미 계산한 컨텍스트를 오프로드 계층에서 다시 읽어오기 때문에 재충전 과정을 생략할 수 있기 때문입니다.
  • 기존 사용자들이 가장 큰 차이를 느낍니다. 재개된 세션에서 최악의 경우 첫 번째 토큰 지연 시간은 VRAM 전용 기준에서 13.9초였지만 플래시 메모리에서는 3.2초였습니다. 오프로드 덕분에 이러한 지연 시간이 대화형 사용자가 견딜 수 있는 범위 내로 유지됩니다.
  • 에이전트 트래픽으로 인해 퇴거 비용이 많이 든다: 일주일 동안 계측된 Claude Code 트래픽 분석 결과, 98.16%가 캐시 읽기였고, 실제로 사용되지 않는 입력은 0.02%에 불과했습니다.
  • KV 오프로드는 쓰기 작업량이 많은 워크로드로, 높은 내구성을 요구하는 드라이브가 필요합니다. 모델이 생성하는 모든 토큰은 KV 항목을 기록하고, TTL 변경으로 인해 티어가 24시간 내내 재기록됩니다. 테스트한 지속적인 쓰기 속도에서 미러링된 RAID10 어레이는 드라이브당 하루 약 3.2회 쓰기를 기록했으며, RAID0으로 스트라이핑할 경우 약 1.6회 DWPD로 떨어져 D7-PS1030의 3 DWPD 등급과 유사한 성능을 보였습니다. 플래시 티어의 핵심 제약 조건은 용량이나 속도가 아니라 내구성이며, 캐시가 일회용이기 때문에 쓰기 작업에 특화된 드라이브를 이처럼 혹사시키는 것은 용인 가능한 수준입니다.

추론은 어떻게 작동하는가

대규모 언어 모델은 자기회귀적입니다. 즉, 각 출력 토큰은 그 이전에 나온 모든 토큰에 의해 조건화됩니다. 어텐션 메커니즘은 시퀀스의 각 토큰에 대해 쿼리(Q) 벡터를 계산하고, 이 Q 벡터를 이전 토큰들의 키(K) 및 값(V) 벡터와 비교함으로써 이러한 조건화를 구현합니다. 어텐션 출력은 값들의 가중 조합이며, 가중치는 QK 내적에서 얻어집니다.

요청이 도착하면, 요청의 모든 토큰에 대한 K 및 V 텐서가 준비될 때까지는 응답할 수 없습니다. 첫 번째 단계는 사전 채우기(prefill)입니다. 엔진은 단일 병렬 패스로 모델을 통해 요청을 처리하고 결과 K 및 V 텐서를 메모리에 기록합니다. 따라서 사전 채우기는 연산 집약적인 작업이며, 지연 시간은 요청 길이에 따라 증가합니다.

사전 채우기가 완료되면 엔진은 토큰을 하나씩 순차적으로 출력합니다. 각 새 토큰은 이전 모든 토큰의 K와 V 값을 읽어와 어텐션 출력을 계산하고, 다음 단계를 위해 자신의 K와 V 값을 메모리에 저장합니다. 이 두 번째 단계가 디코딩입니다. 각 토큰을 생성할 때 이전 모든 토큰의 캐시된 K와 V 텐서를 메모리에서 불러와 어텐션을 계산한 후, 새 토큰의 K와 V 텐서를 다음 단계를 위해 메모리에 저장해야 하므로 디코딩은 순차적이며 메모리 대역폭에 제약을 받습니다.

두 단계에서 생성된 K와 V 텐서는 KV 캐시 역할을 합니다. 이 캐시가 없으면 n+1번째 토큰을 생성할 때마다 이전 n개 토큰의 키와 값을 모두 다시 계산해야 하므로 계산 복잡도가 제곱에 비례합니다. 캐시가 있으면 각 새 토큰은 자신의 K와 V 값만 계산하고 나머지는 메모리에서 읽어오므로 토큰당 비용이 선형적으로 유지됩니다.

에이전트 트래픽이란 어떤 모습일까요?

추론 과정이 메모리 대역폭 제약을 받는다고 흔히들 설명하는데, 이는 디코딩 과정이 응답의 사용자에게 보이는 부분에서 대부분을 차지하기 때문입니다. 하지만 실제 두 단계 간의 균형은 작업 부하에 따라 달라집니다. 짧은 프롬프트에 긴 에세이 작성을 요구하는 경우는 디코딩 부담이 크고, 긴 에이전트형 프롬프트에 간단한 JSON 편집을 요구하는 경우는 프리필 부담이 큽니다. 어느 쪽이 더 많은 작업을 처리하는지에 따라 캐시 관리가 잘못될 경우 어떤 부분에 부하가 걸리는지가 결정됩니다.

재계산 문제의 형태는 이러한 균형에서 비롯되며, "에이전트"는 광범위한 사용 패턴을 포괄합니다. 에이전트 코딩은 현재 가장 인기 있는 패턴 중 하나이며, OpenRouter 리더보드 에서 사용되는 토큰의 상당 부분을 차지합니다. 대표적인 사례를 정량화하기 위해 Claude Code에 OpenTelemetry(OTEL) 로깅을 설치하고 일주일 동안의 추적 데이터를 Grafana로 내보냈습니다. 토큰 트래픽 유형별 분석 결과는 아래와 같습니다. 참고: 이 Claude Code 사용량은 컨텍스트 길이 1M인 Claude Opus 4.8 모델에서 여러 코딩 프로젝트를 동시에 작업하는 환경에서 측정되었습니다.

캐시 읽기는 전체 토큰 트래픽의 98.16%를 차지했습니다. 캐시 생성(이전에 사용된 접두사가 만료되어 다시 채워지는 경우)은 1.52%였습니다. 출력 토큰은 0.30%였고, 실제로 사용되지 않은 입력 토큰은 0.02%였습니다.

트래픽의 98%가 캐시 읽기인 워크로드에서 오프로드 없이 캐시를 제거하면 시스템이 수행하려던 작업의 대부분을 다시 채워야 합니다. 병목 현상은 일반적으로 최적화되는 디코딩 대역폭에서 GPU가 이미 이전 턴에서 수행한 프리필 컴퓨팅으로 이동합니다. 실제로, 동일한 이유로 프리필이 게이팅 단계이기 때문에 대규모 분산형 서빙 아키텍처에서 디코딩 워커보다 프리필 워커를 더 많이 실행하는 경우가 흔합니다.

98%라는 수치는 한 사용자의 트래픽 구성을 나타낸 것입니다. 짧은 대화량으로 이루어진 채팅 작업에서는 콜드 트래픽이 더 많이 나타날 수 있습니다. 대화마다 다른 문서를 다시 제공하는 검색 강화 시스템에서도 마찬가지입니다. 이러한 일반적인 형태는 대화가 길고, 접두사가 안정적이며, 사용자가 동일한 컨텍스트로 계속 돌아오는 경우에 나타납니다.

캐시가 있는 위치와 캐시가 가득 차면 어떤 일이 발생하는지

이 캐시는 실제로 어디에 저장되며, 공간이 부족해지면 어떻게 될까요? 모델 가중치 로드가 완료되면 남은 VRAM은 고정 크기 블록으로 분할된 KV 캐시 공간이 되며, 엔진은 시작 시 저장할 수 있는 토큰 수를 알려줍니다. KV 오프로딩을 사용하지 않는 표준 설정에서는 이 캐시 풀이 유일한 저장 공간입니다.

GPU 서버는 고가이며 토큰이 상품이기 때문에 목표는 서버에 24시간 내내 요청을 지속적으로 공급하는 것입니다. 즉, 컴퓨팅 자원이 유휴 상태로 있지 않도록 처리 대기 중인 요청들을 소량씩 GPU에 로드해 두는 동시에, 서비스 수준 목표(SLO) 내에서 응답 지연 시간을 유지하기 위해 큐의 균형을 맞춰야 합니다. 모든 요청이 전체 컨텍스트 윈도우를 소모하는 것은 아니므로, 완료된 키-값(KV)은 대부분 VRAM에 캐시됩니다. 하지만 지속적인 부하가 걸리면 캐시가 가득 차게 되고, 캐시가 가득 차면 오래된 항목들이 제거되어 공간을 확보합니다.

이상적인 세상에서는 모든 답변을 한 번에 처리하고 끝낼 수 있겠지만, 모델은 아직 그 정도로 발전하지 않았기 때문에 에이전트 루프를 실행하여 사용자 또는 에이전트 간에 주고받는 과정을 반복합니다. 다음 차례가 되면, 해당 키-값(KV)이 아직 캐시되지 않은 경우 엔진은 지금까지의 모든 대화 내용과 새로운 토큰을 다시 처리합니다. 이전 차례의 컨텍스트가 모델을 통해 다시 실행되고, GPU가 이미 해당 토큰에 대해 수행한 계산 비용은 이후의 모든 차례에 대해 두 번째, 세 번째, 그리고 그 이후에도 계속해서 지불됩니다. 이러한 과정은 순전히 낭비입니다.

KV 캐시 오프로드 변경 사항은 무엇인가요?

VRAM이 가득 차는 순간 캐시를 제거하는 대신, 오프로드 기능은 캐시를 계층 구조에 따라 VRAM에서 시스템 메모리, 그리고 SSD로 점진적으로 이동시킵니다. 자주 사용되는 데이터는 VRAM에 유지되고, 더 이상 저장할 수 없는 데이터는 시스템 메모리로 이동하며, 시스템 메모리마저 가득 차면 다시 SSD 또는 네트워크 스토리지 계층으로 이동합니다. 따라서 실제 캐시 제거는 메모리 부족이 아닌 사용자가 설정한 TTL(Time-to-Live) 값에 의해 이루어지므로 매우 드물게 발생합니다.

다음 턴이 시작될 때, 수만 개의 컨텍스트 토큰을 다시 계산하는 대신 RAM이나 플래시 스토리지에서 키-값(KV)을 가져옵니다. 시스템 메모리에서 다시 로드하는 데 약간의 지연 시간이 발생하지만, 사전 채우기를 다시 수행하는 것보다 훨씬 저렴하고 빠릅니다. NVMe에서 다시 로드하는 것은 DRAM에서 가져오는 것보다 약간 느리지만, 여전히 재계산을 대체하는 것보다 훨씬 빠릅니다. 스토리지 용량은 비교적 저렴하지만 GPU 연산은 그렇지 않으므로, 턴 시작 시 약간의 재로드 지연 시간을 감수하더라도 수 초가 걸리는 재계산을 건너뛰는 것이 결과적으로 이득입니다.

테스트 방법

저희 연구실에서 이를 테스트해 보았습니다. 시스템 구성은 다음과 같습니다.

  • 서버: Dell PowerEdge XE7740
  • GPU: NVIDIA RTX PRO 6000 Blackwell Server Edition 4개 (96GB)
  • 시스템 메모리: 1TB DDR5 (16 x 64GB 5200MT/s DDR5)
  • 저장 장치: Solidigm PS1030 12.8TB E3.S 드라이브 8개 (RAID10)
  • 서비스 스택: vLLM 0.22.0 및 LMCache 0.5.0
  • 모델: 미니맥스-M2.7

테스트 플랫폼은 이러한 워크로드에 완벽하게 적합합니다. Dell의 PowerEdge XE7740은 엔터프라이즈 AI 추론을 위해 특별히 설계된 PCIe Gen5 섀시로, 최대 8개의 더블 와이드 GPU를 지원합니다. 저희가 사용한 4개 GPU 구성은 가장 인기 있는 구성 중 하나입니다. 이 구성은 광범위한 추론 환경에 충분한 가속기 용량을 제공하며, 수요 증가에 따라 동일한 시스템에서 최대 8개까지 확장할 수 있는 여유 공간을 제공합니다. 각 NVIDIA RTX PRO 6000 Blackwell Server Edition은 96GB의 GDDR7 메모리를 제공하므로, 4개의 카드는 GPU 캐시를 사용하기 전에 상당한 양의 VRAM을 확보할 수 있습니다. 오프로드 계층은 RAID10으로 구성된 8개의 12.8TB Solidigm D7-PS1030 드라이브에서 작동하며, Gen5 고내구성 플래시 메모리는 KV 캐시 계층에서 발생하는 지속적인 쓰기 작업에 적합합니다. 마지막으로, 테스트에 사용된 MiniMax-M2.7 모델은 당시 4개 GPU 구성에 적합한 최고의 오픈 코딩 모델 중 하나였습니다.

kv 캐시 오프로드 Solidigm 1030 SSD

우리는 세 가지 구성을 테스트했습니다.

  1. VRAM 기준선은 오프로드가 없는 기본 vLLM으로, VRAM에 들어갈 수 있는 모든 데이터는 캐시되고 나머지는 모두 제거됩니다.
  2. LMCache가 시스템 메모리로 오프로딩되며, 오프로딩을 위해 512GB가 할당되었습니다.
  3. LMCache는 로컬 RAID10 NVMe 어레이를 오프로드 계층으로 사용하고, 그 앞에 64GB RAM 스테이징 버퍼를 배치하여 플래시 메모리로 데이터를 오프로딩합니다.

본 연구에서는 고정된 합성 접두사 스윕이 아닌 실제 에이전트 코딩 트래픽을 기반으로 워크로드를 모델링했습니다. 해당 트래픽은 프리필 작업이 많고 디코딩 작업은 적으며, 접두사 재사용이 광범위하게 이루어집니다. 세션은 분당 λ = 2.5개의 세션 비율로 포아송 분포를 따라 도착합니다. 각 세션은 여러 턴에 걸쳐 실행됩니다. 각 턴에서 모델은 짧은 추가 작업을 입력받는데, 일반적으로 250~600 토큰 길이의 도구 또는 명령 결과이며, 때때로 1,500~3,500 토큰 길이의 파일 읽기 작업도 포함됩니다. 모델은 짧은 응답을 출력하는데, 일반적으로 40~200 토큰 길이의 도구 호출 또는 간단한 추론이며, 때때로 400~900 토큰 길이의 코드 블록도 포함됩니다. 턴 길이는 ±100 토큰만큼 변동됩니다. 세션은 컨텍스트 상한선인 64 토큰까지 단조롭게 증가하며, 이 상한선에 도달하면 작업 세트가 VRAM 용량을 초과하는 심층 컨텍스트 영역에 진입하게 됩니다. 동일한 시드 로드가 세 가지 계층 모두에 적용되며, 각 계층은 3분간의 캐시 웜업 시간을 갖습니다.

메모리 구성에 대해 간단히 설명드리겠습니다. XE7740은 최고 사양인 2TB DDR5 메모리가 탑재된 상태로 출고되었는데, 이는 다양한 프로젝트를 지원하기 위한 구성이었으며, 2026년 메모리 가격 급등 이전 가격으로 책정된 제품이었습니다. 현재 기업에서 4개의 GPU를 사용하는 경우, 원래 구성은 일반적인 주문량에 비해 과도한 사양이었기 때문에, 보다 현실적인 구성을 위해 1TB의 메모리를 제거하고 채널당 DIMM 하나씩만 남겨 최대 메모리 처리량을 유지했습니다.

플래시 계층에 대한 방법론적 참고 사항: 테스트 실행에는 LMCache의 로컬 디스크 백엔드가 사용되었으며, 어레이 앞에 64GB RAM 스테이징 버퍼가 필요했습니다. 플래시에 저장된 KV(키보드 값) 크기는 테스트 실행 과정에서 호스트의 전체 DRAM 용량을 훨씬 초과하여 증가했으므로, 지속적인 결과는 호스트 메모리보다는 드라이브 서비스 성능을 반영합니다.

성능

부하 시 처리량

KV 작업 세트가 각 계층이 수용할 수 있는 용량을 초과함에 따라 전체 서비스 처리량은 다음과 같습니다.


캐시가 채워지는 처음 10분 동안은 모든 계층이 함께 성능을 끌어올리며, 성능 차이는 거의 없습니다. 그 후 메모리 계층이 가득 차면 각 계층이 분리됩니다. VRAM만 사용하는 기준선이 먼저 정체됩니다. VRAM이 포화되면 초당 총 토큰 수가 약 12,000개 수준에서 안정화됩니다. 새 세션이 시작되면 이전 세션이 제거되고, 해당 세션이 다시 시작되면 제거된 캐시를 처음부터 다시 구축해야 하므로 매초 더 많은 시간이 디코딩보다 캐시 재충전에 사용됩니다.

DRAM 및 SSD 계층은 캐시가 가득 찰 때까지 거의 모든 접두사를 재계산하는 대신 메모리나 디스크에서 제공하기 때문에 해당 정체기를 훨씬 넘어 계속 상승합니다. 기준선에서 캐시 재충전에 소요되는 시간은 대신 새로운 토큰을 생성하는 데 사용됩니다.

최대 부하 시, 오프로드는 DRAM 계층에서 기준치 대비 최대 2.9배(+188%), 플래시 계층에서 최대 2.2배(+122%)의 총 서비스 처리량을 제공했습니다. 작업 세트가 VRAM 용량을 초과하기 전까지는 세 가지 구성 모두 서로 1% 이내의 차이를 보였습니다. 메모리에서 데이터가 제거되는 경우는 없었으므로 오프로드를 통해 복구할 데이터도 없었습니다. 이러한 이점은 메모리 부족으로 인해 데이터가 제거될 때만 나타나며, 서버 부하가 높아질수록 더욱 커집니다.

더 큰 용량의 스토리지 계층이 필요한 이유는 DRAM이 가득 차기 시작할 때 분명해집니다. 이 부하에서 512GB RAM 캐시는 실행 시작 후 약 45분 만에 포화 상태에 이르며, 그 이후에는 캐시된 데이터를 제거하기 시작해야 합니다. 이때 반환되는 접두사(prefix)가 캐시에서 누락되어 다시 채워지는데, 이는 캐시가 방지하고자 했던 바로 그 재계산 과정입니다. 반면 테라바이트급의 여유 용량을 가진 SSD 계층은 이러한 한계에 도달하지 않습니다. 한계를 넘어서면 플래시 메모리는 초당 약 3만 개의 토큰을 처리하는 반면, DRAM은 약 1만 7천 개의 토큰만 처리하여 RAM 용량이 소진된 후에는 SSD가 75% 더 높은 처리량 우위를 보입니다. 다시 말해, 포화 상태에 도달한 후 DRAM 계층은 최대 처리량의 42%만 제공하는 반면, SSD 계층은 94%를 제공합니다. 이것이 바로 전체 과정의 핵심인 용량 계층 구조입니다. VRAM이 먼저 소진되고, 512GB DRAM 계층이 나중에 소진되며, 기가바이트가 아닌 테라바이트 단위로 측정되는 스토리지 계층은 사실상 용량이 부족해지는 일이 없으므로, 더 빠른 계층들이 데이터를 버리기 시작한 후에도 오랫동안 컨텍스트를 계속 제공합니다.

총 처리량 수치를 해석할 때 한 가지 주의할 점은, 초당 수만 개의 토큰이라는 수치가 GPU가 토큰을 계산하는 속도가 아니라 오프로드 계층의 서비스 처리 속도라는 것입니다. 총 처리량은 각 요청에 포함된 모든 입력 프리필 토큰과 모든 출력 디코딩 토큰을 합산합니다. 하지만 캐시가 있는 경우, 캐시 적중 시 GPU에서 다시 프리필하는 대신 DRAM이나 플래시 메모리에서 접두사의 키 값(KV)을 불러옵니다.

사용자가 실제로 기다리는 처리량 부분인 출력 토큰 수로 계산 범위를 제한하면 더 명확한 그림을 얻을 수 있습니다.

출력 토큰의 경우, 캐시가 채워지는 동안 세 계층 모두 비슷한 추이를 보이다가 캐시가 포화되는 시점에서 분리됩니다. DRAM 계층은 초당 약 300개의 토큰을 처리하며 기준치 대비 75% 증가한 수치를 기록한 후, 캐시가 비워지기 시작하면서 다시 감소합니다. 플래시 메모리는 나머지 기간 동안 초당 약 250개의 토큰을 처리하며 기준치 대비 46% 증가한 수치를 유지합니다. RAM과 SSD의 추이는 DRAM이 포화될 때까지 약 10% 이내의 차이를 유지하다가 그 이후에는 격차가 벌어집니다.

첫 번째 토큰 대기 시간: 사용자가 기다리는 시간

처리량은 총 토큰 생산량을 측정합니다. 첫 토큰 수신 시간은 개별 사용자가 체감하는 시간, 즉 전송 버튼을 누른 시점부터 첫 토큰이 수신될 때까지의 대기 시간을 측정합니다. 작업 세트가 증가하고 각 계층이 채워짐에 따라 실행 기간 동안 중앙값을 기준으로 해당 시간을 그래프로 나타냅니다.

캐시가 유지되는 동안 세 계층 모두 약 0.5초 만에 첫 번째 토큰을 반환합니다. 그 후 처리량 순서와 동일하게 각 계층의 성능이 차이를 보이기 시작합니다. 기준선이 먼저 무너집니다. 실행 초반에 10초를 넘어서는 반면, DRAM 계층은 512GB 용량이 약 45분 시점에 가득 찰 때까지 1초 미만의 TTFT(Time To Fly Time)를 훨씬 오랫동안 유지합니다. 그 후, 데이터를 제거하고 재계산을 시작하면서 지연 시간이 급격히 증가합니다. SSD 계층은 가장 완만하게 성능이 저하되며 실행 후반부에 세 계층 중 가장 낮은 지연 시간을 유지합니다.


그 반전은 티어링 논쟁을 축소판으로 보여주는 예입니다. 작업 세트가 해당 티어에 적합할 때는 DRAM이 지연 시간 측면에서 유리하지만, 작업 세트가 해당 티어에 적합하지 않게 되면 플래시 메모리가 지연 시간 측면에서 유리해집니다. 플래시 메모리는 DRAM 티어가 버리기 시작한 컨텍스트 정보를 계속 저장하고 있기 때문입니다.

재방문자 문제

위의 지연 시간 수치는 연속 세션 내의 턴을 기준으로 합니다. 재방문 사용자의 경우는 다릅니다. 세션이 대화 도중 일시 중지되고 약 15분 동안 유휴 상태로 있다가 중단된 지점에서 다시 시작됩니다. 우리는 약 20번의 턴 후 휴면 상태에 들어갔다가 15분 후에 다시 시작되는 코호트를 사용하여 이를 모델링했습니다. 이는 바쁜 서버가 그동안 캐시를 통해 다른 트래픽을 처리하기에 충분한 시간입니다. 각 계층의 측정 기간 내에 이러한 재시작이 11번 발생했으며, 모든 계층에 동일한 워크로드가 시드되었기 때문에 매 실행마다 동일한 11개의 세션이 재시작되어 턴 재개에 대한 공정한 비교가 가능했습니다. 아래 차트는 각 계층의 일반 턴과 재시작 턴에서의 첫 번째 토큰 획득 시간 중앙값을 나타내며, 수염은 샘플에서 가장 느린 재시작 시간을 표시합니다.

중앙값 기준으로 보면, 수치는 메커니즘이 예측하는 바를 확인시켜 줄 뿐이며, 각 계층은 예상 순서대로 배열됩니다. DRAM이 가장 빠릅니다. 휴면 세션이 재개되는 데 0.6초가 걸리는데, 이는 일반적인 재개에 걸리는 0.5초보다 약간 높은 수치입니다. SSD는 0.8초로 두 번째로 느립니다. NVMe 페치가 DRAM 페치보다 느리다는 것은 이미 알려진 사실이며, 이러한 차이가 결과에 반영된 것으로 보입니다. VRAM만 사용하는 기준선은 1.4초로 가장 느립니다. 오프로드할 대상이 없기 때문에 유휴 세션의 접두사가 활성 트래픽을 위해 GPU 메모리에서 제거되었고, 첫 번째 재개 시 이를 다시 계산해야 합니다. 전체적으로 보면, 속도 차이는 최대 1초 정도에 불과합니다.

최상의 경우는 선택이 이루어지는 시점이 아닙니다. 각 계층에서 11번의 재접속 중 최악의 경우는 DRAM에서 0.8초, SSD에서 3.2초, 기준선에서 13.9초입니다. 첫 토큰을 기다리는 데 14초가 걸리는 것이 허용 가능한 수준인지 아니면 심각한 SLO 위반인지는 서비스에 따라 다르지만, 상호작용이 필요한 서비스의 경우 후자에 해당하며, 오프로드 계층만이 사용자가 견딜 수 있는 범위 내에서 이러한 대기 시간을 유지합니다. 또한, 재계산 비용은 재접속 사용자가 축적한 기록량에 따라 증가하기 때문에, 처리량 테스트의 더 깊은 맥락에서는 기준선의 대기 시간이 14초를 훨씬 넘는 반면, DRAM과 SSD는 제한된 재로드 시간만 발생시킵니다.

KV 캐시 선택 및 크기 조정

두 오프로드 계층 모두 VRAM만 사용하는 기준선보다 훨씬 뛰어난 성능을 보이며, 그 과정에서 서로 매우 근접한 성능을 나타냅니다. 차이가 작은 이유는 처리량 향상이 단순히 VRAM 공간 확보에 기인하며, 제거된 캐시가 DRAM에 있든 SSD에 있든 확보되는 공간의 양은 동일하기 때문입니다. 처리량은 캐시가 어느 계층에서 왔는지에 영향을 받지 않습니다. 지연 시간은 DRAM 페치가 NVMe 페치보다 빠르기 때문에 영향을 받지만, 동일한 키 값을 처음부터 다시 계산하는 것에 비하면 두 방식 모두 비용 효율적입니다.

둘 중 하나를 선택하는 것은 SLO(서비스 수준 속도)와 비용 간의 절충안이며, 이는 운영자가 무엇을 최적화하려는지에 따라 달라집니다. 오프로드된 캐시 전체를 RAM에 유지하면 지연 시간이 가장 짧지만, 플래시 메모리에 비해 지연 시간 증가폭이 상대적으로 작은 것에 비해 자본 지출(CAPEX)이 상당히 높습니다. 계층화는 그 중간 지점입니다. 즉, 지연 시간에 중요한 영향을 미치는 캐시를 처리하는 작은 RAM 계층과, 수백 밀리초 이내에 응답할 필요가 없는 롱테일 캐시를 저장하는 스토리지 계층으로 구성됩니다.

KV 캐시를 이해하는 또 다른 방법은 크기를 기준으로 생각하는 것입니다. 스토리지 계층의 크기는 시스템이 감당할 수 있는 최대 토큰 처리량에 따라 결정됩니다. 시스템이 유지해야 하는 KV 캐시의 크기는 처리량에 캐시 항목의 TTL(Time To Live)을 곱한 값입니다. 생성된 모든 토큰은 KV 항목에 기록되므로, 계산은 토큰이 도착하는 속도에 토큰이 보관되는 시간을 곱하는 것과 같습니다. 프로덕션 환경에서 기본적으로 사용되는 TTL 값은 5분과 1시간입니다.

여기서 테스트한 MiniMax-M2.7의 FP8 KV 캐시 크기를 계산해 보겠습니다. KV 요소당 1바이트라고 가정하면, 토큰당 KV 항목은 2 × 62 × 8 × 128바이트, 즉 약 124KiB입니다. 이는 모든 그룹화 쿼리 어텐션 트랜스포머에 일반화됩니다. 토큰당 KV는 레이어 수 × KV 헤드 수 × 헤드 크기 × 2(K와 V의 경우) × 데이터 유형 바이트로 계산되므로, 레이어 수나 KV 헤드 수가 많을수록 토큰당 더 많은 데이터를 기록합니다. 여기서 사용된 중간 동작 속도(RAM 계층에서 초당 약 4,200개 토큰)에서 1시간 동안 데이터를 유지하면 약 1,500만 개의 토큰이 캐시에 저장되는데, 토큰당 124KiB라고 하면 약 1.8TB에 해당합니다. 이는 엄청난 양의 DRAM을 필요로 하며, 구축 비용을 증가시킵니다.

이러한 점을 고려할 때, SLO 요구 사항과 예산이 티어 선택의 기준이 됩니다. SLO가 충분히 여유로워 SSD 티어의 재로드 지연 시간이 그 범위 내에 포함된다면, 두 번째 티어의 KV 캐시는 스토리지만으로 구성하고 커넥터에 필요한 최소한의 RAM 스테이징 버퍼만 앞에 배치할 수 있습니다. 스토리지 비용은 크지 않습니다. 모든 테스트에서 최대 KV 트래픽은 중간 작동 지점에서 쓰기 4.1GB/s, 읽기 1.1GB/s였으며, fio로 측정한 최대치는 약 114GB/s였습니다. 우리가 사용한 RAID10 어레이는 대역폭 여유가 약 28배에 달했기 때문에 XE7740이 8개의 GPU를 모두 활용하고 더 많은 동시 부하를 처리하더라도 플래시 메모리는 병목 현상을 일으키지 않았습니다. 이러한 여유 공간 덕분에 운영자는 속도보다는 용량을 기준으로 티어를 구성할 수 있습니다. D7-PS1030의 1테라바이트가 추가될 때마다 TTL이 연장되고 시스템이 상주하는 작업 세트가 커지며, 상주 캐시가 커질수록 재계산을 방지하고 더 많은 토큰을 처리할 수 있습니다.

내구성은 이 등급을 정의하는 제약 조건입니다. KV 오프로드 캐시는 쓰기 작업이 매우 많습니다. 모델이 생성하는 모든 토큰은 KV 항목에 기록되고, TTL 변경으로 인해 24시간 내내 등급이 계속 재기록되므로 드라이브는 사실상 쓰기 작업을 멈추지 않습니다. 8개 드라이브로 구성된 어레이에서 지속적인 쓰기 속도는 1.9GB/s였으며, 테스트한 RAID10 구성에서는 미러링으로 인해 미디어가 흡수하는 속도가 두 배로 증가하여 12.8TB 드라이브당 하루에 약 3.2회 쓰기가 발생합니다. 이는 D7-PS1030의 지속적인 등급인 3 DWPD보다 약간 높습니다. 기본 스토리지의 경우 이 정도면 기준을 충족하지 못하겠지만, 이 경우에는 허용 가능한 수준입니다. 캐시는 설계상 일회용이며, 드라이브 마모로 인한 고장 모드는 데이터 손실이 아닌 재계산입니다. 일부 사용자에게는 RAID0이 이 등급에 더 적합할 수 있습니다. 8개 드라이브 전체에 스트라이핑하여 중복 쓰기를 방지하고 미디어 속도를 약 1.6 DWPD로 줄여 등급 범위 내에 안정적으로 들어갑니다. 어떤 경우든 결론은 같습니다. 이 워크로드는 시스템 내 다른 어떤 것보다 내구성을 빠르게 소모하며, 전용 고내구성 드라이브는 해당 계층에 필요한 용량의 일부만 제공하므로, 쓰기 작업에 특화된 대용량 드라이브인 PS1030이 최적의 선택이 되는 것입니다.

달러당 토큰 수

성능 분석 결과, 플래시 메모리는 작업 세트가 메모리 용량을 초과할 경우 DRAM이 달성할 수 없는 처리량과 첫 번째 토큰 지연 시간을 대부분 유지하는 것으로 나타났습니다. 상업적으로 중요한 것은 데이터 저장 계층의 비용입니다. 재계산 문제를 해결하는 가장 쉬운 방법은 시스템에 값비싼 DRAM을 더 추가하는 것입니다. 오프로드 방식은 스토리지 계층의 단위 용량당 비용이 의미 있게 저렴할 때만 효과적입니다.

두 기술 간의 격차를 가장 명확하게 보여주는 것은 가격이 아니라 용량입니다. 512GB DRAM 오프로드 계층은 용량이 차서 캐시를 비우기 시작했지만, 테라바이트 단위로 측정되는 플래시 계층은 그렇지 않았습니다. 현실적인 DRAM 예산으로는 GPU 옆에 수십 테라바이트의 KV 캐시를 배치할 수 없으므로, 특정 컨텍스트 길이를 넘어서면 빠른 DRAM과 플래시 중 어느 것을 선택할지가 아니라 플래시를 사용할지, 아니면 컨텍스트를 버릴지 선택해야 합니다. 컨텍스트를 버리는 행위 자체가 처리량과 지연 시간을 증가시키는 주요 원인입니다.

가격 측면에서 기업용 플래시 메모리는 오랫동안 DRAM에 비해 테라바이트당 비용이 훨씬 저렴했습니다. 이는 NAND 플래시 메모리가 다층 3D 적층 셀 구조를 사용하는 반면 DRAM은 트랜지스터 하나와 커패시터 하나로 구성된 단일 셀 구조를 채택하고 있기 때문입니다. 2026년 메모리 수요 급증으로 두 메모리 모두 가격이 급격히 상승했고, NAND 계약 가격 또한 올해 내내 DRAM 가격 상승률과 거의 동일한 속도로 올랐습니다. 따라서 플래시 메모리 가격이 하락하는 동안 DRAM 가격이 급등하는 상황은 아닙니다. 하지만 현재의 높은 가격 수준에서도 테라바이트당 가격 격차는 여전히 존재하며, 플래시 메모리는 기업 예산에 맞는 가격으로 테라바이트급 캐시 용량을 확보할 수 있는 유일한 메모리 유형으로 남아 있습니다.

처리량과 비용은 같은 방향을 가리킵니다. 플래시 메모리가 DRAM보다 우위를 점하게 된 시점에서는 초당 더 많은 토큰을 처리하고 있었지, 더 적은 토큰을 처리하고 있었던 것이 아닙니다. 즉, 처리량을 희생하면서 용량을 늘리는 것이 아니라, 테라바이트당 비용이 더 저렴한 매체에서 더 많은 처리량을 제공하는 것입니다. 초당 토큰 처리량 대비 비용을 기준으로 보면 플래시 메모리가 훨씬 유리하며, 특히 컨텍스트를 더 오래 유지해야 할수록 그 격차는 더욱 커집니다. DRAM은 바로 그 지점에서 한계에 도달하는 반면, 플래시 메모리는 그렇지 않기 때문입니다.

DRAM은 작업 세트가 적합한 동안에는 여전히 적절한 계층이며, 커넥터에 필요한 얇은 RAM 스테이징 버퍼는 여전히 플래시 메모리 앞에 위치합니다. 하지만 GPU나 DRAM을 추가하는 것은 캐시가 가득 찰 때까지 워크로드에 필요한 최대 성능을 확보하기 위해 테라바이트당 가장 많은 비용을 발생시킵니다. 플래시 메모리로 오프로딩하거나 계층화하면 컨텍스트를 무기한으로 유지하면서 대부분의 성능을 유지할 수 있으며, 테라바이트당 비용도 합리적입니다. 하지만 최종 결정은 궁극적으로 운영자가 최적화하려는 워크로드에 대한 SLO 요구 사항에 따라 달라집니다.

맺음말

추론 워크로드의 경우, 토큰 경제학이 핵심입니다. 토큰이 곧 결과물이며, 재계산은 낭비입니다. GPU는 이미 해당 컨텍스트를 한 번 생성했는데, 다시 재구축해야 하는 상황이 발생하기 때문입니다. 에이전트 기반 서비스에서 이 문제는 더욱 심각해집니다. 일주일 동안 계측된 Claude Code 트래픽 분석 결과, 토큰의 98.16%가 캐시 읽기였으며, 이는 GPU가 이미 계산한 컨텍스트를 매번 캐시에서 제거할 때마다 재구축해야 한다는 것을 보여줍니다. KV 캐시 오프로드는 이러한 히스토리 재구축에 소요될 컴퓨팅 자원을 새로운 토큰 생성에 활용합니다. XE7740에서 모델, GPU, 엔진을 고정한 상태에서, 이 오프로드는 고부하 환경에서 VRAM만 사용하는 기준 대비 최대 2.9배의 서비스 처리량 향상을 보여주었습니다. DRAM 계층이 가득 차서 처리량이 감소하는 상황에서도 플래시 메모리는 DRAM이 따라올 수 없는 용량으로 처리량을 유지했습니다.

하지만 그렇다고 DRAM이 필요 없어지는 것은 아닙니다. 세션이 열리고 잠시 실행된 후 캐시 용량을 초과하기 전에 닫히는 짧고 버스트적인 워크로드의 경우 DRAM이 적합하며 KV 캐시 오프로드는 큰 도움이 되지 않습니다. 작업 세트가 적합하고 지연 시간이 최적이며 제거해야 할 데이터가 없기 때문입니다.

하지만 우리는 DRAM 계층만으로 충분한 예외적인 경우를 그러한 프로필로 보고 있습니다. 현재 대부분의 실제 운영 환경에서 추론은 장시간 지속적으로 실행됩니다. 멀티턴 에이전트, 대규모 컨텍스트, 꾸준한 동시 접속, 동일 세션에 반복해서 접속하는 사용자 등이 그 예입니다. 이러한 환경에서는 작업 세트가 운영자가 제공할 수 있는 메모리 계층의 용량을 초과하게 되고, 캐시가 비워지며, GPU가 이미 생성한 컨텍스트를 재구성하는 데 다시 투입됩니다. 이것이 바로 비용이 많이 드는 오류 모드이며, 흔히 발생합니다.

이러한 워크로드의 경우, KV 캐시를 플래시로 오프로드하면 두 가지 측면에서 이점이 있습니다. 첫째, GPU가 기존 토큰을 재계산하는 대신 새로운 토큰을 생성하도록 하여 토큰 경제 효율성을 높일 수 있습니다. 둘째, 이러한 효율성을 가능하게 하는 용량을 시스템에서 가장 비용 효율적인 내구성 계층에 배치할 수 있습니다. 빌드 시트에서 가장 중요한 결과는 제거되는 부분입니다. 캐시로 플래시에 의존하는 서버는 DRAM을 훨씬 적게 사용할 수 있으며, 2026년 현재 메모리 가격을 고려할 때 이는 견적에서 가장 큰 절감 효과 중 하나입니다. 토큰은 제품이며, 현재 서버 운영을 지배하는 장기 컨텍스트 워크로드의 경우, 토큰 효율적인 경로는 동일한 토큰을 두 번 생성하는 데 드는 비용을 절감하는 경로이며, 그 경로는 플래시를 통해 이루어집니다.

AI용 Solidigm SSD 스토리지

이 보고서는 Solidigm이 후원합니다. 이 보고서에 표현된 모든 견해와 의견은 고려 중인 제품에 대한 우리의 공정한 견해를 기반으로 합니다.

StorageReview에 참여

뉴스레터 | 유튜브 | 팟캐스트 ( 아이튠즈 / 스포티파이) | 인스타그램 | 트위터 | 틱톡 | RSS 피드

디뱐시 자이나교

머신러닝 엔지니어이자 홈랩 운영자, 그리고 기술 애호가입니다. StorageReview에서 AI 및 신흥 워크로드 테스트를 주도하며, 인사이트와 성능 분석 결과를 제공하고 있습니다.