概要
FAISS では、CPU 上で作成したインデックスを GPU に転送して高速化する方法と、最初から GPU 上にインデックスを構築する方法の両方が用意されています。ここでは「GPU 対応インデックスの作成と転送」の手順・API・ベストプラクティスを体系的に説明します。
1. 前提:GPU 版 FAISS のインストールと CUDA 環境
| 項目 | 内容 |
|---|---|
| 必要ソフト | CUDA 11 以降 + 対応ドライバ、faiss-gpu (PyPI) またはソースビルド |
| 確認コマンド | faiss.get_num_gpus() で利用可能 GPU 数を確認 |
| Python 以外 | C++ でも同等の API (faiss::gpu 名前空間) が利用可能 |
2. GPU リソース (StandardGpuResources) の初期化
StandardGpuResources) の初期化
StandardGpuResources は scratch メモリ・cuBLAS ハンドル・CUDA ストリームを保持します。サイズが小さすぎると cudaMalloc が頻発し性能が低下します。github.com
3. インデックスの作成と転送パターン
3.1 CPU で作成 ➜ GPU へ転送
-
CPU インデックスを構築/訓練
-
転送
-
複数 GPU へ複製:
index_cpu_to_all_gpus -
指定リストへ複製:
index_cpu_gpu_list(gpus=[0,2]) -
リソース共有:
index_cpu_to_gpu_multiple_py(resources, cpu_index)
github.com
-
3.2 GPU で直接作成
GPU で直接訓練すれば二重コピーを防げます。
3.3 転送後の利用
-
追加・検索:
gpu_index.add(xb)/gpu_index.search(xq, k)
入力が PyTorch tensor などで既に GPU 上にある場合はホストコピーが省けます。github.com -
パラメータ調整:
gpu_index.nprobe,gpu_index.indices_options,reserveVecs()などを CPU 版と同様に変更可能。
4. GPU ➜ CPU への逆転送と永続化
GPU インデックスは直接ディスクに保存できません。永続化する場合は
と一度 CPU に戻します。github.com
5. 複数 GPU の活用
| 方式 | 特徴 | API |
|---|---|---|
| IndexReplicas | 同一データを各 GPU に複製しクエリを並列化。バッチが大きいほど高速 | index_cpu_to_gpu_multiple (既定) |
| IndexShards | データを分割して各 GPU に配置。メモリ節約だが線形スピードアップは限定的 | GpuMultipleClonerOptions(shard=True) |
さらに common_ivf_quantizer=True で複数 GPU で量子化器を共有しメモリを節約できます。github.com
6. 代表的な GPU 対応インデックスと制限
| インデックス | クラス名 (GPU) | 留意点 |
|---|---|---|
| Flat | GpuIndexFlatL2, GpuIndexFlatIP |
k ≤ 2048 |
| IVF-Flat | GpuIndexIVFFlat |
nprobe ≤ 2048 |
| IVF-PQ | GpuIndexIVFPQ |
大きなコードサイズは float16 必須 |
| IVF-SQ | GpuIndexIVFScalarQuantizer |
– |
制限値 (k, nprobe ≤ 2048 など) とメモリ上限に注意。github.com
7. ベストプラクティスと落とし穴
-
バッチ処理:
add()/search()は 8 k~16 k 件程度をまとめると GPU メモリとスループットのバランスが良い。 -
メモリ不足:
indices_options=faiss.INDICES_CPUでインデックス ID を CPU 側に置く、またはuseFloat16を活用。 -
I/O: 保存前に必ず
index_gpu_to_cpu()。 -
ストリーム同期: 異なる CUDA ストリームを使う他ライブラリ (PyTorch など) と併用する際は
setDefaultNullStreamAllDevices()または明示的同期を実施。 -
リソース共有: 複数 GPU インデックス生成時は同じ
StandardGpuResourcesインスタンスを再利用してメモリを節約。
8. 最小実装例(CPU → GPU 転送パターン)
(index_cpu_to_gpu による転送例)unfoldai.com
まとめ
-
転送 API:
index_cpu_to_gpu/index_gpu_to_cpuを中心に覚える -
リソース管理:
StandardGpuResourcesとGpuClonerOptionsを適切に設定 -
パフォーマンス: バッチ処理・float16・複数 GPU レプリカで最大化
-
保存: GPU から直接ファイルへは書き出せないので必ず CPU に戻す
これらを押さえれば、大規模ベクトル検索を GPU で高速に処理しつつ、運用面のトラブルも回避できます。
ChatGPT4o 生成日:2025/06/18