简介
指令是计算机程序给计算机处理器的命令。在最低级别上,每条指令是一个 0 和 1 的序列,描述了计算机要执行的物理操作。在计算机的汇编器语言中,每条语言语句一般对应一条处理器指令。CPU 依靠指令来计算和控制系统,指令执行能力是衡量 CPU 性能的重要指标。指令集也与 CPU 效率有密切关系。
Advanced Vector Extensions(AVX)是 x86 架构微处理器中的指令集,由英特尔在 2008 年 3 月提出,并在 2011 年发布的 Sandy Bridge 系列处理器中首次支持。AVX 指令集提供了新的特性、指令和编码方案。AVX2 指令集将大多数整数命令操作扩展到 256 位,并引入了熔合乘法累积(FMA)运算。AVX-512 则使用新的 EVEX 前缀编码将 AVX 指令进一步扩展到 512 位。
Milvus 是一款开源的向量相似度搜索引擎,支持使用多种 AI 模型将非结构化数据向量化,并为向量数据提供搜索服务,可广泛应用于图像处理、机器视觉、自然语言处理、语音识别以及推荐系统。 从 0.7.0 版本开始,Milvus 新增了对 AVX-512 指令集的支持。Milvus 理论上可支持所有包含 AVX-512 指令集的 CPU。本文将介绍和分析 Milvus 不同索引类型在 AVX-512 和 AVX2 两种指令上的性能表现。
性能对比
配置
- CPU: Intel(R) Platinum 8163 CPU @ 2.50GHz24 核 48 线程
- Number of CPU: 2
- Graphics card, GeForce RTX 2080Ti 11GB 4卡
- Mem: 768GB
- Disk: 2TB SSD
Milvus 参数
- cahce.cahe_size: 25, CPU 内存大小,用于缓存数据以加快查询速度。
- nlist: 4096
- nprobe: 128
Note: nlist 是使用客户端创建索引设置的参数,nprobe 则是进行搜索设置的参数。IVFLAT 和 SQ8 索引都是通过聚类算法把大量的向量划分成很多‘桶’,nlist 指的就是聚类时划分桶的总数。通过索引查询时,第一步先找到和目标向量最接近的若干个桶,第二步在这若干个桶里通过比较向量距离查找出最相似的 k 条向量。nprobe 指的就是第一步若干个桶的数量。
数据集
本次我们所使用的是 SIFT10M 数据集,其包含了 1000 万条 128 维的向量,常被用于分析相应的近似最近邻搜索方法的性能。本次我们通过对比两种指令集在 nq = [1, 10, 100, 500, 1000] 时的 top-1 检索时间,对两种指令集进行性能比对。
向量索引
向量索引是通过一定的数学模型建立在向量上的一种省时、省空间的数据结构。通过向量索引,我们可以高效地查询多个与目标向量相似的向量。由于精确检索通常非常耗时,因此Milvus的向量索引类型大多采用 ANNS(近似最近邻搜索)。
本次我们共测试了三种索引:IVF_FLAT,IVF_SQ8 和 HNSW。下面我们对其结果逐一进行分析。
IVF_FLAT
IVF(Inverted File)是一种基于量化的索引类型。IVF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。
IVF_SQ8
IVF_SQ8 根据 IVF 对放入单元的每个向量进行标量量化。标量量化将原始向量的每个维度从一个 4 字节的浮点数转换为一个 1 字节的无符号整数,所以 IVF_SQ8 索引文件比 IVF_FLAT 索引文件占用的空间小得多。
HNSW
HNSW(Hierarchical Small World Graph)是一种基于图的索引算法。从最上层开始搜索,在这一层找到最接近目标的节点,然后进入下一层开始再次搜索。经过多次迭代,可以快速接近目标位置。
小结
通过分析上面三种索引在两种指令集上的性能表现,我们可以发现不同索引使用 AVX-512 指令集时的检索速度均稍快于其在 AVX2 上的速度。这是因为相比于 AVX2 支持 256 位的计算,AVX-512 支持 512 位,在这个层面上 AVX-512 应该比 AVX2 快一倍。但是,Milvus 在搜索时除去计算还有其它的耗时,所以 AVX-512 的整体检索时间并没有高于 AVX2 一倍。
索引对比
通过观察可得,HNSW 的检索速度明显快于另外两种索引,而在两种指令集上 IVF_SQ8 的检索速度均稍快于 IVF_FLAT。这一现象可能是因为 SQ8 的所需内存带宽只有 IVF_FLAT 的1/4。IVF_FLAT 每个向量维度要加载 4 个字节,而 SQ8 只加载 1 个字节。计算所需的时间很可能是受到内存带宽的约束。因此 SQ8 不仅占用较少的空间,而且检索速度更快。
结语
本文测试并分析了 Milvus 不同索引在 AVX-512 和 AVX2 两种指令集上的性能表现。Milvus 在使用各类索引时均表现出了极优的性能,并且在 AVX-512 指令集上得到了进一步的提升。
目前,Milvus 可以对接各种深度学习平台,并运用于众多 AI 领域。在最新的 0.11.0 版本中,Milvus 新增了标量字段过滤和在查询时指定距离计算方式两种功能。未来 Milvus 会持续增加更多功能,助力用户高效完成非结构化数据检索。关于 Milvus 的更多应用场景请参考:https://milvus.io/cn/scenarios
欢迎加入 Milvus 社区
github.com/milvus-io/milvus | 源码
milvus.io | 官网
milvusio.slack.com | Slack 社区
zhihu.com/org/zilliz-11/columns | 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili