HNSW 알고리즘만 구현해 놓은 C++ 헤더 전용 라이브러리다. Python 바인딩을 제공하며, HNSW 논문 저자인 Yury Malkov 가 직접 만들었다.

faiss 처럼 여러 인덱스 방식을 한데 담은 라이브러리와 달리, 한 알고리즘만 다루는 대신 그 경로를 얇게 유지한 것이 특징이다. 의존성이 거의 없어 빌드가 간단하고, 질의당 오버헤드가 작다.

언제 faiss 대신 쓰나

faiss 는 IVF, PQ 압축, GPU 실행, 여러 인덱스 조합 등 선택지가 넓다. 데이터가 아주 크거나 메모리를 줄여야 하면 그쪽이 맞다.

반대로 다음 조건에서는 hnswlib 이 유리하다.

  • 인덱스가 메모리에 다 올라간다
  • 알고리즘은 HNSW 로 정해져 있다
  • 질의 지연이 밀리초 단위에서 문제가 된다

같은 HNSW 라도 faiss 를 거치면 추상화 계층을 통과하는 비용이 붙는다. 검색 자체가 몇 밀리초인 상황에서는 이 차이가 전체 지연에서 눈에 띄는 비중이 된다. 네이버가 4ms 도 느리다고 보고 hnswlib 으로 옮긴 사례가 이 이유다.

제약

  • HNSW 만 지원한다. 인덱스 방식을 바꾸려면 라이브러리를 바꿔야 한다
  • 벡터를 전부 메모리에 올린다. 압축이 없으므로 데이터가 커지면 메모리가 그대로 비용이 된다
  • 삭제는 표시만 하는 방식(soft delete)이라, 삭제가 잦으면 인덱스를 다시 만들어야 한다
  • 인덱스 구축 파라미터(M, ef_construction)는 만든 뒤에 바꿀 수 없다. 검색 시 정확도와 속도를 조절하는 ef 만 질의 시점에 조정한다

milvus, weaviate 같은 벡터 데이터베이스가 내부 엔진의 하나로 hnswlib 을 쓰기도 한다.

References