Knowhere
Topik ini memperkenalkan Knowhere, mesin eksekusi vektor inti dari Milvus.
Gambaran umum
Knowhere adalah mesin eksekusi vektor inti dari Milvus, yang menggabungkan beberapa pustaka pencarian kemiripan vektor termasuk Faiss, Hnswlib, dan Annoy. Knowhere juga dirancang untuk mendukung komputasi heterogen. Knowhere mengontrol perangkat keras (CPU atau GPU) mana yang akan menjalankan pembuatan indeks dan permintaan pencarian. Inilah bagaimana Knowhere mendapatkan namanya - mengetahui di mana harus menjalankan operasi. Lebih banyak jenis perangkat keras termasuk DPU dan TPU akan didukung dalam rilis mendatang.
Knowhere dalam arsitektur Milvus
Gambar di bawah ini mengilustrasikan posisi Knowhere dalam arsitektur Milvus.
Knowhere
Lapisan paling bawah adalah perangkat keras sistem. Di atasnya terdapat pustaka indeks pihak ketiga. Pada lapisan paling atas, Knowhere berinteraksi dengan simpul indeks dan simpul kueri melalui CGO, yang memungkinkan paket Go memanggil kode C.
Keunggulan Knowhere
Berikut ini adalah keunggulan Knowhere dibandingkan Faiss.
Dukungan untuk BitsetView
Milvus memperkenalkan mekanisme bitset untuk merealisasikan "penghapusan lunak". Vektor yang dihapus secara lunak masih ada dalam database tetapi tidak akan dihitung selama pencarian atau kueri kemiripan vektor.
Setiap bit dalam bitset berhubungan dengan vektor yang diindeks. Jika sebuah vektor ditandai sebagai "1" dalam bitset, itu berarti vektor ini dihapus secara lunak dan tidak akan dilibatkan selama pencarian vektor. Parameter bitset diterapkan pada semua API kueri indeks Faiss yang terbuka di Knowhere, termasuk indeks CPU dan GPU.
Untuk informasi lebih lanjut tentang mekanisme bitset, lihat bitset.
Dukungan untuk beberapa metrik kemiripan untuk mengindeks vektor biner
Knowhere mendukung Hamming, Jaccard, Tanimoto, Superstruktur, dan Substruktur. Jaccard dan Tanimoto dapat digunakan untuk mengukur kemiripan antara dua set sampel, sedangkan Superstruktur dan Substruktur dapat digunakan untuk mengukur kemiripan struktur kimia.
Dukungan untuk set instruksi AVX512
Selain AArch64, SSE4.2 dan AVX2, set instruksi yang telah didukung oleh Faiss, Knowhere juga mendukung AVX512, yang dapat meningkatkan kinerja pembuatan indeks dan kueri sebesar 20% hingga 30% dibandingkan dengan AVX2.
Pemilihan instruksi SIMD otomatis
Knowhere mendukung pemanggilan instruksi SIMD yang sesuai secara otomatis (misalnya, SIMD SSE, AVX, AVX2, dan AVX512) pada prosesor CPU apa pun (baik di lokasi maupun platform cloud), sehingga pengguna tidak perlu secara manual menentukan flag SIMD (misalnya, "-msse4") selama kompilasi.
Knowhere dibangun dengan memfaktorkan ulang basis kode Faiss. Fungsi-fungsi umum (misalnya, komputasi kesamaan) yang mengandalkan akselerasi SIMD telah diperhitungkan. Kemudian untuk setiap fungsi, empat versi (yaitu, SSE, AVX, AVX2, AVX512) diimplementasikan dan masing-masing dimasukkan ke dalam file sumber yang terpisah. Kemudian file sumber selanjutnya dikompilasi secara individual dengan bendera SIMD yang sesuai. Oleh karena itu, pada saat runtime, Knowhere dapat secara otomatis memilih instruksi SIMD yang paling sesuai berdasarkan flag CPU saat ini dan kemudian menghubungkan penunjuk fungsi yang tepat menggunakan pengait.
Optimalisasi kinerja lainnya
Baca Milvus: Sistem Manajemen Data Vektor yang Dibangun Khusus untuk mengetahui lebih lanjut tentang pengoptimalan kinerja Knowhere.
Struktur kode Knowhere
Komputasi dalam Milvus terutama melibatkan operasi vektor dan skalar. Knowhere hanya menangani operasi pengindeksan vektor.
Indeks adalah struktur data yang terpisah dari data vektor aslinya. Secara umum, pengindeksan membutuhkan empat langkah: membuat indeks, melatih data, menyisipkan data, dan membangun indeks. Dalam beberapa aplikasi AI, pelatihan dataset dipisahkan dari pencarian vektor. Data dari dataset pertama-tama dilatih dan kemudian dimasukkan ke dalam basis data vektor seperti Milvus untuk pencarian kemiripan. Sebagai contoh, dataset terbuka sift1M dan sift1B membedakan data untuk pelatihan dan data untuk pengujian.
Namun, di Knowhere, data untuk pelatihan dan pencarian adalah sama. Knowhere melatih semua data dalam sebuah segmen dan kemudian memasukkan semua data yang telah dilatih dan membuat indeks untuk data tersebut.
DataObj
: kelas dasar
DataObj
adalah kelas dasar dari semua struktur data di Knowhere. Size()
adalah satu-satunya metode virtual di DataObj
. Kelas Index diwarisi dari DataObj
dengan sebuah field bernama "size_". Kelas Index juga memiliki dua metode virtual - Serialize()
dan Load()
. Kelas VecIndex
yang diturunkan dari Index
adalah kelas dasar virtual untuk semua indeks vektor. VecIndex
menyediakan metode termasuk Train()
, Query()
, GetStatistics()
, dan ClearStatistics()
.
kelas dasar
Beberapa jenis indeks lainnya tercantum di sebelah kanan pada gambar di atas.
Indeks Faiss memiliki dua kelas dasar:
FaissBaseIndex
untuk semua indeks pada vektor float point, danFaissBaseBinaryIndex
untuk semua indeks pada vektor biner.GPUIndex
adalah kelas dasar untuk semua indeks GPU Faiss.OffsetBaseIndex
adalah kelas dasar untuk semua indeks yang dikembangkan sendiri. Dengan hanya ID vektor yang disimpan dalam berkas indeks, ukuran berkas untuk vektor 128 dimensi dapat dikurangi 2 kali lipat.
IDMAP
: pencarian secara kasar (brute-force)
IDMAP
Secara teknis, IDMAP
bukanlah sebuah indeks, melainkan digunakan untuk pencarian brute-force. Ketika vektor dimasukkan ke dalam basis data, tidak diperlukan pelatihan data atau pembuatan indeks. Pencarian akan dilakukan secara langsung pada data vektor yang dimasukkan.
Namun, untuk konsistensi kode, IDMAP
juga mewarisi kelas VecIndex
dengan semua antarmuka virtualnya. Penggunaan IDMAP
sama dengan indeks lainnya.
Indeks IVF
IVF
Indeks IVF (inverted file) adalah indeks yang paling sering digunakan. Kelas IVF
berasal dari VecIndex
dan FaissBaseIndex
, dan selanjutnya meluas ke IVFSQ
dan IVFPQ
. GPUIVF
berasal dari GPUIndex
dan IVF
. Kemudian GPUIVF
diperluas lebih lanjut menjadi GPUIVFSQ
dan GPUIVFPQ
.
IVFSQHybrid
adalah indeks hibrida yang dikembangkan sendiri. Kuantizer kasar dieksekusi di GPU sementara pencarian di bucket di CPU. Jenis indeks ini dapat mengurangi terjadinya penyalinan memori antara CPU dan GPU dengan memanfaatkan daya komputasi GPU. IVFSQHybrid
memiliki tingkat recall yang sama dengan GPUIVFSQ
tetapi hadir dengan kinerja yang lebih baik.
Struktur kelas dasar untuk indeks biner relatif lebih sederhana. BinaryIDMAP
dan BinaryIVF
diturunkan dari FaissBaseBinaryIndex
dan VecIndex
.
Indeks pihak ketiga
indeks pihak ketiga
Saat ini, hanya ada dua jenis indeks pihak ketiga yang didukung selain Faiss: indeks berbasis pohon Annoy
, dan indeks berbasis grafik HNSW
. Kedua indeks pihak ketiga yang umum dan sering digunakan ini berasal dari VecIndex
.
Menambahkan indeks ke Knowhere
Jika Anda ingin menambahkan indeks baru ke Knowhere, pertama-tama Anda dapat merujuk ke indeks yang sudah ada:
Untuk menambahkan indeks berbasis kuantisasi, lihat
IVF_FLAT
.Untuk menambahkan indeks berbasis grafik, lihat
HNSW
.Untuk menambahkan indeks berbasis pohon, lihat
Annoy
.
Setelah merujuk ke indeks yang ada, Anda dapat mengikuti langkah-langkah di bawah ini untuk menambahkan indeks baru ke Knowhere.
Tambahkan nama indeks baru di
IndexEnum
. Tipe datanya adalah string.Tambahkan pemeriksaan validasi data pada indeks baru di file
ConfAdapter.cpp
. Pemeriksaan validasi terutama untuk memvalidasi parameter untuk pelatihan data dan kueri.Buat file baru untuk indeks baru. Kelas dasar dari indeks baru harus menyertakan
VecIndex
, dan antarmuka virtual yang diperlukan dariVecIndex
.Tambahkan logika pembangunan indeks untuk indeks baru di
VecIndexFactory::CreateVecIndex()
.Tambahkan unit test di bawah direktori
unittest
.
Apa selanjutnya
Setelah mempelajari cara kerja Knowhere di Milvus, Anda mungkin juga ingin:
Mempelajari berbagai jenis indeks yang didukung oleh Milvus.
Mempelajari tentang mekanisme bitset.
Memahami bagaimana data diproses di Milvus.