벡터 집합 성능

벡터 집합 성능 (Vector Sets Performance)

Redis 벡터 집합(vector sets)이 부하(load) 아래에서 어떻게 동작하는지, 그리고 속도와 재현율(recall)을 최적화하려면 무엇을 알아야 하는지를 정리한 페이지예요. 벡터 검색을 본격적으로 쓰려는 분이라면 이 성능 특성을 미리 알아두면 큰 도움이 됩니다.

출처: Redis 공식 문서 — performance

질의 성능 (Query performance)

VSIM을 사용한 벡터 유사도 질의는 기본적으로 스레드(thread) 기반으로 동작합니다. Redis는 이 질의들을 병렬로 처리하기 위해 최대 32개 스레드를 사용해요.

  • VSIM 성능은 사용 가능한 CPU 코어 수에 따라 거의 선형적으로 확장됩니다.

  • int8 양자화(quantization)를 쓰는 3M 항목(300차원 벡터) 집합에서 초당 약 50,000회의 유사도 질의를 기대할 수 있어요.

  • 성능은 EF 파라미터에 크게 의존합니다:

    • EF를 높이면 재현율(recall)은 좋아지지만 검색이 느려져요.
    • EF를 낮추면 더 빠른 결과를 얻지만 정확도가 떨어집니다.

삽입 성능 (Insertion performance)

VADD 명령으로 벡터를 삽입하는 것은 질의보다 연산 비용이 더 큽니다:

  • 삽입은 기본적으로 단일 스레드(single-threaded)로 동작해요.
  • CAS 옵션을 쓰면 후보 그래프 검색(candidate graph search)을 백그라운드 스레드로 떠넘길 수 있습니다.
  • 단일 노드에서 초당 수천 회의 삽입을 기대할 수 있어요.

양자화 영향 (Quantization effects)

양자화(quantization)는 속도와 메모리 모두에 큰 영향을 줍니다:

  • Q8 (기본값): FP32보다 4배 작고, 높은 재현율과 높은 속도
  • BIN (이진): FP32보다 32배 작고, 재현율은 낮지만 가장 빠른 검색
  • NOQUANT (FP32): 완전한 정밀도이지만 성능이 느리고 메모리 사용이 가장 높음

정밀도와 효율 사이의 트레이드오프에 가장 잘 맞는 양자화 모드를 사용하세요. 아래 예제는 서로 다른 모드가 단순한 벡터에 어떤 영향을 주는지 보여줘요. NOQUANT 모드에서도 부동소수점 반올림 때문에 값이 약간 변한다는 점을 기억하세요.

> VADD quantSetQ8 VALUES 2 1.262185 1.958231 quantElement Q8
(integer) 1
> VEMB quantSetQ8 quantElement
1) "1.2643694877624512"
2) "1.958230972290039"

> VADD quantSetNoQ VALUES 2 1.262185 1.958231 quantElement NOQUANT
(integer) 1
> VEMB quantSetNoQ quantElement
1) "1.262184977531433"
2) "1.958230972290039"

> VADD quantSetBin VALUES 2 1.262185 1.958231 quantElement BIN
(integer) 1
> VEMB quantSetBin quantElement
1) "1"
2) "1"

삭제 성능 (Deletion performance)

DEL로 큰 벡터 집합을 삭제하면 지연 시간(latency) 스파이크가 발생할 수 있어요:

  • Redis는 많은 그래프 노드를 연결 해제(unlink)하고 재구성해야 합니다.
  • 수백만 개 요소를 삭제할 때 지연이 가장 두드러집니다.

저장/로드 성능 (Save and load performance)

벡터 집합은 전체 HNSW 그래프 구조를 저장하고 로드합니다:

  • 디스크에서 다시 로드할 때는 빠르고 그래프를 다시 구축할 필요가 없어요.

예: 300개 컴포넌트를 가진 3M 벡터 집합은 약 15초 안에 로드됩니다.

튜닝 팁 요약 (Summary of tuning tips)

요소 (Factor) 성능에 미치는 영향 팁 (Tip)
EF 쿼리가 느려지지만 재현율은 높아짐 낮은 값(예: 200)에서 시작해 점점 올리기
M 노드당 메모리는 늘고 재현율이 좋아짐 재현율이 너무 낮지 않으면 기본값 사용
양자화 타입 (Quant type) 이진(Binary)이 가장 빠르고 FP32가 가장 느림 완전한 정밀도가 필요하지 않으면 Q8 또는 BIN 사용
CAS 스레딩으로 삽입이 빨라짐 높은 쓰기 처리량이 필요할 때 사용

더 알아보기 (Learn more)