본문 바로가기

IT & AI

Turbovec, 31GB 벡터를 4GB로 줄인 Rust 검색 엔진

728x90

Turbovec, 31GB 벡터를 4GB로 줄인 Rust 검색 엔진

AI 뉴스 썸네일
AI 뉴스 썸네일

RAG 서비스를 운영하면 임베딩 저장 공간과 검색 지연 시간이 함께 커져요. Rust로 만든 Turbovec은 Google Research의 TurboQuant 알고리즘을 벡터 인덱스로 구현해 이 부담을 줄여요. Python 바인딩도 제공해서 기존 AI 애플리케이션에 붙여 볼 수 있어요.

728x90

핵심 요약

구분내용
메모리프로젝트 설명에 따르면 1,000만 개의 float32 문서 벡터가 쓰는 31GB를 4GB로 줄여요.
검색ARM의 NEON과 x86의 AVX-512·AVX2를 활용해 압축된 벡터를 직접 검색해요.
운영별도 학습 없이 벡터를 추가하고, 변경분 저장과 외부 ID 기반 삭제를 지원해요.
적용Rust와 Python에서 로컬로 실행하며 주요 RAG 프레임워크 연동 모듈을 제공해요.

1. 벡터 검색의 메모리와 지연 시간을 함께 줄여요

Turbovec은 고차원 벡터를 2비트 또는 4비트로 양자화해 저장해요. 1,536차원 FP32 벡터 하나는 원래 6,144바이트를 쓰지만, 2비트 설정에서는 384바이트로 줄어요. 프로젝트가 제시한 1,000만 문서 예시도 같은 원리로 31GB에서 4GB까지 작아져요. 1

압축한 벡터를 매번 복원한 뒤 비교하지도 않아요. 쿼리를 같은 공간으로 한 번 회전하고 코드북 값으로 점수를 계산해요. ARM에서는 NEON을 쓰고, 최신 x86에서는 AVX-512 VNNI와 AVX-512BW를 활용해요. 해당 명령어를 지원하지 않는 CPU에서는 AVX2나 스칼라 경로로 바뀌어요. 2

프로젝트 자체 벤치마크는 10만 개 벡터와 1,000개 쿼리, k=64 조건에서 5회 실행한 중앙값을 사용했어요. 4비트 검색은 FAISS FastScan보다 ARM에서 평균 3.5배, x86에서 평균 3.4배 빨랐어요. 2비트에서는 각각 26%와 20% 빨랐다고 밝혔어요. 다만 이 수치는 프로젝트가 정한 데이터 세트와 하드웨어에서 측정한 결과예요. 실제 서비스에서는 벡터 차원, 필터 선택도, 동시 요청 수를 맞춘 별도 측정이 필요해요. 2

벡터를 넣기 전에 인덱스를 다시 학습하지 않아요

일반적인 PQ 인덱스는 코드북 학습과 재구축 과정이 운영 부담으로 이어질 수 있어요. Turbovec의 기본 TurboQuant 경로는 입력 데이터와 무관한 코드북을 사용해요. 벡터를 추가하면 바로 검색 대상에 들어가고, 말뭉치가 커져도 별도 학습 단계를 다시 돌리지 않아요. 원한다면 대표 표본으로 TQ+ 보정을 한 번 수행해 일부 데이터 분포에서 재현율을 높일 수 있어요. 3

검색 필터를 SIMD 커널 안에서 처리해요

권한 목록이나 시간 범위로 후보를 먼저 좁힌 뒤 벡터 점수로 재정렬하는 하이브리드 검색에도 맞아요. `search()`에 허용 ID 목록이나 슬롯 비트 마스크를 넘기면 허용 벡터가 없는 블록을 점수 계산 전에 건너뛰어요. 이미 계산한 결과를 나중에 버리는 방식보다 선택 범위가 좁을 때 계산량을 아낄 수 있어요. SQL, BM25, ACL 결과를 1차 후보로 쓰는 RAG 구성에서 실용적인 부분이에요. 2

변경분 저장과 안정적인 외부 ID를 지원해요

`sync(path)`는 마지막 동기화 이후 바뀐 부분만 저장해요. 작은 추가나 삭제 때문에 전체 인덱스 파일을 매번 다시 쓸 필요가 없어요. `IdMapIndex`는 외부에서 쓰던 64비트 ID를 유지하고, 삭제할 때 ID 맵과 swap-and-pop 방식을 이용해 O(1)로 처리해요. 전체 스냅샷이 필요하면 `write`와 `load`를 그대로 쓸 수 있어요. 2

Python에서는 `pip install turbovec`, Rust에서는 `cargo add turbovec`으로 설치할 수 있어요. LangChain, LlamaIndex, Haystack, Agno용 연동 문서도 마련돼 있어요. 관리형 벡터 데이터베이스 없이 머신이나 VPC 안에서 인덱스를 운영하려는 팀이 검토하기 쉬운 구성인 셈이에요.

왜 중요한가요

벡터 검색 비용은 모델 호출료만으로 설명되지 않아요. 임베딩 수가 늘면 메모리와 저장 공간, 인덱스 갱신 시간도 함께 늘어요. Turbovec은 압축, 즉시 추가, 증분 저장을 한 라이브러리 안에서 제공해 운영 경로를 단순하게 만들어요. 특히 데이터를 외부 서비스로 보내기 어려운 RAG나 에지 환경에서 선택지가 될 수 있어요. 2

도입 전에는 검색 속도만 보지 않는 편이 좋아요. 서비스에서 쓰는 임베딩으로 recall@k를 확인하고, 필터가 많은 쿼리와 동시 요청 조건을 따로 재현해야 해요. FAISS와의 비교도 같은 메모리 예산과 정확도 목표를 맞춰야 의미가 있어요. 저장 파일 호환성, 장애 복구 시간, Python 호출 오버헤드까지 함께 재면 실제 교체 비용을 판단하기 쉬워요.

참고 자료

  1. Turbovec - Rust로 구현한 벡터 검색용 Google TurboQuant — GeekNews
  2. RyanCodrai/turbovec: A vector index built on TurboQuant — GitHub
  3. TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate — arXiv
728x90