💻
💻RTX5080×CUDA12.9×Faissでベンチとってみた
Faiss-GPU【📊 1536次元 × 100万件】ベンチマーク
環境構築から測定条件、結果、体感などをシンプルにまとめます。
🧠 Faissとは?
Faiss(Facebook AI Similarity Search)は、大量のベクトルデータから**類似検索(近傍探索)**を高速に行うためのC++/Pythonライブラリです。特に、巨大な特徴ベクトル(埋め込み)を扱う機械学習や検索システムで重宝されます。
- 特徴:
- 数百万〜数十億件の高次元ベクトルに対応
- CPUだけでなく GPU(CUDA)対応 の実装あり
- Flat(全件探索)、IVF、PQなど複数のインデックス手法に対応
- 高次元ベクトルの近傍探索が高速
- 学習済みのクラスタリングを活用して検索を加速できる
本記事では IVF(Inverted File Index) を使って RTX 5080 のGPU性能を測定しています。
🔧 測定環境
- CPU:AMD Ryzen 9 9900X 12-Core
- GPU:RTX 5080
- RAM:64 GB
- OS:Windows 11 Home + WSL2 (Ubuntu)
⚙ 測定条件
- ベクトル次元:1536
- ベースベクトル数:1,000,000(100万件)
- クエリ数:100件
- 検索アルゴリズム:IVF(Inverted File Index)
📊 測定結果
==== Faiss GPU Benchmark ====
Train time : 637.33 ms
Add time : 2139.26 ms
Search time for 100 queries : 32.23 ms
Average per query : 0.32 ms/query
==============================
💬 補足:
- Train time:IVFインデックスの構築時に行うクラスタリング処理(k-means)の所要時間です。
- Add time:学習済みのインデックスにベクトルを追加・登録する処理時間です(クラスタ割り当てを含む)。
💡 感想
FAISS-GPUの pip install では sm_120(RTX 5080のアーキテクチャ)に対応しておらず、
ビルドエラーが出たため、CUDA 12.9 + sm_120 対応でFaissを自前ビルドしました。
結果としてGPUの性能をしっかり活かせる構成ができ、
RTX 5080 × IVF の組み合わせでこの速度が出るのは素直に嬉しいです。
🔭 今後の展望
-
sm_120対応の正式版Faiss-GPUが出たら再計測予定 - Faiss FlatL2 vs IVF vs PQ の比較ベンチもとってみたい
-
torch + faissでの統合テストも視野に入れています
📝 ベンチソース(Python)
import numpy as np
import faiss
import time
# パラメータ設定
d = 1536 # ベクトル次元
nb = 1000000 # ベースベクトル数
nq = 100 # クエリベクトル数
k = 5 # 近傍数
nlist = 100 # クラスタ数
# データ作成(float32でGPUに優しい)
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((nq, d)).astype('float32')
# GPUリソース準備
res = faiss.StandardGpuResources()
# IVF+Flat のインデックス構成(クラスタ数 nlist)
quantizer = faiss.IndexFlatL2(d)
index_cpu = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
# GpuClonerOptionsでオプション設定(すべてデフォルト)
co = faiss.GpuClonerOptions()
index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu, co)
# ----- 測定:train -----
start_train = time.perf_counter()
index_gpu.train(xb)
end_train = time.perf_counter()
# ----- 測定:add -----
start_add = time.perf_counter()
index_gpu.add(xb)
end_add = time.perf_counter()
# ----- 測定:search -----
start_search = time.perf_counter()
D, I = index_gpu.search(xq, k)
end_search = time.perf_counter()
# ----- 結果出力 -----
print("==== Faiss GPU Benchmark ====")
print(f"Train time : {(end_train - start_train)*1000:.2f} ms")
print(f"Add time : {(end_add - start_add)*1000:.2f} ms")
print(f"Search time for {nq} queries : {(end_search - start_search)*1000:.2f} ms")
print(f"Average per query: {(end_search - start_search)*1000/nq:.2f} ms/query")
print("==============================")
🎀 しめに
RTX 5080世代でもこうした計測ができるという情報が、
どなたかの参考になれば嬉しいです。
📝 誤記・改善点などあれば、お気軽にコメントください!
Discussion