FAISS(Facebook AI Similarity Search)通过高效的索引结构、内存管理和并行计算来优化 CPU 上的向量搜索。一项关键技术是使用乘积量化 (PQ) 将高维向量压缩成更小的代码,从而减少内存占用并加快距离计算。 例如,PQ 将向量分成子向量,每个子向量量化成一小组质心,从而允许使用查找表进行近似距离计算。 FAISS 还采用了倒排文件索引 (IVF),它将数据集划分为簇,并将搜索限制在最相关的簇,从而大大减少了距离计算的数量。 此外,FAISS 利用 SIMD(单指令、多数据)指令(如 AVX2)来并行化 CPU 内核上的操作,从而能够批量处理向量比较。 查询的批量处理进一步优化了缓存使用,最大限度地减少了内存延迟。 这些方法优先考虑降低计算开销,同时保持可接受的准确性,使其适用于商品硬件上对延迟敏感的应用。
使用 GPU 加速时,FAISS 会改变策略来利用 GPU 的大规模并行架构。 与依赖分层缓存优化和 SIMD 的 CPU 不同,GPU 处理数千个并发线程,从而使暴力破解式的精确搜索更可行。 例如,GPU 上的 FAISS 可以使用 CUDA 内核并行计算所有查询向量和数据库向量之间的距离,从而在某些情况下绕过对 IVF 聚类的需求。 内存带宽成为一个关键因素:像 NVIDIA A100 这样的 GPU 提供超过 1.5 TB/s 的带宽,从而可以快速传输大型批量数据。 FAISS 还使用专门的数据结构,如 GpuIndexIVFPQ,它结合了 IVF 和 PQ,但将量化向量存储在 GPU 内存中,以避免 CPU-GPU 数据传输瓶颈。 但是,GPU 内存约束需要仔细管理——索引可能需要跨多个 GPU 分片,或者与 CPU 内存组合以用于更大的数据集。 这些优化优先考虑吞吐量而不是延迟,这使得 GPU 非常适合具有高查询量的批量处理场景。
主要区别在于并行粒度和内存处理。 CPU 优化侧重于算法捷径(如 IVF)和轻量级并行(SIMD),以补偿有限的内核数量,而 GPU 则利用暴力破解式并行和高内存带宽。 例如,CPU 可能会使用 IVF 将 100 万个向量的搜索减少到每个查询 1 万次比较,而 GPU 可以并行计算所有 100 万个距离,但需要更多内存。 此外,CPU 实现通常通过量化来权衡精确结果以提高速度,而 GPU 可以负担得起更详尽的搜索。 实际考虑因素包括成本和规模:对于较小的数据集或低延迟的单个查询,CPU 更容易部署,而 GPU 在面向吞吐量的任务(如每秒处理数千个查询的实时推荐系统)中表现出色。 FAISS 的混合 CPU/GPU 支持使开发人员可以根据其基础设施和工作负载要求进行选择。