kv-cache

2 개의 포스트

cloudflare

더 작고, 더 빠르고, 더 안전하게: Kimi와 GLM을 대규모로 실행하기 (새 탭에서 열림)

Cloudflare는 대규모·장문 컨텍스트 MoE 모델인 Kimi와 GLM을 GPU 메모리에 효율적으로 탑재하기 위해 KV 캐시 양자화, 모델 가중치 압축, 공유 캐시 무결성 검사를 적용했다. FP8 KV 캐시와 INT4 가중치는 정확도를 거의 유지하면서 동시 처리량과 비용을 개선하며, 캐시 무결성 검사는 1% 미만의 오버헤드로 데이터 오염 위험을 줄인다. 특히 프리필과 디코드 단계를 분리해 각 단계에 가장 적합한 정밀도를 선택한 것이 핵심이다. ## 장문 컨텍스트의 메모리 병목 - 모델 추론에서 GPU 메모리는 크게 두 부분이 사용된다. - 모델 가중치 - 이전 토큰의 어텐션 Key·Value를 저장하는 KV 캐시 - 장문 컨텍스트 모델에서는 가중치보다 KV 캐시가 먼저 메모리를 가득 채우는 경우가 많다. - Cloudflare는 모든 실험과 운영 트래픽에 오픈소스 추론 프레임워크 SGLang을 사용한다. - 프리필(prefill)은 입력 전체를 처리하는 단계이고, 디코드(decode)는 토큰을 하나씩 생성하는 단계다. - 프리필: 주로 연산량에 제한됨 - 디코드: 메모리 용량과 메모리 대역폭에 제한됨 ## FP8 기반 KV 캐시 양자화 - 기본 BF16 형식의 KV 캐시를 FP8(e4m3)로 저장해 캐시 크기를 절반으로 줄였다. - Kimi K2.6에서는 GPU에 저장 가능한 컨텍스트가 약 68만 6천 토큰에서 137만 토큰으로 증가했다. - 단일 동시 요청에서는 FP8 변환 비용 때문에 BF16보다 토큰 처리 속도가 몇 퍼센트 느리다. - 그러나 더 많은 요청을 동시에 수용할 수 있다. - BF16: 동시 요청 32개에서 메모리 부족 - FP8: 동시 요청 64개까지 처리 - 최대 처리량: 약 41% 증가 - 토큰당 비용: 약 30% 감소 - 프리필은 메모리보다 연산이 병목이므로 BF16을 유지하고, 디코드에만 FP8을 적용한다. - 평가 결과 FP8과 BF16의 성능 차이는 사실상 구분하기 어려웠다. - GSM8K, ARC, MMLU 등 주요 벤치마크에서 점수 차이가 미미함 - 도구 호출 유효성도 BF16 92.2%, FP8 92.6%로 유사 ## INT4 기반 모델 가중치 압축 - GLM 5.2의 가중치를 FP8에서 INT4로 줄였다. - 모델 체크포인트 크기: - 705GB → 421GB - 약 40% 감소 - 8-way 텐서 병렬 구성에서 GPU당 가중치 메모리: - 약 88GB → 52GB - 확보된 공간으로 동일한 하드웨어에서 약 118만 토큰의 KV 캐시를 수용할 수 있다. - 디코드에서는 매 토큰 생성 시 가중치를 GPU 메모리에서 읽어야 하므로, 가중치가 작을수록 메모리 대역폭 부담이 줄어든다. - INT4 디코드 성능 개선: - 동시 요청 1개: 60 → 92 tok/s, 55% 향상 - 동시 요청 8개: 21% 향상 - 동시 요청 32개: 27% 향상 - 반면 프리필에서는 INT4 가중치를 연산 전에 확장해야 하므로 느려진다. - FP8: 약 10,160 tok/s - INT4: 약 8,660 tok/s - 따라서 디코드는 INT4, 프리필은 FP8로 실행하는 방식이 가장 효율적이다. - 벤치마크 전반에서 INT4와 FP8의 정확도 차이는 0.8점 이내로, 실질적인 품질 저하가 관찰되지 않았다. ## 공유 KV 캐시 무결성 검사 - 캐시 압축으로 더 많은 요청이 같은 GPU와 물리적 KV 캐시 페이지를 공유하게 되면서, 페이지 재사용 오류의 위험도 커진다. - Cloudflare는 각 물리적 캐시 페이지에 재할당 때마다 바뀌는 태그를 부여했다. - 요청마다 사용할 페이지와 태그 정보를 기록하고, 디코드 전에 실제 매핑과 일치하는지 검사한다. - 불일치가 발생하면 잘못된 캐시 데이터를 반환하지 않고 해당 요청을 중단한다. - 검사는 어텐션 커널에 직접 삽입하지 않고 별도의 배치 검사로 실행해 GPU 스레드 간 경쟁 상태를 피했다. - 측정 결과 오버헤드는 매우 작았다. - 처리량 감소: 약 0.38~0.79% - p95 지연시간 증가: 약 0.42~0.80% - 기능이 필요 없는 배포 환경에서는 기본 no-op 추적기를 사용해 측정 가능한 오버헤드가 없다. ## 향후 방향 - 더 많은 모델과 배포 환경에 FP8 KV 캐시를 확대할 예정이다. - NVIDIA Blackwell GPU에서 NVFP4 가중치를 검증하고 있다. - KV 캐시 무결성 검사를 거의 비용 없이 모든 환경에서 활성화하는 것을 목표로 한다. - 이러한 최적화는 정확도를 유지하면서 더 많은 고객에게 낮은 비용으로 모델을 제공하기 위한 기반이다. 실용적으로는 추론 단계를 하나의 설정으로 처리하기보다, 프리필과 디코드의 병목이 다르다는 점을 반영해 정밀도를 분리하는 것이 중요하다. 디코드에는 FP8 KV 캐시와 INT4 가중치를, 프리필에는 BF16 KV 캐시와 FP8 가중치를 선택하는 방식이 대표적인 최적화 전략이다.

cloudflare

초거대 언어 모델 구동을 위한 기반 구축 (새 탭에서 열림)

Cloudflare의 Workers AI는 Kimi K2.5와 같은 초대형 언어 모델(LLM)을 효율적으로 구동하기 위해 소프트웨어와 하드웨어의 균형을 맞춘 최적화된 인프라를 구축하고 있습니다. 특히 에이전트 기반 서비스에서 발생하는 긴 컨텍스트와 반복되는 입력을 처리하기 위해 입력(Prefill)과 출력(Decode) 단계를 분리하고 캐싱 효율을 극대화하는 전략을 취했습니다. 이를 통해 기존 대비 추론 속도를 3배 향상시키고 지연 시간의 변동성을 대폭 줄이는 성과를 거두었습니다. ### Prefill과 Decode 단계의 분리 (PD Disaggregation) * LLM 추론의 두 단계인 'Prefill'(입력 토큰 처리, 연산 중심)과 'Decode'(출력 토큰 생성, 메모리 대역폭 중심)를 별도의 서버에서 독립적으로 수행하도록 아키텍처를 설계했습니다. * 단일 GPU에서 두 단계가 서로를 방해(Blocking)하며 자원 효율을 떨어뜨리는 문제를 해결하여 GPU 활용도를 극대화했습니다. * 토큰 인식 부하 분산(Token-aware load balancing) 기술을 적용해 각 서버의 처리량을 실시간으로 추정하고 부하를 균등하게 배분합니다. * 이 구조를 통해 첫 토큰 생성 시간(TTFT)의 편차를 줄이고, 토큰 당 생성 시간을 기존 100ms에서 20~30ms 수준으로 개선했습니다. ### 프롬프트 캐싱 및 세션 어피니티 (Prompt Caching) * 에이전트형 서비스의 특성상 시스템 프롬프트나 이전 대화 기록 등 반복되는 긴 입력이 많다는 점에 착안하여 프롬프트 캐싱을 최적화했습니다. * `x-session-affinity` 헤더를 도입하여 동일한 세션의 요청이 이전 입력 텐서가 계산된 리전으로 라우팅되도록 유도했습니다. * 이러한 세션 고정 라우팅을 통해 피크 시간대 입력 토큰 캐시 히트율을 60%에서 80%까지 끌어올렸으며, 전체적인 처리량을 크게 향상시켰습니다. * 사용자가 캐싱을 적극적으로 활용하도록 캐시된 토큰에 대해 할인된 가격을 제공하는 경제적 유인책을 병행합니다. ### KV 캐시 최적화 및 Mooncake 엔진 활용 * 초대형 모델은 여러 GPU에 걸쳐 실행되므로, GPU 간에 KV 캐시(입력 텐서 저장 공간)를 효율적으로 공유하는 것이 필수적입니다. * Moonshot AI의 'Mooncake' 전송 엔진을 활용해 NVLink 및 NVMe over Fabric과 같은 RDMA 프로토콜 기반의 직접 메모리 전송을 구현, CPU 개입 없이 데이터를 빠르게 전달합니다. * LMCache 및 SGLang HiCache를 사용하여 클러스터 내 모든 노드가 캐시를 공유하므로, 특정 노드에 종속되지 않고 캐시를 재사용할 수 있습니다. * 캐시 저장소를 GPU VRAM에서 NVMe 스토리지로 확장하여 세션 유지 시간을 늘리고 더 많은 트래픽을 효율적으로 수용합니다. ### 결론 및 제언 Cloudflare Workers AI에서 대규모 모델을 사용하는 개발자라면 `x-session-affinity` 헤더를 반드시 사용하여 프롬프트 캐싱 혜택을 받는 것이 권장됩니다. 이는 단순한 속도 향상을 넘어 토큰 비용 절감으로 이어지며, 특히 긴 대화 맥락을 유지해야 하는 AI 에이전트 서비스에서 성능 차이를 만드는 핵심 요소가 됩니다.