TairVector是基于Tair的向量存储引擎,集存储、检索于一体,提供高性能、实时的向量数据库服务。本文介绍了TairVector的性能测试方法和测试结果。

TairVector支持高性能的向量近似最近邻(ANN)检索,可用于非结构化数据的语义检索、个性化推荐等场景,更多信息请参见TairVector

测试说明

测试环境

数据库实例:Tair内存型(兼容Redis 6.0),16 GB。

执行测试的服务器:
  • Tair实例为同专有网络(VPC)的ECS实例,且与Tair通过专有网络连接。
  • 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 IP
Deep-image-96-angular 该数据集是ImageNet图片经过GoogLeNet模型训练,从最后一层神经网络提取的向量。 96 9,990,000 10,000 3.57 GB IP
Random-s-100-euclidean 该数据集为测试工具随机生成,不提供下载链接。 100 90,000 10,000 34 MB L2
Mnist-784-euclidean 该数据集来自于手写数字识别数据库 784 60,000 10,000 179 MB L2

测试工具与测试方法

  1. 在测试服务器上,安装tair-py
    支持两种安装方式:
    • 通过pip安装:
      pip install tair
    • 通过代码安装:
      git clone https://github.com/alibaba/tair-py.git
      cd tair-py
      python setup.py install
  2. 下载Ann-benchmarks,并解压。
    解压命令如下:
    tar -zxvf ann-benchmarks.tar.gz
  3. Tair实例的连接地址、端口号和账号密码配置到algos.yaml文件中。
    打开algos.yaml文件,搜索tairvector找到对应配置项,修改base-args参数项,参数说明如下:
    • hostTair实例的连接地址。
    • port:端口号。
    • passwordTair实例的账号密码,格式为user:password,更多信息请参见Tair实例登录方式
    • parallelism:多线程的并发数,默认为4。
    示例如下:
    {"host": "r-****0d7f.redis.zhangbei.rds.aliyuncs.com", "port": "6379", "password": "testaccount:Rp829dlwa", "parallelism": 4}
  4. 执行run.py,启动完整的测试流程。
    重要 run.py脚本会执行整个测试流程,包括建索引、写入数据、查询以及记录结果等操作,请勿对单个数据集重复执行。
    示例如下:
    # 单线程测试Sift数据集(HNSW索引)。
    python run.py --local --runs 3 --algorithm tairvector --dataset sift-128-euclidean
    # 多线程测试Sift数据集(HNSW索引)。
    python run.py --local --runs 3 --algorithm tairvector --dataset sift-128-euclidean --batch
    
    # 单线程测试Mnist数据集(FLAT索引)。
    python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean
    # 多线程测试Mnist数据集(FLAT索引)。
    python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean --batch
  5. 执行data_export.py,导出结果。
    示例如下:
    # 单线程
    python data_export.py --output out.csv
    # 多线程
    python data_export.py --output out.csv --batch

测试结果

HNSW索引

  • 写入性能

    本次测试8线程并发写入,重点关注写入的吞吐率(Throughput)。

    以下为ef_construct = 500时,不同M参数取值下的写入性能。M值越大,HNSW索引的写入性能越差。

    图 1. Sift数据集
    Sift数据集
    图 2. Gist数据集
    Gist数据集
    图 3. Glove数据集
    Glove数据集
    图 4. Deep数据集
    Deep数据集
  • ANN查询性能

    重点关注单线程的ANN查询延迟(Latency)和多线程并发查询的吞吐率。

    • 单线程ANN查询延迟

      以下为ef_construct = 500时,在不同的M和ef_search参数取值下,TairVector的单线程ANN查询延迟。参数ef_search取值越大,查询过程中就会遍历更多数据,因此查询延迟越大,但召回率也会更高,请参见召回率的测试结果

      图 5. Sift数据集
      Sift数据集
      图 6. Gist数据集
      Gist数据集
      图 7. Glove数据集
      Glove数据集
      图 8. Deep数据集
      Deep数据集
    • 多线程查询吞吐率

      以下为ef_construct = 500M = 24时,在不同的ef_search参数取值下,TairVector的单线程和4线程并发查询的吞吐率。

      图 9. Sift数据集
      Sift数据集
      图 10. Gist数据集
      Gist数据集
      图 11. Glove数据集
      Glove数据集
      图 12. Deep数据集
      Deep数据集
  • 召回率
    HNSW索引的查询召回率跟参数密切相关。以下是不同数据集,以不同的M和ef_search参数取值时的Top 10召回率。M和ef_search越大,查询召回率越高,但是查询速度越慢(参考ANN查询性能结果)。
    说明 您在使用过程中可以根据需求调整索引参数,平衡查询性能与召回率。
    图 13. Sift数据集
    Sift数据集
    图 14. Gist数据集
    Gist数据集
    图 15. Glove数据集
    Glove数据集
    图 16. Deep数据集
    Deep数据集
  • 内存效率
    内存效率将通过放大系数进行展示,即索引占用的内存大小和向量数据原始大小的比值。以下为在不同M参数取值下,TairVector的内存放大系数。TairVector内存效率HNSW索引的内存使用量只受参数M的影响,M值越大,HNSW索引的内存开销也越大。向量维度越高,例如Gist数据集(960向量维度),存储向量数据本身所占用的内存空间越多,存储索引的内存占比越小,放大系数也就越小,同时受M值的影响也越小。

FLAT索引

  • 写入性能
    以下为FLAT索引的写入吞吐率。Flat吞吐率
  • ANN查询性能
    以下为FLAT索引单线程和多线程的ANN查询吞吐率。flat查询性能
  • 内存效率
    以下为TairVector Flat索引的内存放大系数。fLAT由于Random数据集总量小,额外的数据结构占用的内存较大,因此Random数据集内存放大系数较大。