开始前准备一台笔记本电脑:组件最低配置操作系统UbuntuLTS18.04CPUIntelCorei5-8250UGPUNvidiaGeForceMX150,2GBGDDR5GPU驱动软件CUDA10.1,Driver418.74内存8GBDDR4硬盘NVMeSSD256GB请按照说明安装Milvus1,准备测试数据和脚本。本实验使用的原始数据集为SIFT1B。在这个测试中,我们从原始数据集中提取了100万条记录。测试工具下载:100万测试数据集查询向量集搜索结果对比(groundtruth)测试脚本为了方便存放测试数据和脚本,请创建一个名为milvus_sift1m的文件夹。使用上面提供的下载链接将测试数据集下载到milvus_sift1m目录下:测试数据集下载解压后,会看到一个名为bvecs_data的文件夹。该文件夹下存放了10个NPY文件,每个NPY文件存放了10万条uint8格式的矢量数据。查询向量集下载完成后,会看到一个query.npy文件,里面存放了实验中需要查询的10000个向量。控制数据(groundtruth)包含一个名为ground_truth.txt的文本文件,其中存储了查询向量集中每个向量的top1000个相似向量的位置。测试脚本将包含一个Python程序milvus_bootcamp.py和一个shell脚本get_id.sh。获取测试所需的数据和脚本后,在milvus_sift1m目录下存放如下内容:100万条测试数据:bvecs_data文件夹1万条查询向量集:query.npy1万条查询向量集groundtruth:ground_truth.txt测试脚本:milvus_bootcamp.py和get_id.sh注意:在使用脚本milvus_bootcamp.py进行测试之前,请仔细阅读脚本的README。并根据实际情况,修改脚本中的相关变量值。2、配置Milvus参数Milvus可以根据数据分布、性能和精度要求灵活调整相关系统参数,以充分发挥产品的最佳性能。在本实验中,使用下表所示的参数配置可以达到90%以上的召回率。配置文件:/home/$USER/milvus/conf/server_config.yaml参数名称推荐值index_building_threshold64cpu_cache_capacity4use_blas_threshold801nprobe32其余参数可以保持默认。修改配置文件参数后,重启MilvusDocker使配置生效。$dockerrestart3.数据导入在导入数据之前,首先确保bvecs_data文件夹和测试脚本milvus_bootcamp.py都放在milvus_sift1m目录下,然后确认Milvus已经正常启动。进入milvus_sift1m目录,运行以下脚本:$python3milvus_bootcamp.py--table=ann_1m_sq8--index=ivfsq8-t该脚本会创建一个名为ann_1m_sq8的表,其使用的索引类型为ivfsq8,并导入数据:上述处理完成后,运行如下脚本查看Milvus中存在的表以及表中的vector条目数:$python3milvus_bootcamp.py--show$python3milvus_bootcamp.py--table=ann_1m_sq8--rows数据导入后完成后,会在milvus_sift1m目录下生成一个名为ann_1m_sq8_idmap.txt的文件,里面存放了Milvus分配给每个向量的向量编号(ids)和向量的具体位置。为了保证所有导入Milvus的数据都已经被索引,请进入/home/$USER/milvus/db目录,在终端输入如下命令:$sqlite3meta.sqlite进入交互式命令行后,输入thefollowingcommandtocheckthevectordata表当前的状态:sqlite>select*fromTableFileswheretable_id='ann_1m_sq8';30|ann_1m_sq8|3|1565599487052367000|3|102400000|1565599495009366|1565599487052372|119071231|ann_1m_sq8|3|1565599495107862000|3|102400000|1565599502559292|1565599495107863|119071232|ann_1m_sq8|3|1565599502656466000|3|102400000|1565599510079453|1565599502656467|119071233|ann_1m_sq8|3|1565599510129972000|3|51200000|1565599513555987|1565599510129973|119071234|ann_1m_sq8|3|1565599513650120000|3|102400000|1565599521067974|1565599513650121|119071235|ann_1m_sq8|3|1565599521132604000|3|51200000|1565599524843984|1565599521132605|1190712Milvus会将一个向量数据表分成若干个数据切片进行存储,所以查询命令会返回多条记录。第三列的数字代表数据表使用的索引类型,数字3代表使用的ivfsq8索引。第五列的数字代表索引构建的状态。当该列的数字为3时,表示已经在对应的数据表分片上建立了索引。如果一个分片上的索引还没有建好,你可以手动为这个数据分片创建一个索引。进入milvus_sift1m目录,运行以下脚本:$python3milvus_bootcamp.py--table=ann_1m_sq8--build手动建好索引后,再次进入sqlite交互界面,确认所有数据分片都已建立索引。如果想了解其他列数据的含义,请进入/home/$USER/milvus/db目录,在sqlite交互界面输入如下命令查看。sqlite>.schema4,精度测试SIFT1B提供了10000个向量的查询向量集,对于每个查询向量,给出了该向量在不同规模数据集上的top1000groundtruth。因此,方便计算Milvus查询结果的准确率。准确率的计算公式为:准确率=(Milvus查询结果与Groundtruth一致的向量个数)/(query_records中的向量个数*top_k)(1)执行准确率测试脚本,随机选择从10000个查询向量中提取10个向量,然后对这10个向量测试Milvus的top20结果的准确率。进入milvus_sift1m目录,运行以下脚本:$python3milvus_bootcamp.py--table=ann_1m_sq8-q10-k20-s(2)验证精度测试结果上述脚本运行后,会生成一个名为accuracy_results的文件夹,该文件夹下会有一个名为10_20_result.csv的文件,文件内容如下图:nq:查询向量个数topk:查询该向量的前k个相似向量total_time:用于整个查询的总时间,单位:秒avg_time:每个向量的平均查询时间,单位:秒recall:Milvus查询结果与groundtruth对比的准确率Milvus查询准确率与搜索子空间(nprobe参数)。本次测试中nprobe设置为32,Milvus的查询准确率可以达到90%以上。通过增加nprobe的值可以达到更高的准确率,但也会降低Milvus的查询性能。因此需要结合实际数据分布和业务SLA调整搜索子空间的大小,以达到性能和准确率的平衡。5、性能测试为了评估Milvus的查询性能,进入milvus_sift1m目录,运行如下脚本:$python3milvus_bootcamp.py--table=ann_1m_sq8-s运行后会生成一个名为performance_results的文件夹,在该文件夹下下会有一个名为xxx_results.csv的文件,其中xxx代表命令执行的时间。文件内容如下图所示(未完全展示):nq:查询向量的个数topk:查询某个向量的前k个相似向量total_time:查询前k个相似向量的总时间vectorsofnqvectors,单位:秒avg_time:查询一个向量的topk个相似向量的平均时间,单位:秒注:1.milvus_bootcamp.py中设置的待测nq为:1,50,100,150,200、250、300、350、400、450、500、550、600、650、700、750、800。对于每个nq,milvus_bootcamp.py设置的topk为:1、20、50、100、300、500,800,1000。2.Milvus启动后,在进行第一次向量检索时,需要一定的时间将数据加载到内存中。3.如果两次测试之间有一段时间,IntelCPU可能会降频到基本频率。性能测试时,尽量连续运行测试用例。第一个测试用例可以运行两次,取第二次运行时间。