本实验所使用的原始数据集为 SIFT1B ,关于该数据集的详细信息请参考:http://corpus-texmex.irisa.fr/。在本次测试中,咱们提取了原始数据集中的 100 万条数据。python
经实测,如下硬件配置可顺利完成实验:git
Component | Minimum Config |
---|---|
OS | Ubuntu LTS 18.04 |
CPU | Intel Core i5-8250U |
GPU | Nvidia GeForce MX150, 2GB GDDR5 |
GPU Driver | CUDA 10.1, Driver 418.74 |
Memory | 8 GB DDR4 |
Storage | NVMe SSD 256 GB |
测试工具下载:sql
为方便存放测试数据和脚本,请建立名为 milvus_sift1m 的文件夹。利用前文提供的下载连接,将测试数据集下载到 milvus_sift1m 目录下:docker
获取完测试须要的数据和脚本后, milvus_sift1m 目录下应该存放有如下内容:shell
注意bash
使用脚本 milvus_bootcamp.py 进行测试以前,请仔细阅读该脚本的 README 。并根据实际状况,对脚本中的相关变量值进行修改。 使用脚本 get_id.sh 测试以前须要为它添加可执行权限,执行下述指令:工具
$ chmod +x get_id.sh
Milvus 能够根据数据分布和性能、准确性的要求灵活调整相关系统参数,以发挥产品的最佳性能。在此实验中,采用以下表所示的参数配置,就能够实现90%以上召回率。性能
配置文件: /home/$USER/milvus/conf/server_config.yaml测试
参数名称 | 推荐值 |
---|---|
index_building_threshold | 64 |
cpu_cache_capacity | 4 |
use_blas_threshold | 801 |
nprobe | 32 |
其他参数保持默认便可。配置文件参数修改完毕后,重启 Milvus Docker 使配置生效。ui
$ docker restart <container id>
导入数据以前,首先确保 bvecs_data 文件夹与测试脚本 milvus_bootcamp.py 都放在 milvus_sift1m 目录下,而后确认 Milvus 已经正常启动。( Milvus 安装及启动方法参见:Milvus 快速上手 )
进入 milvus_sift1m 目录,运行以下脚本:
$ python3 milvus_bootcamp.py --table=ann_1m_sq8 --index=ivfsq8 -t
脚本会建立一张名为 ann_1m_sq8 的表,它采用的索引类型为 ivfsq8 ,并导入数据:
上述过程完成以后,运行以下脚本以查看 Milvus 中存在的的表,以及表中的向量条数:
$ python3 milvus_bootcamp.py --show $ python3 milvus_bootcamp.py --table=ann_1m_sq8 --rows
数据导入完成后,会在 milvus_sift1m 目录下产生一个名为 ann_1m_sq8_idmap.txt 的文件,该文件中存放的是 Milvus 为每一条向量分配的向量编号( ids )以及该向量的具体位置。
为了确保导入 Milvus 的数据已经所有建好索引,请进入 /home/$USER/milvus/db 目录,在终端输入以下命令:
$ sqlite3 meta.sqlite
进入交互式命令行以后,输入以下命令,检查向量数据表当前的状态:
sqlite> select * from TableFiles where table_id='ann_1m_sq8'; 30|ann_1m_sq8|3|1565599487052367000|3|102400000|1565599495009366|1565599487052372|1190712 31|ann_1m_sq8|3|1565599495107862000|3|102400000|1565599502559292|1565599495107863|1190712 32|ann_1m_sq8|3|1565599502656466000|3|102400000|1565599510079453|1565599502656467|1190712 33|ann_1m_sq8|3|1565599510129972000|3|51200000|1565599513555987|1565599510129973|1190712 34|ann_1m_sq8|3|1565599513650120000|3|102400000|1565599521067974|1565599513650121|1190712 35|ann_1m_sq8|3|1565599521132604000|3|51200000|1565599524843984|1565599521132605|1190712
Milvus 会将一个向量数据表分红若干数据分片进行存储,所以查询命令会返回多条记录。其中第三列数字表明数据表采用的索引类型,数字 3 表明采用的是 ivfsq8 索引。第五列数字表明索引构建的状况,当这列数字为 3 时,表明相应的数据表分片上的索引已构建完毕。若是某个分片上的索引尚未构建完成,能够手动为这个数据分片创建索引。进入 milvus_sift1m 目录,运行以下脚本:
$ python3 milvus_bootcamp.py --table=ann_1m_sq8 --build
手动创建索引后,再次进入 sqlite 交互界面,确认全部数据分片都已经建好索引。若是想了解其余列数据表明的含义,请进入 /home/$USER/milvus/db 目录,在 sqlite 交互界面输入以下命令进行查看。
sqlite>.schema
SIFT1B 提供了10,000 条向量的查询向量集,而且对于每条查询向量都给出了该向量在不一样规模数据集上的 top1000 ground truth。所以,能够方便地对 Milvus 查询结果的准确率进行计算。准确率计算公式为:
准确率= ( Milvus 查询结果与 Groundtruth 一致的向量个数 ) / ( query_records 的向量个数 * top_k )
(1)执行准确性测试脚本
从 10,000 条查询向量中随机取出 10 条向量,而后测试 Milvus 针对这 10 条向量的 top20 结果的准确率。进入 milvus_sift1m 目录,运行以下脚本:
$ python3 milvus_bootcamp.py --table=ann_1m_sq8 -q 10 -k 20 -s
(2)验证准确性测试结果
上述脚本运行完成后,将会生成一个名为 accuracy_results 的文件夹,在该文件夹下面会有一个名为 10_20_result.csv 的文件,文件里的内容以下图所示:
Milvus 查询准确率与搜索子空间( nprobe 参数)有很大关系。本次测试中 nprobe 设置为32,Milvus 查询准确率能够达到 90% 以上。能够经过增大 nprobe 值来实现更高的准确率但同时也会下降 Milvus 的查询性能。
所以,须要结合实际数据分布和业务SLA,调整搜索子空间大小以达到性能和准确性的平衡。
为评估 Milvus 的查询性能,进入 milvus_sift1m 目录,运行以下脚本:
$ python3 milvus_bootcamp.py --table=ann_1m_sq8 -s
运行结束后,将会生成一个名为 performance_results 的文件夹,在该文件夹下会有一个名为 xxx_results.csv 的文件,'xxx' 表明执行命令的时间。文件内容以下图所示(未彻底展现):
注意