faiss-6: 索引I/O操作

所有的函数都是深复制,不需要关系对象关系

读写操作

import faiss

# 写到本地文件
faiss.write_index(index, "index_file.index")  # 将index保存为index_file.index文件

# 读到本地文件
index = faiss.read_index("index_file.index")  # 读入index_file.index文件

复制

# 完全复制一个index
index_new = faiss.clone_index(index)  

# 复制索引到GPU
index_cpu_to_gpu = faiss.index_cpu_to_gpu()

# 从GPU复制到CPU
index_gpu_to_cpu = faiss.index_gpu_to_cpu(index)

# 使用IndexShards或IndexProxy将索引复制到几个GPU
index_cpu_to_mlp_gpu = faiss.index_cpu_to_gpu_multiple(index)

Index factory

Index_factory用一个字符串构建Index,用逗号分割可以分为3部分:

  • 前处理部分
  • 倒排表(聚类)
  • 细化后处理部分(编码)

前处理部分(preprocessing)

  • PCA:PCA64表示通过PCA将数据维度降为64,PCAR64表示增加了随机旋转(random rotation)
  • OPQ: OPQ16表示用OPQMatrix将数组量化为16位

倒排表部分(inverted file)

  • IVF: IVF4096表示使用粗量化器IndexFlatL2建立一个大小是4096的倒排表,即聚类为4096类
  • IMIIMI2x8表示通过Mutil-index使用2x8个bits(MultiIndexQuantizer)建立2^(2*8)份的倒排索引
  • IDMap: 如果不使用倒排但需要add_with_ids,可以通过IndexIDMap来添加id

细化后处理部分(refinement)

  • Flat: 保存完整向量,通过IndexFlat或者IndexIVFFlat实现
  • PQ16: 将向量编码为16byte,通过IndexPQ或者IndexIVFPQ实现
  • PQ8+16:表示通过8字节来进行PQ,16个字节对第一级别量化的误差再做PQ,通过IndexIVFPQR实现

例如:

index = index_factory(128, "OPQ16_64,IMI2x8,PQ8+16")

上述语句是处理128维的向量

  • OPQ16_64:使用OPQ来预处理数据,16是OPQ内部处理的blocks大小,64为OPQ后的输出维度
  • IMI2x8: 使用multi-index建立65536(2^16)和倒排列表
  • PQ8+16: 编码采用8字节PQ和16字节refine的Re-rank方案
index = faiss.index_factory(128, "PCA80,Flat")  # 原始向量128维,用PCA降为80维,然后应用精确搜索
index = faiss.index_factory(128, "OPQ16_64,IMI2x8,PQ8+16")  # 原始向量128维,用OPQ降为64维,分为16类,用2*8bit的倒排多索引,用PQ编码为8byte保存,检索时使用16byte

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值