Cardinal 소개: 벡터 검색을 위한 최고 성능의 엔진
이 글은 Alexandr Guzhva와 Li Liu가 작성했습니다.
데이터베이스에서 '성능'은 특히 벡터 데이터베이스에서 중요한 지표입니다. 이는 제한된 리소스 내에서 대량의 사용자 요청을 효율적으로 처리하는 데 핵심적인 역할을 합니다. 일부 상황에서는 접근 지연 시간이 문제가 되지 않을 수 있지만, 벡터 데이터베이스에서는 여러 이유로 성능이 여전히 필수적입니다.
벡터 검색은 Approximate Nearest Neighbor Search(ANNS)에 의존하며, 향상된 성능을 위해 약간의 정확도를 절충할 수 있습니다. 향상된 성능은 결과적으로 더 높은 정밀도를 가능하게 합니다.
일관된 쿼리 지연 시간 하에서 유지되는 뛰어난 성능은 동일한 리소스로 더 높은 처리량을 가능하게 하여 더 큰 사용자 기반을 수용할 수 있게 합니다.
또한 향상된 성능은 동일한 사용 시나리오를 지원하는 데 필요한 계산 리소스를 줄여 줍니다.
벡터 데이터베이스는 본질적으로 계산 집약적이며, 리소스 사용량의 상당 부분—종종 80%를 초과—이 벡터 거리 계산에 할애됩니다. 그 결과, 벡터 검색 작업 처리를 담당하는 벡터 검색 엔진은 벡터 데이터베이스의 전반적인 성능을 결정하는 중요한 요소가 됩니다.
Zilliz는 벡터 데이터베이스 성능 향상을 지속적으로 우선시합니다. 오픈 소스 Milvus와 완전 관리형 Zilliz Cloud는 유사 제품에 비해 뛰어난 성능을 보여 줍니다. Milvus 벡터 검색 엔진 Knowhere는 새로운 검색 엔진의 기반을 마련함으로써 이러한 성공을 달성하는 데 중요한 역할을 합니다.
Zilliz Cloud의 최신 릴리스의 핵심에는 우리가 구축한 새로운 벡터 검색 엔진인 Cardinal이 있습니다. 이 검색 엔진은 이미 이전 버전에 비해 성능이 3배 향상되었음을 입증했으며, Milvus의 10배에 달하는 검색 성능(QPS)을 제공합니다.
우리는 오픈 소스 벡터 데이터베이스 벤치마크 도구를 통해 최신 Zilliz Cloud의 성능을 평가하고, 그 성능을 Milvus 및 기존 엔진을 사용한 Zilliz Cloud와 비교했습니다. 평가 결과는 아래 차트에 표시되어 있습니다.
Cardinal이란 무엇인가요?
Cardinal은 가장 실용적이고 널리 사용되는 ANNS 방법을 구현한 독점 멀티스레드 최신 C++ 템플릿 기반 벡터 검색 엔진입니다. Cardinal은 사용 가능한 컴퓨팅 리소스를 효율적으로 활용하기 위해 처음부터 설계되고 작성되었습니다.
Cardinal은 다음을 수행할 수 있습니다.
브루트 포스 검색 수행,
ANNS 인덱스 생성 및 수정,
인덱스 Top-K 및 인덱스 범위 검색 수행,
FP32, FP16, BF16을 포함한 다양한 입력 데이터 형식 작업,
인메모리 데이터 또는 메모리 매핑 데이터 작업,
사용자가 제공한 기준에 따라 검색 중 결과 필터링.
Cardinal에는 다음이 포함됩니다.
다양한 내부 매개변수를 쉽게 구성할 수 있게 해 주는 ANN 방법의 구현. 그러나 기본 운영 지점은 합리적인 정확도(재현율)를 유지하면서 검색 속도(QPS, 초당 쿼리 수)를 극대화하도록 지속적으로 조정됩니다.
ANNS 방법을 지원하는 다양한 알고리즘의 효율적인 구현. 예를 들어, 샘플 필터링 기능을 제공하는 알고리즘이 있습니다.
검색 또는 구축 중 사용되는 가장 계산 집약적인 작업을 위한 저수준 특화 최적화 커널. 여러 하드웨어 플랫폼이 지원됩니다. 다양한 메트릭에 대한 거리를 계산하는 커널 외에도 Cardinal에는 융합 커널과 데이터 전처리용 커널도 포함되어 있습니다.
비동기 작업, 메모리 매핑 I/O 기능, 캐싱, 메모리 할당자, 로깅 등의 지원 기능.
Knowhere vs Cardinal
Knowhere 라이브러리는 오픈 소스 Milvus의 내부 핵심으로, 벡터 검색을 담당합니다. Knowhere는 Faiss, DiskANN, hnswlib와 같은 업계 표준 오픈 소스 라이브러리의 패치된 버전을 기반으로 합니다.
Knowhere와 Cardinal을 비교해 보겠습니다:
| 기능 | Knowhere | Cardinal |
|---|---|---|
| 프로덕션 준비도 | 예 | 예 |
| 확장성 기능 | 예 | 예 |
| 설계 철학 | 실험과 유연성 | 범위가 좁으며, 성능을 위해 기존 기능 향상을 우선시 |
| 호스트 호환성 | 모든 호스트 유형 | Zilliz Cloud 호스트 환경에 최적화 |
| 의존성 | 잘 알려진 OSS 라이브러리 및 구현에 의존 | 중요하고 복잡한 수정 및 최적화 포함 |
둘 다 프로덕션 준비가 되어 있으며 Milvus와 Zilliz Cloud에 필요한 모든 확장성 기능을 제공합니다.
Knowhere는 실험과 유연성을 염두에 두고 설계되었습니다. Cardinal은 범위가 더 좁으며, 광범위한 새 기능을 도입하기보다는 속도와 성능 향상을 위해 기존 기능을 개선하는 데 우선순위를 둡니다.
Knowhere는 오픈 소스이며 다양한 환경에 배포될 수 있으므로 모든 호스트 유형에서 실행됩니다. Cardinal은 Zilliz Cloud 호스트 환경에 최적화되어 있습니다.
Knowhere는 Faiss, DiskANN, hnswlib와 같은 잘 알려진 OSS 라이브러리 및 구현에 의존합니다. Cardinal은 중요하고 복잡한 수정 및 최적화를 포함합니다.
Cardinal이 빠른 이유
Cardinal은 다양한 알고리즘 관련 최적화, 엔지니어링 최적화, 저수준 최적화를 구현합니다. Cardinal은 데이터셋에 가장 적합한 검색 전략과 인덱스를 자동으로 선택하는 AUTOINDEX 메커니즘을 도입합니다. 이를 통해 수동 튜닝의 필요성을 없애 개발자의 시간과 노력을 절약합니다.
자세히 살펴보겠습니다.
알고리즘 최적화
이러한 형태의 최적화는 검색 프로세스의 정확성과 효과를 크게 향상시키며, 이는 여러 알고리즘이 함께 작동하는 다면적인 파이프라인입니다. 이 파이프라인 내의 수많은 알고리즘은 전체 성능을 높이기 위해 개선될 수 있습니다. Cardinal에서 알고리즘 최적화의 주목할 만한 후보는 다음과 같습니다:
IVF 기반 접근 방식과 그래프 기반 접근 방식을 모두 포함하는 검색 알고리즘,
필터링된 샘플의 비율과 관계없이 검색이 필요한 재현율을 유지하도록 돕기 위해 설계된 알고리즘,
best-first search 알고리즘의 고급 반복 버전,
priority queue 데이터 구조를 위한 맞춤형 알고리즘.
매개변수화 가능한 알고리즘은 성능과 RAM 사용량의 균형과 같은 트레이드오프를 위한 유연성을 제공합니다. 그 결과, Cardinal의 알고리즘 최적화에는 매개변수 공간 내에서 최적의 운영 지점을 선택하는 것도 포함됩니다.
엔지니어링 최적화
알고리즘은 처음에는 추상적인 튜링 머신을 염두에 두고 설계되지만, 실제 구현에서는 네트워크 지연 시간, 클라우드 제공업체의 IOPS 제한, 그리고 가치 있지만 유한한 자원인 머신 RAM의 한계와 같은 과제에 직면합니다.
엔지니어링 최적화는 Cardinal의 벡터 검색 파이프라인이 실용성을 유지하고 컴퓨팅, RAM 및 기타 리소스 제약에 부합하도록 보장합니다. Cardinal의 개발에서는 표준 관행과 혁신적인 기법을 결합합니다. 이 접근 방식은 C++ 컴파일러가 계산적으로 최적인 컴파일 코드를 생성할 수 있게 하면서도, 새로운 기능을 신속하게 추가할 수 있도록 깨끗하고, 벤치마킹 가능하며, 쉽게 확장 가능한 소스 코드를 유지하게 합니다.
다음은 Cardinal에 구현된 엔지니어링 관행의 몇 가지 예로, 특정 최적화를 보여줍니다:
특화된 메모리 할당자와 메모리 풀,
적절하게 구현된 멀티스레드 코드,
요소들을 다양한 검색 파이프라인으로 조합하기 쉽게 하는 컴포넌트의 계층적 구조,
특정하고 중요한 사용 사례를 위한 코드 사용자 지정.
저수준 최적화
검색 시간의 대부분은 커널이라고 알려진 비교적 작은 코드 조각에서 소비됩니다. 가장 간단한 예는 두 벡터 간의 L2 거리를 계산하는 커널입니다.
Cardinal에는 다양한 목적을 위한 수많은 컴퓨트 커널이 포함되어 있으며, 각각은 특정 하드웨어 플랫폼과 사용 사례에 맞게 작성되고 최적화되어 있습니다.
Cardinal은 x86 및 ARM 하드웨어 플랫폼을 지원하지만, 다른 플랫폼도 쉽게 추가할 수 있습니다.
x86 플랫폼의 경우, Cardinal 커널은 AVX-512의 F, CD, VL, BW, DQ, VPOPCNTDQ, VBMI, VBMI2, VNNI, BF16 및 FP16 확장을 사용합니다. 또한, 새로운 AMX 명령어 세트의 사용을 탐색하고 있습니다.
ARM 플랫폼의 경우, Cardinal 커널은 NEON 및 SVE 명령어 세트 모두에 대해 제공됩니다.
우리는 Cardinal이 컴퓨트 커널에 대해 가장 최적의 코드를 얻도록 보장합니다. 단순히 최신 C++ 컴파일러가 작업을 수행하는 데만 의존하지 않습니다:
우리는 핫스팟과 CPU 메트릭을 분석하기 위해 Linux perf와 같은 전용 도구를 사용합니다
우리는 RAM/캐시 접근 횟수, 사용된 CPU 명령어, 레지스터, 컴퓨트 포트와 같은 하드웨어 ‘리소스’의 최적 사용을 보장하기 위해 GodBolt Compiler Explorer 및 uiCA와 같은 머신 코드 분석 도구를 사용합니다.
우리는 설계, 벤치마킹, 프로파일링, 어셈블러 코드 분석 단계를 교차적으로 수행하는 반복적 접근 방식을 사용합니다.
적절하게 최적화된 컴퓨트 커널은 단순하지만 최적화되지 않은 커널에 비해 2배 또는 3배의 속도 향상을 제공할 수 있습니다. 이는 나아가 클라우드 호스트 머신에서 2배 더 높은 QPS 값 또는 20% 더 낮은 메모리 요구 사항으로 이어질 수 있습니다.
AutoIndex: 검색 전략 선택
벡터 검색은 양자화, 인덱스 구축, 검색 알고리즘, 데이터 구조 등 많은 독립적인 컴포넌트를 포함하는 복잡한 프로세스입니다. 각 컴포넌트에는 조정 가능한 수많은 매개변수가 있습니다. 이들이 함께 매우 다양한 벡터 검색 전략의 범위를 형성하며, 서로 다른 데이터셋과 시나리오에는 서로 다른 검색 전략이 필요합니다.
성능 향상 가능성을 더 잘 활용하기 위해, Cardinal은 각 컴포넌트에서 여러 전략을 지원하는 것에 더해 AUTOINDEX라고 알려진 AI 기반 동적 전략 선택 메커니즘 세트를 구현했습니다. 이는 주어진 데이터셋의 분포, 제공된 쿼리, 하드웨어 구성에 따라 가장 적합한 전략을 적응적으로 선택합니다. 이를 통해 사용자의 검색 품질 요구를 충족하면서 최적의 성능을 달성할 수 있습니다.
Cardinal 벤치마크
우리는 테스트 환경에서 Cardinal을 지원하기 위해 ANN-benchmarks를 도입했습니다. ANN benchmarks는 ANNS 구현을 평가하기 위한 표준 벤치마킹 도구이며, 서로 다른 거리 메트릭을 사용하는 여러 표준 데이터셋에서 실행됩니다. 모든 성능 평가는 단일 스레드 사용으로 제한된 docker 컨테이너 내부에서 수행됩니다. 메트릭은 수많은 단일 쿼리 요청을 활용하는 여러 평가 반복을 기반으로 합니다. 평가된 모든 프레임워크의 결과는 recall-vs-QPS Pareto frontier로 집계됩니다.
모든 테스트는 기준 ann-benchmarks(2024년 1월 기준)와 동일한 종류의 머신에서 수행되었으며, 이는 다음 구성의 Amazon EC2 r6i.16xlarge 머신입니다:
CPU: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
CPU 코어 수: 32
하이퍼스레딩은 비활성화됨
RAM: 512 GB
OS: Linux kernel 6.2.0-1017-aws가 포함된 Ubuntu 22.04.3 LTS
Huge page 지원은 활성화되지 않았습니다.
테스트는 `--parallelism=31` 옵션으로 실행되었습니다.
Cardinal은 clang 17.0.6 컴파일러를 사용하여 컴파일되었습니다.
아래에 제시된 벤치마크 결과는 Cardinal 엔진에만 해당하며 Zilliz Cloud에서 제공하는 추가적인 비인덱스 최적화는 포함하지 않습니다.
참고: Zilliz Cloud 전용 최적화를 포함한 결과는 위의 글 시작 부분에 제공되어 있습니다.
다음 차트는 ANN-benchmark GitHub 페이지에 제시된 결과 차트 이미지를 가져와 그 위에 추가 Cardinal 곡선을 정확히 더해 제작되었습니다.
제공된 모든 벤치마크에서 Cardinal은 매우 경쟁력 있는 결과를 보여줍니다. 그리고 추가 개선의 여지도 있습니다.
다음은 무엇일까요?
미래는 의심할 여지 없이 우리에게 새로운 도전 과제를 가져올 것입니다. 서로 다른 요구사항, 서로 다른 병목 지점, 더 큰 데이터셋. 우리는 Cardinal을 더욱 개선하기 위해 계속 노력하고 있습니다.
길은 밝혀져 있습니다. 경로는 분명합니다. 우리에게 필요한 것은 그것을 따라갈 힘뿐입니다 :)
계속 읽기

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

Our Journey to 35K+ GitHub Stars: The Real Story of Building Milvus from Scratch
Join us in celebrating Milvus, the vector database that hit 35.5K stars on GitHub. Discover our story and how we’re making AI solutions easier for developers.

How to Use Anthropic MCP Server with Milvus
MCP + Milvus: Streamline AI agent development with standardized data access, eliminating integration hassles while enhancing context and flexibility.



