성능 FAQ (Performance FAQ)
Milvus 사용 중 자주 묻는 성능 관련 질문들을 모아서 답변해 드리는 문서예요. IVF 인덱스의 nlist/nprobe 설정부터 데이터 삽입과 검색을 동시에 할 때의 영향, VARCHAR 필드 인덱싱 효과까지 다뤄요.
출처: Milvus 문서
본문
IVF 인덱스에서 nlist와 nprobe는 어떻게 설정하나요?
nlist 설정은 시나리오에 따라 달라져요. 경험상 권장하는 nlist 값은 4 × sqrt(n)인데, 여기서 n은 세그먼트 안의 총 엔티티 수예요.
각 세그먼트의 크기는 datacoord.segment.maxSize 파라미터로 결정되는데, 기본값은 512 MB예요. 세그먼트 안의 총 엔티티 수 n은 datacoord.segment.maxSize를 엔티티 하나의 크기로 나눠 대략 계산할 수 있어요.
nprobe 설정은 데이터셋과 시나리오에 따라 달라지고, 정확도와 쿼리 성능 사이의 트레이드오프가 있어요. 반복 실험을 통해 이상적인 값을 찾는 것을 권장해요.
아래 차트는 sift50m 데이터셋과 IVF_SQ8 인덱스에서 실행한 테스트 결과로, 서로 다른 nlist/nprobe 조합의 리콜과 쿼리 성능을 비교한 거예요.
작은 데이터셋에서 쿼리가 더 오래 걸리는 이유는 무엇인가요?
쿼리 연산은 세그먼트 단위로 수행돼요. 인덱스는 세그먼트를 쿼리하는 데 걸리는 시간을 줄여 줘요. 만약 세그먼트가 인덱싱되지 않았다면 Milvus는 원본 데이터에 대해 brute-force 검색을 수행하게 되고, 쿼리 시간이 급격히 늘어나요.
그래서 작은 데이터셋(컬렉션)은 인덱스가 구축되지 않았기 때문에 보통 쿼리하는 데 더 오래 걸려요. 세그먼트의 크기가 rootCoord.minSegmentSizeToEnableindex가 정한 인덱스 구축 임계값에 도달하지 못했기 때문이에요. create_index()를 호출하면 임계값에 도달했지만 아직 자동 인덱싱되지 않은 세그먼트를 강제로 인덱싱해서 쿼리 성능을 크게 개선할 수 있어요.
CPU 사용량에 영향을 주는 요인은 무엇인가요?
Milvus가 인덱스를 구축하거나 쿼리를 실행할 때 CPU 사용량이 증가해요. 일반적으로 인덱스 구축은 CPU 집약적이지만, 예외적으로 Annoy는 단일 스레드에서 실행돼요.
쿼리를 실행할 때 CPU 사용량은 nq와 nprobe의 영향을 받아요. nq와 nprobe가 작으면 동시성이 낮아져 CPU 사용량도 낮게 유지돼요.
데이터 삽입과 검색을 동시에 하면 쿼리 성능에 영향이 있나요?
삽입 연산은 CPU 집약적이지 않아요. 하지만 새 세그먼트가 인덱스 구축 임계값에 도달하지 못했을 수 있어서 Milvus는 brute-force 검색을 수행하게 되고, 쿼리 성능에 큰 영향을 줄 수 있어요.
rootcoord.minSegmentSizeToEnableIndex 파라미터가 세그먼트의 인덱스 구축 임계값을 결정하며 기본값은 1024행이에요. 자세한 내용은 System Configuration을 참고하세요.
VARCHAR 필드를 인덱싱하면 삭제 속도를 높일 수 있나요?
VARCHAR 필드를 인덱싱하면 "Delete By Expression" 연산을 빠르게 할 수 있지만, 특정 조건에서만 그래요.
- INVERTED Index: 비기본 키 VARCHAR 필드의
IN또는==표현식에 도움이 돼요. - Trie Index: 비기본 VARCHAR 필드의 접두사 쿼리(예:
LIKE prefix%)에 도움이 돼요.
하지만 VARCHAR 필드를 인덱싱해도 다음 경우에는 속도가 빨라지지 않아요.
- ID로 삭제: VARCHAR 필드가 기본 키인 경우
- 관련 없는 표현식: VARCHAR 필드가 삭제 표현식에 포함되지 않은 경우
아직도 질문이 있다면?
다음을 활용할 수 있어요.
- Milvus GitHub에서 질문하고 아이디어를 공유하고 다른 사람을 도와주세요.
- Discord 커뮤니티에 참여해 지원을 받고 오픈소스 커뮤니티와 교류해 보세요.
더 알아보기 (Learn more)
- System Configuration
- IVF 인덱스의
nlist/nprobe의미와 튜닝법은 IVF_FLAT 문서를 참고하세요.