💻

💻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