벡터 인덱싱으로 초대규모 데이터의 유사도 검색 가속화
컴퓨터 비전부터 신약 발견에 이르기까지, 벡터 유사도 검색 엔진은 많은 인기 인공지능(AI) 애플리케이션을 구동합니다. 유사도 검색 엔진이 의존하는 백만, 십억, 심지어 조 단위 벡터 데이터셋을 효율적으로 쿼리할 수 있게 해주는 핵심 요소 중 하나는 인덱싱입니다. 인덱싱은 빅데이터 검색을 대폭 가속화하는 데이터 구성 과정입니다. 이 글에서는 벡터 유사도 검색을 효율적으로 만드는 데 인덱싱이 하는 역할, 다양한 벡터 inverted file(IVF) 인덱스 유형, 그리고 각기 다른 시나리오에서 어떤 인덱스를 사용해야 하는지에 대한 조언을 다룹니다.
바로 가기:
- 벡터 인덱싱은 유사도 검색과 머신 러닝을 어떻게 가속화하나요?
- IVF 인덱스의 다양한 유형은 무엇이며 어떤 시나리오에 가장 적합한가요?
- FLAT: 100% 재현율이 필요할 때 비교적 작은(백만 규모) 데이터셋 검색에 적합합니다.
- IVF_FLAT: 정확도를 희생하는 대신 속도를 향상시킵니다(그 반대도 마찬가지).
- IVF_SQ8: IVF_FLAT보다 빠르고 리소스 소모가 적지만, 정확도도 더 낮습니다.
- IVF_SQ8H: IVF_SQ8보다 훨씬 빠른 새로운 하이브리드 GPU/CPU 접근 방식입니다.
- 대규모 벡터 데이터 관리 플랫폼인 Milvus에 대해 더 알아보세요.
벡터 인덱싱은 유사도 검색과 머신 러닝을 어떻게 가속화하나요?
유사도 검색 엔진은 입력값을 데이터베이스와 비교하여 입력값과 가장 유사한 객체를 찾는 방식으로 작동합니다. 인덱싱은 데이터를 효율적으로 구성하는 과정이며, 대규모 데이터셋에서 시간이 오래 걸리는 쿼리를 크게 가속화함으로써 유사도 검색을 유용하게 만드는 데 중요한 역할을 합니다. 대규모 벡터 데이터셋이 인덱싱된 후에는, 입력 쿼리와 유사한 벡터를 포함할 가능성이 가장 높은 클러스터 또는 데이터 하위 집합으로 쿼리를 라우팅할 수 있습니다. 실제로 이는 매우 큰 벡터 데이터에서 쿼리 속도를 높이기 위해 어느 정도의 정확도를 희생한다는 의미입니다.
사전에 비유할 수 있습니다. 사전에서는 단어가 알파벳순으로 정렬되어 있습니다. 단어를 찾을 때, 같은 첫 글자를 가진 단어만 포함된 섹션으로 빠르게 이동할 수 있어 입력 단어의 정의를 찾는 검색을 대폭 가속화할 수 있습니다.
IVF 인덱스의 다양한 유형은 무엇이며 어떤 시나리오에 가장 적합한가요?
고차원 벡터 유사도 검색을 위해 설계된 인덱스는 매우 많으며, 각각 성능, 정확도, 저장소 요구 사항 측면에서 트레이드오프가 있습니다. 이 글에서는 몇 가지 일반적인 IVF 인덱스 유형, 그 장단점, 그리고 각 인덱스 유형에 대한 성능 테스트 결과를 다룹니다. 성능 테스트는 오픈 소스 벡터 데이터 관리 플랫폼인 Milvus에서 각 인덱스 유형의 쿼리 시간과 재현율을 정량화합니다. 테스트 환경에 대한 추가 정보는 이 글 하단의 방법론 섹션을 참조하세요.
FLAT: 100% 재현율이 필요할 때 비교적 작은(백만 규모) 데이터셋 검색에 적합합니다.
완벽한 정확도가 필요하고 비교적 작은(백만 규모) 데이터셋에 의존하는 벡터 유사도 검색 애플리케이션의 경우, FLAT 인덱스가 좋은 선택입니다. FLAT은 벡터를 압축하지 않으며, 정확한 검색 결과를 보장할 수 있는 유일한 인덱스입니다. FLAT의 결과는 100% 미만의 재현율을 가진 다른 인덱스가 생성한 결과와 비교하기 위한 기준점으로도 사용할 수 있습니다.
FLAT은 검색에 대해 철저한 접근 방식을 취하기 때문에 정확합니다. 즉, 각 쿼리에 대해 대상 입력이 데이터셋의 모든 벡터와 비교됩니다. 이로 인해 FLAT은 목록에서 가장 느린 인덱스가 되며, 대규모 벡터 데이터를 쿼리하는 데는 적합하지 않습니다. Milvus의 FLAT 인덱스에는 매개변수가 없으며, 이를 사용하는 데 데이터 학습이나 추가 스토리지가 필요하지 않습니다.
FLAT 성능 테스트 결과:
FLAT 쿼리 시간 성능 테스트는 200만 개의 128차원 벡터로 구성된 데이터셋을 사용하여 Milvus에서 수행되었습니다.
Milvus의 FLAT 인덱스에 대한 쿼리 시간 테스트 결과.
핵심 요점:
- nq(쿼리의 대상 벡터 수)가 증가하면 쿼리 시간이 증가합니다.
- Milvus에서 FLAT 인덱스를 사용하면 nq가 200을 초과하는 순간 쿼리 시간이 급격히 증가하는 것을 볼 수 있습니다.
- 일반적으로 FLAT 인덱스는 Milvus를 CPU보다 GPU에서 실행할 때 더 빠르고 일관적입니다. 그러나 nq가 20 미만일 때는 CPU에서의 FLAT 쿼리가 더 빠릅니다.
IVF_FLAT: 정확도를 희생해 속도를 향상시킵니다(그리고 그 반대도 마찬가지입니다).
정확도를 희생하면서 유사도 검색 프로세스를 가속화하는 일반적인 방법은 근사 최근접 이웃(ANN) 검색을 수행하는 것입니다. ANN 알고리즘은 유사한 벡터를 함께 클러스터링하여 스토리지 요구 사항과 계산 부하를 줄이며, 그 결과 더 빠른 벡터 검색을 가능하게 합니다. IVF_FLAT은 가장 기본적인 inverted file 인덱스 유형이며 ANN 검색의 한 형태에 의존합니다.
IVF_FLAT은 벡터 데이터를 여러 클러스터 단위(nlist)로 나눈 다음, 대상 입력 벡터와 각 클러스터 중심 간의 거리를 비교합니다. 시스템이 쿼리하도록 설정된 클러스터 수(nprobe)에 따라, 유사도 검색 결과는 대상 입력과 가장 유사한 클러스터(들) 내의 벡터 간 비교만을 기반으로 반환되며, 이를 통해 쿼리 시간이 크게 줄어듭니다.
nprobe를 조정하면 주어진 시나리오에 대해 정확도와 속도 사이의 이상적인 균형을 찾을 수 있습니다. 당사의 IVF_FLAT 성능 테스트 결과는 대상 입력 벡터 수(nq)와 검색할 클러스터 수(nprobe)가 모두 증가함에 따라 쿼리 시간이 급격히 증가함을 보여줍니다. 그러나 IVF_FLAT은 벡터 데이터를 압축하지 않으며, 인덱스 파일에는 원시 비인덱싱 벡터 데이터셋과 비교해 스토리지 요구 사항을 약간 증가시키는 메타데이터가 포함됩니다.
IVF_FLAT 성능 테스트 결과:
IVF_FLAT 쿼리 시간 성능 테스트는 10억 개의 128차원 벡터를 포함하는 공개 1B SIFT 데이터셋을 사용하여 Milvus에서 수행되었습니다.
Milvus의 IVF_FLAT 인덱스에 대한 쿼리 시간 테스트 결과.
핵심 요점:
- CPU에서 실행할 때 Milvus의 IVF_FLAT 인덱스에 대한 쿼리 시간은 nprobe와 nq가 모두 증가함에 따라 증가합니다. 이는 쿼리에 포함된 입력 벡터가 많을수록, 또는 쿼리가 검색하는 클러스터가 많을수록 쿼리 시간이 더 길어진다는 의미입니다.
- GPU에서는 nq와 nprobe의 변화에 대한 인덱스의 시간 변동이 더 적습니다. 이는 인덱스 데이터가 크고, CPU 메모리에서 GPU 메모리로 데이터를 복사하는 것이 전체 쿼리 시간의 대부분을 차지하기 때문입니다.
- 모든 시나리오에서, nq = 1,000 및 nprobe = 32인 경우를 제외하고, IVF_FLAT 인덱스는 CPU에서 실행할 때 더 효율적입니다.
IVF_FLAT 재현율 성능 테스트는 100만 개의 128차원 벡터를 포함하는 공개 1M SIFT 데이터셋과 100만 개 이상의 200차원 벡터를 포함하는 glove-200-angular 데이터셋을 모두 사용하여 인덱스 구축(nlist = 16,384)을 위해 Milvus에서 수행되었습니다.
Milvus의 IVF_FLAT 인덱스에 대한 재현율 테스트 결과.
핵심 요점:
- IVF_FLAT 인덱스는 정확도에 맞게 최적화할 수 있으며, nprobe = 256일 때 1M SIFT 데이터셋에서 0.99 이상의 재현율을 달성합니다.
IVF_SQ8: IVF_FLAT보다 빠르고 리소스를 덜 소모하지만, 정확도는 더 낮습니다.
IVF_FLAT은 압축을 수행하지 않으므로, 생성되는 인덱스 파일은 원본의 원시 비인덱싱 벡터 데이터와 거의 같은 크기입니다. 예를 들어, 원본 1B SIFT 데이터셋이 476 GB라면, IVF_FLAT 인덱스 파일은 약간 더 큽니다(~470 GB). 모든 인덱스 파일을 메모리에 로드하면 470 GB의 스토리지를 소비합니다.
디스크, CPU 또는 GPU 메모리 리소스가 제한된 경우, IVF_SQ8은 IVF_FLAT보다 더 나은 옵션입니다. 이 인덱스 유형은 스칼라 양자화를 수행하여 각 FLOAT(4바이트)를 UINT8(1바이트)로 변환할 수 있습니다. 이를 통해 디스크, CPU 및 GPU 메모리 소비를 70–75% 줄일 수 있습니다. 1B SIFT 데이터셋의 경우, IVF_SQ8 인덱스 파일은 단 140 GB의 스토리지만 필요합니다.
IVF_SQ8 성능 테스트 결과:
IVF_SQ8 쿼리 시간 테스트는 인덱스 빌드를 위해 10억 개의 128차원 벡터를 포함하는 공개 1B SIFT 데이터셋을 사용하여 Milvus에서 수행되었습니다.
Milvus에서 IVF_SQ8 인덱스의 쿼리 시간 테스트 결과.
핵심 요점:
- 인덱스 파일 크기를 줄임으로써 IVF_SQ8은 IVF_FLAT 대비 뚜렷한 성능 향상을 제공합니다. IVF_SQ8은 IVF_FLAT과 유사한 성능 곡선을 따르며, 쿼리 시간은 nq와 nprobe가 증가함에 따라 늘어납니다.
- IVF_FLAT과 유사하게, IVF_SQ8은 CPU에서 실행되고 nq와 nprobe가 더 작을 때 더 빠른 성능을 보입니다.
IVF_SQ8 리콜 성능 테스트는 인덱스 빌드를 위해 100만 개의 128차원 벡터를 포함하는 공개 1M SIFT 데이터셋과 100만 개 이상의 200차원 벡터를 포함하는 glove-200-angular 데이터셋을 모두 사용하여 Milvus에서 수행되었습니다(nlist = 16,384).
Milvus에서 IVF_SQ8 인덱스의 리콜률 테스트 결과.
핵심 요점:
- 원본 데이터를 압축함에도 불구하고, IVF_SQ8은 쿼리 정확도에서 큰 감소를 보이지 않습니다. 다양한 nprobe 설정 전반에서 IVF_SQ8은 IVF_FLAT보다 리콜률이 최대 1% 낮습니다.
IVF_SQ8H: IVF_SQ8보다 훨씬 더 빠른 새로운 하이브리드 GPU/CPU 접근 방식.
IVF_SQ8H는 IVF_SQ8에 비해 쿼리 성능을 향상시키는 새로운 인덱스 유형입니다. CPU에서 실행되는 IVF_SQ8 인덱스가 쿼리될 때, 전체 쿼리 시간의 대부분은 대상 입력 벡터에 가장 가까운 nprobe 클러스터를 찾는 데 사용됩니다. 쿼리 시간을 줄이기 위해 IVF_SQ8은 인덱스 파일보다 더 작은 coarse quantizer 연산용 데이터를 GPU 메모리로 복사하여 coarse quantizer 연산을 크게 가속합니다. 그런 다음 gpu_search_threshold가 어떤 디바이스가 쿼리를 실행할지 결정합니다. nq >= gpu_search_threshold이면 GPU가 쿼리를 실행하고, 그렇지 않으면 CPU가 쿼리를 실행합니다.
IVF_SQ8H는 CPU와 GPU가 함께 작동해야 하는 하이브리드 인덱스 유형입니다. GPU가 활성화된 Milvus에서만 사용할 수 있습니다.
IVF_SQ8H 성능 테스트 결과:
IVF_SQ8H 쿼리 시간 성능 테스트는 인덱스 빌드를 위해 10억 개의 128차원 벡터를 포함하는 공개 1B SIFT 데이터셋을 사용하여 Milvus에서 수행되었습니다.
Milvus에서 IVF_SQ8H 인덱스의 쿼리 시간 테스트 결과.
핵심 요점:
- nq가 1,000 이하일 때, IVF_SQ8H는 IVFSQ8보다 거의 두 배 빠른 쿼리 시간을 보입니다.
- nq = 2000일 때, IVFSQ8H와 IVF_SQ8의 쿼리 시간은 동일합니다. 그러나 gpu_search_threshold 매개변수가 2000보다 낮으면, IVF_SQ8H가 IVF_SQ8보다 더 나은 성능을 보입니다.
- IVF_SQ8H의 쿼리 리콜률은 IVF_SQ8의 리콜률과 동일하며, 이는 검색 정확도 손실 없이 더 짧은 쿼리 시간을 달성한다는 의미입니다.
대규모 벡터 데이터 관리 플랫폼인 Milvus에 대해 자세히 알아보세요.
Milvus는 인공지능, 딥러닝, 기존 벡터 계산 등 다양한 분야의 유사도 검색 애플리케이션을 구동할 수 있는 벡터 데이터 관리 플랫폼입니다. Milvus에 대한 추가 정보는 다음 리소스를 확인하세요:
- Milvus는 GitHub에서 오픈 소스 라이선스로 제공됩니다.
- 그래프 및 트리 기반 인덱스를 포함한 추가 인덱스 유형이 Milvus에서 지원됩니다. 지원되는 인덱스 유형의 전체 목록은 Milvus의 벡터 인덱스 문서를 참조하세요.
- Milvus를 출시한 회사에 대해 자세히 알아보려면 Zilliz.com을 방문하세요.
- Milvus 커뮤니티와 채팅하거나 문제에 대한 도움을 받으려면 Slack을 이용하세요.
방법론
성능 테스트 환경
이 글에서 참조한 성능 테스트 전반에 사용된 서버 구성은 다음과 같습니다:
- Intel (R) Xeon (R) Platinum 8163 @ 2.50GHz, 24 cores
- GeForce GTX 2080Ti x 4
- 768 GB memory
관련 기술 개념
이 글을 이해하는 데 필수적이지는 않지만, 다음은 인덱스 성능 테스트 결과를 해석하는 데 도움이 되는 몇 가지 기술 개념입니다:
Blog_Accelerating Similarity Search on Really Big Data with Vector Indexing_8.png
리소스
이 글에는 다음 출처가 사용되었습니다:
- “데이터베이스 시스템 백과사전,” Ling Liu and M. Tamer Özsu.
다음 단계
벡터 인덱싱으로 정말 큰 데이터에서 유사도 검색 가속화: Part II를 계속 읽어보세요.
계속 읽기

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.



