概要
FAISS を PyTorch(Torch) および ONNX/ONNX Runtime と組み合わせると、
1 ) 学習用モデル―検索インデックス間のデータ移動をゼロコピーで高速化し、
2 ) 推論エンジンにバンドルした“埋め込み生成+近傍検索”をワンステップでデプロイ
できるようになります。以下では目的別に典型的な連携パターンと実装の勘所を解説します。
1 . PyTorch との連携
| 目的 | 主要 API/仕組み | 補足 |
|---|---|---|
| ゼロコピーでテンソルを渡す | faiss.contrib.torch_utils を import |
これを読み込むだけで FAISS が torch.Tensor を受け付けるようにパッチされ、CPU⇄GPU 間のコピーを自動で管理します。GPU テンソルは GPU インデックスでのみ使用可 github.com |
| 学習ループに組み込む | PyTorch の DataLoader ↔ 埋め込みモデル ↔ FAISS 検索 | 生成した埋め込みをバッチ単位で index.add() し、その場で index.search() して負例サンプリングやハードネガティブマイニングに利用 |
| マルチ GPU | faiss.index_cpu_to_all_gpus() / IndexReplicas |
GPU ごとにサブインデックスを作成してレプリカ検索。Torch 側テンソルも各 GPU に配置しておくと PCIe 転送を回避可能 |
| 混合精度 | torch.float16 or bfloat16 → Tensor.contiguous() で整形して渡す |
FAISS 側では GpuIndexIVFPQ 等が FP16 をサポート。モデル推論も AMP にするとエンドツーエンドで半精度化できる |
実装スニペット(GPU, L2 距離)
2 . ONNX / ONNX Runtime との連携
2-1 . 分離型パイプライン
推論は ONNXRuntime、ベクトル検索は FAISS を別プロセス/別ライブラリで動かす構成。
-
メリット: 各コンポーネントを独立スケール可。
-
手順
-
PyTorch モデルを
torch.onnx.export()で embedding_model.onnx に変換 -
ONNXRuntime でバッチ推論 → NumPy 配列を FAISS に
index.add()orindex.search() -
必要なら結果を ONNXRuntime に戻して追加推論(再ランキング等)
-
2-2 . 統合型パイプライン(カスタム Op)
ONNXRuntime の Custom Operator 機構に FAISS 検索を埋め込む方法 onnxruntime.aionnxruntime.ai
-
C++ か Python で
FaissSearchカスタム Op を実装 -
モデルを再エクスポートし、グラフ末尾に
FaissSearchノードを挿入 -
推論 1 回で 「テキスト → 埋め込み → 近傍 ID」 まで取得
活用例: GitHub プロジェクト MiniVectorDB は ONNX 量子化済み多言語 USE モデルで埋め込みを生成し、
FAISS CPU インデックスに直接格納するオールインワン DB を提供しています github.com
2-3 . 運用上の注意
-
バイナリ互換: ONNXRuntime (CUDA) と FAISS-GPU の CUDA バージョンを揃える
-
メモリ管理: カスタム Op で GPU バッファを共有する際は
Ort::CustomOpApi::GetTensorMutableData
と FAISS のIndex::search_cなどを組み合わせ、ダブルコピーを避ける -
再現性: ONNX 量子化 (
quantize_dynamicなど) を使う場合、量子化誤差で検索順位が変わる。
ANN 指数 (IVF, HNSW) のパラメータも合わせてチューニングすること
3 . ベストプラクティスまとめ
-
学習-検索の一体化: 研究用途なら Torch+
torch_utilsで高速プロトタイピングし、
推論配備時に ONNXRuntime+FAISS へ切り替えるとデプロイが容易。 -
負荷分散: 高 QPS サービスは GPU FAISS を複数台にレプリカ配置し、
ONNXRuntime はマイクロバッチ推論で GPU を高効率に活用。 -
型 & 精度: 量子化(8 bit PQ 等)と半精度 (FP16) は別物。
まず PQ/HNSW など 検索側の近似 を最適化し、その後モデル量子化を検討すると品質劣化を抑えやすい。 -
CI/CD: ONNX 静的モデル + FAISS インデックスファイルはどちらもバージョン付きアーティファクトとして
GitHub Actions などで生成 → コンテナに同梱、が運用しやすい。
参考リソース
-
faiss.contrib.torch_utilsパッチにより Torch GPU テンソルを直接検索に使用可能 github.com -
ONNXRuntime の Custom Op 作成方法 onnxruntime.aionnxruntime.ai
-
FAISS CPU + ONNX 量子化埋め込みを組み合わせた実践例 MiniVectorDB github.com
ChatGPT4o 生成日:2025/06/18