GitHub概要
facebookresearch/faiss
A library for efficient similarity search and clustering of dense vectors.
スター36,371
ウォッチ486
フォーク3,982
作成日:2017年2月7日
言語:C++
ライセンス:MIT License
トピックス
なし
スター履歴
データ取得日時: 2025/7/30 03:04
FAISSとは
FAISS (Facebook AI Similarity Search)は、MetaのFundamental AI Researchグループが開発した、高密度ベクトルの効率的な類似検索とクラスタリングのためのライブラリです。RAMに収まらないような大規模なベクトルセットでも検索可能で、多様なアルゴリズムとGPU加速を特徴とします。
主な特徴
高性能GPU加速
- 最高水準の速度: GPU実装は対応するCPU実装の5〜10倍高速
- マルチGPUサポート: 8GPUで約6〜7倍のリニアスピードアップを達成
- CUDA/ROCm対応: NVIDIA CUDAおYoubiびAMD ROCmをサポート
- メモリ効率: GPUメモリでの割り当てフリー設計
2025年の最新機能: NVIDIA cuVS統合
- cuVS統合: NVIDIA cuVSをFAISS v1.10に統合し、さらなる高速化を実現
- IVFインデックス: 構築時間2最大4.7倍高速、検索遅延最大8.1倍減少
- CAGRAグラフインデックス: CPU HNSW比で構築時間12.3倍高速、検索遅延。4.7倍減少
- 柔軟なバックエンド選択: condaパッケージで古典的なFAISS GPUとNVIDIA cuVSアルゴリズムを選択可能
包括的なアルゴリズムサポート
- フラットインデックス: 原始ベクトルでの線形検索
- IVF (Inverted File): クラスタリングベースの高速検索
- PQ (Product Quantization): ベクトル圧縮でメモリ効率向上
- HNSW (Hierarchical NSW): 高速近似最近隣検索
- LSH (Locality Sensitive Hashing): ハッシュベースの近似検索
- スカラー量子化: 精度と速度のバランス調整
GPUインデックスタイプ
- GpuIndexFlat: GPU版フラットインデックス
- GpuIndexIVFFlat: GPU版IVFフラットインデックス
- GpuIndexIVFPQ: GPU版IVF + PQインデックス
- GpuIndexIVFScalarQuantizer: GPU版IVF + スカラー量子化
- GpuIndexCagra: NVIDIA貢献のGPU専用グラフベースインデックス
多彩な言語サポート
- C++コア: 高速なネイティブ実装
- Pythonラッパー: NumPyとの完全な統合
- 評価ツール: パラメータチューニングと評価のためのサポートコード
メリット・デメリット
メリット
- 業界最高水準の検索速度とGPU最適化
- 多様なアルゴリズムとインデックス手法で柔軟性が高い
- 大規模データセットでもRAMを超えて処理可能
- Meta(Facebook)の実用的な経験と継続的な開発
- 豊富なドキュメントとコミュニティサポート
- アルゴリズムの柔軟性と最大制御が必要な特殊用途に最適
デメリット
- 純粋なベクトルライブラリで、完全なデータベース機能はない
- 高度な設定とチューニングが必要で、学習コストが高い
- ライブラリレベルのツールで、統合的なソリューションが必要
- GPUハードウェア依存性が高く、インフラコストがかかる
主要リンク
インストール方法
Condaでのインストール(推奨)
# CPU版
conda install -c pytorch faiss-cpu
# GPU版(古典的なFAISS GPU)
conda install -c pytorch faiss-gpu
# GPU版(NVIDIA cuVS統合)
conda install -c pytorch faiss-gpu-cuvs
pipでのインストール
# CPU版
pip install faiss-cpu
# GPU版
pip install faiss-gpu
ソースからのビルド
# リポジトリのクローン
git clone https://github.com/facebookresearch/faiss.git
cd faiss
# CMakeでのビルド
cmake -B build -DFAISS_ENABLE_PYTHON=ON -DFAISS_ENABLE_GPU=ON
make -C build -j faiss
# Pythonラッパーのインストール
cd build/faiss/python
python setup.py install
使用例
基本的なベクトル検索
import numpy as np
import faiss
# ランダムデータの生成
d = 64 # ベクトルの次元数
nb = 100000 # データベースサイズ
nq = 10000 # クエリ数
np.random.seed(1234) # 再現可能性のため
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.
# インデックスの作成とデータの追加
index = faiss.IndexFlatL2(d) # L2距離でのフラットインデックス
print(f"Index is trained: {index.is_trained}")
index.add(xb) # インデックスにベクトルを追加
print(f"Index contains {index.ntotal} vectors")
# 検索の実行
k = 4 # 4個の最近隣を検索
D, I = index.search(xq, k) # 検索実行
print(f"First 5 neighbors of first query: {I[:5]}")
print(f"Corresponding distances: {D[:5]}")
GPU加速の例
import faiss
import numpy as np
# GPUリソースの設定
res = faiss.StandardGpuResources() # GPUリソースの初期化
# データの準備
d = 64
nb = 100000
nq = 1000
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((nq, d)).astype('float32')
# CPUインデックスをGPUに移行
index_flat = faiss.IndexFlatL2(d)
gpu_index = faiss.index_cpu_to_gpu(res, 0, index_flat)
# データの追加と検索
gpu_index.add(xb)
D, I = gpu_index.search(xq, 5)
print(f"GPU search completed. First result: {I[0]}")
IVFインデックスでの高速検索
import faiss
import numpy as np
# データの準備
d = 64
nb = 100000
nlist = 100 # クラスタ数
k = 4
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((10000, d)).astype('float32')
# IVFインデックスの作成
quantizer = faiss.IndexFlatL2(d) # クラスタリング用の量子化器
index = faiss.IndexIVFFlat(quantizer, d, nlist)
# インデックスのトレーニング
assert not index.is_trained
index.train(xb)
assert index.is_trained
# データの追加
index.add(xb)
print(f"Added {index.ntotal} vectors to index")
# 検索パラメータの調整
index.nprobe = 10 # 検索するクラスタ数
D, I = index.search(xq, k)
print(f"IVF search completed. Recall vs exact: {(I[:5] == I[:5]).sum() / 20}")
Product Quantizationでのメモリ節約
import faiss
import numpy as np
# データの準備
d = 64
nb = 100000
nlist = 100
m = 8 # PQのサブベクトル数
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((10000, d)).astype('float32')
# IVF + PQインデックスの作成
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
# 8 specifies that each sub-vector is encoded as 8 bits
# トレーニングとデータ追加
index.train(xb)
index.add(xb)
# 検索パラメータ調整
index.nprobe = 10
D, I = index.search(xq, k)
print(f"PQ search completed. Memory usage significantly reduced.")
print(f"Index size: {index.ntotal} vectors")
マルチGPU検索
import faiss
import numpy as np
# 利用可能GPU数の確認
ngpus = faiss.get_num_gpus()
print(f"Number of GPUs: {ngpus}")
if ngpus > 1:
# データの準備
d = 64
nb = 100000
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((1000, d)).astype('float32')
# マルチGPUインデックスの作成
cpu_index = faiss.IndexFlatL2(d)
gpu_index = faiss.index_cpu_to_all_gpus(cpu_index)
# データ追加と検索
gpu_index.add(xb)
D, I = gpu_index.search(xq, 5)
print(f"Multi-GPU search completed on {ngpus} GPUs")
else:
print("Multi-GPU example requires more than 1 GPU")
HNSWインデックスの例
import faiss
import numpy as np
# HNSWパラメータ
d = 64
M = 16 # 接続数
ef_construction = 200 # 構築時の探索幅
# データの準備
nb = 10000
nq = 100
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((nq, d)).astype('float32')
# HNSWインデックスの作成
index = faiss.IndexHNSWFlat(d, M)
index.hnsw.efConstruction = ef_construction
# データ追加
index.add(xb)
# 検索時のパラメータ調整
index.hnsw.efSearch = 50
D, I = index.search(xq, 5)
print(f"HNSW search completed. Results: {I[:3]}")
主要ユースケース
- 推薦システム: 商品やコンテンツの類似推薦
- 画像・動画検索: マルチメディアコンテンツの類似検索
- 自然言語処理: 文書エンベディングの類似検索
- 生体情報学: DNA、タンパク質配列の類似性分析
- 金融: リスク管理、似たような取引パターン検索
- 異常検知: 高次元データでの外れ値検出
- クラスタリング: 大規模データのグルーピングと分類
まとめ
FAISSは、Metaの長年の研究と実用経験に裏打ちされた、世界最高水準のベクトル類似検索ライブラリです。GPU加速と多様なアルゴリズムにより、大規模データでの高速検索が必要なアプリケーションに最適です。2025年のNVIDIA cuVS統合により、さらなる性能向上を遂げています。特殊なユースケースでアルゴリズムの柔軟性と最大制御が必要な場合、FAISSは他に類を見ない選択肢です。