AISAQCompatible with Milvus 2.6.4+
AISAQ adalah indeks vektor berbasis disk yang memperluas DISKANN untuk menangani dataset berskala miliaran dengan jejak DRAM yang minimal.
Tidak seperti DISKANN, yang menyimpan vektor terkompresi dalam memori, AISAQ dirancang dengan "Arsitektur DRAM Nyaris Nol" yang berarti menyimpan semua struktur data pada SSD.
AISAQ memungkinkan menjalankan database berskala sangat tinggi menggunakan server standar sekaligus menawarkan mode operasi untuk menyeimbangkan kinerja dan biaya penyimpanan.
Cara kerja AISAQ
Diagram di atas membandingkan tata letak penyimpanan DISKANN, AISAQ-Performance, dan AISAQ-Scale, yang menunjukkan bagaimana data (vektor mentah, daftar tepi, dan kode PQ) didistribusikan antara RAM dan disk.
Aisaq Vs Diskann
Dasar: Rekap DISKANN
Dalam DISKANN, vektor mentah dan daftar tepi disimpan di disk, sedangkan vektor yang dikompresi PQ disimpan di memori (DRAM).
Ketika DISKANN berjalan ke sebuah simpul (misalnya, vektor 0):
Ia memuat vektor mentah(raw_vector_0) dan daftar sisi(edgelist_0) dari disk.
Daftar sisi menunjukkan tetangga mana yang akan dikunjungi berikutnya (node 2, 3, dan 5 dalam contoh ini).
Vektor mentah digunakan untuk menghitung jarak yang tepat ke vektor kueri untuk pemeringkatan.
Data PQ dalam memori digunakan untuk penyaringan jarak perkiraan untuk memandu penjelajahan berikutnya.
Karena data PQ sudah di-cache di DRAM, setiap kunjungan node hanya membutuhkan satu disk I/O, sehingga mencapai kecepatan kueri yang tinggi dengan penggunaan memori yang moderat.
Untuk penjelasan rinci tentang komponen dan parameter ini, lihat DISKANN.
Mode Operasi AISAQ
AISAQ menawarkan dua mode operasi untuk menangani dua kasus penggunaan yang berbeda:
Mode kinerja: dioptimalkan untuk aplikasi yang membutuhkan latensi rendah dan throughput tinggi dalam skala besar, seperti pencarian semantik online.
Mode skala: dioptimalkan untuk aplikasi dengan batasan latensi yang lebih longgar, seperti RAG dan pencarian semantik offline, sekaligus memungkinkan perluasan dataset yang hemat biaya hingga skala sangat tinggi.
Mode performa AISAQ
Performa AISAQ mencapai "Jejak DRAM Nyaris Nol" dengan memindahkan data PQ dari memori ke disk dengan tetap mempertahankan IOPS yang rendah melalui kolokasi dan redundansi data.
Vektor mentah setiap node, daftar tepi, dan data PQ tetangganya disimpan bersama pada disk.
Tata letak ini memastikan bahwa mengunjungi sebuah node (misalnya, vektor 0) hanya membutuhkan satu disk I/O.
Karena data PQ disimpan secara berlebihan di dekat beberapa node, ukuran file indeks meningkat secara signifikan, menghabiskan lebih banyak ruang disk.
Mode skala AISAQ
Skala AISAQ berfokus pada pengurangan penggunaan ruang disk sekaligus memenuhi persyaratan kinerja aplikasi targetnya.
Dalam mode ini:
Data PQ disimpan secara terpisah pada disk, tanpa redundansi.
Desain ini meminimalkan ukuran indeks tetapi menyebabkan lebih banyak operasi I / O selama penelusuran grafik.
Untuk mengurangi biaya overhead IOPS, AISAQ memperkenalkan dua optimasi:
Algoritma penyusunan ulang yang mengurutkan vektor PQ berdasarkan prioritas untuk meningkatkan lokalitas data.
Cache PQ dalam DRAM (pq_read_page_cache_size) yang menyimpan data PQ yang sering diakses.
Contoh konfigurasi
# milvus.yaml
knowhere:
AISAQ:
build:
max_degree: 56 # Controls the maximum number of connections (edges) each data point can have in the Vamana graph
search_list_size: 100 # During index construction, this parameter defines the size of the candidate pool used when searching for the nearest neighbors for each node. For every node being added to the graph, the algorithm maintains a list of the search_list_size best candidates found so far. The search for neighbors stops when this list can no longer be improved. From this final candidate pool, the top max_degree nodes are selected to form the final edges
inline_pq: -1 # Number of PQ vectors stored inline per Index node (read when node is accessed, to reduce IO)
rearrange: true # Re-arrange the PQ vectors data structure to improve data locality and reduce disk accesses during search (ignored in performance mode)
num_entry_points: 100 # Number of candidate entry points to optimize search entry-point selection
pq_code_budget_gb_ratio: 0.125 # Controls the size of the PQ codes (compressed representations of data points) compared to the size of the uncompressed data
disk_pq_code_budget_gb_ratio: 0.25 # Controls the size of the PQ codes of the high precision vectors stored in the index (used for re-ranking), compared to the size of the uncompressed data
pq_cache_size: 0 # PQ vectors cache size in DRAM (bytes). The PQ vectors cache is loaded during Index load and used during search to reduce IOs (ignored in performance mode)
search_cache_budget_gb_ratio: 0 # Controls the amount of DRAM to be used for caching frequently accessed index nodes. This cache is loaded during index load and used during search to reduce IOs
search:
search_list: 16 # During a search operation, this parameter determines the size of the candidate pool that the algorithm maintains as it traverses the graph. A larger value increases the chances of finding the true nearest neighbors (higher recall) but also increases search latency
beamwidth: 8 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read the index nodes
vectors_beamwidth: 1 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read groups of neighboring PQ vectors (ignored in performance mode)
pq_read_page_cache_size: 5242880 (5MiB) # PQ read cache size in DRAM per search thread (bytes). It caches frequently accessed data pages containing PQ vectors (ignored in performance mode and applicable only when rearrange is true). The PQ read cache memory is reused across all AISAQ segments
Parameter AISAQ
AISAQ mewarisi beberapa parameter dari DISKANN - max_degree, search_list_size, dan pq_code_budget_gb_ratio.
Parameter pembangun indeks
Parameter-parameter ini mempengaruhi bagaimana indeks AISAQ dibangun. Menyesuaikan parameter ini dapat memengaruhi ukuran indeks, waktu pembuatan, dan kualitas pencarian.
Parameter |
Deskripsi |
Rentang Nilai |
Saran Penyetelan |
|---|---|---|---|
|
Mengontrol jumlah maksimum koneksi (sisi) yang dapat dimiliki setiap titik data dalam grafik Vamana. |
Tipe Bilangan bulat Rentang: [1, 512] Nilai default: |
Nilai yang lebih tinggi akan membuat grafik yang lebih padat, berpotensi meningkatkan pemanggilan (menemukan hasil yang lebih relevan), tetapi juga meningkatkan penggunaan memori dan waktu pembuatan. Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [10, 100]. |
|
Selama pembangunan indeks, parameter ini mendefinisikan ukuran kumpulan kandidat yang digunakan ketika mencari tetangga terdekat untuk setiap node. Untuk setiap simpul yang ditambahkan ke dalam graf, algoritma akan menyimpan sebuah daftar kandidat terbaik yang ditemukan sejauh ini. Pencarian tetangga berhenti ketika daftar ini tidak lagi dapat ditingkatkan. Dari kumpulan kandidat akhir ini, node-node dengan max_degree tertinggi dipilih untuk membentuk sisi-sisi akhir. |
Tipe Bilangan bulat Rentang: [1, 512] Nilai default: |
Ukuran search_list_size yang lebih besar meningkatkan kemungkinan menemukan tetangga terdekat yang sebenarnya untuk setiap simpul, yang dapat menghasilkan grafik berkualitas lebih tinggi dan kinerja pencarian yang lebih baik (recall). Namun, hal ini memerlukan waktu pembuatan indeks yang jauh lebih lama. Ini harus selalu diatur ke nilai yang lebih besar atau sama dengan max_degree. |
|
Jumlah vektor PQ yang disimpan sebaris per simpul Indeks (dibaca ketika simpul diakses, untuk mengurangi IO) |
Tipe Bilangan bulat Rentang: [0, max_degree] Nilai default: |
Nilai Tetapkan Atur Tetapkan
|
|
Atur ulang struktur data vektor PQ untuk meningkatkan lokalitas data dan mengurangi akses disk selama pencarian (diabaikan dalam mode kinerja). |
Jenis Boolean Rentang: [benar, salah] Nilai default: |
Jika benar, mengurangi IO selama pencarian dengan hanya sedikit peningkatan memori dan waktu pembuatan indeks. |
|
Jumlah kandidat titik masuk untuk mengoptimalkan pemilihan titik masuk pencarian. |
Tipe Bilangan bulat Rentang: [0, 1000] Nilai default: |
Nilai yang tinggi dapat mengurangi waktu pencarian dengan memulai pencarian dari titik masuk yang lebih dekat. Tetapkan nilai yang lebih tinggi untuk segmen besar (misalnya untuk vektor 10M dan di atasnya gunakan nilai 1000). |
|
Mengontrol ukuran kode PQ (representasi titik data yang dikompresi) dibandingkan dengan ukuran data yang tidak dikompresi. |
Tipe Mengapung Rentang: (0.0, 0.25] Nilai default: |
Rasio yang lebih tinggi akan menghasilkan hasil pencarian yang lebih akurat, secara efektif menyimpan lebih banyak informasi tentang vektor asli, tetapi meningkatkan kompleksitas komputasi selama pencarian. Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: (0,0417, 0,25]. |
|
Mengontrol ukuran kode PQ dari vektor presisi tinggi yang disimpan dalam indeks (digunakan untuk pemeringkatan ulang), dibandingkan dengan ukuran data yang tidak dikompresi. |
Tipe Mengapung Rentang: [0, 0.25] Nilai default: |
Dengan nilai default 0,25, vektor akan dikuantisasi menjadi 25% dari ukuran aslinya (kompresi 4×), sehingga mengurangi jejak disk dengan dampak akurasi yang relatif minimal. Tetapkan nilai 0 untuk menyimpan vektor presisi penuh dalam indeks disk untuk pemeringkatan ulang. Nilai yang lebih besar menawarkan tingkat penemuan kembali yang lebih tinggi tetapi meningkatkan penggunaan disk. |
|
Ukuran cache vektor PQ dalam DRAM (byte). Cache vektor PQ dimuat selama pemuatan indeks dan digunakan selama pencarian untuk mengurangi IO (diabaikan dalam mode kinerja). |
Jenis Bilangan bulat Rentang: [0, 1073741824] Nilai default: |
Cache yang lebih besar meningkatkan kinerja kueri tetapi meningkatkan penggunaan DRAM. |
|
Mengontrol jumlah DRAM yang akan digunakan untuk cache node indeks yang sering diakses Cache ini dimuat selama pemuatan indeks dan digunakan selama pencarian untuk mengurangi IO. |
Tipe Mengapung Rentang: [0.0, 0.3) Nilai default: |
Nilai yang lebih tinggi mengalokasikan lebih banyak memori untuk caching, mengurangi IO disk, namun menghabiskan lebih banyak memori sistem. Nilai yang lebih rendah menggunakan lebih sedikit memori untuk caching, sehingga berpotensi meningkatkan kebutuhan akses disk. |
Parameter pencarian indeks
Parameter ini mempengaruhi bagaimana AISAQ melakukan pencarian. Menyesuaikannya dapat memengaruhi kecepatan pencarian, latensi, dan penggunaan sumber daya.
Parameter |
Deskripsi |
Rentang Nilai |
Saran Penyetelan |
|---|---|---|---|
|
Selama operasi pencarian, parameter ini menentukan ukuran kumpulan kandidat yang dipertahankan oleh algoritme saat melintasi grafik. Nilai yang lebih besar meningkatkan peluang menemukan tetangga terdekat yang sebenarnya (recall yang lebih tinggi) tetapi juga meningkatkan latensi pencarian. |
Tipe Bilangan bulat Rentang: [topk, int32_max] Nilai default: |
Untuk keseimbangan yang baik antara performa dan akurasi, disarankan untuk menetapkan nilai ini sama atau sedikit lebih besar daripada jumlah hasil yang ingin Anda ambil (top_k). |
|
Mengontrol tingkat paralelisme selama pencarian dengan menentukan jumlah maksimum permintaan I/O disk paralel untuk membaca simpul indeks. |
Tipe Bilangan bulat Rentang: [1, 16] Nilai default: |
Nilai yang lebih tinggi meningkatkan paralelisme, yang dapat mempercepat pencarian pada sistem dengan CPU dan SSD yang kuat. Namun, pengaturan yang terlalu tinggi dapat menyebabkan perebutan sumber daya yang berlebihan. Pada kebanyakan kasus, kami sarankan Anda menetapkan nilai 2. |
|
Mengontrol tingkat paralelisme selama pencarian dengan menentukan jumlah maksimum permintaan I/O disk paralel untuk membaca kelompok vektor PQ yang berdekatan (diabaikan dalam mode kinerja). |
Tipe Bilangan bulat Rentang: [1, 4] harus <= beamwidth Nilai default: |
Nilai yang lebih tinggi meningkatkan paralelisme, yang dapat mempercepat pencarian pada sistem dengan CPU dan SSD yang kuat. Namun, pengaturan yang terlalu tinggi dapat menyebabkan perebutan sumber daya yang berlebihan, karena setiap kelompok vektor PQ yang bertetangga dapat berisi hingga vektor dengan derajat maksimal. Dalam kebanyakan kasus, kami menyarankan Anda menetapkan nilai 1. |
|
Ukuran cache baca PQ dalam DRAM per thread pencarian (byte). Memori ini menyimpan halaman data yang sering diakses yang berisi vektor PQ (diabaikan dalam mode kinerja dan hanya berlaku bila pengaturan ulang benar). Memori cache baca PQ digunakan kembali di semua segmen AISAQ. |
Jenis Bilangan bulat Rentang: [0, 33554432] Nilai default: |
Cache yang lebih besar meningkatkan kinerja kueri tetapi meningkatkan penggunaan DRAM. Nilai yang disarankan berkisar dari 2 MiB untuk segmen kecil (1 M vektor), 5 MiB untuk segmen sedang (50 M vektor) dan 10 MiB untuk segmen besar (250 M vektor). |