Faiss-Server基于Faiss的开源实现,是一个使用gRPC协议提供向量检索的服务。
支持加载的向量文件格式
- .fvecs(Fvecs格式文件)
- .svm(Libsvm格式文件)
Libsvm要求的格式如下。
21187279 1:0.2663046344870018 2:0.36652042181588923 3:1.0686633708024278 4:0.48038935355720136 5:0.25852895390543884 6:0.3548201486996048 7:0.5256999599627583 8:0.6950687558969181 9:0.678305894615746 10:0.22776047265501018 21264640 1:0.3939700179792862 2:0.2754414668803289 3:0.9439534329739017 4:0.40100161008614665 5:0.4995636031244379 6:0.013824724791385053 7:0.5587276328436032 8:0.5785080421720411 9:0.2784678162956546 10:0.5387681136371216
通用的形式标识为
tagid 1:xx 2:xx 3:xx
。其中tagid
可以是任意的字符串,例如在推荐的场景中,通常设置为itemid。数字1
是向量的数据,通常从1开始。xx
是维度的具体值。 - .index(Faiss生成的Index文件)
如果您直接加载数据量大的Index文件,创建索引会非常慢。但是在线下通过Libsvm格式的文件build成Faiss的Index文件,再通过在线Faiss Server加载Index文件,加载速度非常快。
加载本地的向量文件
示例文件:article_word2vec.svm
docker run -it -p 9000:9000 -v /home/bruceding.jing:/index datascience-registry.cn-beijing.cr.aliyuncs.com/tools/faiss-server:1.0.0 --index_source=/index/article_word2vec.svm --index_params=Flat
运行命令后,输出相关的日志信息,启动gRPC server成功,监听9000的端口。
参数 | 描述 |
---|---|
-p | 使用docker的-p 参数进行端口映射。
本示例中为9000,表示Faiss-Server的默认监听端口。 |
/home/bruceding.jing | docker镜像地址映射的路径。请根据您的实际情况修改。 |
datascience-registry.cn-beijing.cr.aliyuncs.com/tools/faiss-server:1.0.0 | Faiss-Server提供的docker镜像地址。 |
--index_source | 指定向量文件的具体路径。 |
--index_params | 指定Faiss Index构建的参数,本示例中使用了Flat 搜索的方式构建索引。
Faiss-Server使用Faiss的index_factory的形式构建索引。 |
加载OSS中的向量文件
docker run -it -p 9000:9000 datascience-registry.cn-beijing.cr.aliyuncs.com/tools/faiss-server:1.0.0 --index_params=IVF256,Flat --search_params=nprobe=128 --accessid=xxx --accesskey=xxx --endpoint=oss-cn-beijing.aliyuncs.com --bucket_name=faiss-server --object_name=demo_data/article_word2vec.svm
参数 | 描述 |
---|---|
--index_params | 使用的是IVF256,Flat ,使用了聚簇索引的方式,分成了256份。
|
--search_params | 查询向量最相近的128个聚簇集合。具体的查询参数设置请参见Index IO, cloning and hyper parameter tuning。 |
--bucket_name | OSS的bucket名称。 |
--object_name | OSS的向量文件地址。 |
--endpoint | OSS的访问地址, 这里是外网的地址。在VPC内网的情况下,一定要使用内网地址,节省流量费用,读取速度也会更快。 |
docker run datascience-registry.cn-beijing.cr.aliyuncs.com/tools/faiss-server:1.0.0 --help
加载OSS中Version检查机制
通常,Faiss-Server是在线的服务,直接加载向量文件耗时长。因此您可以生成Index索引文件,通过Faiss-Server直接加载Index文件节省时间。
部分场景下,向量文件需要定时加载。
您可以生成多个版本的向量文件,通过Version文件记录当前加载的文件。Faiss-Server会异步检查Version文件内容,一旦有变动,会自动加载最新的Index和Idxmap文件。
- 1:向量召回算法,生成item的向量文件,存储至OSS文件中。
- 2和3:Faiss-Server读取OSS的向量文件,进行构建索引。
Version文件包含版本内容,实质是Index和Idxmap两个文件地址:
- Index文件是构建出来的Faiss Index文件。
- Idxmap文件是映射表,是tagid和Index具体向量位置的映射。
- 4:在线的Faiss-Server服务一直是启动状态,会监听Version文件内容。
介绍离线流程中,如何构造Index文件。
测试向量服务
启动Faiss-Server之后,可以使用如下工具测试。
工具和源码下载:faiss-client-go.tar.gz和faiss-client-java.tar.gz。
./faiss-client-go --host "11.158.**.**:9000" --vector "1:0.8254435895816826 2:0.3546776922906237 3:0.14982954432756015 4:0.4796270382425792 5:0.5478646494350313 6:0.3771617042371068 7:0.5107318036421319 8:0.7005006312566686 9:0.7030542773195687 10:0.692132791047145" --k 20
参数 | 描述 |
---|---|
--host | 指定Faiss-Server的地址,包括IP地址和端口号。 |
--vector | 指定请求的向量数据,和SVM的格式一样,维度也一致。本示例中是10维的数据。 |
--k | 指定返回TopN的⼤小。
默认是10,本示例中指定为20。 |
tagid
指的是SVM文件里的tagid,通常是itemid
。