ONNXやTorchとの連携

概要

FAISS を PyTorch(Torch) および ONNX/ONNX Runtime と組み合わせると、
1 ) 学習用モデル―検索インデックス間のデータ移動をゼロコピーで高速化し、
2 ) 推論エンジンにバンドルした“埋め込み生成+近傍検索”をワンステップでデプロイ
できるようになります。以下では目的別に典型的な連携パターンと実装の勘所を解説します。


1 . PyTorch との連携

目的 主要 API/仕組み 補足
ゼロコピーでテンソルを渡す faiss.contrib.torch_utilsimport これを読み込むだけで 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 bfloat16Tensor.contiguous() で整形して渡す FAISS 側では GpuIndexIVFPQ 等が FP16 をサポート。モデル推論も AMP にするとエンドツーエンドで半精度化できる

実装スニペット(GPU, L2 距離)

python
import torch, faiss, faiss.contrib.torch_utils vecs = torch.randn(1_000_000, 768, device='cuda') # 学習済み埋め込み index = faiss.GpuIndexFlatL2(faiss.StandardGpuResources(), 768) index.add(vecs) # torch.Tensor のまま追加 query = torch.randn(10, 768, device='cuda') D, I = index.search(query, k=20) # 10×20 の距離・ID

2 . ONNX / ONNX Runtime との連携

2-1 . 分離型パイプライン

推論は ONNXRuntime、ベクトル検索は FAISS を別プロセス/別ライブラリで動かす構成。

  • メリット: 各コンポーネントを独立スケール可。

  • 手順

    1. PyTorch モデルを torch.onnx.export()embedding_model.onnx に変換

    2. ONNXRuntime でバッチ推論 → NumPy 配列を FAISS に index.add() or index.search()

    3. 必要なら結果を ONNXRuntime に戻して追加推論(再ランキング等)

2-2 . 統合型パイプライン(カスタム Op)

ONNXRuntime の Custom Operator 機構に FAISS 検索を埋め込む方法 onnxruntime.aionnxruntime.ai

  1. C++ か Python で FaissSearch カスタム Op を実装

  2. モデルを再エクスポートし、グラフ末尾に FaissSearch ノードを挿入

  3. 推論 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 . ベストプラクティスまとめ

  1. 学習-検索の一体化: 研究用途なら Torch+torch_utils で高速プロトタイピングし、
    推論配備時に ONNXRuntime+FAISS へ切り替えるとデプロイが容易。

  2. 負荷分散: 高 QPS サービスは GPU FAISS を複数台にレプリカ配置し、
    ONNXRuntime はマイクロバッチ推論で GPU を高効率に活用。

  3. 型 & 精度: 量子化(8 bit PQ 等)と半精度 (FP16) は別物。
    まず PQ/HNSW など 検索側の近似 を最適化し、その後モデル量子化を検討すると品質劣化を抑えやすい。

  4. 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