첨부된 MemKV 사용자 가이드 및 기술 문서에 따르면, MemKV는 RDMA가 불가능한 환경(일반 라우팅 네트워크, 클라우드, 혼합 NIC 등)을 위해 1급 시민(First-class) TCP 전송 모드를 공식 지원합니다.
RDMA 환경이 아닌 일반 TCP/IP 네트워크 환경에서 GPU 추론 엔진(vLLM, SGLang 등)을 MemKV에 연결하는 구성 절차 및 방법은 다음과 같습니다.
network.address, 기본 9900)는 TCP 리스너를 통해 컨트롤 메시지뿐 아니라 RDMA가 비활성화된 클라이언트의 인라인 벌크 데이터(TcpPut, TcpGet, TcpDelete, Exists)를 모두 전송합니다.num_connections)을 열고 배치 읽기/쓰기를 파이프라이닝합니다./etc/memkv/config.yaml)RDMA NIC이 없는 일반 노드라면 서버 설정을 TCP에 맞게 조정합니다.
network:
address: 0.0.0.0:9900 # TCP 수신 주소 (Admin API는 자동으로 9901에 바인딩됨)
auth_key: <64자리_hex_key> # HMAC-SHA256 필수 인증 키 (openssl rand -hex 32로 생성)
storage:
mode: direct # 물리 raw NVMe가 있으면 direct, 없으면 file 모드 사용
block_size: 4 MiB
drives:
- media: /dev/nvme0n1
storage.mode: file로 변경하고 일반 파일 경로(예: /var/lib/memkv/drive0.dat)를 지정할 수 있습니다.클라이언트의 설정 파일(client.yaml) 또는 환경변수에서 transport: tcp를 명시하는 것이 핵심입니다. (auto로 둘 경우 부팅 시 RDMA를 시도하다가 경고(WARN)를 남기고 TCP로 래치(latch)되지만, 명시적으로 tcp를 선언하면 불필요한 QP 생성 없이 즉시 TCP 전송 모드로 동작합니다.)
# 1. 서버 엔드포인트 및 인증 키 설정
export MEMKV_SERVERS="10.0.0.1:9900,10.0.0.2:9900" # 대상 MemKV 서버 TCP 주소
export MEMKV_AUTH_KEY="<서버와_동일한_64자리_hex_key>"
export MEMKV_LICENSE="/path/to/minio.license"
# 2. 전송 모드를 TCP로 강제 (RDMA 탐색 생략)
export MEMKV_TRANSPORT=tcp
# 3. TCP 소켓 병렬성 및 배치 튜닝
export MEMKV_NUM_CONNECTIONS=8 # 서버당 연결할 TCP 커넥션 풀 크기 (기본값: 8)
export MEMKV_STAGING_SIZE_MB=256 # 배치 처리용 호스트 메모리 버퍼
(주의: MEMKV_RDMA_DEVICES는 지정하지 않습니다.)
client.yaml) 사용servers:
- 10.0.0.1:9900
- 10.0.0.2:9900
transport: tcp # tcp 명시
num_connections: 8
auth_key: "<64자리_hex_key>"
license: /path/to/minio.license
export MEMKV_CONFIG="$HOME/client.yaml"
memkv_vllm의 직접 오프로딩(MemKVOffloadingSpec)은 문서상 "RDMA 전용(TCP 풀백 없음)"으로 명시되어 있으므로, 일반 TCP 환경에서는 LMCache 플러그인을 경유하는 방식을 사용해야 합니다.
lmcache.yaml):chunk_size: 256
local_cpu: True
max_local_cpu_size: 60 # GiB 단위 CPU 풀
enable_lazy_memory_allocator: True
storage_plugins: memkv
extra_config:
storage_plugin.memkv.module_path: memkv_lmcache.backend
storage_plugin.memkv.class_name: MemKVStorageBackend
--device=/dev/infiniband) 없이 일반 컨테이너로 기동합니다.docker run -d --name vllm-memkv-tcp \
--runtime nvidia --net host --shm-size=64g --ipc=host \
-e CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
-e MEMKV_SERVERS="10.0.0.1:9900,10.0.0.2:9900" \
-e MEMKV_AUTH_KEY="$AUTH_KEY" \
-e MEMKV_TRANSPORT=tcp \
-e MEMKV_LICENSE=/minio.license \
-e LMCACHE_CONFIG_FILE=/lmcache.yaml \
-v /path/to/models:/inference-models:ro \
-v /path/to/minio.license:/minio.license:ro \
-v /path/to/lmcache.yaml:/lmcache.yaml:ro \
-v /path/to/wheels:/plugins:ro \
--entrypoint bash \
vllm/vllm-openai:<tag> -lc '
pip install "lmcache>=0.5,<0.6" /plugins/memkv_lmcache-*.whl &&
vllm serve /inference-models/<model-dir> \
--host 0.0.0.0 --port 8810 \
--tensor-parallel-size 8 \
--trust-remote-code \
--enable-prefix-caching \
--kv-transfer-config "{\"kv_connector\":\"LMCacheConnectorV1\",\"kv_role\":\"kv_both\"}"
'
SGLang 역시 MEMKV_TRANSPORT=tcp 환경변수를 주입하여 기동합니다.
docker run -d --name sglang-memkv-tcp \
--runtime nvidia --net host --shm-size=64g \
-e CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
-e MEMKV_SERVERS="10.0.0.1:9900,10.0.0.2:9900" \
-e MEMKV_AUTH_KEY="$AUTH_KEY" \
-e MEMKV_TRANSPORT=tcp \
-e MEMKV_LICENSE=/minio.license \
...
sglang launch_server \
--model-path /models/<model-dir> \
--tp 8 \
--enable-hierarchical-cache \
--hicache-storage-backend dynamic \
--hicache-storage-backend-extra-config "{\"backend_name\":\"memkv\",\"module_path\":\"memkv_sglang.backend\",\"class_name\":\"MemKVHiCacheStorage\"}"
chrony 또는 ntpd 동기화가 필수적입니다.