벡터 집합 성능
벡터 집합 성능 (Performance) (performance-4)
Redis 벡터 집합(vector sets)이 부하에서 어떻게 동작하는지, 속도와 재현율(recall)을 위해 어떻게 최적화하는지 배워볼게요.
쿼리 성능
VSIM을 사용한 벡터 유사도 검색은 기본적으로 스레드(thread) 방식으로 동작해요. Redis는 이 쿼리를 병렬로 처리하기 위해 최대 32개 스레드를 사용합니다.
VSIM성능은 사용 가능한 CPU 코어 수에 거의 선형적으로 비례해요.- int8 양자화(quantization)를 사용하는 300차원 벡터 3백만 개 집합에서 초당 약 5만 건의 유사도 쿼리를 기대할 수 있어요.
- 성능은
EF파라미터에 크게 좌우돼요.EF가 높을수록 재현율은 좋아지지만 검색은 느려져요.EF가 낮을수록 결과는 빠르게 돌아오지만 정확도는 떨어져요.
삽입 성능
VADD 명령으로 벡터를 삽입하는 것은 쿼리보다 계산 비용이 훨씬 커요.
- 삽입은 기본적으로 단일 스레드로 동작해요.
CAS옵션을 쓰면 후보 그래프 검색을 백그라운드 스레드로 오프로드할 수 있어요.- 단일 노드에서 초당 수천 건 수준의 삽입을 기대할 수 있어요.
양자화 효과
양자화는 속도와 메모리 양쪽에 큰 영향을 줍니다.
Q8(기본값):FP32보다 4배 작고, 높은 재현율과 높은 속도를 제공해요.BIN(바이너리):FP32보다 32배 작고, 재현율은 낮지만 가장 빠른 검색을 제공해요.NOQUANT(FP32): 완전한 정밀도지만 성능은 느리고 메모리 사용량은 가장 높아요.
정밀도와 효율성 사이의 트레이드오프에 가장 잘 맞는 양자화 모드를 선택하면 돼요. 아래 예시는 여러 모드가 단순한 벡터에 어떤 영향을 주는지 보여줘요. NOQUANT 모드에서도 부동소수점 반올림 때문에 값이 살짝 달라진다는 점을 기억해 두세요.
양자화 모드 비교: VADD와 VEMB로 Q8, NOQUANT, BIN 모드를 비교해 정밀도·메모리·성능 사이의 트레이드오프를 이해해 보세요.
> 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"
삭제 성능
DEL로 큰 벡터 집합을 삭제하면 지연 시간이 튈 수 있어요.
- Redis는 많은 그래프 노드를 연결 해제(unlink)하고 재구성해야 해요.
- 수백만 개 원소를 삭제할 때 지연이 가장 눈에 띕니다.
저장 및 로드 성능
벡터 집합은 전체 HNSW 그래프 구조를 저장하고 로드해요.
- 디스크에서 다시 로드할 때가 가장 빠르며 그래프를 다시 만들 필요가 없어요.
- 예: 구성 요소 300개짜리 3백만 벡터 집합은 약 15초 만에 로드됩니다.
튜닝 팁 요약
튜닝 팁 요약
| 요소 | 성능에 미치는 영향 | 팁 |
|---|---|---|
EF |
쿼리는 느려지지만 재현율은 높아짐 | 낮게 시작(예: 200)하고 위쪽으로 조정 |
M |
노드당 메모리는 많아지고 재현율은 좋아짐 | 재현율이 너무 낮지 않으면 기본값 사용 |
| 양자화 타입 | 바이너리가 가장 빠르고 FP32가 가장 느림 |
전체 정밀도가 필요하지 않으면 Q8 또는 BIN 사용 |
CAS |
스레딩으로 삽입이 빨라짐 | 높은 쓰기 처리량이 필요할 때 사용 |
더 알아보기 (Learn more)
출처: 공식문서