原文作者:@houkai
轉載自:https://www.cnblogs.com/houkai/p/9316176.html
目錄
Fassi通過CUDA支持GPU,要求3.5以上算力,float16要求CUDA7.5+
通過index_gpu_to_cpu可以將索引從GPU複製到CPU,index_cpu_to_gpu 和 index_cpu_to_gpu_multiple可以從CPU複製到GPU,並支持GpuClonerOptions來調整GPU存儲對象的方式。
GpuIndexFlat, GpuIndexIVFFlat 和 GpuIndexIVFPQ分別是IndexFlat, IndexIVFFlat 和 IndexIVFPQ的GPU實現。它們除了算法需要的參數,還需要一個資源對象GpuResources,來避免無效的數據交互。
GPU下的限制:
- 都所有索引 k 和nprobe 必須小於1024
- GpuIndexIVFPQ,每個向量允許字節數:1, 2, 3, 4, 8, 12, 16, 20, 24, 28, 32, 48, 56, 64 和 96。超過56,可以使用 float16 IVFPQ 模式。
- GpuIndexIVFPQ的預計算表佔用顯存較大,如果有cudaMalloc錯誤,禁止預計算表
- indices_options = INDICES_CPU,設置倒排文件可以放在CPU
- StandardGpuResources默認使用18%的GPU顯存,並動態調整
- add和search最好再batch的形式進行,見示例
- I/O操作不支持GPU
benchs/bench_gpu_sift1m.py 下是Python的GPU使用示例
使用多卡
可以複製數據到多個GPU,分開查詢IndexProxy;也可以通過IndexShards分割數據到多個GPU。
GPU在單卡下是CPU的5-10倍,多卡和單卡相比基本是線性的提升:8個卡可以提升6-7倍。推薦支持batch查詢,且當最近鄰k值很大時性能也會受影響。