大約最近鄰居的分佈式計算
該項目引用了我的主論文工作“分佈了與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 service.ini - 轉到您確定為聚合器的機器。在庫的發布文件夾中,導入和自定義gentregator.ini文件並運行命令
./aggregator - 轉到客戶端,自定義config.py文件,然後執行
python search.py
- 米爾維斯:
-
python init.py -
python search.py
由克里斯蒂安·斯汀(Christian Stingone)製作