全部产品
Search
文档中心

ApsaraDB RDS:Gunakan ekstensi pgvector untuk menguji performa berdasarkan indeks HNSW

更新时间:Jul 02, 2025

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

  • Instance RDS menjalankan PostgreSQL 16.

  • Instance RDS adalah instance RDS standar yang menjalankan RDS High-availability Edition dan menggunakan tipe instance khusus pg.x8.2xlarge.2c. Tipe instance ini menyediakan 16 core dan 128 GB memori.

  • Ekstensi pgvector menjalankan versi 0.8.0.

Spesifikasi instance ECS

  • Instance ECS menggunakan tipe instance ecs.c6.xlarge, yang menyediakan 4 core dan 8 GiB memori.

  • Instance ECS menjalankan Alibaba Cloud Linux 3.

Alat uji

ANN-Benchmarks

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

  1. Buat akun bernama ann_testuser dan database bernama ann_testdb. Untuk informasi lebih lanjut, lihat Buat Database dan Akun.

  2. Instal ekstensi pgvector di database ann_testdb. Ekstensi ini dikenal sebagai vector dalam sistem. Untuk detail lebih lanjut, lihat Kelola Ekstensi.

Instance ECS

  1. Instal Docker. Untuk panduan lebih lanjut, lihat Instal Docker.

  2. Jalankan perintah berikut untuk mengunduh alat ANN-Benchmarks:

    cd ~
    git clone https://github.com/erikbern/ann-benchmarks.git
  3. Jalankan 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_test
  4. Jalankan perintah berikut untuk menginstal dependensi alat ANN-Benchmarks:

    cd ~/ann-benchmarks/
    pip install -r requirements.txt

Prosedur pengujian

Penting

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

  1. Opsional. Ubah file ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/Dockerfile dari 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] pgvector
  2. Tentukan --algorithm pgvector dan jalankan skrip install.py untuk membuat gambar Docker uji.

    cd ~/ann-benchmarks/
    python install.py --algorithm pgvector
    Catatan

    Jalankan perintah python install.py --help untuk 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

Catatan

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

  1. 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.log

    Parameter

    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.

  2. Jalankan perintah berikut untuk mendapatkan hasil uji:

    cd ~/ann-benchmarks
    python plot.py --dataset nytimes-256-angular --recompute
    Catatan

    Tabel 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

  3. 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.csv

    Sebagai 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, dan ef_search meningkatkan laju recall tetapi menurunkan QPS.

  • Meningkatkan nilai parameter m dan ef_construction meningkatkan 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

    Catatan

    P99: 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.

  1. Jalankan perintah berikut untuk membuat dataset kustom:

    Catatan

    Dalam 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}")
    
  2. Dalam bagian DATASETS dari file ~/ann-benchmarks/ann_benchmarks/datasets.py, tambahkan dataset kustom.

    DATASETS: Dict[str, Callable[[str], None]] = {
      ......,
      "<custom_dataset>": None,
    }
  3. Unggah dataset kustom ke direktori ~/ann-benchmarks dan gunakan dataset tersebut untuk menjalankan skrip uji run.py.