Bu konu, ApsaraDB RDS for PostgreSQL örneğinde HNSW dizinine sahip pgvector uzantısının performans kıyaslamasını sunar. Kıyaslama, hatırlama oranı, saniye başına sorgu sayısı (QPS) ve dizin oluşturma süresi gibi temel ölçümler açısından RDS uygulamasının topluluk sürümüne kıyasla performansını değerlendirmek için ann-benchmarks aracını kullanır.
Test ortamı
Ağ dalgalanmalarından kaynaklanan hataları önlemek için RDS PostgreSQL örneğiniz ile istemci ECS örneğinizi aynı Virtual Private Cloud (VPC) ve vSwitch içinde konumlandırın.
|
Bileşen |
Açıklama |
|
RDS PostgreSQL örneği |
|
|
ECS örneği |
|
|
Test aracı |
Önemli
Varsayılan olarak ANN-Benchmarks tek iş parçacıklı performansı test eder. Örneğin eşzamanlı performansını test etmek için bkz. Pgvector performans testi (IVF dizini tabanlı). |
Ön koşullar
RDS for PostgreSQL örneği
ann_testuseradında yüksek ayrıcalıklı bir hesap veann_testdbadında bir test veritabanı oluşturun. Daha fazla bilgi için bkz. Hesaplar ve veritabanları oluşturun.ann_testdbveritabanında pgvector eklentisini (vector) yükleyin. Daha fazla bilgi için bkz. Eklentileri yönetin.
İstemci ECS örneği
Docker'ı yükleyin. Daha fazla bilgi için bkz. Docker yükleyin.
-
ann-benchmarks aracını indirmek için aşağıdaki komutları çalıştırın.
cd ~ git clone https://github.com/erikbern/ann-benchmarks.git -
Conda kullanarak
ann_testadlı Python 3.10.6 sanal ortamı oluşturmak ve etkinleştirmek için aşağıdaki komutları çalıştırın.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_test -
ann-benchmarks bağımlılıklarını yüklemek için aşağıdaki komutları çalıştırın.
cd ~/ann-benchmarks/ pip install -r requirements.txt
Test yordamı
Bu yordamdaki tüm adımlar ann_test sanal ortamında gerçekleştirilir. Oturum zaman aşımına uğrar veya herhangi bir nedenle sonlanırsa conda activate ann_test komutuyla ortama yeniden girin.
Adım 1: Bağlantı ayarlarını yapılandırın
Bağlantı ayarlarını eklemek için kıyaslama aracındaki ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/module.py dosyasını düzenleyin. Değerleri gerçek ortamınıza göre doldurun.
# Set the connection parameters for PostgreSQL
os.environ['ANN_BENCHMARKS_PG_USER'] = 'ann_testuser' # The user for the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_PASSWORD'] = 'testPawword' # The password for the RDS PostgreSQL user
os.environ['ANN_BENCHMARKS_PG_DBNAME'] = 'ann_testdb' # The database name of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_HOST'] = 'pgm-****.pg.rds.aliyuncs.com' # The internal endpoint of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_PORT'] = '5432' # The internal port number of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_START_SERVICE'] = 'false' # Disable automatic service startup
Adım 2: ann-benchmarks test parametrelerini yapılandırın
Test gereksinimlerinize göre kıyaslama aracındaki ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/config.yml dosyasını düzenleyin. Örnek:
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]]
Bu test M-16(100), M-16(200) ve M-24(200) olmak üzere üç gruba ayrılmıştır. Her test grubu, HNSW dizini oluşturma parametrelerini yapılandırmak için arg_groups ve erişim parametrelerini yapılandırmak için query_args kullanır.
|
Parametre |
Açıklama |
|
|
arg_groups |
M |
HNSW dizinindeki Daha büyük bir değer grafiğin yoğunluğunu artırır; bu durum genellikle hatırlama oranını iyileştirir ancak dizin oluşturma ve sorgu süresini de uzatır. |
|
efConstruction |
HNSW dizinindeki Daha büyük bir değer genellikle hatırlama oranını iyileştirir ancak dizin oluşturma ve sorgu süresini de uzatır. |
|
|
query_args |
ef_search |
Arama işlemi sırasında korunan aday kümesinin boyutunu belirleyen sorgu zamanı ayarıdır. Daha büyük bir değer genellikle hatırlama oranını iyileştirir ancak sorgu süresini de uzatır. |
Adım 3: Test Docker görüntüsü oluşturun
-
PostgreSQL topluluk sürümünün (varsayılan) test edilmesini atlamak için (isteğe bağlı)
~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/Dockerfiledosyasını aşağıdaki gibi değiştirin:FROM ann-benchmarks USER root RUN pip install psycopg[binary] pgvector -
Test Docker görüntüsünü oluşturmak için
--algorithm pgvectorparametresiyle install.py betiğini çalıştırın.cd ~/ann-benchmarks/ python install.py --algorithm pgvectorNotDesteklenen parametreleri görüntülemek için
python install.py --helpkomutunu çalıştırın.
Adım 4: Veri kümesini edinin
Kıyaslama betiği belirtilen genel veri kümesini otomatik olarak indirir.
Bu konuda metin benzerliği araması örneği olarak Angular mesafe türünü kullanan nytimes-256-angular veri kümesi kullanılmıştır. Diğer genel veri kümeleri için bkz. ann-benchmarks.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Genel veri kümesi test ihtiyaçlarınızı karşılamıyorsa, erişim performansını test etmek için gerçek vektör verilerinizi HDF5 gibi standart bir biçime dönüştürmenizi öneririz. Daha fazla bilgi için bkz. Ek II: Özel Test Veri Kümeleri.
Adım 5: Testi çalıştırın ve sonuçları alın
-
Kıyaslama betiğini çalıştırmak için aşağıdaki komutları kullanın.
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.log
Parametre
Açıklama
--dataset
Test edilecek veri kümesini belirtir.
--k
Sorgu SQL deyemindeki LIMIT değeri, döndürülecek sonuç sayısını belirtir.
--algorithm
Test edilecek vektör veritabanı algoritması. Bu test için pgvector olarak ayarlayın.
--runs
Test çalıştırma sayısı. Çalıştırmalar arasından en iyi sonuç seçilir.
--parallelism
Test eşzamanlılığı. Varsayılan değer 1'dir. -
Test sonuçlarının grafiğini oluşturmak için aşağıdaki komutu çalıştırın.
cd ~/ann-benchmarks python plot.py --dataset nytimes-256-angular --recomputeDizin oluşturma ölçümlerine ve aynı hatırlama oranındaki performans kazançlarına odaklanın.
Dizin oluşturma karşılaştırması:
Dizin Türü
Oluşturma Süresi (s)
Dizin Boyutu
HNSW topluluk sürümü (v0.8.0)
127,89
7820 MB
HNSW RDS sürümü (v0.8.0.1)
77,72
3916 MBAynı hatırlama oranında QPS karşılaştırması:
Hatırlama Oranı
v0.8.0 HNSW Parametreleri
v0.8.0.1 HNSW Parametreleri
v0.8.0 QPS
v0.8.0.1 QPS
%97
ef_search=10
ef_search=10
1635,41
1954,48
%98
ef_search=30
ef_search=20
1075,49
1379,61
%99,3
ef_search=120
ef_search=80
434,74
737,06
%99,5
ef_search=300
ef_search=350
200,06
319,19
%99,6
ef_search=500
ef_search=500
109,51
177,94 -
Ayrıntılı test sonuçlarını bir CSV dosyasına aktarmak için (isteğe bağlı) aşağıdaki komutu çalıştırın.
cd ~/ann-benchmarks python data_export.py --out res.csvÖrneğin,
mveef_constructionparametreleri ile dizin oluşturma süresi arasındaki ilişkiyi analiz edebilirsiniz:
m
ef_construction
Oluşturma Süresi (s)
16
100
33,35161
16
200
57,66014
24
200
87,22608
Sonuçlar
HNSW dizini oluştururken:
m,ef_constructionveef_searchdeğerlerini artırmak hatırlama oranını iyileştirebilir ancak QPS'yi düşürür.mveef_constructiondeğerlerini artırmak hatırlama oranını yükseltirken QPS'yi düşürür ve dizin oluşturma süresini uzatır.Uygulamanız yüksek bir hatırlama oranı gerektiriyorsa varsayılan dizin parametrelerinden (m=16, ef_construction=64 ve ef_search=40) kaçının.
Ek I: RDS for PostgreSQL: Dizinin oluşturulması üzerindeki parametre etkisi
Bu ek, çeşitli RDS for PostgreSQL ve vektör parametrelerinin dizin oluşturma üzerindeki etkisini göstermek için ann-benchmarks test sonuçlarını kullanır.
RDS for PostgreSQL: Dizinin oluşturulması üzerindeki parametre etkisi
Örneğin, ann-benchmarks test parametreleri m=16 ve efConstruction=64 olarak ayarlandığında RDS for PostgreSQL parametreleri dizin oluşturmayı aşağıdaki şekilde etkiler.
-
maintenance_work_mem
Bu parametre,
VACUUMveCREATE INDEXgibi bakım işlemleri için kilobayt (KB) cinsinden maksimum belleği belirtir. **maintenance_work_memdeğeri veri kümesi boyutundan küçük olduğunda değeri artırmak dizin oluşturma süresini azaltır. Ancak değer veri kümesi boyutunu aştığında oluşturma süresi artık azalmaz.**Örneğin, pg.x8.2xlarge.2c türündeki (16 çekirdek, 128 GB) bir RDS for PostgreSQL örneğinde
max_parallel_maintenance_workersparametresi varsayılan değeri olan 8'e ayarlandığında ve yaklaşık 324 MB boyutundaki nytimes-256-angular veri kümesi kullanıldığındamaintenance_work_memparametresi dizin oluşturmayı aşağıdaki şekilde etkiler:
maintenance_work_mem
Dizin Oluşturma Süresi (s)
64 MB (65536 KB)
52,82
128 MB (131072 KB)
46,79
256 MB (262144 KB)
36,40
512 MB (524288 KB)
18,90
1 GB (1048576 KB)
19,06 -
max_parallel_maintenance_workers
Bu parametre
CREATE INDEXiçin maksimum paralel çalışan sayısını ayarlar. **max_parallel_maintenance_workersdeğeri arttıkça dizin oluşturma süresi azalır.**Örneğin, pg.x8.2xlarge.2c türündeki (16 çekirdek, 128 GB) bir RDS for PostgreSQL örneğinde
maintenance_work_memparametresi 2 GB'a (2048 MB) ayarlandığında ve yaklaşık 324 MB boyutundaki nytimes-256-angular veri kümesi kullanıldığındamax_parallel_maintenance_workersparametresi dizin oluşturmayı aşağıdaki şekilde etkiler:
max_parallel_maintenance_workers
Dizin Oluşturma Süresi (s)
1
76,00
2
51,34
4
32,49
8
19,66
12
14,44
16
13,07
24
13,15
Dizin oluşturma üzerindeki vektör parametresi etkisi
RDS for PostgreSQL parametreleri maintenance_work_mem=8 GB (8388608 KB) ve max_parallel_maintenance_workers=16 olarak ayarlandığında vektör parametrelerinin dizin oluşturma üzerindeki etkisi aşağıdaki bölümlerde gösterilmiştir.
-
Vektör boyutu
Aşağıdaki testler GloVe veri kümesini (1.183.514 vektör) kullanır ve ann-benchmarks test parametreleri
m=16,efConstruction=64veef_search=40olarak ayarlanır. Sonuçlar, vektör boyutu arttıkça dizin oluşturma süresi ve sorgu gecikme süresinin de arttığını, hatırlama oranı ve QPS'nin ise azaldığını göstermektedir.
Boyut
Oluşturma Süresi (s)
Hatırlama Oranı
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,11NotSorgu gecikme süresinin yüzde 99'luk dilimi. Sorgu isteklerinin %99'unun bu değerden daha kısa sürede tamamlandığı, yalnızca %1'inin ise daha uzun sürdüğü anlamına gelir.
-
Vektör sayısı
Bu testler
dbpedia-openai-{n}k-angularveri kümesi serisini kullanır; buradanbin cinsinden vektör sayısını (100'den 1.000'e) temsil eder. Ann-benchmarks test parametrelerim=48,efConstruction=256veef_search=200olarak ayarlandığında test sonuçları aşağıdaki gibidir. Sonuçlar, vektör sayısı arttıkça dizin oluşturma süresinin doğrusal olmayan bir şekilde arttığını, hatırlama oranı ve QPS'nin azaldığını ve sorgu gecikme süresinin ise arttığını göstermektedir.
Vektör Sayısı
Satır Sayısı (x10.000)
Oluşturma Süresi (s)
Hatırlama Oranı
QPS
p99 (ms)
100
10
54,05
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
Ek II: Özel test veri kümesi
Aşağıdaki örnek, nytimes-256-angular veri biçimine dayalı bir veri kümesinin nasıl oluşturulacağını gösterir.
-
Özel bir test veri kümesi oluşturmak için aşağıdaki betiği çalıştırın.
NotBu örnek rds_ai uzantısını gerektirir. Daha fazla bilgi için bkz. AI (rds_ai).
import h5py import numpy as np import psycopg2 import pgvector.psycopg2 # Connection details 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: # Connect to the RDS for PostgreSQL database with psycopg2.connect(**conn_info) as connection: pgvector.psycopg2.register_vector(connection) with connection.cursor() as cur: # Fetch the vector data 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) # Get query data and compute embeddings with open('query.txt', 'r', encoding='utf-8') as file: queries = [query.strip() for query in file] test = [] # Install the rds_ai extension or use the Alibaba Cloud Model Studio SDK for query in queries: cur.execute(f"SELECT rds_ai.embed('{query.strip()}')::vector(1024)") test.extend([cur.fetchone()[0]]) test = np.array(test) # Calculate the top N nearest neighbor distances 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("The HDF5 file was created successfully and the dataset was added.") except (Exception, psycopg2.DatabaseError) as error: print(f"Error: {error}") -
Özel test veri kümenizi
DATASETSbölümünde~/ann-benchmarks/ann_benchmarks/datasets.pydosyasına kaydedin.DATASETS: Dict[str, Callable[[str], None]] = { ......, "<custom_dataset>": None, } Özel test veri kümesini
~/ann-benchmarksdizinine yükleyin. Ardından veri kümesinirun.pytest betiğiyle kullanabilirsiniz.