GPU 加速向量检索是什么
GPU 适合大规模批量的向量计算:FAISS 的 GPU 索引把构建与检索放到显存,批量查询吞吐显著提升。但它有两个限制:显存容量决定能放下的数据规模,超出就得靠分片或量化;单条低延迟查询的收益有限,因为算子启动与数据传输的开销占比高。因此它更适合离线批量检索与高吞吐在线服务,而不是低频偶发的查询。
基本信息
| 依赖 | FAISS 的 GPU 版本加 CUDA 驱动 |
|---|---|
| 关键约束 | 显存容量决定数据与索引规模上限 |
| 收益场景 | 大批量查询、离线索引构建 |
| 低收益场景 | 低频单条查询 |
| 常见故障 | 版本不匹配导致符号或初始化错误 |
| 降级路径 | 分片或量化 |
典型使用场景
- 离线批量相似度计算,一次几万到上百万条查询
- 在线高吞吐检索,把请求合并成批提高利用率
- 索引构建加速,缩短全量重建窗口
- 算法实验阶段快速迭代
- 与模型推理共用 GPU 时做任务排队与配额
FAISS GPU 索引
FAISS GPU 索引
import faiss
res = faiss.StandardGpuResources() # 初始化 GPU 资源
cpu_index = faiss.IndexFlatIP(768) # 先在 CPU 侧定义结构
gpu_index = faiss.index_cpu_to_gpu(res, 0, cpu_index) # 搬到 0 号卡
gpu_index.add(np.random.rand(1000000, 768).astype("float32"))
D, I = gpu_index.search(np.random.rand(256, 768).astype("float32"), 10)
# 批量 256 条一起查,吞吐远高于逐条调用收益与限制读法
| 维度 | 说明 | 注意 |
|---|---|---|
| 显存容量 | 决定可驻留的数据与索引规模 | 超限需要分片或量化,而不是硬塞 |
| 批量大小 | 批量越大吞吐越高 | 单条查询收益有限,开销占比高 |
| 版本匹配 | FAISS、CUDA、驱动三方需匹配 | 不匹配时报符号或初始化错误 |
| 资源争用 | 与推理任务共享同一块卡 | 需要排队与配额,避免互相拖慢 |
要核对 FAISS 与 CUDA、驱动的版本匹配;显存不足时迁回分片或量化方案,通常比不断增加显卡更实际。
只有当批量足够大、查询足够密时 GPU 才划算:低频场景利用率低,还额外背上一份运维依赖。
GPU 索引落盘前要先转回 CPU 索引:用 index_gpu_to_cpu 转换后再写文件,直接对 GPU 索引调用写文件接口在多数版本不可用。