Perhitungan terdistribusi dari tetangga terdekat
Proyek ini merujuk pada karya tesis master saya "Perhitungan terdistribusi dari tetangga terdekat" untuk gelar master saya dalam ilmu komputer dalam kolaborasi eksternal dengan Wikimedia Foundation. Pekerjaan ini berfokus pada membuat layanan unggahan gambar di Wikipedia lebih efisien, mempelajari cara mendistribusikan perhitungan perkiraan tetangga terdekat, mengembangkan solusi ad hoc, mengeksplorasi kemungkinan yang ada dan mengadaptasi mereka untuk melakukan pencarian yang didistribusikan dari gambar serupa dalam dataset Wikimedia.
Apa repositori ini
Repositori ini dimaksudkan untuk berisi implementasi beberapa perpustakaan untuk melakukan pencarian kesamaan (cosine) untuk menemukan yang terbaik untuk tujuan saya. Berbagai implementasi didasarkan pada kasus penggunaan yang sebelumnya terbuka.
Perkiraan tetangga terdekat
- KNN: Perpustakaan ini tidak diperkirakan dan sangat tidak efisien untuk kasus penggunaan penelitian saya, implementasinya, dengan SKLEARN, hanya disediakan untuk tujuan perbandingan dengan perpustakaan yang diperkirakan. Di dalam KNN Anda juga akan menemukan versi brute-force yang menjalankan perbandingan linier antara vektor tunggal dan seluruh dataset, tanpa membuat struktur data.
- Gangguan: Perpustakaan ini mengimplementasikan versi Ann, yang ditulis oleh Erik Bernhardsson atas nama Spotify.
- FAISS: Perpustakaan ini dibuat untuk pencarian kesamaan yang efisien dan pengelompokan vektor padat oleh tim peneliti Facebook (sekarang meta).
- SPTAG: Perpustakaan ini dirancang untuk vektor skala besar perkiraan pencarian tetangga terdekat, dibuat oleh Microsoft sebagai versi alternatif untuk perpustakaan mereka sebelumnya, yang disebut Diskann. Tidak seperti teknologi lain, solusi ini melibatkan penggunaan memori RAM dan disk fisik, mengelola secara efisien dan berapa banyak informasi yang menyimpannya.
Distribuited perkiraan tetangga terdekat
- Terdistribusi-FAISs: Perpustakaan ini telah dibahas, tetapi bukan versi terdistribusi. Algoritma ini, meskipun sangat efisien, tidak menambah banyak hal baru pada proposal yang sebelumnya dianalisis yang berjalan pada satu mesin. Namun, apa yang membuat perpustakaan ini istimewa adalah dapat didistribusikan pada beberapa mesin dengan cara yang sangat sederhana.
- Terdistribusi-SPTAG: Perpustakaan ini telah dibahas, tetapi bukan versi terdistribusi. Algoritma ini, meskipun sangat efisien, tidak menambah banyak hal baru pada proposal yang sebelumnya dianalisis yang berjalan pada satu mesin. Namun, apa yang membuat perpustakaan ini istimewa adalah dapat didistribusikan pada beberapa mesin dengan cara yang sangat sederhana.
- MILVUS: Perpustakaan ini mengimplementasikan basis data vektor yang berfokus pada penyediaan sistem dan arsitektur yang efisien untuk pencarian kesamaan dan aplikasi bertenaga AI. Kebutuhan bahwa Milvus mencoba memuaskan adalah menyediakan sistem lengkap yang mampu beroperasi pada dataset dinamis yang sangat besar, memberikan solusi yang juga dapat berjalan pada GPU juga dengan cara terdistribusi. Untuk melakukan Milvus ini dibangun di perpustakaan yang telah dijelaskan sebagai FAISS, membuat perubahan yang diperlukan untuk kasus penggunaannya.
Bagaimana itu terstruktur
Proyek ini telah disusun dengan cara yang tepat untuk memastikan organisasi file yang mudah dan membuat navigasi di dalamnya sederhana.
- Algoritma: Di dalam folder ini Anda dapat menemukan semua implementasinya
- for-each-library:
- config.py: File ini berisi konfigurasi yang diperlukan untuk operasi perpustakaan yang benar
- init.py: File ini berisi kode untuk membaca set data, melatih struktur data dan membuat indeks
- Search.py: File ini berisi kode untuk melakukan pencarian dan mengembalikan item yang dihasilkan
- File lain: chronometer.py, mocks.py
- Dataset: Dataset dan struktur data yang disimpan dalam memori akan dimasukkan ke dalam folder ini
- Terkompresi: Di folder ini dimungkinkan untuk memasukkan set data terkompresi, seperti yang dapat dilihat dari contoh yang dimasukkan. Anda juga dapat melihat file yang disebut links.txt yang berisi semua set data wikimedia
- Decompressed: Di folder ini dimungkinkan untuk memasukkan set data dekompresi, dari sini mereka akan difilter dan didekomposisi untuk fungsi perpustakaan yang benar
- Gambar: Di dalam folder ini dimungkinkan untuk menemukan gambar yang sesuai dengan vektor yang diekstraksi dari dataset
- Vektor: Di dalam folder ini dimungkinkan untuk menemukan vektor yang sesuai dengan gambar yang diekstraksi dari dataset
- formatDataSets.bash: File ini, dapat dieksekusi mengikuti readme.md ini, berisi kode untuk menguraikan semua dataset dari folder yang didekompresi yang menggerakkan vektor di dalam vektor/ folder dan gambar yang sesuai di dalam gambar/ folder. File ini menggunakan formatDataSets.py untuk mengonversi file .csv menjadi format biner untuk mempercepat semua proyek.
- Dokumen: Dokumen yang diperoleh selama penulisan tesis
Cara mengeksekusi
Unduh beberapa set data
- Pergi ke folder terkompresi dan jalankan
wget -i links.txt untuk mengunduh dataset wikimedia (gambar, vektor) - Arsip dekompresi menjadi dekompresi, dalam wikimedia dataset case
gunzip *.gz - Masuk ke folder dataset dan ikuti readme.md
Impor / Instal / Kompilasi Perpustakaan
Pertama -tama masuk ke folder algoritma dan instal persyaratan umum dengan pip install -r requirements.txt .
- Knn:
pip install scikit-learn atau jangan menginstal apa pun jika Anda lebih suka menggunakan versi brute-force - Gangguan:
pip install annoy - FAISS: Ikuti tutorial Conda
- SPTAG: Anda dapat mengkompilasi pustaka ini melalui kode sumber, atau menggunakan Docker. Saya pribadi merekomendasikan solusi terakhir, dengan menjalankan perintah ini:
set GIT_LFS_SKIP_SMUDGE=1
git clone --recurse-submodules https://github.com/microsoft/SPTAG
cd SPTAG
docker build -t sptag .
- Distributed -faiss: Kloning repositori (jika Anda ingin menggunakan PR saya untuk menambahkan presisi ke fase pencarian dengan
set_index_parameter atau set_index_parameters Metode klon repositori ini), masukkan folder dan kemudian jalankan pip install -e . - Distributed-Sptag: Ikuti instruksi untuk SPTAG
- Milvus:
pip install pymilvus dan kemudian milvus dapat dipasang dengan Docker Compose atau Kubernetes (Milvus mandiri untuk pengujian) atau dengan Helm + Kubernetes (Milvus Cluster untuk produksi)
Jalankan Perpustakaan JST
Sebelum menjalankan pustaka, sesuaikan berbagai file config.py
-
python init.py -
python search.py
Jalankan Perpustakaan Distributed-Ann
Sebelum menjalankan pustaka, sesuaikan berbagai file config.py
- Distributed-faiss:
- Kustomisasi file Discovery_config.txt.
- Jalankan pada setiap server
python init_server.py - Jalankan pada klien
python init_client.py - Jalankan pada klien
python search.py
- Distributed-Sptag:
- Buka setiap server, sesuaikan file config.py (perhatian untuk start_metadata_offset) dan jalankan
python init.py - Pergi ke server hosting indeks yang dibuat sebelumnya. Di folder rilis perpustakaan, impor dan sesuaikan file service.ini dan jalankan perintah
./server -m socket -c service.ini - Pergi ke mesin yang Anda identifikasi sebagai agregator. Di folder rilis perpustakaan, impor dan sesuaikan file agregator.ini dan jalankan perintah
./aggregator - Buka klien, sesuaikan file config.py, dan jalankan
python search.py
- Milvus:
-
python init.py -
python search.py
Dibuat oleh Christian Stingone