벡터 집합 성능

벡터 집합 성능 (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)

출처: 공식문서