Bitweave를 구축한 이유: 1.1 MB 미만의 RSS 메모리로 구현한 밀리초 미만(Sub-Millisecond) 하이브리드 검색
요약
Bitweave는 Rust 기반의 초경량 하이브리드 검색 엔진으로, 1.1 MB 미만의 메모리 점유율로 밀리초 미만의 검색 속도를 제공합니다. 메모리 맵 파일과 1비트 양자화, SIMD 가속 기술을 활용하여 로컬 RAG 및 에지 에이전트 환경에 최적화된 성능을 구현합니다.
핵심 포인트
- 1.1 MB 미만의 극도로 낮은 RSS 메모리 점유율 유지
- Zero-copy 메모리 맵(memmap2)을 통한 효율적인 인덱스 로딩
- 1-Bit 양자화 및 SIMD 연산을 활용한 초고속 사전 필터링
- Float32 재점수화(Rescoring)를 통한 검색 정확도 확보
- Rust 기반 구현 및 Python 바인딩 지원으로 개발 편의성 제공
로컬 RAG (Retrieval-Augmented Generation, 검색 증강 생성) 애플리케이션, 에지 에이전트(edge agents), 또는 서버리스 AI 파이프라인을 구축할 때, 개발자들은 보통 표준 벡터 저장소(vector stores)의 한계에 부딪힙니다. 바로 메모리 오버헤드(memory overhead)입니다.
전용 벡터 데이터베이스를 로컬에서 실행하면 인덱스를 활성 상태(warm)로 유지하기 위해서만 수백 메가바이트에서 수 기가바이트의 RAM이 필요한 경우가 많습니다. 반대로, 원시 JSON 파일을 스캔하거나 SQLite를 쿼리하는 것과 같은 경량 로컬 옵션들은 벡터 차원(vector dimensions)이 수천 단위(1536d+)로 올라가면 확장성(scale)이 떨어집니다.
우리는 바로 이러한 트레이드오프(trade-off)를 해결하기 위해 Bitweave를 구축했습니다. Bitweave는 Rust로 작성되었고(Python 바인딩 제공), 범주형 필터링(categorical filtering)과 벡터 검색을 처리하면서도 활성 힙(active heap) 점유율을 1.1 MB RSS 미만으로 유지하는 제로 카피(zero-copy), SIMD 가속 하이브리드 검색 엔진입니다.
아키텍처: Bitweave가 1.1 MB 미만의 RAM에서 어떻게 밀리초 미만(Sub-Millisecond)의 속도를 달성하는가
Bitweave는 메모리 소비를 무시할 수 있는 수준으로 유지하면서 검색 속도를 극대화하기 위해 3단계 설계에 의존합니다:
[ Categorical Filters ] ---> Bit-Sliced Bitmaps
│
▼
[ Query Vector (1536d) ] --> 1-Bit SIMD Pre-Filtering (Hamming Distance)
│ (Top K Candidates)
▼
[ Raw Embeddings Buffer ] -> Zero-Copy Float32 Rescoring (exact_rescore=True)
│
▼
Top-K Results Array (NumPy)
-
Zero-Copy Memory Mapping (memmap2)
인덱스 파일을 Python RAM이나 Rust 힙(heap) 공간으로 역직렬화(deserializing)하는 대신, Bitweave는 메모리 맵 파일(.bweave)을 사용합니다. 운영 체제의 페이지 캐시(page cache)가 디스크에서 가상 주소 공간(virtual address space)으로 인덱스 세그먼트를 직접 지연 로딩(lazy loading)하도록 처리합니다. 그 결과, 인덱스가 5,000개 또는 200,000개의 레코드를 보유하더라도 활성 RSS 메모리 점유율(footprint)은 약 1.1 MB 수준으로 일정하게 유지됩니다. -
1-Bit Vector Quantization & SIMD Hamming Distance
고차원 float32 벡터(1536d)는 1비트 부호 마스크(1-bit sign masks, 값이 0보다 크면 1로, 0 이하이면 0으로 매핑)로 양자화(quantized)됩니다. 사전 순위 지정(pre-ranking) 단계에서 Bitweave는 SIMD 비트 연산 XOR 및 POPCNT 연산을 사용하여 후보 벡터들 사이의 해밍 거리(Hamming distances)를 마이크로초 단위로 계산합니다. -
Zero-Copy 2-Pass Float32 Rescoring (exact_rescore=True)
양자화는 초기 후보 선택 속도를 높여주지만, RAG(Retrieval-Augmented Generation)의 정확도를 위해서는 전체 정밀도(full precision)가 매우 중요합니다. Bitweave는 상위 N개의 사전 순위 지정된 후보를 가져온 뒤, 바이너리 버퍼 내의 직접 오프셋 포인터(direct offset pointers)를 통해 해당 후보들의 원본 Float32 임베딩(embeddings)을 역참조(dereferencing)함으로써 이 문제를 해결합니다. 이를 통해 1비트 SIMD 필터링의 속도와 정확한 float32 거리 재점수화(rescoring)를 동시에 얻을 수 있습니다.
Quick Benchmarks: 200,000 Records
200,000개의 밀집 레코드(dense records)를 처리하는 단일 머신에서 Bitweave를 표준 로컬 검색 방식들과 비교 벤치마크했습니다:
Python JSON Scan: ~450 MB RAM | > 120 ms latency | ❌ Zero-copy 미지원
SQLite (Indexed): ~45 MB RAM | ~18 ms latency | ❌ Zero-copy 미지원
Bitweave (.bweave): ~1.1 MB RAM | < 1.0 ms latency | ✅ Zero-copy 지원
Getting Started with Python
Bitweave는 Linux, macOS (x86_64 & Apple Silicon), Windows용 사전 컴파일된 휠(pre-compiled wheels)과 함께 PyPI에 게시되어 있습니다.
Installation
pip install bitweave
Basic Usage
import numpy as np
from bitweave import HybridIndex
...
직접 벤치마크 재현하기
우리는 성능에 대한 주장이 항상 독립적으로 검증 가능해야 한다고 믿습니다. 로컬 환경에서 200k 벤치마크 스위트(benchmark suite) 전체를 실행하고 대화형 HTML 보고서를 생성할 수 있습니다:
git clone [https://github.com/cteague2018/bitweave.git](https://github.com/cteague2018/bitweave.git)
cd bitweave
...
브라우저에서 report.html을 열어 지연 시간(latency) 분포와 RSS 메모리 사용량 그래프를 확인해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기