MinIO AIStor의 MemKV(LLM 인퍼런스 환경에서 KV 캐시를 GPU HBM과 NVMe 간에 고속으로 캐싱/오프로드하는 분산 컨텍스트 메모리 스토어)를 단일 Bare-metal 노드(Co-located / Single-node 형태)에 테스트 목적으로 구성하는 사전 요건 및 절차 정리입니다.
MemKV는 아키텍처상 단일 노드 구성 시 Co-located with drives(전용 NVMe 디스크 직접 사용) 모드와 Co-located file-mode(일반 파일시스템 디렉토리 사용) 두 가지 방식을 지원합니다.
io_uring 및 O_DIRECT를 지원하는 최신 Linux 커널 (Linux 5.15 이상 권장)/dev/nvme1n1)minio.license (MinIO AIStor 라이선스 또는 평가판 라이선스 파일)memkv): 공식 패키지/바이너리sudo mkdir -p /etc/memkv
sudo cp /path/to/minio.license /etc/memkv/minio.license
# 64자 Hex Key 생성
openssl rand -hex 32 | sudo tee /etc/memkv/auth.key
memkv setup 명령어로 시스템의 드라이브와 NIC를 자동 감지하여 설정을 뽑아낼 수 있습니다.# 하드웨어 자동 감지 기반 템플릿 생성
memkv setup > /etc/memkv/config.yaml
또는 단일 노드 테스트 용도에 맞게 /etc/memkv/config.yaml을 수동 작성합니다:
[방법 A: Raw NVMe 디스크 모드 (성능 검증용)]
listen: "0.0.0.0:8500"
license: "/etc/memkv/minio.license"
auth_key: "<위에서 생성한 64자리 Hex 키>"
# 테스트할 raw NVMe 블록 디바이스 지정 (OS 디스크 포함 금지)
drives:
- /dev/nvme1n1
[방법 B: 파일 모드 (전용 NVMe 없는 간이 개발/테스트용)]
listen: "0.0.0.0:8500"
license: "/etc/memkv/minio.license"
auth_key: "<위에서 생성한 64자리 Hex 키>"
# 파일시스템 디렉토리 기반 캐시 경로 지정
file_mode: true
storage_path: "/data/memkv_cache"
sudo memkv setup --force /dev/nvme1n1
# 포그라운드 실행 및 로그 확인
memkv start --config /etc/memkv/config.yaml --license /etc/memkv/minio.license
# 연결 및 I/O 동작 검증
memkv verify --address 127.0.0.1:8500 --auth-key "$(cat /etc/memkv/auth.key)"
출력 결과에 VERIFIED 메시지가 나타나면 로컬 MemKV 인스턴스가 정상 작동하는 상태입니다.
동일한 Bare-metal 머신에서 vLLM 또는 SGLang 등의 서빙 엔진을 실행할 때, 환경 변수 또는 엔진 설정 파일로 방금 띄운 로컬 MemKV를 바라보게 구성합니다:
# MemKV 클라이언트 구성 환경변수 설정
export MEMKV_SERVER="127.0.0.1:8500"
export MEMKV_AUTH_KEY="$(cat /etc/memkv/auth.key)"
memkv_lmcache)를 설치하고, LMCache의 저장소 백엔드 플러그인(Storage plugin)으로 MemKV를 등록하여 KV Cache 오프로딩/프롬프트 캐싱을 테스트할 수 있습니다.==
vLLM과 로컬 MemKV 연동은 LMCache의 스토리지 플러그인(memkv-lmcache)을 통해 이루어집니다.
구조적으로 vLLM은 KV-Transfer 커넥터(LMCacheConnectorV1)를 통해 LMCache를 바라보고, LMCache가 MemKVStorageBackend 플러그인을 통해 로컬 MemKV 서버와 통신하여 NVMe/메모리에 KV 캐시(프롬프트 캐시)를 오프로드하고 재사용합니다.
Python 가상환경(vLLM 구동 환경)에 vLLM, LMCache 및 MemKV 플러그인을 설치합니다.
pip install vllm lmcache memkv-lmcache
/etc/lmcache.yaml)LMCache가 MemKV 플러그인을 스토리지 백엔드로 로드하도록 구성합니다.
max_local_cpu_size는 반드시 0보다 커야 합니다.# /etc/lmcache.yaml
chunk_size: 64
local_cpu: true
max_local_cpu_size: 5 # CPU 메모리 스테이징용 (GB 단위)
# MemKV 스토리지 플러그인 지정
storage_plugins: memkv
extra_config:
storage_plugin.memkv.module_path: memkv_lmcache.backend
storage_plugin.memkv.class_name: MemKVStorageBackend
플러그인은 표준 MEMKV_* 환경 변수를 읽어 로컬 서버에 연결합니다. 단일 노드 로컬 바인딩(127.0.0.1:8500) 기준으로 설정합니다:
# 1. 로컬 MemKV 엔드포인트
export MEMKV_SERVERS="127.0.0.1:8500"
# 2. 서버 설정 시 생성했던 64자리 Hex 인증 키
export MEMKV_AUTH_KEY="$(cat /etc/memkv/auth.key)"
# 3. 라이선스 경로
export MEMKV_LICENSE="/etc/memkv/minio.license"
# 4. LMCache 설정 파일 경로 지정
export LMCACHE_CONFIG_FILE="/etc/lmcache.yaml"
# 5. vLLM KV Transfer 설정 (송수신 겸용)
export KV_TRANSFER_CONFIG='{"kv_connector":"LMCacheConnectorV1","kv_role":"kv_both"}'
(참고: 로컬 TCP 루프백 테스트 시 RDMA 관련 변수는 지정하지 않아도 기본 소켓/TCP 레이어로 통신합니다.)
환경 변수가 로드된 상태에서 vllm serve를 실행합니다.
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--tensor-parallel-size 1 \
--kv-transfer-config "$KV_TRANSFER_CONFIG"
서버 기동 시 표준 출력에서 다음 로그들이 순차적으로 출력되는지 확인합니다:
LMCache INFO: Created dynamic backend: memkv (LMCache가 플러그인을 정상 로드)INFO Creating memkv engine config=PluginConfig ... (MemKV 엔진 초기화 및 서버 핸드셰이크 성공)별도 터미널에서 동일한 롱 프롬프트(수천 토큰 이상)를 2회 연속 요청하여 첫 번째 요청(Cache Miss)과 두 번째 요청(Cache Hit)의 TTFT(Time To First Token) 차이를 비교합니다.
# 1회차 요청 (KV 캐시 생성 및 MemKV로 Write)
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-3.1-8B-Instruct",
"messages": [
{"role": "system", "content": "너는 문서 분석 도우미야. 아래 내용을 요약해줘."},
{"role": "user", "content": "<매우 긴 텍스트 본문...>"}
],
"max_tokens": 50
}'
# 2회차 동일 요청 (MemKV로부터 KV 캐시 복원 -> TTFT 대폭 단축 확인)
vLLM 콘솔 로그에서 두 번째 호출 시 GPU가 프롬프트를 재연산하지 않고 LMCache/MemKV를 통해 청크 단위로 가져와 즉시 토큰 생성을 시작하는 것을 확인할 수 있습니다.