- 1 概述
- 2 结构
- 3 gRPC
- 4 API
- 5 打包
- 6 部署
- 7 后续
- 参考
原生的Faiss不支持分布式,本文利用S3和Zookeeper实现一个分布式实时Faiss系统, 功能包括索引的查询、删除、增加、重建等四个功能,部署在Docker上。
支持向量检索的开源框架,比如vearch、milvus等,但我并没有用,因为,
首先,业务方没有那么大的数据量,
其次,开源框架,虽然部署简单,但也是有成本的,比如,学习成本、部署成本、运维成本等,
与其这样,还不如自己写一个。
整个应用虽然也就花了7天,但测试比开发时间长很多。
图1 结构
图2 索引更新流程
整个Faiss集群外部是四层均衡负载:
- 实线,为核心流程。只能由Master节点完成向量索引的增加、删除,以及与其他节点同步索引,并返回给客户端索引更新的详细信息,包括集群每个节点IP、更新前后的向量数量等。
- 长划线,为集群选举Master节点。在应用启动时,或运行期间,master挂点后,选举master节点。
- 点划线,为集群索引同步。master节点通过gRPC与其他节点同步索引。
- 点虚线,若客户端请求到达的是Slave节点,则需要转发给Master节点,完成集群节点的索引更新。
若图片不能正常显示,配置hosts文件
151.101.76.133 raw.githubusercontent.com
索引同步gRPC定义在protos
里,用如下命令,生成py文件,以便在应用中使用:
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=./ syncindex.proto
对外公开的是Restful API,当然,也有gRPC接口:
执行umake.py
脚本,会将应用打包到deploy
目录。
我部署在Core8、Men24GB的docker上。如果不缓存结果,则TPS=120,TP99=30ms。
- 召回的数据量,10,100,1000……都有可能,所以,如果使用Restful API的话,并且调用链路太长, 耗时可能会长,此时,你可以试试gRPC接口。
- Faiss消耗CPU资源。
- 若要支撑更多的TPS,采用缓存,分布式系统,要有自己的缓存系统。
- 索引同步,可以采用asyncio改写,强化性能。