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
参数说明参见下表。
设置项 |
含义 |
说明 |
|---|---|---|
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类索引中, nlist 和 nprobe 是两个重要的参数:
nlist是聚类的数量,nlist的数量越大,索引的搜索效率越高,但是索引的构建时间也越长。nprobe是搜索时的探测数量,nprobe的数量越大,索引的搜索召回率越高,但是索引的搜索性能越低。
在实际使用的过程中,需要根据实际的场景来调整 nlist 和 nprobe 的数量,以达到搜索效率和搜索召回的平衡。
5.3. GpuIndexIVFPQ
GpuIndexIVFPQ 是IVFPQ索引在GPU上的实现。IVFPQ索引是一种基于聚类和量化的索引。
创建 GpuIndexIVFPQ 时,可以通过 GpuIndexIVFPQConfig 来设定一些参数。参数和 GpuIndexFlatConfig 提供的基本一致,参见 5.1 GpuIndexFlat。
另外还可以额外设置一些选项,参见下表。
设置项 |
含义 |
说明 |
|---|---|---|
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)
除了指定聚类的数量 nlist, m 是PQ量化的子空间的维度, nbits 是PQ量化的子空间的bit数。
m 和 nbits 的数量越大,索引的搜索效率越高,但是索引的构建时间也越长。在实际使用的过程中,需要根据实际的场景来调整 m 和 nbits 的数量,以达到搜索效率和搜索召回的平衡。
备注
要求向量的维度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)
除了指定聚类的数量 nlist, sq 是标量量化的类型, encode_residual 是指定是否对残差进行编码。
通常,建议对残差进行编码以提高搜索的效率(默认选项);同时对于GPU,推荐使用8bit的标量量化。