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-euclidean、Gist-960-euclidean、Glove-200-angular和Deep-image-96-angular資料集測試HNSW索引,使用Random-s-100-euclidean和Mnist-784-euclidean資料集測試FLAT索引。
資料集名稱 | 資料集介紹 | 向量維度 | 向量總數 | 查詢數量 | 資料總量 | 距離類型 |
該資料集是基於Texmex的資料集整理,使用SIFT演算法得到的圖片特徵向量。 | 128 | 1,000,000 | 10,000 | 488 MB | L2 | |
該資料集是基於Texmex的資料集整理,使用GIST演算法得到的圖片特徵向量。 | 960 | 1,000,000 | 1,000 | 3.57 GB | L2 | |
該資料集是互連網文本資料使用GloVe演算法得到的單詞向量。 | 200 | 1,183,514 | 10,000 | 902 MB | COSINE | |
該資料集是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 | 60,000 | 10,000 | 179 MB | L2 |
測試載入器與測試方法
在測試伺服器上,安裝
tair-py和hiredis。安裝方式:
pip install tair hiredis下載、安裝並解壓。
解壓命令如下:
tar -zxvf ann-benchmarks.tar.gz將Tair執行個體的串連地址、連接埠號碼和帳號密碼配置到
algos.yaml檔案中。開啟
algos.yaml檔案,搜尋tairvector找到對應配置項,修改base-args參數項,參數說明如下:url:Tair執行個體的串連地址及帳號密碼,格式為
redis://user:password@host:port。
parallelism:多線程的並發數,預設為4,建議使用預設值。
樣本如下:
{"url": "redis://testaccount:Rp829dlwa@r-bp18uownec8it5****.redis.rds.aliyuncs.com:6379", "parallelism": 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執行
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%。

KNN查詢效能
召回率和QPS都是越高越好,因此曲線越靠近右上方,代表演算法表現越好。
以下為不同資料集下,TairVector HNSW索引的“QPS-召回率”曲線,可以得出:
在4個資料集下,HNSW索引都可以達到99%以上的召回率。
相比較FLOAT32,FLOAT16資料類型的效能略有下降,但是幅度不大,二者表現非常接近。
開啟AUTO_GC功能後,查詢效能會明顯下降,因此建議您僅在需要刪除大量資料的情境下開啟AUTO_GC功能。

為了直觀地展示索引參數如何影響查詢效能,以下為以Sift資料集為例(FLOAT32,不開啟AUTO_GC),QPS和召回率隨著參數M和ef_search的變化趨勢。
可以看到,隨著M和ef_search的增加,QPS下降,召回率上升。
您在使用過程中可以根據需求調整索引參數,平衡查詢效能與召回率。

記憶體效率
HNSW索引的記憶體使用量量只受參數M的影響,M值越大,HNSW索引的記憶體佔用越大。
以下為不同資料集下,TairVector HNSW索引的記憶體佔用量,可以得出:
相比較FLOAT32,FLOAT16資料類型可以顯著減少記憶體佔用量,最大可以減少40%以上。
開啟AUTO_GC功能後,記憶體佔用量有小幅上升,但是幅度不大。
說明您在使用過程中可以根據向量資料維度和記憶體容量預算選擇合適的M值。同時如果可以接受一定的精度損失,建議使用FLOAT16類型以節省記憶體空間。

FLAT索引
寫入效能
以下是在兩個資料集下,TairVector FLAT索引的寫入吞吐率。
相比較FLOAT32,FLOAT16資料類型的寫入效能略有下降,下降幅度為5%左右。

KNN查詢效能
以下是在兩個資料集下,TairVector FLAT索引KNN查詢的QPS。
相比較FLOAT32,FLOAT16資料類型的KNN查詢效能提升約10%左右。

記憶體效率
以下是在兩個資料集下,TairVector FLAT索引的記憶體佔用情況。
相比較FLOAT32,FLOAT16資料類型可減少40%以上的記憶體佔用。
