벡터 집합 성능
벡터 집합 성능 (Vector Sets Performance)
Redis 벡터 집합(vector sets)이 부하(load) 아래에서 어떻게 동작하는지, 그리고 속도와 재현율(recall)을 최적화하려면 무엇을 알아야 하는지를 정리한 페이지예요. 벡터 검색을 본격적으로 쓰려는 분이라면 이 성능 특성을 미리 알아두면 큰 도움이 됩니다.
질의 성능 (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 |
스레딩으로 삽입이 빨라짐 | 높은 쓰기 처리량이 필요할 때 사용 |