DiskANN, Solusi ANNS Berbasis Disk dengan Recall dan QPS Tinggi pada Dataset Berskala Miliaran
Chengming Li, Insinyur Litbang Zilliz, lulus dari SouthEast University dengan gelar Master di bidang Ilmu Komputer. Fokusnya saat ini adalah pada masalah ANNS pada data berdimensi tinggi, termasuk solusi berbasis grafik dan kuantisasi.
"DiskANN: Pencarian Tetangga Terdekat Miliar Titik yang Akurat dan Cepat pada Satu Simpul" adalah makalah yang diterbitkan di NeurIPS pada tahun 2019. Makalah ini memperkenalkan metode mutakhir untuk melakukan pembangunan indeks dan pencarian pada dataset berskala miliaran menggunakan satu mesin dengan hanya 64GB RAM dan SSD yang cukup besar. Selain itu, metode ini memenuhi tiga persyaratan ANNS (Approximate Nearest Neighbor Search) pada dataset berskala besar: recall yang tinggi, latensi yang rendah, dan kepadatan yang tinggi (jumlah node dalam satu mesin). Metode ini membangun indeks berbasis grafik pada dataset berskala miliaran SIFT-1B menggunakan mesin tunggal dengan RAM 64GB dan CPU 16-core, mencapai 5000 QPS (kueri per detik) dengan recall lebih dari 95% @ 1, dan latensi rata-rata lebih rendah dari 3ms.
Penulis
Suhas Jayaram Subramanya: Mantan karyawan Microsoft India Research Institute, mahasiswa doktoral CMU. Minat penelitian utamanya adalah komputasi berkinerja tinggi dan algoritme pembelajaran mesin untuk data berskala besar.
Devvrit: Asisten Peneliti Pascasarjana di Universitas Texas di Austin. Minat penelitiannya adalah ilmu komputer teoretis, pembelajaran mesin, dan pembelajaran mendalam.
Rohan Kadekodi: Mahasiswa doktoral di University of Texas. Arah penelitiannya adalah sistem dan penyimpanan, terutama termasuk penyimpanan persisten, sistem file, dan penyimpanan kV.
Ravishankar Krishaswamy: Peneliti utama di lembaga penelitian Microsoft India. Doktor dari CMU. Arah penelitiannya adalah algoritma aproksimasi berdasarkan grafik dan pengelompokan.
Harsha Vardhan Simhadri: Peneliti utama lembaga penelitian Microsoft India. Doktor dari CMU. Di masa lalu, dia mempelajari algoritma paralel dan sistem runtime. Sekarang pekerjaan utamanya adalah mengembangkan algoritma baru dan menulis model pemrograman.
Motivasi
Sebagian besar algoritma ANNS arus utama membuat beberapa trade-off antara kinerja pembuatan indeks, kinerja pencarian, dan recall. Algoritme berbasis graf seperti HNSW dan NSG adalah metode mutakhir dalam hal kinerja pencarian dan pemanggilan saat ini. Karena metode pengindeksan berbasis grafik yang menggunakan memori terlalu banyak menggunakan memori, maka relatif sulit untuk mengindeks dan mencari set data berskala besar menggunakan mesin tunggal dengan sumber daya memori yang terbatas.
Banyak aplikasi membutuhkan respons cepat dari ANNS berbasis jarak Euclidean pada dataset berskala miliaran. Di bawah ini adalah dua solusi utama:
- Indeks terbalik + kuantisasi: untuk mengelompokkan dataset ke dalam M partisi dan mengompres dataset menggunakan skema kuantisasi seperti PQ (Kuantisasi Produk). Solusi ini menghasilkan recall yang rendah karena hilangnya presisi yang disebabkan oleh kompresi data. Meningkatkan topk membantu meningkatkan recall sementara QPS akan menurun.
- Divide and index: untuk membagi dataset menjadi beberapa pecahan yang terpisah-pisah dan membangun indeks dalam memori untuk setiap pecahan. Ketika permintaan kueri datang, pencarian akan dilakukan pada indeks setiap pecahan dan hasilnya akan dikembalikan setelah penggabungan. Solusi ini menyebabkan perluasan skala dataset yang berlebihan, dan dengan demikian lebih banyak mesin diperlukan karena pembatasan sumber daya memori dalam satu mesin, yang mengarah ke QPS yang rendah.
Kedua solusi yang disebutkan di atas dibatasi oleh pembatasan memori dari satu mesin. Makalah ini mengusulkan desain mekanisme pengindeksan residen SSD untuk mengatasi masalah ini. Tantangan pengindeksan SSD-resident adalah mengurangi jumlah akses disk acak dan jumlah permintaan untuk akses disk.
Kontribusi
Makalah ini menyajikan skema ANNS residen SSD yang disebut DiskANN, yang secara efektif dapat mendukung pencarian pada dataset berskala besar. Skema ini didasarkan pada algoritme berbasis grafik yang disajikan dalam makalah ini: Vamana. Kontribusi dari makalah ini meliputi:
- DiskANN dapat mengindeks dan mencari dataset berskala miliaran yang terdiri dari lebih dari 100 dimensi pada satu mesin dengan RAM 64GB, memberikan lebih dari 95% recall@1 dengan latensi di bawah 5 milidetik.
- Algoritma berbasis grafik baru yang disebut Vamana dengan radius pencarian yang lebih kecil daripada NSG dan HNSW diusulkan untuk meminimalkan jumlah akses disk.
- Vamana dapat bekerja di memori dan kinerjanya tidak lebih lambat dari NSG dan HNSW.
- Indeks Vamana yang lebih kecil yang dibangun di atas partisi yang tumpang tindih dari kumpulan data yang besar dapat digabungkan menjadi satu grafik tanpa kehilangan konektivitas.
- Vamana dapat digabungkan dengan skema kuantisasi seperti PQ. Struktur grafik dan data asli disimpan di disk sementara data yang dikompresi disimpan di memori.
Vamana
Algoritma ini mirip dengan ide dari NSG[2][4] (bagi mereka yang tidak mengerti NSG, silahkan merujuk ke Referensi [2], dan jika Anda tidak ingin membaca makalah, Anda dapat merujuk ke Referensi [4]). Perbedaan utama keduanya terletak pada strategi pemangkasan. Tepatnya, switch alpha telah ditambahkan ke strategi pemangkasan NSG. Ide utama dari strategi pemangkasan NSG adalah bahwa pilihan tetangga dari titik target dibuat seberagam mungkin. Jika tetangga baru lebih dekat ke tetangga titik target daripada titik target, kita tidak perlu menambahkan titik ini ke kumpulan titik tetangga. Dengan kata lain, untuk setiap tetangga titik target, tidak boleh ada titik tetangga lain dalam radius jarak di sekitarnya (titik target, titik tetangga). Strategi pemangkasan ini secara efektif mengontrol derajat keluar dari graf, dan relatif radikal. Strategi ini mengurangi jejak memori dari indeks, meningkatkan kecepatan pencarian, tetapi juga mengurangi akurasi pencarian. Strategi pemangkasan Vamana adalah untuk mengontrol skala pemangkasan secara bebas melalui parameter alpha. Prinsip kerjanya adalah mengalikan dist (titik tetangga, titik kandidat) dalam kondisi pemangkasan dengan parameter alpha (tidak kurang dari 1). Hanya ketika dist (titik target, titik kandidat tertentu) lebih besar dari jarak referensi yang diperbesar, strategi pemangkasan diadopsi, meningkatkan toleransi pengecualian timbal balik antara tetangga titik target.
Proses pengindeksan Vamana relatif sederhana:
- Inisialisasi sebuah graf acak;
- Hitung titik awal, yang mirip dengan titik navigasi NSG. Pertama, cari titik pusat global, lalu cari titik yang paling dekat dengan titik pusat global sebagai titik navigasi. Perbedaan antara Vamana dan NSG adalah input dari NSG sudah berupa graf tetangga terdekat, sehingga pengguna cukup melakukan pencarian tetangga terdekat pada titik centroid secara langsung pada graf tetangga awal. Akan tetapi, Vamana menginisialisasi graf tetangga terdekat secara acak, sehingga pengguna tidak dapat melakukan pencarian perkiraan secara langsung pada graf acak tersebut. Mereka perlu melakukan perbandingan global untuk mendapatkan titik navigasi sebagai titik awal dari iterasi selanjutnya. Tujuan dari poin ini adalah untuk meminimalkan radius pencarian rata-rata;
- Lakukan Approximate Nearest Neighbor Search pada setiap titik berdasarkan graf tetangga acak yang telah diinisialisasi dan titik awal pencarian yang telah ditentukan pada langkah 2, jadikan semua titik pada jalur pencarian sebagai kandidat tetangga, dan jalankan strategi pemangkasan tepi dengan menggunakan alfa=1. Mirip dengan NSG, memilih himpunan titik pada jalur pencarian yang dimulai dari titik navigasi sebagai himpunan tetangga kandidat akan meningkatkan beberapa sisi yang panjang dan secara efektif mengurangi radius pencarian.
- Sesuaikan alpha > 1 (makalah ini merekomendasikan 1.2) dan ulangi langkah 3. Sedangkan langkah 3 didasarkan pada sebuah graf tetangga terdekat acak, graf tersebut berkualitas rendah setelah iterasi pertama. Oleh karena itu, diperlukan iterasi lain untuk meningkatkan kualitas graf, yang sangat penting untuk tingkat recall.
Makalah ini membandingkan tiga indeks graf, yaitu Vamana, NSG, dan HNSW. Dalam hal pengindeksan dan kinerja kueri, Vamana dan NSG relatif dekat, dan keduanya sedikit mengungguli HNSW. Lihat bagian Eksperimen di bawah ini untuk data.
2.png
Untuk memvisualisasikan proses pembangunan indeks Vamana, makalah ini menyediakan sebuah grafik, di mana 200 titik dua dimensi digunakan untuk mensimulasikan dua putaran iterasi. Baris pertama menggunakan alpha = 1 untuk memangkas tepi. Terlihat bahwa strategi pemangkasannya relatif radikal, dan sejumlah besar tepi dipangkas. Setelah meningkatkan nilai alpha dan melonggarkan kondisi pemangkasan, banyak sisi yang ditambahkan kembali. Pada graf akhir, cukup banyak sisi yang panjang yang ditambahkan. Hal ini secara efektif dapat mengurangi radius pencarian.
DiskANN
Sebuah komputer pribadi dengan memori hanya 64GB bahkan tidak dapat menampung satu miliar data mentah, apalagi indeks yang dibangun di atasnya. Ada dua tantangan di depan: 1. Bagaimana cara mengindeks kumpulan data berskala besar dengan sumber daya memori yang terbatas? 2. Bagaimana cara menghitung jarak saat mencari jika data asli tidak dapat dimuat dalam memori?
Makalah ini mengusulkan solusi-solusi berikut:
- Untuk tantangan pertama: pertama, bagi data ke dalam k cluster menggunakan k-means, dan kemudian alokasikan setiap titik ke dalam i cluster terdekat. Umumnya, 2 sudah cukup untuk jumlah i. Bangun indeks Vamana berbasis memori untuk setiap cluster, dan akhirnya gabungkan k indeks Vamana menjadi satu.
- Untuk tantangan kedua: membangun indeks pada vektor asli dan vektor yang dikompresi. Membangun indeks pada vektor asli memastikan kualitas grafik, sementara vektor terkompresi dapat dimuat dalam memori untuk pencarian berbutir kasar. Meskipun pencarian dengan vektor terkompresi dapat menyebabkan hilangnya akurasi, arah secara umum akan benar selama kualitas grafik cukup tinggi. Hasil jarak akhir akan dihitung dengan menggunakan vektor asli.
Tata letak indeks DiskANN mirip dengan indeks grafik pada umumnya. Himpunan tetangga dari setiap titik dan data vektor asli disimpan bersama. Hal ini memanfaatkan lokalitas data dengan lebih baik.
Seperti yang telah disebutkan sebelumnya, jika data indeks disimpan di SSD, jumlah akses disk dan permintaan baca dan tulis disk harus dikurangi sebanyak mungkin untuk memastikan penundaan pencarian yang rendah. Oleh karena itu, DiskANN mengusulkan dua strategi pengoptimalan:
- Cache hotspot: cache semua titik dalam C yang melompat dari titik awal dalam memori. Nilai C lebih baik diatur dalam 3 hingga 4.
- Pencarian balok: Sederhananya, ini adalah untuk memuat informasi tetangga. Saat mencari titik p, titik tetangga p perlu dimuat dari disk jika tidak ada dalam memori. Karena sejumlah kecil operasi akses acak SSD memerlukan waktu yang sama dengan operasi akses sektor tunggal SSD, informasi tetangga dari W titik yang tidak diakses dapat dimuat sekaligus. W tidak dapat diatur terlalu besar atau kecil. W yang besar akan memboroskan sumber daya komputasi dan bandwidth SSD, sedangkan W yang kecil akan meningkatkan penundaan pencarian.
Eksperimen
Eksperimen ini terdiri dari tiga kelompok:
Perbandingan di antara indeks berbasis memori: Vamana VS. NSG VS. HNSW
Kumpulan data: SIFT1M (128 dimensi), GIST1M (960 dimensi), DEEP1M (96 dimensi) dan set data 1M yang diambil secara acak dari DEEP1B.
Parameter indeks (semua set data menggunakan set parameter yang sama):
HNSW: M = 128, efc = 512.
Vamana: R = 70, L = 75, alfa = 1,2.
NSG: R = 60, L = 70, C= 500.
Parameter pencarian tidak disediakan dalam makalah ini, yang mungkin konsisten dengan parameter pengindeksan. Untuk pemilihan parameter, parameter NSG yang disebutkan dalam artikel didasarkan pada parameter yang tercantum dalam repositori GitHub NSG untuk memilih grup dengan kinerja yang lebih baik. Vamana dan NSG relatif dekat, jadi parameternya juga diatur dekat. Namun, alasan pemilihan parameter HNSW tidak diberikan. Kami percaya bahwa parameter M dari HNSW ditetapkan relatif besar. Hal ini dapat menyebabkan perbandingan yang kurang meyakinkan antara indeks berbasis grafik jika derajat keluarnya tidak ditetapkan pada tingkat yang sama.
Dengan parameter pengindeksan di atas, waktu pengindeksan Vamana, HNSW, dan NSG masing-masing adalah 129 detik, 219 detik, dan 480 detik. Waktu pengindeksan NSG termasuk waktu untuk membangun graf tetangga awal dengan EFANN [3].
Gambar 3. Kurva Recall-QPS:
3.png
Dapat dilihat dari Gambar 3 bahwa Vamana memiliki performa yang sangat baik pada ketiga set data, mirip dengan NSG dan sedikit lebih baik dari HNSW.
Gambar 3. Perbandingan radius pencarian:
Dari Gambar 2.c, kita dapat melihat bahwa Vamana memiliki rata-rata jalur pencarian terpendek dengan tingkat recall yang sama dibandingkan dengan NSG dan HNSW.
Perbandingan antara indeks yang dibangun satu kali dan indeks gabungan yang besar
Kumpulan data: SIFT1B
Parameter indeks yang dibangun satu kali: L = 50, R = 128, alfa = 1,2. Setelah dijalankan selama 2 hari pada mesin DDR3 1800G, memori puncak sekitar 1100 G, dan rata-rata out-degree adalah 113,9.
Prosedur pengindeksan berdasarkan penggabungan:
- Latih 40 cluster pada dataset menggunakan kmeans;
- Setiap titik didistribusikan ke dalam 2 cluster terdekat;
- Buatlah indeks Vamana dengan L = 50, R = 64, dan alpha = 1.2 untuk setiap cluster;
- Gabungkan indeks dari setiap cluster.
Indeks ini menghasilkan indeks sebesar 384GB dengan rata-rata out-of-degree sebesar 92,1. Indeks ini berjalan selama 5 hari pada mesin DDR4 64GB.
Hasil perbandingannya adalah sebagai berikut (Gambar 2a):
4.png
Kesimpulannya:
- Indeks yang dibangun sekali pakai secara signifikan lebih baik daripada indeks berbasis penggabungan;
- Indeks berbasis penggabungan juga sangat baik;
- Skema pengindeksan berbasis penggabungan juga dapat diterapkan pada set data DEEP1B (Gambar 2b).
Indeks berbasis disk: DiskANN VS. FAISS VS. IVF-OADC + G + P
IVFOADC+G+P adalah sebuah algoritma yang diusulkan dalam Referensi [5].
Makalah ini hanya membandingkan DiskANN dengan IVFOADC+G+P, karena referensi [5] telah membuktikan bahwa IVFOADC+G+P lebih baik daripada FAISS. Selain itu, FAISS membutuhkan sumber daya GPU yang tidak didukung oleh semua platform.
IVF-OADC+G+P tampaknya merupakan kombinasi dari HNSW dan IVF-PQ. Ini menentukan cluster menggunakan HNSW, dan melakukan pencarian dengan menambahkan beberapa strategi pemangkasan ke cluster target.
Hasilnya terlihat pada Gambar 2a. Angka 16 dan 32 pada gambar tersebut adalah ukuran codebook. Datasetnya adalah SIFT1B, yang dikuantifikasi oleh OPQ.
Rincian implementasi kode
Kode sumber DiskANN bersumber terbuka di https://github.com/microsoft/DiskANN
Pada bulan Januari 2021, kode sumber dari solusi disk telah menjadi sumber terbuka.
Berikut ini terutama memperkenalkan proses pengindeksan dan proses pencarian.
Pembuatan indeks
Ada 8 parameter untuk membangun indeks:
data_type: opsi termasuk float/int8/uint8.
data_file.bin: File biner data asli. Dua bilangan bulat pertama dalam berkas tersebut masing-masing mewakili jumlah total n dari vektor kumpulan data dan dimensi vektor dim. N byte terakhir dim sizeof(data_type) adalah data vektor kontinu.
index_prefix_path: Awalan jalur dari file keluaran. Setelah indeks dibuat, beberapa berkas terkait indeks akan dihasilkan. Parameter ini adalah awalan umum dari direktori tempat berkas-berkas tersebut disimpan.
R: Derajat keluar maksimum dari indeks global.
L: Parameter L dari indeks Vamana, batas atas dari ukuran set kandidat.
B: Ambang batas memori saat melakukan kueri. Ini mengontrol ukuran buku kode PQ, dalam GB.
M: Ambang batas memori saat membangun indeks. Ini menentukan ukuran fragmen, dalam GB.
T: Jumlah utas.
Proses pengindeksan (fungsi entri: aux_utils.cpp::build_disk_index):
- Menghasilkan berbagai nama berkas keluaran menurut index_prefix_path.
- Pemeriksaan parameter.
- Baca meta dari data_file.bin untuk mendapatkan n dan dim. Tentukan nomor subruang buku kode m dari PQ menurut B dan n.
- generate_pq_pivots: Ambil sampel titik pusat dari set pelatihan PQ menggunakan laju sampling p = 1500000/n secara seragam untuk melatih PQ secara global.
- generate_pq_data_dari_pivot: Menghasilkan buku kode PQ global, dan menyimpan titik pusat dan buku kode secara terpisah.
- build_merged_vamana_index: memotong kumpulan data asli, membangun indeks Vamana dalam segmen, dan akhirnya menggabungkan indeks menjadi satu.
- partisi_dengan_ram_anggaran: Tentukan jumlah fragmen k sesuai dengan parameter M. Contoh set data menggunakan kmeans, bagikan setiap titik ke dua cluster terdekat. Fragmentasi set data, dan setiap fragmen menghasilkan dua file: file data dan file ID. File ID dan file data berhubungan satu sama lain, dan setiap ID dalam file ID berhubungan dengan vektor dalam file data. ID diperoleh dengan menomori setiap vektor dari data asli dari 0 hingga n-1. ID relatif penting dan terkait dengan penggabungan.
- Secara global mengambil sampel secara seragam pada training set dengan tingkat pengambilan sampel sebesar 1500000 / n;
- Inisialisasi num_parts = 3. Lakukan iterasi dari 3:
- Lakukan num_parts-means++ pada set pelatihan di langkah i;
- Gunakan sampling rate 0.01 untuk mengambil sampel set uji secara seragam secara global, dan bagi set uji ke dalam 2 cluster terdekat;
- Hitung jumlah titik di setiap klaster dan bagi dengan sampling rate untuk memperkirakan jumlah titik di setiap klaster;
- Perkirakan memori yang dibutuhkan oleh cluster terbesar pada langkah 3 sesuai dengan ukuran indeks Vamana, jika tidak melebihi parameter M, lanjutkan ke langkah iii, jika tidak num_parts ++ kembali ke langkah 2;
- Bagilah kumpulan data asli ke dalam file grup num_parts, setiap grup file termasuk file data yang terfragmentasi dan file ID yang sesuai dengan data yang terfragmentasi.
- Buat indeks Vamana secara terpisah untuk semua irisan pada langkah a dan simpan ke disk;
- merge_shards: menggabungkan pecahan num_parts Vamana ke dalam indeks global:
- Baca file ID dari pecahan num_parts ke dalam idmap. Idmap ini setara dengan membuat pemetaan maju dari fragmen->id;
- Buat pemetaan mundur dari id-> fragmen menurut idmap, dan ketahui di mana dua fragmen setiap vektor berada;
- Gunakan pembaca dengan cache 1GB untuk membuka indeks Vamana irisan num_parts, dan gunakan penulis dengan cache 1GB untuk membuka file keluaran, siap untuk digabungkan;
- Tempatkan titik navigasi num_parts dari indeks Vamana ke dalam file titik tengah, yang akan digunakan saat pencarian;
- Mulai penggabungan menurut ID dari kecil ke besar, baca kumpulan titik tetangga dari setiap vektor asli di setiap fragmen secara bergantian sesuai dengan pemetaan terbalik, duplikat, kocok, potong, dan tulis ke file keluaran. Karena pemenggalan pada awalnya diurutkan secara global, dan sekarang penggabungannya juga diurutkan, maka ID dalam indeks flushed akhir dan ID data asli adalah korespondensi satu-ke-satu.
- Menghapus file sementara, termasuk file fragmen, indeks fragmen, dan file ID fragmen.
buat_tata_letak_disk: Indeks global yang dihasilkan pada langkah 6 hanya memiliki tabel ketetanggaan yang ringkas. Langkah ini adalah untuk menyelaraskan indeks. Tabel ketetanggaan dan data asli disimpan bersama. Ketika mencari, muat tabel kedekatan dan baca vektor asli secara bersamaan untuk penghitungan jarak yang akurat. Ada juga konsep SECTOR, dengan ukuran default 4096. Setiap SEKTOR hanya berisi 4096 / node_size informasi vektor. node_size = ukuran vektor tunggal + ukuran tabel ketetanggaan node tunggal.
Terakhir, lakukan pengambilan sampel seragam global sebesar 150000 / n, simpan, dan gunakan untuk pemanasan saat melakukan pencarian.
Pencarian
Ada 10 parameter pencarian:
- index_type: Pilihannya termasuk Float/int8/uint8, mirip dengan parameter pertama data_type saat membangun indeks.
- index_prefix_path: Lihat parameter indeks index_prefix_path.
- num_nodes_to_cache: Jumlah hotspot cache.
- num_threads: Jumlah utas pencarian.
- beamwidth: Batas atas jumlah titik pramuat. Sistem menentukan jika disetel 0.
- query_file.bin: File set kueri.
- truthset.bin: File set hasil, "null" berarti set hasil tidak disediakan, program menghitungnya dengan sendirinya;
- K: topk;
- result_output_prefix: Jalur untuk menyimpan hasil pencarian;
- L*: Daftar parameter pencarian. Beberapa nilai dapat ditambahkan. Untuk setiap L, informasi statistik akan diberikan saat melakukan pencarian dengan L yang berbeda.
Proses pencarian:
- Memuat data terkait: memuat kumpulan kueri, data titik pusat PQ, data buku kode, titik awal pencarian, dan data lainnya, serta membaca meta indeks.
- Gunakan kumpulan data yang diambil sampelnya selama pengindeksan untuk melakukan cached_beam_search, hitung waktu akses setiap titik, dan muat titik num_nodes_to_cache dengan frekuensi akses tertinggi ke cache.
- Ada operasi WARMUP secara default. Seperti langkah 2, kumpulan data sampel ini juga digunakan untuk melakukan cached_beam_search.
- Menurut jumlah parameter L yang diberikan, setiap L akan dilakukan dengan cached_beam_search lagi dengan set kueri, dan statistik seperti recall rate dan QPS akan dikeluarkan. Proses pemanasan dan statistik data hotspot tidak dihitung dalam waktu kueri.
Tentang cached_beam_search:
- Temukan kandidat terdekat ke titik kueri dari titik awal kandidat. Jarak PQ digunakan di sini, dan titik awal ditambahkan ke antrean pencarian.
- Mulai mencari:
- Dari antrean pencarian, tidak ada lebih dari beam_width + 2 titik yang belum dikunjungi. Jika titik-titik ini ada di cache, tambahkan ke antrean hit cache. Jika tidak dikunjungi, tambahkan ke antrean tidak dikunjungi. Pastikan ukuran antrean miss tidak melebihi beam_width.
- Kirim permintaan akses disk asinkron ke titik-titik dalam antrean miss.
- Untuk titik-titik yang terkena cache, gunakan data asli dan data kueri untuk menghitung jarak yang tepat, tambahkan ke antrean hasil, lalu gunakan PQ untuk menghitung jarak ke titik-titik tetangga yang belum dikunjungi sebelum menambahkan ke antrean pencarian. Panjang antrian pencarian dibatasi oleh parameter.
- Proses titik-titik yang terlewat dalam cache pada langkah a, mirip dengan langkah c.
- Ketika antrian pencarian kosong, pencarian berakhir, dan topk antrian hasil dikembalikan.
Rangkuman
Meskipun ini adalah pekerjaan yang relatif panjang, namun secara keseluruhan sangat bagus. Ide kertas dan kodenya jelas: membagi sejumlah ember yang tumpang tindih melalui k-means, lalu membagi ember untuk membangun indeks peta, dan akhirnya menggabungkan indeks, yang merupakan ide yang relatif baru. Adapun indeks grafik berbasis memori Vamana, pada dasarnya adalah versi NSG yang diinisialisasi secara acak yang dapat mengontrol perincian pemangkasan. Saat melakukan kueri, ia memanfaatkan sepenuhnya cache + pipeline, menutupi sebagian waktu io, dan meningkatkan QPS. Namun, menurut makalah tersebut, meskipun kondisi mesin tidak luar biasa, waktu pelatihan memakan waktu hingga 5 hari, dan kegunaannya relatif rendah. Pengoptimalan untuk pelatihan pasti diperlukan di masa mendatang. Dari perspektif kode, kualitasnya relatif tinggi dan dapat langsung digunakan di lingkungan produksi.
Referensi
- Suhas Jayaram Subramanya, Fnu Devvrit, Harsha Vardhan Simhadri, Ravishankar Krishnawamy, Rohan Kadekodi. DiskANN: Pencarian Tetangga Terdekat Miliar Titik yang Akurat dan Cepat pada Satu Simpul. NeurIPS 2019.
- [Cong Fu, Chao Xiang, Changxu Wang, dan Deng Cai. Pencarian tetangga terdekat yang cepat dengan grafik penyebaran yang menavigasi. PVLDB, 12(5):461 - 474, 2019. doi: 10.14778/3303753.3303754.] (http://www.vldb.org/pvldb/vol12/p461-fu.pdf)
- Cong Fu dan Deng Cai. GitHub - ZJULearning/efanna: pustaka cepat untuk pencarian ANN dan konstruksi grafik KNN.
- Mesin Pencari Untuk AI:高维数据检索工业级解决方案
- Penulis
- Motivasi
- Kontribusi
- Vamana
- DiskANN
- Eksperimen
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word