FAISS란?
FAISS (Facebook AI Similarity Search):
- 개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있게 해주는 라이브러리
- 전통적인 쿼리 검색 엔진이 해시 기반 검색에 최적화되어 있어 발생하는 제한 사항을 해결하고, 보다 확장 가능한 유사성 검색 기능을 제공
- Facebook AI Similarity Search는 개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있게 해주는 라이브러리
- 대규모 데이터 셋을 검색하여 대상 항목과 유사한 항목을 찾아야하는 상황에서 도움을 줄 수있도록 설계됨
- 목적: FAISS는 메모리 사용량과 속도에 중점을 둔 어떤 크기의 벡터 집합에서든 검색하는데 사용. 매우 큰 데이터셋을 다룰때 특히 유용
- 효율성: FAISS에는 밀리초 내에 수백만 개의 벡터를 검색할 수 있는 알고리즘이 포함되어 있다. CPU와 GPU사용 모두에 최적화 되어있음
- 사용사례: 가장 가까운 이웃 검색과 같은 머신러닝 작업에 자주 사용. → 추천시스템, 클러스터링 및 다른 많은 AI응용 프로그램에 필수적인 작업
- 통합: FAISS는 PyTorch와 같은 다른 머신 러닝 도구 및 라이브러리와 쉽게 통합될 수 있다.
- 오픈소스: FAISS는 오픈 소스로 GitHub에서 누구나 사용, 수정, 기여할 수 있도록 코드가 제공
효율적인 유사성 검색
Faiss 를 사용하면 개발자들은 표준데이터 베이스 엔진 (sql)으로는 비효율적이거나 불가능한 방식으로 멀티미디어 문서를 검색할 수 있다. FAISS는 메모리-속도-정확도의 트레이드 오프를 최적화하는 백만에서 수십억 규모의 데이터셋을 위한 최근접 이웃 검색 구현을 포함하고 있다. → FAISS의 목표는 모든 운영 포인트에 대해 최첨단의 성능을 제공하는 것
FAISS 사용법
FAISS의 핵심 개념은 인덱스 생성이다. 인덱스는 벡터 데이터의 구조를 나타내는 메타 데이터라고 보면 된다. 먼저 데이터를 양자화하여 인덱스를 생성하고 이후 인덱스를 활용해서 유사성 검색을 수행하는 구조.
이때 FAISS는 복잡한 벡터 공간을 작은 클러스터로 분할하며 각 클러스터는 그 안에 벡터들이 서로 유사하다는 점에서 차별성을 가진다. 클러스터링은 원본 벡터 공간을 더 작고 쉽게 이해하기 쉽게, 계산하기 편한 공간으로 변환하는 역할을 한다. 이렇게 만들어진 클러스터는 원래 대량 데이터 대신 사용되며 각 클러스터는 원본 데이터의 '대표', '중심'을 나타내게 된다
FAISS를 사용하기 위해선 아래의 4단계로 요약할 수 있다.
- 필요한 벡터 데이터 로드
- 로드한 벡터 데이터를 파시스 인덱스에 추가
- 인덱스 학습
- 전역 클러스터링
- 로컬 클러스터링
- 유사성 검색 수행
인덱스 학습(3)의 경우 위와 같이 두단계로 나뉘게 되는데 가장 먼저 전체 데이터 셋에 대한 전역 클러스터링을 수행 (이 전역 클러스터는 벡터 공간을 광범위하게 커버) 다음으로 전역 클러스터 내에서 로컬 클러스터링을 수행하며 이 때 클러스터의 수를 늘리고 벡터 공간을 더욱 세밀하게 나누어 계산 속도 및 정확성을 향상
유사성 검색 수행(4)의 경우 쿼리 벡터를 입력받아 가장 유사한 벡터들을 인덱스에서 찾아 반환. 이 때 인덱스 내의 각 클러스터에 대해 계산되고 가장 유사도가 높은 클러스터들이 반환 결과로 선택
-> FAISS의 컴포넌트를 2가지(인덱싱, 검색)로 쪼갤 수 있다. 인덱싱에서는 대량의 고차원 벡터 데이터를 관리 및 인덱스 구축에 기능을 담당하며, 검색 부분에서는 구축된 인덱스를 통해 특정 쿼리 벡터와 가장 유사한 벡터를 찾아내는 기능을 함
-> FAISS는 크게 3가지 인덱스 유형을 지원
- 플랫(Flat) Index: 간단히 모든 벡터 간의 거리를 계산하는 방식 (가장 비효율적인 인덱스)
- 계층적(hierarchical) 인덱스: 벡터 공간을 여러 계층으로 나누어 검색을 최적화
- 제품 인덱스(product): 여러 벡터를 조합하여 더 복잡한 벡터를 생성하고 이를 인덱스화 함
How does FAISS handle Large datasets?
Faiss 는 대규모 데이터 셋을 효과적으로 처리하기 위해 특별히 설계되었으며, 이를 위해 여러 전략과 기술을 사용
- 양자화: Faiss가 사용하는 주요 기술 중 하나는 벡터 양자화. 이를 통해 고차원 벡터를 컴팩트한 코드로 압축할 수 있어 메모리 사용량을 크게 줄일 수 있다. Faiss에는 product Quantization(PQ) 및 scalar Quantization(SQ)과 같은 다양한 양자화 방법이 있다.
- 인덱싱 구조: Faiss는 다양한 시나리오에 맞게 맞춤화된 다양한 인덱싱 구조를 제공.
- GPU가속: Faiss는 특히 대규모 데이터 셋을 처리할 때 특정 연산을 가속화하기 위해 GPU를 활용, GPU구현은 종종 더 빠른 최근접 이웃 검색, K-평균 군집화 및 기타 연산을 제공
- 배치 처리: 배치 처리를 지원하여 여러 쿼리를 동시에 병렬 처리할 수 있다. → 대규모 대아터셋을 처리할때 검색 작업을 가속화 하는데 유리
- 계층적 탐색 가능 소규모 세계(HNSW) 및 NSG: 이것들은 FAISS의 고급 인덱싱 구조로, 검색을 더 효율적으로 만들기 윈해 원시 벡터 위에 레이어를 추가한다.→더 빠른 최근접 이웃 검색을 촉진하기 위해 계층적 그래프를 생성
- 재훈련 없이 추가: 일부 Faiss 인덱스는 완전한 재훈련 없이 새로운 벡터를 추가할 수 있게 해주어 시간이 지남에 따라 성장하는 동적 데이터셋이 적합
- 외부 메모리: RAM에 맞지 않는 너무 큰 데이터셋의 경우, Faiss는 디스크에 저장된 데이터로 작업할 수 있는 인덱스를 지원하여 전체 데이터셋을 메모리에 로드하지 않고도 효율적인 유사성 검색을 가능하게 함
- 클러스터링: 인덱스를 구축하기 전에 Faiss는 중심이 벡터 그룹을 나타내는 k-평균 군집화를 사용하여 대규모 데이터셋을 클러스터링할 수 있음. 이로 인해 검색 공간이 줄어들어 검색이 가장 관련 있는 클러스터에 중점을 둠
'Machine Learning' 카테고리의 다른 글
AI Agent? (~ing) (0) | 2025.03.19 |
---|---|
Langchain vs Llama Index (1) | 2025.02.19 |
[pytorch] GRU 입력 텐서와 출력 텐서의 shape 이해 (0) | 2023.07.19 |
what is Ensemble Learning? (0) | 2023.07.19 |
what is Grid search? (0) | 2023.07.19 |