5. mcFaiss GPU索引的支持

本章描述GPU相关索引在mcFaiss上的一些参数和设定。默认使用Python接口作为示例介绍。

5.1. GpuIndexFlat

GpuIndexFlat 是Flat索引在GPU上的实现。Flat索引是最简单、最常用的索引,其搜索效率较低,但是可以提供100%的召回;其构建速度较快,适用于数据量较小的场景。

创建 GpuIndexFlat 时,可以通过 GpuIndexFlatConfig 来设定一些参数,示例如下:

config = faiss.GpuIndexFlatConfig()
config.device = 0
config.useFloat16 = False
config.storeTransposed = False

参数说明参见下表。

表 5.1 GpuIndexFlatConfig的参数说明

设置项

含义

说明

device

使用的显卡设备索引

默认为0。即,使用第一个GPU设备

useFloat16

是否使用FP16。如果使用,则在内部计算时,会使用FP16进行一些相关计算,这在精度要求不高的场景下,可以提高索引训练和搜索的效率

默认不使用

storeTransposed

是否保存转置后的矩阵数据。对于向量数据来说,输入的向量数据是行排序的;但是对于GPU的运算来说,列排序的数据往往可以减少不必要的计算和转置,从而提高搜索的性能。但是保存一份额外的转置数据,需要额外的内存开销

默认不保存

5.2. GpuIndexIVFFlat

GpuIndexIVFFlat 是IVFFlat索引在GPU上的实现。IVFFlat索引是一种基于聚类的索引,其搜索效率较高,但是通常无法提供100%的召回。

创建 GpuIndexIVFFlat 时,可以通过 GpuIndexIVFFlatConfig 来设定一些参数。参数和 GpuIndexFlatConfig 提供的基本一致,参见 5.1 GpuIndexFlat

创建 GpuIndexIVFFlat 时,需要指定聚类的数量,示例如下:

nlist = 1024
index = faiss.GpuIndexIVFFlat(res, d, nlist, faiss.METRIC_L2, config)

在IVF类索引中, nlistnprobe 是两个重要的参数:

  • nlist 是聚类的数量, nlist 的数量越大,索引的搜索效率越高,但是索引的构建时间也越长。

  • nprobe 是搜索时的探测数量, nprobe 的数量越大,索引的搜索召回率越高,但是索引的搜索性能越低。

在实际使用的过程中,需要根据实际的场景来调整 nlistnprobe 的数量,以达到搜索效率和搜索召回的平衡。

5.3. GpuIndexIVFPQ

GpuIndexIVFPQ 是IVFPQ索引在GPU上的实现。IVFPQ索引是一种基于聚类和量化的索引。

创建 GpuIndexIVFPQ 时,可以通过 GpuIndexIVFPQConfig 来设定一些参数。参数和 GpuIndexFlatConfig 提供的基本一致,参见 5.1 GpuIndexFlat。 另外还可以额外设置一些选项,参见下表。

表 5.2 GpuIndexIVFPQConfig的额外参数说明

设置项

含义

说明

useMMCodeDistance

指定是否使用MMCode距离。MMCode距离是一种针对PQ量化的距离计算方式,可以提高搜索的效率。但是MMCode距离的计算方式会导致搜索结果的召回率下降,因此在实际使用的过程中,建议不要使用MMCode距离。

默认不使用

usePrecomputedTables

指定是否使用预计算的量化表。预计算的量化表可以提高搜索的效率,但是会占用更多的内存。在实际使用的过程中,可以考虑使用预计算的量化表。

默认不使用

创建 GpuIndexIVFPQ,示例如下:

nlist = 1024
d = 256
m = 16
nbits = 8

index = faiss.GpuIndexIVFPQ(res, d, nlist, m, nbits, faiss.METRIC_L2, config)

除了指定聚类的数量 nlistm 是PQ量化的子空间的维度, nbits 是PQ量化的子空间的bit数。 mnbits 的数量越大,索引的搜索效率越高,但是索引的构建时间也越长。在实际使用的过程中,需要根据实际的场景来调整 mnbits 的数量,以达到搜索效率和搜索召回的平衡。

备注

要求向量的维度d能被m整除。nbits通常在GPU取8。

5.4. GpuIndexIVFScalarQuantizer

GpuIndexIVFScalarQuantizer 是IVFSQ索引在GPU上的实现。IVFSQ索引是一种基于聚类和标量量化的索引。

创建 GpuIndexIVFScalarQuantizer 时,可以通过 GpuIndexIVFScalarQuantizerConfig 设定一些参数,参数和 GpuIndexFlatConfig 提供的基本一致,参见 5.1 GpuIndexFlat

创建 GpuIndexIVFScalarQuantizer,示例如下:

nlist = 1024
sq = faiss.ScalarQuantizer.QT_8bit
encode_residual = True

index = faiss.GpuIndexIVFScalarQuantizer(res, d, nlist, sq, faiss.METRIC_L2, encode_residual, config)

除了指定聚类的数量 nlistsq 是标量量化的类型, encode_residual 是指定是否对残差进行编码。 通常,建议对残差进行编码以提高搜索的效率(默认选项);同时对于GPU,推荐使用8bit的标量量化。