全部產品
Search
文件中心

Tair (Redis® OSS-Compatible):TairVector效能白皮書

更新時間:Feb 24, 2025

TairVector是基於Tair(企業版)的向量儲存引擎,集儲存、檢索於一體,提供高效能、即時的向量資料庫服務。本文介紹了TairVector的效能測試方法和測試結果。

TairVector支援高效能的向量近似最近鄰(ANN)檢索,可用於非結構化資料的語義檢索、個人化推薦等情境,更多資訊請參見Vector

測試說明

資料庫測試環境

測試環境資訊

說明

地區和可用性區域

華北3(張家口)地區,可用性區域A。

儲存介質

記憶體型(相容Redis 6.0)。

執行個體版本

6.2.8.2

執行個體架構

標準版(雙副本)架構,不啟用叢集,詳情請參見標準架構

執行個體規格

由於測試結果受規格影響較小,本次測試以16 GB(tair.rdb.16g)規格為例。

用戶端測試環境

  • 與執行個體為同Virtual Private Cloud的ECS執行個體,且與執行個體通過專用網路串連。

  • Linux作業系統。

  • 已安裝Python 3.7及以上版本。

測試資料

本文使用Sift-128-euclideanGist-960-euclideanGlove-200-angularDeep-image-96-angular資料集測試HNSW索引,使用Random-s-100-euclideanMnist-784-euclidean資料集測試FLAT索引。

資料集名稱

資料集介紹

向量維度

向量總數

查詢數量

資料總量

距離類型

Sift-128-euclidean

該資料集是基於Texmex的資料集整理,使用SIFT演算法得到的圖片特徵向量。

128

1,000,000

10,000

488 MB

L2

Gist-960-euclidean

該資料集是基於Texmex的資料集整理,使用GIST演算法得到的圖片特徵向量。

960

1,000,000

1,000

3.57 GB

L2

Glove-200-angular

該資料集是互連網文本資料使用GloVe演算法得到的單詞向量。

200

1,183,514

10,000

902 MB

COSINE

Deep-image-96-angular

該資料集是ImageNet圖片經過GoogLeNet模型訓練,從最後一層神經網路提取的向量。

96

9,990,000

10,000

3.57 GB

COSINE

Random-s-100-euclidean

該資料集為測試載入器隨機產生,不提供下載連結。

100

90,000

10,000

34 MB

L2

Mnist-784-euclidean

該資料集來自於MNIST手寫失敗資料集。

784

60,000

10,000

179 MB

L2

測試載入器與測試方法

  1. 在測試伺服器上,安裝tair-pyhiredis

    安裝方式:

    pip install tair hiredis
  2. 下載、安裝並解壓。

    解壓命令如下:

    tar -zxvf ann-benchmarks.tar.gz
  3. Tair執行個體的串連地址、連接埠號碼和帳號密碼配置到algos.yaml檔案中。

    開啟algos.yaml檔案,搜尋tairvector找到對應配置項,修改base-args參數項,參數說明如下:

    • urlTair執行個體的串連地址及帳號密碼,格式為redis://user:password@host:port

    • parallelism:多線程的並發數,預設為4,建議使用預設值。

    樣本如下:

    {"url": "redis://testaccount:Rp829dlwa@r-bp18uownec8it5****.redis.rds.aliyuncs.com:6379", "parallelism": 4}
  4. 執行run.py,啟動完整的測試流程。

    重要

    run.py指令碼會執行整個測試流程,包括建索引、寫入資料、查詢以及記錄結果等操作,請勿對單個資料集重複執行。

    樣本如下:

    # 多線程測試Sift資料集(HNSW索引)。
    python run.py --local --runs 3 --algorithm tairvector-hnsw --dataset sift-128-euclidean --batch
    # 多線程測試Mnist資料集(FLAT索引)。
    python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean --batch

    您也可以通過內建的Web前端執行測試,樣本如下:

    # 需提前安裝Streamlit依賴。
    pip3 install streamlit
    # 啟動Web前端,啟動後可以在瀏覽器中開啟"http://localhost:8501"。
    streamlit run webrunner.py
  5. 執行data_export.py,匯出結果。

    樣本如下:

    # 多線程
    python data_export.py --output out.csv --batch

測試結果

重點關注寫入效能KNN查詢效能記憶體效率方面的測試結果:

  • 寫入效能:關注吞吐率,吞吐率越高,效能越好。

  • KNN查詢效能:關注QPS和召回率,QPS反映系統效能,召回率反映結果的準確性。通常召回率越高,相應的QPS也越低。在相同召回率下比較QPS才有參考意義,因此測試結果以“QPS-召回率”曲線的形式展示。對於FLAT索引,由於召回率始終為1,因此只展示QPS。

  • 記憶體效率:關注向量索引佔用記憶體的情況,記憶體佔用越低越好。

說明

寫入和KNN查詢測試均為4線程並發。

本次分別測試了FLOAT32(預設資料類型)和FLOAT16資料類型的效能。對於HNSW索引,還測試了開啟AUTO_GC功能下的效能表現。

HNSW索引

寫入效能

以下為ef_construct = 500時,不同M參數取值下的寫入效能,可以得出:

  • M值越大,HNSW索引的寫入效能越差。

  • 相比較FLOAT32,FLOAT16資料類型的寫入效能在多數情況下會有所下降,但是下降幅度不大,二者表現非常接近。

  • 開啟AUTO_GC功能後,寫入效能會存在一定幅度提升,提升幅度最大可達30%。

image (39).png

KNN查詢效能

召回率和QPS都是越高越好,因此曲線越靠近右上方,代表演算法表現越好。

以下為不同資料集下,TairVector HNSW索引的“QPS-召回率”曲線,可以得出:

  • 在4個資料集下,HNSW索引都可以達到99%以上的召回率。

  • 相比較FLOAT32,FLOAT16資料類型的效能略有下降,但是幅度不大,二者表現非常接近。

  • 開啟AUTO_GC功能後,查詢效能會明顯下降,因此建議您僅在需要刪除大量資料的情境下開啟AUTO_GC功能。

image (46).png

為了直觀地展示索引參數如何影響查詢效能,以下為以Sift資料集為例(FLOAT32,不開啟AUTO_GC),QPS和召回率隨著參數M和ef_search的變化趨勢。

可以看到,隨著M和ef_search的增加,QPS下降,召回率上升。

說明

您在使用過程中可以根據需求調整索引參數,平衡查詢效能與召回率。

2.jpg

記憶體效率

HNSW索引的記憶體使用量量只受參數M的影響,M值越大,HNSW索引的記憶體佔用越大。

以下為不同資料集下,TairVector HNSW索引的記憶體佔用量,可以得出:

  • 相比較FLOAT32,FLOAT16資料類型可以顯著減少記憶體佔用量,最大可以減少40%以上。

  • 開啟AUTO_GC功能後,記憶體佔用量有小幅上升,但是幅度不大。

    說明

    您在使用過程中可以根據向量資料維度和記憶體容量預算選擇合適的M值。同時如果可以接受一定的精度損失,建議使用FLOAT16類型以節省記憶體空間。

3.jpg

FLAT索引

寫入效能

以下是在兩個資料集下,TairVector FLAT索引的寫入吞吐率。

相比較FLOAT32,FLOAT16資料類型的寫入效能略有下降,下降幅度為5%左右。

image (43).png

KNN查詢效能

以下是在兩個資料集下,TairVector FLAT索引KNN查詢的QPS。

相比較FLOAT32,FLOAT16資料類型的KNN查詢效能提升約10%左右。

image (44).png

記憶體效率

以下是在兩個資料集下,TairVector FLAT索引的記憶體佔用情況。

相比較FLOAT32,FLOAT16資料類型可減少40%以上的記憶體佔用。

image (45).png