GPUとCPUの使い分け

FAISS(Facebook AI Similarity Search)における「GPUとCPUの使い分け」について詳しく説明します。FAISSは大規模なベクトル検索を効率的に行うために、CPUとGPUの両方に対応しています。それぞれの特徴や用途に応じて適切に使い分けることで、検索性能とリソース使用効率を最適化できます。


1. GPUとCPUの基本的な違い

項目 CPU GPU
並列処理能力 低(少数コア) 高(数千スレッド)
レイテンシ 高(データ転送コストあり)
メモリ容量 大(数十GB〜) 小(数GB〜数十GB)
ベクトル数の処理 中規模向き 大規模向き
精度要求 高精度対応に向く 近似・高速向け

2. CPU使用の利点と適用場面

利点

  • 高精度: Flatインデックス(全件探索)など、誤差のない検索が可能。

  • 低オーバーヘッド: データ転送が不要で、初期化コストも少ない。

  • メモリ容量が大きいため、非常に大きなインデックスでも処理可能。

適用場面

  • ベクトル数が少ない(数千〜数十万)。

  • 厳密な距離計算が必要(例:セキュリティ用途)。

  • GPUが使えないローカル・クラウド環境。


3. GPU使用の利点と適用場面

利点

  • 並列処理による高速化: 検索速度が数十〜数百倍に向上する場合もある。

  • 量子化インデックス(IVF+PQ等)との相性が良い: 高速な近似検索が可能。

  • 複数GPU対応: 分散処理によるスケーラビリティ。

適用場面

  • 大規模データセット(数百万〜数十億ベクトル)。

  • リアルタイム検索が求められるシステム。

  • 学習やチューニング段階でインデックスの繰り返し再構築が必要。


4. GPUとCPUの併用戦略

FAISSでは、GPUとCPUの併用も可能です。以下のような使い分けが一般的です:

  • インデックスのトレーニングはGPUで高速に行い、保存・展開はCPUで行う

  • GPUで検索、CPUで前処理/後処理(例:フィルタリングやスコア補正)

  • 検索のバッチ処理はGPU、逐次的な少量検索はCPU


5. 注意点

  • データ転送のコスト: GPUにデータを転送するfaiss.index_cpu_to_gpu()はコストがかかるため、頻繁な転送は避けるべき。

  • インデックスの種類による制限: 一部のインデックス(例:HNSW)はGPUに未対応。

  • GPUメモリ制約: インデックスが大きすぎる場合は複数GPUやシャーディング(分割)が必要。


6. 実装例:CPU→GPUへのインデックス転送

python
import faiss import numpy as np # データ作成 d = 128 xb = np.random.random((100000, d)).astype('float32') # CPUインデックス作成 index_cpu = faiss.IndexFlatL2(d) index_cpu.add(xb) # GPUに転送 res = faiss.StandardGpuResources() index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu)

まとめ

判断軸 選択すべき処理対象
精度重視 CPU(Flat, exact search)
スピード重視 GPU(IVF+PQ, HNSWなど)
データサイズが非常に大きい CPU(メモリ容量)または複数GPU
リアルタイム性能が必要 GPU
単発/少量検索 CPUでも十分

CPUとGPUの特性を理解し、適切に使い分けることで、FAISSの性能を最大限に活用できます。

ChatGPT4o 生成日:2025/06/18