
Vec1은 SQLite의 가상 테이블 인터페이스를 이용해 근사 최근접 이웃(ANN) 벡터 검색을 제공하는 확장 기능이다. 유클리드(L2) 거리와 코사인 거리를 지원하며, 현재 릴리스는 0.7이다.
Vec1은 이식성 있는 C로 구현됐으며 외부 의존성이 없다. x86에서는 AVX2를, ARM에서는 NEON을 사용한다. 검색 방식은 OPQ(최적화 제품 양자화)를 적용한 IVFADC(비대칭 거리 계산 기반 역파일)다. 공개 데이터셋을 이용한 테스트 결과도 제공한다.
빌드와 사용
확장 기능은 단일 C 파일인 vec1.c로 구현됐다. SQLite 확장 기능 빌드 방식을 따라 컴파일할 수 있다. 성능을 높이려면 SIMD 지원과 적극적인 컴파일러 최적화를 사용하는 것이 좋다고 안내한다. Linux 또는 macOS의 x86-64에서 gcc나 clang을 사용하는 예시는 다음과 같다.
cc -g -O3 -DNDEBUG -mavx2 -mfma vec1.c -shared -fPIC -o vec1.so
x86-64에서 MSVC를 사용할 때는 다음과 같이 빌드한다.
cl /Zi /O2 /DNDEBUG /arch:AVX2 vec1.c -link -dll -out:vec1.dll
ARM에서 NEON을 활성화하는 데 별도 옵션은 필요하지 않지만, 루프 언롤링 등 최적화를 위해 -O3 또는 이에 해당하는 옵션을 전달해야 한다. 위와 같이 x86-64용 SIMD 명령어를 활성화해 빌드한 바이너리는 해당 명령어를 지원하지 않는 시스템에서 작동하지 않는다. 여러 x86-64 아키텍처를 지원하도록 빌드하는 방법은 Makefile의 vec1multi.so 타깃에 나와 있다.
사용 방법은 사용 설명서와 참조 문서에서 확인할 수 있다. SQLite Vec1 벡터 쿼리 영상도 제공한다.
로드맵과 한계
프로젝트는 1.0 릴리스 전에 반드시 추가해야 할 기능은 없다고 밝히면서도, 테스트가 충분하지 않다고 적었다. 1.0 이후에는 검색 경로 전반의 최적화와 SELECT count(*) FROM vec1tbl 성능 개선, wasm SIMD 지원 등을 추가하거나 조사할 계획이다.
그 밖에 32비트 IEEE 부동소수점 외 자료형 지원, 파티션 키, IVFADC의 대안이 될 수 있는 그래프 기반 인덱스, 서로 다른 바이트 순서로 저장된 부동소수점 값을 사용하는 데이터베이스 지원, 내적 거리 측정, 다중 스레드 쿼리도 검토 대상으로 제시했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요