KV 캐시 스토어
MASS KV 캐시 스토어는 LLM 추론에서 생성한 KV 캐시를 저장하고 여러 GPU 서버가 재사용할 수 있도록 하는 공유 스토리지입니다. 서버의 GPU·호스트 메모리 밖으로 캐시 저장 공간을 확장해, 이후 요청이 같은 프롬프트 앞부분을 포함할 때 반복 계산을 줄입니다.
KV 캐시를 공유하는 이유
추론 엔진은 프롬프트를 처리하면서 입력 토큰에 대한 어텐션의 키와 값을 계산합니다. 공통 시스템 프롬프트나 대화의 앞부분처럼 동일한 토큰열로 시작하는 요청에서는 이 KV 캐시를 재사용해 해당 구간을 다시 계산하는 작업을 줄일 수 있습니다.
각 GPU 서버의 메모리만으로는 보관할 수 있는 캐시 양이 제한됩니다. 공유 스토어는 캐시를 보관할 공간을 늘리고, 다른 서버가 생성한 호환 가능한 캐시도 가져다 쓸 수 있게 합니다.
같은 문장이라는 이유만으로 모든 캐시를 재사용할 수 있는 것은 아닙니다. 모델, 앞선 토큰열, 캐시 표현 방식 등이 호환되어야 하며, 추론 엔진의 연동 기능이 재사용할 수 있는 페이지를 식별합니다.
구성 요소
| 구성 요소 | 역할 |
|---|---|
| 추론 엔진 연동 기능 | 캐시 페이지를 식별하고 읽기·저장을 요청 |
| GPU 서버별 캐시 서비스 | 캐시 위치 정보를 유지하고 스토리지 I/O 처리 |
| 공유 NVMe 스토리지 | 연결된 GPU 서버들이 접근할 캐시 페이지 보관 |
캐시 데이터는 NVMe-oF를 통해 GPU 서버와 스토리지 사이에서 이동합니다. 서버끼리는 페이지의 위치 정보를 별도로 교환하므로, 다른 서버가 만든 캐시도 해당 서버에서 데이터를 전달받을 필요 없이 스토리지에서 읽을 수 있습니다.
페이지 저장과 재사용
스토어는 KV 캐시를 고정 크기의 페이지로 관리합니다. 각 페이지에는 추론 엔진 연동 기능이 지정한 키와 공유 스토리지상의 저장 위치가 있습니다.
- 저장. 캐시 서비스가 계산이 끝난 페이지를 자신의 쓰기 영역에 저장합니다. 스토리지 쓰기가 완료되면 페이지 위치를 기록하고 다른 서버에 알립니다.
- 조회. 추론 엔진이 페이지를 요청하면 캐시 서비스가 로컬에 있는 위치 정보를 확인합니다. 요청마다 별도의 중앙 서버에 위치를 물을 필요가 없습니다.
- 읽기. 페이지를 사용할 수 있으면 공유 스토리지에서 읽어 추론 엔진에 전달합니다. 다른 서버가 저장한 페이지도 같은 방식으로 읽습니다.
- 재계산. 캐시에서 페이지를 제공할 수 없으면 추론 엔진이 필요한 내용을 계산합니다. 새로 생성한 페이지는 이후 요청에서 재사용하도록 저장할 수 있습니다.
위치 정보는 비동기로 전파됩니다. 따라서 한 서버가 저장을 마친 페이지를 다른 서버가 아직 찾지 못하는 경우도 있습니다.
캐시 공간과 I/O 관리
각 GPU 서버는 자신에게 할당된 영역에 쓰고, 다른 서버의 영역에 저장된 페이지도 읽을 수 있습니다. 쓰기를 담당하는 영역은 나누되, 저장된 캐시는 함께 사용합니다.
스토어는 공간을 재사용할 때 기존 캐시 페이지를 조회 대상에서 제외하고, 이미 진행 중인 읽기가 끝난 뒤 그 자리에 새 데이터를 씁니다. 이후 제외된 페이지를 요청하면 캐시 미스로 처리합니다.
캐시 서비스는 읽기를 우선 처리하고 장치별 진행 중인 쓰기 양을 제한해 캐시 쓰기가 읽기에 주는 영향을 줄입니다. 읽기와 쓰기는 여전히 장치와 네트워크 자원을 공유하므로, 지연 시간은 작업 부하와 가용 자원에 따라 달라집니다.
관리와 데이터 보관
관리자는 Dashboard에서 스토어를 만들고 연결을 허용할 GPU 서버를 지정하며 사용 현황을 확인합니다. GPU 서버는 mass-ctl kvcache connect <store>로 연결하고, 추론 중 캐시 재사용은 추론 엔진의 연동 기능이 담당합니다.
KV 캐시는 다시 생성할 수 있는 데이터입니다. 캐시에서 페이지가 제거되거나 페이지를 사용할 수 없으면 계산량과 응답 시간이 늘어날 수 있지만, 추론 엔진이 필요한 캐시를 다시 만들 수 있습니다. 파일·오브젝트 스토리지는 애플리케이션 데이터를 선택한 보호 정책에 따라 보관하는 용도로 사용합니다.