26S24a

QK·2026년 9월 24일

첨부된 MemKV 사용자 가이드 및 기술 문서에 따르면, MemKV는 RDMA가 불가능한 환경(일반 라우팅 네트워크, 클라우드, 혼합 NIC 등)을 위해 1급 시민(First-class) TCP 전송 모드를 공식 지원합니다.

RDMA 환경이 아닌 일반 TCP/IP 네트워크 환경에서 GPU 추론 엔진(vLLM, SGLang 등)을 MemKV에 연결하는 구성 절차 및 방법은 다음과 같습니다.


1. 연결 아키텍처 및 포트 구성

  • 데이터 및 컨트롤 플레인 (Port 9900): MemKV 서버의 기본 포트(network.address, 기본 9900)는 TCP 리스너를 통해 컨트롤 메시지뿐 아니라 RDMA가 비활성화된 클라이언트의 인라인 벌크 데이터(TcpPut, TcpGet, TcpDelete, Exists)를 모두 전송합니다.
  • 클라이언트 동작: 클라이언트는 RDMA QP(Queue Pair) 설정을 완전히 건너뛰며, 고속 링크 처리량을 유지하기 위해 서버당 여러 개의 TCP 커넥션 풀(num_connections)을 열고 배치 읽기/쓰기를 파이프라이닝합니다.

2. MemKV 서버 측 설정 (/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
  • 참고: 만약 물리 전용 NVMe 디스크가 없는 일반 호스트라면 storage.mode: file로 변경하고 일반 파일 경로(예: /var/lib/memkv/drive0.dat)를 지정할 수 있습니다.

3. 클라이언트(GPU 호스트) 설정

클라이언트의 설정 파일(client.yaml) 또는 환경변수에서 transport: tcp를 명시하는 것이 핵심입니다. (auto로 둘 경우 부팅 시 RDMA를 시도하다가 경고(WARN)를 남기고 TCP로 래치(latch)되지만, 명시적으로 tcp를 선언하면 불필요한 QP 생성 없이 즉시 TCP 전송 모드로 동작합니다.)

방법 A. 환경변수로 전달 (권장)

# 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는 지정하지 않습니다.)

방법 B. 설정 파일(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"

4. GPU 추론 엔진별 연동 방법

① vLLM + LMCache 연동

memkv_vllm의 직접 오프로딩(MemKVOffloadingSpec)은 문서상 "RDMA 전용(TCP 풀백 없음)"으로 명시되어 있으므로, 일반 TCP 환경에서는 LMCache 플러그인을 경유하는 방식을 사용해야 합니다.

  1. 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
  1. vLLM 실행 (Docker 컨테이너 예시):
    RDMA 디바이스 마운트(--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 (HiCache) 연동

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\"}"

5. 일반 TCP 연결 시 주의사항

  • 성능 트레이드오프: Zero-copy 직결을 지원하는 RDMA(RoCEv2/IB) 대비 일반 TCP는 커널 TCP 스택 및 호스트 메모리 버퍼링을 거치므로 지연시간이 증가하며 대역폭이 낮아집니다(문서 기준 약 5~10배 차이 발생 가능).
  • 보안 네트워크 필수: 와이어 헤더는 HMAC-SHA256으로 서명 검증되지만, 페이로드 바이트 자체는 평문(Plaintext)으로 전송되므로 외부 인터넷이 아닌 신뢰할 수 있는 사설 내부망/VLAN에서만 운용해야 합니다.
  • 시각 동기화 (NTP): 요청 서명 검증의 허용 시각 오차 창이 ±60초이므로 GPU 호스트와 MemKV 서버 간 chrony 또는 ntpd 동기화가 필수적입니다.
profile
engineer

0개의 댓글