Faiss

Ryu Jihoon·2024년 10월 24일
post-thumbnail

Faiss 소개

Faiss는 Facebook AI Research에서 개발한 빠른 유사성 검색과 밀집 벡터 검색을 위한 라이브러리입니다. Faiss는 특히 대규모 데이터베이스에서 고차원 벡터를 처리하고, 가장 유사한 항목을 빠르게 검색하는 데 최적화된 도구입니다. 주로 임베딩 벡터를 이용한 검색 작업에 많이 사용되며, 효율적인 검색이 가능하도록 다양한 인덱싱 및 검색 알고리즘을 제공합니다.


Faiss의 주요 특징

  1. 고성능 검색
    Faiss는 대규모 데이터셋(수백만에서 수억 개의 벡터)에 대해 빠르게 유사한 벡터를 검색할 수 있는 성능을 제공합니다. GPU 가속을 지원하여 매우 큰 데이터셋에서도 빠른 검색이 가능합니다.

  2. 유사도 검색
    벡터 공간에서 주어진 쿼리 벡터와 가장 가까운 벡터들(k-NN, k Nearest Neighbors)을 찾습니다. 주로 L2 거리(유클리드 거리)코사인 유사도를 사용합니다.
    예를 들어, 이미지 검색 시스템에서는 이미지의 임베딩 벡터를 생성한 후, 해당 임베딩 벡터를 Faiss에 입력하면 가장 유사한 이미지 벡터들을 반환할 수 있습니다.

  3. 효율적인 인덱싱
    인덱싱(indexing)을 통해 벡터를 효율적으로 저장하고 검색하는 방법을 제공합니다. 대규모 벡터 데이터에서 빠른 검색이 가능하도록, 벡터를 압축하거나 클러스터링하는 방식의 인덱싱을 사용할 수 있습니다.
    Faiss는 다양한 인덱스 타입을 지원합니다. 대표적인 인덱스는 Flat 인덱스, IVF(Indexed Vector File) 인덱스, PQ(Product Quantization) 등이 있습니다.

  4. CPU 및 GPU 지원
    Faiss는 CPU뿐만 아니라 GPU에서도 동작하도록 설계되어 있어, 대규모 데이터에서 높은 성능을 요구하는 작업을 처리할 수 있습니다.


Faiss의 주요 인덱스

  • Flat Index
    가장 단순한 형태로, 모든 벡터를 선형 탐색하여 가장 유사한 벡터를 찾습니다. 정확도는 높지만 속도가 느릴 수 있습니다.

  • IVF (Indexed Vector File)
    벡터를 클러스터링하여 여러 개의 클러스터 중에서 가장 가까운 클러스터에 대해 탐색합니다. 클러스터링을 통해 검색 속도를 높이지만, 정확도는 약간 감소할 수 있습니다.

  • PQ (Product Quantization)
    벡터를 압축하여 메모리 사용량을 줄이고, 이를 기반으로 검색을 수행합니다. 검색 속도는 빠르지만 정확도가 떨어질 수 있습니다.


Faiss의 활용 예시

1. 이미지 검색

CNN을 사용하여 이미지 임베딩을 생성한 후, 이 벡터들을 Faiss에 저장합니다. 새로운 이미지가 입력되면 해당 이미지를 임베딩으로 변환하고, 가장 가까운 벡터를 Faiss에서 검색하여 관련된 이미지를 찾을 수 있습니다.

2. 추천 시스템

유저의 행동 데이터를 임베딩 벡터로 변환하고, 이를 기반으로 유사한 사용자에게 맞는 아이템을 추천합니다. 사용자가 새로운 행동을 할 때마다 그와 유사한 다른 사용자를 찾아 유사한 행동을 추천하는 방식입니다.

3. 자연어 처리

텍스트 임베딩을 사용하여 문장이나 단어를 벡터로 변환한 후, 유사한 문장이나 문서를 찾을 수 있습니다. 문서 검색 엔진에서 입력된 쿼리와 유사한 문서를 빠르게 찾아주는 작업에 Faiss를 활용할 수 있습니다.


Faiss 설치 및 기본 사용법

1. 설치

  • CPU 버전 설치
  pip install faiss-cpu

2. 기본 사용법

import faiss
import numpy as np

# 임의의 데이터 생성 (1000개의 128차원 벡터)
data = np.random.random((1000, 128)).astype('float32')

# 쿼리 벡터 생성 (128차원 벡터 5개)
query = np.random.random((5, 128)).astype('float32')

# Faiss 인덱스 생성 (L2 거리 기반 Flat 인덱스)
index = faiss.IndexFlatL2(128)  # 128은 벡터 차원 수

# 데이터 추가 (학습할 필요 없음)
index.add(data)  # 데이터베이스에 벡터 추가

# 쿼리 벡터에 대해 k-NN 검색 (가장 가까운 10개 검색)
k = 10
distances, indices = index.search(query, k)  # 거리와 인덱스 반환

print(indices)  # 각 쿼리에 대한 가장 가까운 벡터들의 인덱스
print(distances)  # 각 쿼리와의 거리

Faiss의 장점

  • 확장성: 매우 큰 데이터셋에서도 빠르고 효율적인 검색을 수행할 수 있습니다.
  • 다양한 인덱스 옵션: 다양한 인덱스 옵션을 제공하여, 정확도와 속도 간의 균형을 조절할 수 있습니다.
  • GPU 지원: GPU 가속을 통해 대규모 벡터 데이터에서의 검색 성능을 극대화할 수 있습니다.

Faiss 사용 시 고려사항

  • 속도 vs 정확도: 인덱스 방식에 따라 속도와 정확도 간의 트레이드오프가 있습니다. Flat 인덱스는 정확하지만 느리고, IVF나 PQ는 빠르지만 정확도가 떨어질 수 있습니다.
  • 메모리 사용량: Flat 인덱스는 모든 벡터를 메모리에 저장하므로, 데이터셋이 매우 크면 메모리 부족 문제가 발생할 수 있습니다. 이 경우 PQ 같은 압축 기법을 사용할 수 있습니다.
profile
CSE Junior

0개의 댓글