Faiss教程:索引(2)


索引的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM