TairVector adalah struktur data internal dari Tair (Enterprise Edition) yang menyediakan penyimpanan dan pengambilan vektor real-time berperforma tinggi. Dokumen ini menjelaskan metode pengujian kinerja TairVector serta hasil pengujian yang diperoleh oleh Alibaba Cloud.
TairVector mendukung algoritma pencarian tetangga terdekat aproksimasi (ANN). Anda dapat menggunakan TairVector untuk pengambilan semantik data tidak terstruktur dan rekomendasi personalisasi. Untuk informasi lebih lanjut, lihat Vektor.
Deskripsi pengujian
Lingkungan pengujian database
Item | Deskripsi |
Wilayah dan zona | Zona A di wilayah China (Zhangjiakou) |
Jenis penyimpanan | Instans berbasis DRAM yang menjalankan Redis 6.0 |
Versi mesin | 6.2.8.2 |
Arsitektur instans | Arsitektur master-replika standar dengan mode kluster dinonaktifkan. Untuk informasi lebih lanjut, lihat Arsitektur standar. |
Jenis instans | tair.rdb.16g. Jenis instans memiliki dampak kecil pada hasil pengujian. |
Lingkungan pengujian klien
Sebuah instans Elastic Compute Service (ECS) yang berada dalam virtual private cloud (VPC) yang sama dengan instans Tair (Redis OSS-compatible) dibuat dan terhubung ke instans tersebut melalui VPC.
Sistem operasi Linux digunakan.
Python 3.7 atau versi lebih baru telah diinstal.
Data pengujian
Dataset Sift-128-euclidean, Gist-960-euclidean, Glove-200-angular, dan Deep-image-96-angular digunakan untuk menguji algoritma pengindeksan Hierarchical Navigable Small World (HNSW). Dataset Random-s-100-euclidean dan Mnist-784-euclidean digunakan untuk menguji algoritma pengindeksan Flat Search.
Dataset | Deskripsi | Dimensi vektor | Jumlah vektor | Jumlah permintaan | Volume data | Rumus jarak |
Vektor fitur gambar yang dihasilkan dengan menggunakan dataset Texmex dan algoritma scale-invariant feature transform (SIFT). | 128 | 1.000.000 | 10.000 | 488 MB | L2 | |
Vektor fitur gambar yang dihasilkan dengan menggunakan dataset Texmex dan algoritma gastrointestinal stromal tumor (GIST). | 960 | 1.000.000 | 1.000 | 3,57 GB | L2 | |
Vektor kata yang dihasilkan dengan menerapkan algoritma GloVe pada data teks dari internet. | 200 | 1.183.514 | 10.000 | 902 MB | COSINE | |
Vektor yang diekstraksi dari lapisan keluaran jaringan saraf GoogLeNet dengan set data pelatihan ImageNet. | 96 | 9.990.000 | 10.000 | 3,57 GB | COSINE | |
Random-s-100-euclidean | Vektor yang diekstraksi dari lapisan keluaran jaringan saraf GoogLeNet dengan set data pelatihan ImageNet. | 100 | 90.000 | 10.000 | 34 MB | L2 |
Dataset dari database Modified National Institute of Standards and Technology (MNIST) angka tulisan tangan. | 784 | 60.000 | 10.000 | 179 MB | L2 |
Alat dan metode pengujian
Instal
tair-pydanhiredispada server pengujian.Jalankan perintah berikut untuk menginstal hiredis:
pip install tair hiredisUnduh dan ekstrak Ann-benchmarks.
Jalankan perintah berikut untuk mengekstrak Ann-benchmarks:
tar -zxvf ann-benchmarks.tar.gzKonfigurasikan titik akhir, nomor port, nama pengguna, dan kata sandi instans Tair dalam file
algos.yaml.Buka file
algos.yaml, caritairvectoruntuk menemukan item konfigurasi terkait, lalu konfigurasikan parameter berikut daribase-args:url: Titik akhir, nama pengguna, dan kata sandi instans Tair. Format:
redis://user:password@host:port.
parallelism: Jumlah thread konkuren. Nilai default: 4. Kami merekomendasikan menggunakan nilai default.
Contoh:
{"url": "redis://testaccount:Rp829dlwa@r-bp18uownec8it5****.redis.rds.aliyuncs.com:6379", "parallelism": 4}Jalankan skrip
run.pyuntuk memulai pengujian.PentingSetelah menjalankan skrip
run.py, seluruh pengujian dimulai untuk membuat indeks, menulis data ke indeks, lalu meminta dan mencatat hasilnya. Jangan jalankan skrip berulang kali pada satu dataset.Contoh:
# Jalankan pengujian multi-threaded menggunakan dataset Sift-128-euclidean dan algoritma pengindeksan HNSW. python run.py --local --runs 3 --algorithm tairvector-hnsw --dataset sift-128-euclidean --batch # Jalankan pengujian multi-threaded menggunakan dataset Mnist-784-euclidean dan algoritma pengindeksan Flat Search. python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean --batchAnda juga dapat menggunakan antarmuka web bawaan untuk menjalankan pengujian. Contoh:
# Instal dependensi Streamlit terlebih dahulu. pip3 install streamlit # Mulai antarmuka web. Kemudian, masukkan http://localhost:8501 di browser Anda. streamlit run webrunner.pyJalankan skrip
data_export.pydan ekspor hasilnya.Contoh:
# Banyak thread. python data_export.py --output out.csv --batch
Hasil pengujian
Kami merekomendasikan Anda memperhatikan hasil pengujian kinerja penulisan, kinerja permintaan k-nearest neighbor (kNN), dan efisiensi memori.
Kinerja Penulisan: Kinerja penulisan TairVector meningkat sebanding dengan throughput penulisan.
Kinerja Permintaan kNN: Jumlah permintaan per detik (QPS) mencerminkan performa sistem, sedangkan laju recall mencerminkan akurasi hasil. Biasanya, semakin tinggi laju recall, semakin rendah QPS. Perbandingan QPS hanya signifikan jika laju recall sama. Dalam konteks ini, hasil pengujian disajikan dengan kurva "QPS v.s. Recall". Untuk indeks FLAT, hanya QPS yang disajikan karena laju recall selalu 1.
Efisiensi Memori: Semakin rendah penggunaan memori indeks vektor, semakin baik performa TairVector.
Baik pengujian penulisan maupun permintaan kNN melibatkan empat thread konkuren.
Dalam contoh ini, performa TairVector diuji dengan tipe data float32 dan float16. Tipe data default adalah float32. Performa algoritma pengindeksan HNSW diuji dengan fitur AUTO_GC diaktifkan.
Indeks HNSW
Kinerja penulisan
Gambar berikut menunjukkan kinerja penulisan algoritma pengindeksan HNSW pada nilai parameter M yang berbeda ketika ef_construct disetel ke 500. Parameter M menentukan jumlah maksimum tetangga keluar pada setiap lapisan dalam struktur indeks grafik.
Kinerja penulisan algoritma pengindeksan HNSW menurun secara proporsional terbalik dengan nilai parameter M.
Dibandingkan dengan tipe data float32, kinerja penulisan algoritma pengindeksan HNSW sedikit menurun dalam sebagian besar kasus ketika tipe data float16 digunakan.
Setelah fitur AUTO_GC diaktifkan, kinerja penulisan algoritma pengindeksan HNSW meningkat hingga 30%.

Kinerja permintaan kNN
Semakin tinggi laju recall dan QPS, semakin baik kinerja permintaan kNN. Oleh karena itu, semakin dekat kurva ke sudut kanan atas, semakin baik performa algoritma pengindeksan HNSW.
Gambar berikut menunjukkan kurva "QPS v.s. Recall" ketika indeks HNSW digunakan dengan dataset yang berbeda.
Untuk semua empat dataset, indeks HNSW dapat mencapai laju recall lebih dari 99%.
Dibandingkan dengan tipe data float32, performa algoritma pengindeksan HNSW sedikit menurun ketika tipe data float16 digunakan. Performa kedua tipe data ini sangat dekat.
Setelah fitur AUTO_GC diaktifkan, kinerja permintaan kNN menurun secara signifikan. Oleh karena itu, kami merekomendasikan Anda mengaktifkan fitur AUTO_GC hanya ketika ingin menghapus sejumlah besar data.

Untuk secara visual menunjukkan bagaimana pengaturan parameter memengaruhi kinerja permintaan kNN, gambar berikut menunjukkan bagaimana QPS dan laju recall berubah dengan nilai M dan ef_search. Dalam contoh ini, dataset Sift-128-euclidean dan tipe data float32 digunakan, serta fitur AUTO_GC dinonaktifkan.
Seiring dengan meningkatnya nilai M dan ef_search, QPS menurun dan laju recall meningkat.
Anda dapat memodifikasi parameter terkait berdasarkan kebutuhan bisnis Anda untuk menyeimbangkan kinerja permintaan kNN dengan laju recall.

Efisiensi memori
Penggunaan memori indeks HNSW meningkat hanya sebanding dengan nilai parameter M.
Gambar berikut menunjukkan penggunaan memori indeks HNSW antara dataset yang berbeda.
Dibandingkan dengan tipe data float32, tipe data float16 dapat secara signifikan mengurangi penggunaan memori lebih dari 40%.
Setelah fitur AUTO_GC diaktifkan, penggunaan memori sedikit meningkat.
CatatanAnda dapat menentukan nilai yang sesuai untuk parameter M berdasarkan dimensi vektor dan anggaran kapasitas memori Anda. Jika Anda dapat menerima kehilangan presisi tertentu, kami merekomendasikan Anda menggunakan tipe data float16 untuk menghemat ruang memori.

Indeks FLAT
Kinerja penulisan
Gambar berikut menunjukkan throughput penulisan indeks FLAT antara dua dataset.
Dibandingkan dengan tipe data float32, kinerja penulisan indeks FLAT menurun sekitar 5% ketika tipe data float16 digunakan.

Kinerja permintaan kNN
Gambar berikut menunjukkan kNN QPS indeks FLAT antara dua dataset.
Dibandingkan dengan tipe data float32, kinerja permintaan kNN indeks FLAT meningkat sekitar 10% ketika tipe data float16 digunakan.

Efisiensi memori
Gambar berikut menunjukkan penggunaan memori indeks FLAT antara dua dataset.
Dibandingkan dengan tipe data float32, tipe data float16 dapat mengurangi penggunaan memori lebih dari 40%.
