Faiss教程:索引(2)

原文作者:@houkai
轉載自:https://www.cnblogs.com/houkai/p/9316172.html


目錄

索引的I/O與複製
index_factory
自動調參
特殊的操作

索引的I/O與複製

所有的函數都是深複製,我們不需要關心對象關係。

I/O函數:

  • write_index(index, "large.index"): 寫索引到文件
  • Index * index = read_index("large.index") 讀索引

複製函數:

  • Index* index2 = clone_index(index): 返回索引的深複製
  • Index *index_cpu_to_gpu = index_cpu_to_gpu(resource, dev_no, index): 複製索引到GPU
  • Index *index_gpu_to_cpu = index_gpu_to_cpu(index):從GPU到CPU
  • index_cpu_to_gpu_multiple: uses an IndexShards or IndexProxy to copy the index to several GPUs.

index_factory

index_factory通過字符串來創建索引,字符串包括三部分:預處理、倒排、編碼。
預處理支持:

  • PCA:PCA64表示通過PCA降維到64維(PCAMatrix實現);PCAR64表示PCA後添加一個隨機旋轉。
  • OPQ:OPQ16表示爲數據集進行16字節編碼進行預處理(OPQMatrix實現),對PQ索引很有效但是訓練時也會慢一些。

倒排支持:

  • IVF:IVF4096表示使用粗量化器IndexFlatL2將數據分爲4096份
  • IMI:IMI2x8表示通過Mutil-index使用2x8個bits(MultiIndexQuantizer)建立2^(2*8)份的倒排索引。
  • IDMap:如果不使用倒排但需要add_with_ids,可以通過IndexIDMap來添加id

編碼支持:

  • Flat:存儲原始向量,通過IndexFlat或IndexIVFFlat實現
  • PQ:PQ16使用16個字節編碼向量,通過IndexPQ或IndexIVFPQ實現
  • PQ8+16:表示通過8字節來進行PQ,16個字節對第一級別量化的誤差再做PQ,通過IndexIVFPQR實現

如:
index = index_factory(128, "OPQ16_64,IMI2x8,PQ8+16"): 處理128維的向量,使用OPQ來預處理數據16是OPQ內部處理的blocks大小,64爲OPQ後的輸出維度;使用multi-index建立65536(2^16)和倒排列表;編碼採用8字節PQ和16字節refine的Re-rank方案。

OPQ是非常有效的,除非原始數據就具有block-wise的結構如SIFT。

自動調參

索引的參數包括兩種:bulid-time索引創建時需要設置的、run-time在搜索前可以調整的。針對run-time參數可以進行Auto-tuning。

Key 類名 run-time參數 備註
IVF, IMI2x IndexIVF* nprobe 控制速度和精度的折中
IMI2x* IndexIVF max_codes 平衡倒排列表
PQ* IndexIVFPQ, IndexPQ ht Hamming threshold for polysemous
PQ+ IndexIVFPQR k_factor Re-rank時要覈實的數據量

AutoTuneCriterion:包含ground-truth,使用搜索結果,評估召回;OperatingPoints:包含(性能,時間,參數集合id),目標是找到最優的operating point——沒有其他point可以在更短的時間內達到更好的性能;ParameterSpace:參數空間是指數級的,但是這些參數有一個共同的特性,值越高一般來說速度越慢,性能越好。

faiss/tests/demo_sift1M.cpp中有一個自動調參的示例。自動調參依賴於:評測集合完備且充足,機器環境穩定。

特殊的操作

  • 根據索引重建數據,見test_index_composite.py
    支持IndexFlat, IndexIVFFlat (call make_direct_map first), IndexIVFPQ (same), IndexPreTransform (provided the underlying transform supports it)
  • 從索引中移除元素,remove_ids方法
    見test_index_composite.py,支持IndexFlat, IndexIVFFlat, IndexIVFPQ, IDMap
  • 範圍查找,range_search方法
    將返回離查詢點一定半徑內的向量,在Python中它將返回一個1D元組lims/D/I,針對第i個的查詢結果爲I[lims[i]:lims[i+1]], D[lims[i]:lims[i+1]],支持IndexFlat, IndexIVFFlat
  • 合併切分索引
    merge_from合併其他索引,copy_subset_to複製當前索引的子集到其他索引,支持IndexIVF
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章