🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
Beranda
  • Konsep

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 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().

base class 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, dan FaissBaseBinaryIndex 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 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 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

third-party indices 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.

  1. Tambahkan nama indeks baru di IndexEnum. Tipe datanya adalah string.

  2. Tambahkan pemeriksaan validasi data pada indeks baru di file ConfAdapter.cpp. Pemeriksaan validasi terutama untuk memvalidasi parameter untuk pelatihan data dan kueri.

  3. Buat file baru untuk indeks baru. Kelas dasar dari indeks baru harus menyertakan VecIndex, dan antarmuka virtual yang diperlukan dari VecIndex.

  4. Tambahkan logika pembangunan indeks untuk indeks baru di VecIndexFactory::CreateVecIndex().

  5. Tambahkan unit test di bawah direktori unittest.

Apa selanjutnya

Setelah mempelajari cara kerja Knowhere di Milvus, Anda mungkin juga ingin:

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?