大约最近邻居的分布式计算
该项目引用了我的主论文工作“分布了与Wikimedia Foundation的外部合作计算机科学硕士学位的分布计算”。这项工作的重点是使Wikipedia上的图像上传服务更加高效,研究了如何分发近似最近的邻居的计算,开发临时解决方案,探索现有可能性并调整它们以在Wikimedia数据集中对类似图像进行分布式搜索。
这个存储库是什么
该存储库旨在包含用于执行相似性(余弦)搜索的几个库的实现,以便为我的目的找到最佳的库。各种实现基于先前暴露的用例。
大约最近的邻居
- KNN:该库不近似,对于我的研究用例而言,它的实现及其具有Sklearn的实现仅是为了与近似库的比较目的。在KNN内部,您还将找到一个蛮力版本,该版本在没有创建数据结构的情况下执行单个向量和整个数据集之间的线性比较。
- 烦恼:该库实现了由Erik Bernhardsson代表Spotify撰写的ANN版本。
- FAISS:该图书馆是为Facebook(现为Meta)研究团队创建的,目的是为有效的相似性搜索和密集矢量聚类。
- SPTAG:此库是为大型矢量近似最近的邻居搜索而设计的,该库是由Microsoft创建的,作为其先前库的替代版本,称为Diskann。与其他技术不同,该解决方案涉及使用RAM内存和物理磁盘,并有效地管理哪些信息和多少信息。
分发大约最近的邻居
- 分布式 - 脸:该库已被涵盖,但没有其分布式版本。该算法虽然非常有效,但并没有为先前在单个计算机上运行的提案添加太多新内容。但是,使该库与众不同的是,它可以以非常简单的方式分配在多台计算机上。
- 分布式信息:该库已被涵盖,但没有其分布式版本。该算法虽然非常有效,但并没有为先前在单个计算机上运行的提案添加太多新内容。但是,使该库与众不同的是,它可以以非常简单的方式分配在多台计算机上。
- MILVUS:该库实施了矢量数据库,该数据库致力于为相似性搜索和AI驱动的应用程序提供有效的系统和体系结构。 Milvus试图满足的需求是提供一个能够在巨大动态数据集上操作的完整系统,提供解决方案,也可以以分布式方式在GPU上运行。为了做这个米尔维斯,是建立在已经被解释为faiss的图书馆基础上,为其用例做出了必要的更改。
它的结构如何
该项目以一种精确的方式进行了构建,以确保简单地组织文件并简单地进行导航。
- 算法:在此文件夹中,您可以找到所有实现
- for-each-library:
- config.py:此文件包含库正确操作所需的配置
- init.py:此文件包含用于读取数据集,培训数据结构并创建索引的代码
- search.py:此文件包含用于执行搜索并返回结果项目的代码
- 其他文件:chronometer.py,mocks.py
- 数据集:保存在内存中的数据集和数据结构将插入此文件夹中
- 压缩:在此文件夹中,可以插入压缩数据集,如插入的示例所示。您可能还会注意到一个名为links.txt的文件,其中包含所有Wikimedia数据集
- 解压缩:在此文件夹中,可以插入解压缩数据集,从这里进行过滤和分解以使其正确函数库的正确功能
- 图像:在此文件夹中,可以找到与从数据集提取的向量相对应的图像
- 向量:在此文件夹中,可以找到与从数据集提取的图像相对应的向量
- formatdatasets.bash:此文件,可在此readme.md之后可执行文件,其中包含从解压缩文件夹中分解所有数据集的代码,将向量/文件夹中的向量移动向量/文件夹中的向量以及图像/文件夹中的相应图像。该文件使用formatdatasets.py将.csv文件转换为二进制格式,以加快所有项目。
- 文档:论文撰写期间获得的文件
如何执行
下载一些数据集
- 转到“压缩文件夹”并执行
wget -i links.txt下载Wikimedia数据集(图像,向量) - 在Wikimedia数据集CASE
gunzip *.gz中,解压缩档案分解为解压缩 - 进入数据集文件夹,然后按照readme.md键
导入 /安装 /编译库
首先进入算法文件夹,然后使用pip install -r requirements.txt安装一般要求。
- KNN:
pip install scikit-learn或如果您喜欢使用Bruts-Force版本,请不要安装任何内容 - 烦恼:
pip install annoy - Faiss:关注Conda教程
- SPTAG:您可以通过源代码编译此库,也可以使用Docker。我个人建议通过运行以下命令来推荐后一个解决方案:
set GIT_LFS_SKIP_SMUDGE=1
git clone --recurse-submodules https://github.com/microsoft/SPTAG
cd SPTAG
docker build -t sptag .
- 分布式faiss:克隆存储库(如果要使用我的PR来添加使用
set_index_parameter或set_index_parameters方法克隆此存储库的搜索阶段的精度),请输入该文件夹,然后运行pip install -e . - 分布式示威:遵循SPTAG的说明
- MILVUS:
pip install pymilvus ,然后可以使用Docker Compose或Kubernetes(Milvus独立测试)或Helm + Kubernetes(Milvus cluster)安装Milvus(MILVUS群集)
执行ANN库
在运行库之前,请自定义各种config.py文件
python init.py-
python search.py
执行分布式库库
在运行库之前,请自定义各种config.py文件
- 分布式 - faiss:
- 自定义Discovery_config.txt文件。
- 在每个服务器上执行
python init_server.py - 在客户端
python init_client.py上执行 - 在客户端
python search.py上执行执行
- 分布式式标准:
- 转到每个服务器,自定义config.py文件(注意start_metadata_offset)并运行
python init.py - 转到托管先前创建的索引的服务器。在库的发布文件夹中,导入和自定义service.ini文件并运行命令
./server -m socket -c service.ini - 转到您确定为聚合器的机器。在库的发布文件夹中,导入和自定义gentregator.ini文件并运行命令
./aggregator - 转到客户端,自定义config.py文件,然后执行
python search.py
- 米尔维斯:
-
python init.py -
python search.py
由克里斯蒂安·斯汀(Christian Stingone)制作