벡터 인덱싱을 통한 대용량 데이터의 유사도 검색 가속화
컴퓨터 비전에서 신약 발견에 이르기까지, 벡터 유사도 검색 엔진은 많은 인기 있는 인공 지능(AI) 애플리케이션을 구동합니다. 유사도 검색 엔진이 사용하는 백만, 억, 조 단위의 벡터 데이터 세트를 효율적으로 쿼리할 수 있게 해주는 가장 큰 요소는 빅데이터 검색을 획기적으로 가속화하는 데이터 정리 프로세스인 인덱싱입니다. 이 문서에서는 벡터 유사도 검색을 효율적으로 만드는 데 있어 인덱싱이 하는 역할, 다양한 벡터 반전 파일(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의 결과는 다른 인덱스에서 생성된 결과의 비교 기준으로도 사용할 수 있습니다.
FLAT은 각 쿼리마다 데이터 세트의 모든 벡터와 대상 입력을 비교하는 철저한 검색 방식을 취하기 때문에 정확도가 높습니다. 따라서 FLAT은 목록에서 가장 느린 인덱스이며, 대규모 벡터 데이터를 쿼리하는 데는 적합하지 않습니다. Milvus에는 FLAT 인덱스에 대한 매개변수가 없으며, 이를 사용하는 데 데이터 학습이나 추가 저장 공간이 필요하지 않습니다.
FLAT 성능 테스트 결과:
Milvus에서 2백만 개의 128차원 벡터로 구성된 데이터 세트를 사용해 FLAT 쿼리 시간 성능 테스트를 수행했습니다.
블로그_벡터 인덱싱으로 대용량 데이터의 유사도 검색 가속화하기_2.png
핵심 사항
- nq(쿼리의 대상 벡터 수)가 증가하면 쿼리 시간이 증가합니다.
- Milvus의 FLAT 인덱스를 사용하면 nq가 200을 초과하면 쿼리 시간이 급격히 증가하는 것을 볼 수 있습니다.
- 일반적으로 Milvus를 CPU보다 GPU에서 실행할 때 FLAT 인덱스가 더 빠르고 일관적입니다. 그러나 nq가 20 미만일 때 CPU에서의 FLAT 쿼리가 더 빠릅니다.
IVF_FLAT: 정확도를 희생하는 대신 속도를 향상시킵니다(그 반대의 경우도 마찬가지).
정확도를 희생하면서 유사도 검색 프로세스를 가속화하는 일반적인 방법은 근사 근사 이웃(ANN) 검색을 수행하는 것입니다. ANN 알고리즘은 유사한 벡터를 함께 클러스터링하여 스토리지 요구 사항과 계산 부하를 줄여 벡터 검색 속도를 높입니다. IVF_FLAT은 가장 기본적인 역방향 파일 인덱스 유형으로, ANN 검색의 한 형태에 의존합니다.
IVF_FLAT은 벡터 데이터를 여러 개의 클러스터 단위(nlist)로 나눈 다음, 대상 입력 벡터와 각 클러스터의 중심 사이의 거리를 비교합니다. 시스템이 쿼리하도록 설정된 클러스터 수(nprobe)에 따라 목표 입력과 가장 유사한 클러스터의 벡터만을 비교하여 유사도 검색 결과를 반환하므로 쿼리 시간을 대폭 단축할 수 있습니다.
nprobe를 조정하면 주어진 시나리오에서 정확도와 속도 사이의 이상적인 균형을 찾을 수 있습니다. IVF_FLAT 성능 테스트의 결과는 대상 입력 벡터의 수(nq)와 검색할 클러스터의 수(nprobe)가 모두 증가함에 따라 쿼리 시간이 급격히 증가한다는 것을 보여줍니다. IVF_FLAT은 벡터 데이터를 압축하지 않지만, 인덱스 파일에는 메타데이터가 포함되어 있어 인덱싱되지 않은 원시 벡터 데이터 세트에 비해 저장 공간 요구 사항이 약간 증가합니다.
IVF_FLAT 성능 테스트 결과:
10억 개의 128차원 벡터가 포함된 공개 1B SIFT 데이터 세트를 사용해 Milvus에서 IVF_FLAT 쿼리 시간 성능 테스트를 수행했습니다.
블로그_벡터 인덱싱으로 대용량 데이터에서 유사도 검색 가속화하기_3.png
핵심 사항
- CPU에서 실행할 때, Milvus의 IVF_FLAT 인덱스에 대한 쿼리 시간은 nprobe와 nq 모두에 따라 증가합니다. 즉, 쿼리에 포함된 입력 벡터가 많거나 쿼리가 검색하는 클러스터가 많을수록 쿼리 시간이 길어집니다.
- GPU에서 인덱스는 nq와 nprobe의 변화에 대한 시간 편차가 더 적습니다. 이는 인덱스 데이터가 크고 CPU 메모리에서 GPU 메모리로 데이터를 복사하는 것이 전체 쿼리 시간의 대부분을 차지하기 때문입니다.
- nq = 1,000, nprobe = 32인 경우를 제외한 모든 시나리오에서, IVF_FLAT 인덱스는 CPU에서 실행할 때 더 효율적입니다.
인덱스 구축을 위해 100만 개의 128차원 벡터가 포함된 공개 1M SIFT 데이터 세트와 100만 개 이상의 200차원 벡터가 포함된 glove-200-각 데이터 세트(nlist = 16,384)를 모두 사용해 Milvus에서 IVF_FLAT 리콜 성능 테스트를 수행했습니다.
블로그_벡터 인덱싱으로 대용량 데이터에서 유사도 검색 가속화하기_4.png
핵심 요점:
- IVF_FLAT 인덱스는 정확도를 최적화할 수 있으며, nprobe = 256일 때 1M SIFT 데이터 세트에서 0.99 이상의 리콜률을 달성할 수 있습니다.
IVF_SQ8: IVF_FLAT보다 더 빠르고 리소스를 덜 소모하지만 정확도도 떨어집니다.
IVF_FLAT은 압축을 수행하지 않기 때문에 생성되는 인덱스 파일은 인덱싱되지 않은 원본 원시 벡터 데이터와 거의 같은 크기입니다. 예를 들어, 원본 1B SIFT 데이터 세트가 476GB인 경우, IVF_FLAT 인덱스 파일은 약간 더 커집니다(~470GB). 모든 인덱스 파일을 메모리에 로드하면 470GB의 스토리지가 소모됩니다.
디스크, CPU 또는 GPU 메모리 리소스가 제한되어 있는 경우 IVF_SQ8이 IVF_FLAT보다 더 나은 옵션입니다. 이 인덱스 유형은 스칼라 양자화를 수행하여 각 FLOAT(4바이트)를 UINT8(1바이트)로 변환할 수 있습니다. 이렇게 하면 디스크, CPU, GPU 메모리 사용량이 70~75%까지 줄어듭니다. 1B SIFT 데이터 세트의 경우, IVF_SQ8 인덱스 파일은 140GB의 스토리지만 필요합니다.
IVF_SQ8 성능 테스트 결과:
인덱스 구축을 위해 10억 개의 128차원 벡터가 포함된 공개 1B SIFT 데이터 세트를 사용해 Milvus에서 IVF_SQ8 쿼리 시간 테스트를 수행했습니다.
블로그_벡터 인덱싱으로 실제 빅데이터에서 유사도 검색 가속화하기_5.png
핵심 사항
- 인덱스 파일 크기를 줄임으로써 IVF_SQ8은 IVF_FLAT에 비해 현저한 성능 향상을 제공합니다. IVF_SQ8은 IVF_FLAT과 유사한 성능 곡선을 따르며, 쿼리 시간은 nq 및 nprobe에 따라 증가합니다.
- IVF_SQ8은 IVF_FLAT과 마찬가지로 CPU에서 실행할 때와 nq 및 nprobe가 더 작을 때 더 빠른 성능을 보입니다.
IVF_SQ8 리콜 성능 테스트는 Milvus에서 인덱스 구축을 위해 100만 개의 128차원 벡터가 포함된 공개 1M SIFT 데이터 세트와 100만 개 이상의 200차원 벡터가 포함된 glove-200-각 데이터 세트(nlist = 16,384)를 사용해 수행되었습니다.
블로그_벡터 인덱싱으로 대용량 데이터에서 유사도 검색 가속화하기_6.png
핵심 요점:
- 원본 데이터를 압축했음에도 불구하고 IVF_SQ8은 쿼리 정확도가 크게 감소하지 않습니다. 다양한 nprobe 설정에서 IVF_SQ8은 IVF_FLAT보다 최대 1% 낮은 리콜률을 보였습니다.
IVF_SQ8H: IVF_SQ8보다 훨씬 빠른 새로운 하이브리드 GPU/CPU 접근 방식.
IVF_SQ8H는 IVF_SQ8에 비해 쿼리 성능을 향상시키는 새로운 인덱스 유형입니다. CPU에서 실행되는 IVF_SQ8 인덱스를 쿼리할 때, 전체 쿼리 시간의 대부분은 목표 입력 벡터에 가장 가까운 n프로브 클러스터를 찾는 데 소요됩니다. 쿼리 시간을 줄이기 위해 IVF_SQ8은 인덱스 파일보다 작은 굵은 양자화 연산을 위한 데이터를 GPU 메모리에 복사하여 굵은 양자화 연산을 크게 가속화합니다. 그런 다음 gpu_search_threshold가 쿼리를 실행할 장치를 결정합니다. nq >= gpu_search_threshold이면 GPU가 쿼리를 실행하고, 그렇지 않으면 CPU가 쿼리를 실행합니다.
IVF_SQ8H는 CPU와 GPU가 함께 작동해야 하는 하이브리드 인덱스 유형입니다. GPU가 활성화된 Milvus에서만 사용할 수 있습니다.
IVF_SQ8H 성능 테스트 결과:
인덱스 구축을 위해 10억 개의 128차원 벡터가 포함된 공개 1B SIFT 데이터셋을 사용해 Milvus에서 IVF_SQ8H 쿼리 시간 성능 테스트를 수행했습니다.
블로그_벡터 인덱싱으로 실제 빅데이터에서 유사도 검색 가속화하기_7.png
핵심 사항
- 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에서 문제에 대한 도움을 받으세요.
방법론
성능 테스트 환경
이 문서에서 언급된 성능 테스트에 사용된 서버 구성은 다음과 같습니다:
- 인텔 ® 제온 ® 플래티넘 8163 @ 2.50GHz, 24코어
- GeForce GTX 2080Ti x 4
- 768GB 메모리
관련 기술 개념
이 문서를 이해하는 데 필수적인 것은 아니지만, 다음은 인덱스 성능 테스트 결과를 해석하는 데 도움이 되는 몇 가지 기술 개념입니다:
블로그_벡터 인덱싱으로 실제 빅데이터에서 유사도 검색 가속화하기_8.png
리소스
이 문서에는 다음 자료가 사용되었습니다:
- "데이터베이스 시스템 백과사전", Ling Liu 및 M. Tamer Özsu.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word