Topik ini menjelaskan cara menggunakan ekstensi pgvector untuk menguji performa instance ApsaraDB RDS for PostgreSQL berdasarkan indeks Hierarchical Navigable Small Worlds (HNSW). Ekstensi pgvector memanfaatkan alat ANN-Benchmarks untuk mengevaluasi metrik utama seperti laju recall, permintaan per detik (QPS), dan waktu pembuatan indeks.
Lingkungan pengujian
Instance RDS dan instance Elastic Compute Service (ECS) harus berada dalam virtual private cloud (VPC) yang sama serta termasuk dalam vSwitch yang sama untuk mencegah kesalahan akibat fluktuasi jaringan.
Instance uji dan alat uji | Deskripsi |
Spesifikasi instance RDS |
|
Spesifikasi instance ECS |
|
Alat uji | Penting Secara default, alat ANN-Benchmarks menguji performa single-threaded. Jika Anda ingin menguji performa konkurensi, Anda dapat mengikuti instruksi yang diberikan di Gunakan ekstensi pgvector untuk menguji performa berdasarkan indeks IVF. |
Persiapan
Instance RDS
Buat akun bernama ann_testuser dan database bernama ann_testdb. Untuk informasi lebih lanjut, lihat Buat Database dan Akun.
Instal ekstensi pgvector di database ann_testdb. Ekstensi ini dikenal sebagai vector dalam sistem. Untuk detail lebih lanjut, lihat Kelola Ekstensi.
Instance ECS
Instal Docker. Untuk panduan lebih lanjut, lihat Instal Docker.
Jalankan perintah berikut untuk mengunduh alat ANN-Benchmarks:
cd ~ git clone https://github.com/erikbern/ann-benchmarks.gitJalankan perintah berikut untuk membuat dan mengaktifkan lingkungan virtual bernama ann_test menggunakan Conda serta instal Python 3.10.6:
yum install git yum install conda conda create -n ann_test python=3.10.6 conda init bash source /usr/etc/profile.d/conda.sh conda activate ann_testJalankan perintah berikut untuk menginstal dependensi alat ANN-Benchmarks:
cd ~/ann-benchmarks/ pip install -r requirements.txt
Prosedur pengujian
Semua langkah dalam prosedur pengujian dilakukan di lingkungan virtual ann_test. Jika Anda keluar karena kesalahan seperti timeout, jalankan perintah conda activate ann_test untuk kembali ke lingkungan tersebut.
Langkah 1: Konfigurasikan informasi koneksi untuk alat uji
Tambahkan pengaturan koneksi berikut ke file ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/module.py dari alat uji dan sesuaikan berdasarkan kebutuhan bisnis Anda:
# Konfigurasikan parameter untuk terhubung ke instance RDS.
os.environ['ANN_BENCHMARKS_PG_USER'] = 'ann_testuser' # Menentukan nama pengguna akun yang digunakan untuk terhubung ke instance RDS.
os.environ['ANN_BENCHMARKS_PG_PASSWORD'] = 'testPawword' # Menentukan kata sandi akun yang digunakan untuk terhubung ke instance RDS.
os.environ['ANN_BENCHMARKS_PG_DBNAME'] = 'ann_testdb' # Menentukan nama database yang diperlukan pada instance RDS.
os.environ['ANN_BENCHMARKS_PG_HOST'] = 'pgm-****.pg.rds.aliyuncs.com' # Menentukan titik akhir internal instance RDS.
os.environ['ANN_BENCHMARKS_PG_PORT'] = '5432' # Menentukan port internal instance RDS.
os.environ['ANN_BENCHMARKS_PG_START_SERVICE'] = 'false' # Nonaktifkan startup otomatis.Langkah 2: Konfigurasikan parameter uji untuk alat ANN-Benchmarks
Ubah file ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/config.yml dari alat uji sesuai dengan kebutuhan bisnis Anda. Contoh:
float:
any:
- base_args: ['@metric']
constructor: PGVector
disabled: false
docker_tag: ann-benchmarks-pgvector
module: ann_benchmarks.algorithms.pgvector
name: pgvector
run_groups:
M-16(100):
arg_groups: [{M: 16, efConstruction: 100}]
args: {}
query_args: [[10, 20, 40, 80, 120, 200, 400, 800]]
M-16(200):
arg_groups: [{M: 16, efConstruction: 200}]
args: {}
query_args: [[10, 20, 40, 80, 120, 200, 400, 800]]
M-24(200):
arg_groups: [{M: 24, efConstruction: 200}]
args: {}
query_args: [[10, 20, 40, 80, 120, 200, 400, 800]] Pengujian ini dilakukan pada kelompok berikut: M-16(100), M-16(200), dan M-24(200). Dalam setiap pengujian kelompok, arg_groups digunakan untuk menentukan parameter relevan untuk indeks HNSW, dan query_args digunakan untuk mengambil parameter terkait.
Parameter | Deskripsi | |
arg_groups | M | Berkorespondensi dengan Parameter M dalam indeks HNSW, yang menentukan jumlah maksimum node tetangga dari setiap node di setiap lapisan saat Anda membuat indeks HNSW. Nilai besar menunjukkan kepadatan grafik tinggi. Dalam banyak kasus, kepadatan grafik tinggi meningkatkan laju recall dan memperpanjang waktu yang diperlukan untuk membuat dan menanyakan indeks. |
efConstruction | Berkorespondensi dengan ef_construction dalam indeks HNSW, yang menentukan ukuran set kandidat saat Anda membuat indeks HNSW. Ukuran set kandidat menentukan jumlah node kandidat yang disimpan untuk mencapai koneksi optimal. Dalam banyak kasus, nilai besar meningkatkan laju recall dan memperpanjang waktu yang diperlukan untuk membuat dan menanyakan indeks. | |
query_args | ef_search | Menentukan ukuran set kandidat yang dipertahankan selama penanyaian. Dalam banyak kasus, nilai besar meningkatkan laju recall dan memperpanjang waktu yang diperlukan untuk menanyakan indeks. |
Langkah 3: Buat gambar Docker uji
Opsional. Ubah file
~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/Dockerfiledari alat uji berdasarkan informasi berikut untuk melewati pengujian pada komunitas PostgreSQL yang dikonfigurasi otomatis untuk alat tersebut:FROM ann-benchmarks USER root RUN pip install psycopg[binary] pgvectorTentukan
--algorithm pgvectordan jalankan skrip install.py untuk membuat gambar Docker uji.cd ~/ann-benchmarks/ python install.py --algorithm pgvectorCatatanJalankan perintah
python install.py --helpuntuk melihat parameter konfigurasi yang didukung.
Langkah 4: Dapatkan dataset
Ketika Anda menjalankan skrip uji, dataset publik yang ditentukan akan diunduh secara otomatis.
Dalam topik ini, dataset nytimes-256-angular yang menggunakan rumus jarak Angular digunakan untuk pencarian kesamaan. Untuk informasi lebih lanjut, lihat ann-benchmarks.
Dataset | Dimensi | Jumlah baris data | Jumlah vektor uji | N tetangga terdekat teratas | Rumus jarak |
NYTimes | 256 | 290.000 | 10.000 | 100 | Angular |
Jika dataset publik tidak memenuhi persyaratan pengujian, kami sarankan Anda mengonversi data vektor ke format standar seperti Hierarchical Data Format versi 5 (HDF5) untuk menguji performa pencarian. Untuk informasi lebih lanjut, lihat Lampiran 2: Dataset Uji Kustom.
Langkah 5: Lakukan pengujian dan dapatkan hasilnya
Jalankan perintah berikut untuk menjalankan skrip uji:
cd ~/ann-benchmarks nohup python run.py --dataset nytimes-256-angular -k 10 --algorithm pgvector --runs 1 > ann_benchmark_test.log 2>&1 & tail -f ann_benchmark_test.logParameter
Deskripsi
--dataset
Dataset yang ingin Anda uji.
--k
Nilai LIMIT dari Pernyataan SQL, yang menentukan jumlah rekaman yang akan dikembalikan.
--algorithm
Algoritma untuk database vektor yang diuji. Dalam contoh ini, parameter diatur ke pgvector.
--runs
Jumlah pengujian yang dilakukan untuk memilih set hasil optimal.
--parallelism
Konkurensi. Nilai default: 1.
Jalankan perintah berikut untuk mendapatkan hasil uji:
cd ~/ann-benchmarks python plot.py --dataset nytimes-256-angular --recomputeCatatanTabel berikut menjelaskan hasil uji.
m
ef_construction
ef_search
Laju Recall
QPS
16
100
10
0.630
1423.985
20
0.741
1131.941
40
0.820
836.017
80
0.871
574.733
120
0.894
440.076
200
0.918
297.267
400
0.945
162.759
800
0.969
84.268
16
200
10
0.683
1299.667
20
0.781
1094.968
40
0.849
790.838
80
0.895
533.826
120
0.914
405.975
200
0.933
272.591
400
0.956
148.688
800
0.977
76.555
24
200
10
0.767
1182.747
20
0.840
922.770
40
0.887
639.899
80
0.920
411.140
120
0.936
303.323
200
0.953
199.752
400
0.973
105.506
800
0.988
53.904
Opsional. Jalankan perintah berikut untuk mendapatkan detail hasil uji, termasuk laju recall, QPS, waktu respons (RT), waktu pembuatan indeks, dan ukuran indeks.
cd ~/ann-benchmarks python data_export.py --out res.csvSebagai contoh, Anda dapat memeriksa hubungan antara
m,ef_construction, dan waktu pembuatan indeks.m
ef_construction
build (Waktu pembuatan indeks dalam detik)
16
100
33.35161
16
200
57.66014
24
200
87.22608
Kesimpulan pengujian
Saat membuat indeks HNSW, kesimpulan berikut dapat diperoleh:
Meningkatkan nilai parameter
m,ef_construction, danef_searchmeningkatkan laju recall tetapi menurunkan QPS.Meningkatkan nilai parameter
mdanef_constructionmeningkatkan laju recall, menurunkan QPS, dan menambah waktu pembuatan indeks.Jika memiliki persyaratan tinggi untuk laju recall, kami sarankan Anda tidak menggunakan nilai default parameter indeks. Nilai default m, ef_construction, dan ef_search adalah 16, 64, dan 40, masing-masing.
Lampiran 1: Dampak konfigurasi parameter instance RDS dan vektor pada pembuatan indeks
Anda dapat mengonfigurasi nilai parameter berbeda untuk alat ANN-Benchmarks, melakukan pengujian, lalu menganalisis hasil untuk menentukan dampak konfigurasi parameter instance RDS dan vektor pada pembuatan indeks.
Dampak konfigurasi parameter instance RDS pada pembuatan indeks
Jika mengatur parameter m ke 16 dan parameter efConstruction ke 64 untuk alat ANN-Benchmarks, konfigurasi parameter instance RDS memiliki dampak berikut pada pembuatan indeks:
maintenance_work_mem
Parameter ini menentukan jumlah maksimum memori yang dapat digunakan untuk operasi pemeliharaan seperti VACUUM dan CREATE INDEX. Unit: KB. Jika nilai maintenance_work_mem kurang dari ukuran data uji, meningkatkan nilainya dapat mempersingkat waktu pembuatan indeks. Jika nilainya melebihi ukuran data uji, waktu pembuatan indeks tidak akan berkurang.
Sebagai contoh, instance RDS Anda menggunakan tipe instance pg.x8.2xlarge.2c dengan 16 core dan 128 GB memori, parameter max_parallel_maintenance_workers diatur ke nilai default 8, dan dataset nytimes-256-angular berisi sekitar 324 MB data. Dalam kasus ini, konfigurasi parameter maintenance_work_mem memiliki dampak berikut pada pembuatan indeks.
maintenance_work_mem
Waktu pembuatan indeks (unit: detik)
64 MB (65.536 KB)
52.82
128 MB (131.072 KB)
46.79
256 MB (262.144 KB)
36.40
512 MB (524.288 KB)
18.90
1 GB (1.048.576 KB)
19.06
max_parallel_maintenance_workers
Parameter ini menentukan jumlah maksimum pekerja paralel yang dapat dimulai oleh satu operasi CREATE INDEX. Waktu pembuatan indeks berkurang saat nilai parameter max_parallel_maintenance_workers meningkat.
Sebagai contoh, instance RDS Anda menggunakan tipe instance pg.x8.2xlarge.2c dengan 16 core dan 128 GB memori, parameter maintenance_work_mem diatur ke nilai default 2048 (setara dengan 2 GB), dan dataset nytimes-256-angular berisi sekitar 324 MB data. Dalam kasus ini, konfigurasi parameter max_parallel_maintenance_workers memiliki dampak berikut pada pembuatan indeks.
max_parallel_maintenance_workers
Waktu pembuatan indeks (unit: detik)
1
76.00
2
51.34
4
32.49
8
19.66
12
14.44
16
13.07
24
13.15
Dampak konfigurasi parameter vektor pada pembuatan indeks
Jika mengatur parameter maintenance_work_mem ke 8 GB (setara dengan 8.388.608 KB) dan parameter max_parallel_maintenance_workers ke 16 untuk instance RDS, konfigurasi parameter instance RDS memiliki dampak berikut pada pembuatan indeks.
Dimensi vektor
Dataset GloVe yang berisi 1.183.514 baris data digunakan. Jika mengatur parameter m ke 16, parameter efConstruction ke 64, dan parameter ef_search ke 40 untuk alat ANN-Benchmarks, hasil berikut diperoleh. Hasil uji menunjukkan bahwa waktu pembuatan indeks meningkat, laju recall dan QPS menurun, serta latensi query meningkat saat dimensi vektor meningkat.
Dimensi
Waktu pembuatan indeks (unit: detik)
Laju Recall
QPS
P99 (ms)
25
195.10
0.99985
192.94
7.84
50
236.92
0.99647
152.36
9.69
100
319.36
0.97231
126.89
11.14
200
529.33
0.93186
95.05
15.11
CatatanP99: Persentil ke-99 latensi setelah semua RT permintaan query diurutkan secara ascending. Ini menunjukkan bahwa RT dari 99% semua permintaan query lebih rendah dari nilai ini.
Baris vektor
Dataset dbpedia-openai-{n}k-angular digunakan, dengan jumlah baris vektor yang ditentukan oleh n berkisar dari 100 hingga 1.000. Jika mengatur parameter m ke 48, parameter efConstruction ke 256, dan parameter ef_search ke 200 untuk alat ANN-Benchmarks, hasil berikut diperoleh. Hasil uji menunjukkan bahwa waktu pembuatan indeks meningkat secara nonlinier, laju recall dan QPS menurun, serta latensi query meningkat saat jumlah baris vektor meningkat.
Baris vektor
Jumlah baris (10.000)
Waktu pembuatan indeks (unit: detik)
Laju Recall
QPS
P99 (ms)
100
10
54.05s
0.9993
171.74
8.93
200
20
137.23
0.99901
146.78
10.81
500
50
436.68
0.999
118.55
13.94
1000
100
957.26
0.99879
101.60
16.35
Lampiran 2: Dataset uji kustom
Dataset berikut dibuat berdasarkan format dataset nytimes-256-angular dan hanya disediakan sebagai referensi.
Jalankan perintah berikut untuk membuat dataset kustom:
CatatanDalam contoh ini, rds_ai diinstal. Untuk informasi lebih lanjut, lihat Gunakan Kemampuan AI yang Disediakan oleh Ekstensi rds_ai.
import h5py import numpy as np import psycopg2 import pgvector.psycopg2 # Asumsi conn_info = { 'host': 'pgm-****.rds.aliyuncs.com', 'user': 'ann_testuser', 'password': '****', 'port': '5432', 'dbname': 'ann_testdb' } embedding_len = 1024 distance_top_n = 100 query_batch_size = 100 try: # Terhubung ke instance RDS. with psycopg2.connect(**conn_info) as connection: pgvector.psycopg2.register_vector(connection) with connection.cursor() as cur: # Dapatkan data vektor. cur.execute("select count(1) from test_rag") count = cur.fetchone()[0] train_embeddings = [] for start in range(0, count, query_batch_size): query = f"SELECT embedding FROM test_rag ORDER BY id OFFSET {start} LIMIT {query_batch_size}" cur.execute(query) res = [embedding[0] for embedding in cur.fetchall()] train_embeddings.extend(res) train = np.array(train_embeddings) # Dapatkan data query dan hitung penyematan. with open('query.txt', 'r', encoding='utf-8') as file: queries = [query.strip() for query in file] test = [] # Instal ekstensi rds_ai atau gunakan SDK Alibaba Cloud Model Studio. for query in queries: cur.execute(f"SELECT rds_ai.embed('{query.strip()}')::vector(1024)") test.extend([cur.fetchone()[0]]) test = np.array(test) # Hitung jarak antara N tetangga terdekat teratas dan node yang diperlukan. dot_product = np.dot(test, train.T) norm_test = np.linalg.norm(test, axis=1, keepdims=True) norm_train = np.linalg.norm(train, axis=1, keepdims=True) similarity = dot_product / (norm_test * norm_train.T) distance_matrix = 1 - similarity neighbors = np.argsort(distance_matrix, axis=1)[:, :distance_top_n] distances = np.take_along_axis(distance_matrix, neighbors, axis=1) with h5py.File('custom_dataset.hdf5', 'w') as f: f.create_dataset('distances', data=distances) f.create_dataset('neighbors', data=neighbors) f.create_dataset('test', data=test) f.create_dataset('train', data=train) f.attrs.update({ "type": "dense", "distance": "angular", "dimension": embedding_len, "point_type": "float" }) print("File HDF5 dibuat dan dataset telah ditambahkan.") except (Exception, psycopg2.DatabaseError) as error: print(f"Error: {error}")Dalam bagian
DATASETSdari file~/ann-benchmarks/ann_benchmarks/datasets.py, tambahkan dataset kustom.DATASETS: Dict[str, Callable[[str], None]] = { ......, "<custom_dataset>": None, }Unggah dataset kustom ke direktori
~/ann-benchmarksdan gunakan dataset tersebut untuk menjalankan skrip ujirun.py.