基于BM1684X 架构实现 Faiss 的两个查询接口

news2024/11/28 10:47:25

文章目录

  • Faiss 简介
  • 距离度量
  • 在 Sophon TPU 上的接口实现
    • Sophon TPU
    • indexflat 实现
    • indexPQ 实现

===========================================

Faiss 简介

Faiss 库是 Facebook 开发的一个用于稠密向量相似性搜索和聚类的库,该库包含有诸多向量相似性搜索的算法。向量相似性搜索是将一个向量与底库中的向量集合进行比较,从中找到与检索向量最相似的向量的过程。常见的图像、音视频等均可用机器学习模型转化为嵌入向量,因此 Faiss 库在语义搜索、推荐系统等现实场景中得到了广泛的应用。
使用 Faiss 库对某一个向量进行检索,整个检索的步骤分为 train、add、search 三个步骤,首先选取具有代表性的数据训练得到索引值;然后将索引值添加到底库中;对于给定的输入检索向量,在底库中搜索最相似的 K K K 个向量。
请添加图片描述

距离度量

那么,如何确定两个向量之间的相似性呢?
Faiss 库提供了两种常见的距离度量方法,其一是欧式距离 (Euclidean Distance),也可称为 L2 距离 (L2 Distance);其二是内积距离 (Inner Product, IP)。

设特征空间 X \mathcal{X} X n n n 维实数向量空间 R n \mathcal{R}^n Rn x , y ∈ X \mathbf{x},\mathbf{y}\in \mathcal{X} x,yX, x = ( x 1 , x 2 , ⋯   , x n ) T \mathbf{x}=(x_1,x_2,\cdots,x_n)^T x=(x1,x2,,xn)T, y = ( y 1 , y 2 , ⋯   , y n ) T \mathbf{y}=(y_1,y_2,\cdots,y_n)^T y=(y1,y2,,yn)T,两个向量之间的夹角为 θ \theta θ
x \mathbf{x} x y \mathbf{y} y 之间的 L2 距离为:
L 2 ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ 2 L_2(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i=1}^n|x_i-y_i|^2} L2(x,y)=i=1nxiyi2
x \mathbf{x} x y \mathbf{y} y 之间的内积距离为:
IP ( x , y ) = x ⋅ y = ∑ i = 1 n x i y i = ∥ x ∥ ∥ y ∥ cos ⁡ θ \text{IP}(\mathbf{x},\mathbf{y})=\mathbf{x}\cdot\mathbf{y}=\sum_{i=1}^{n}x_iy_i=\|\mathbf{x}\|\|\mathbf{y}\|\cos\theta IP(x,y)=xy=i=1nxiyi=xycosθ

L2 距离值越小,表示两个向量间的相似度越高。相反,内积距离值越大,表示两个向量间的相似度越高。若 x \mathbf{x} x y \mathbf{y} y 两个向量已进行归一化 (Normalization) 处理,即 ∥ x ∥ = 1 , ∥ y ∥ = 1 \|x\| = 1,\|y\| = 1 x=1,y=1,则此时两个向量之间的内积距离就是余弦距离 (Cosine Similarity):
Cosine Similarity = cos ⁡ θ = x ⋅ y ∥ x ∥ ∥ y ∥ = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 \text{Cosine Similarity} = \cos \theta = \frac{\mathbf{x}\cdot\mathbf{y}}{\|\mathbf{x}\|\|\mathbf{y}\|}=\frac{\sum_{i=1}^{n}x_iy_i}{\sqrt{\sum_{i=1}^{n}x_i^2}\sqrt{\sum_{i=1}^{n}y_i^2}} Cosine Similarity=cosθ=xyxy=i=1nxi2 i=1nyi2 i=1nxiyi

在 Sophon TPU 上的接口实现

若对底库进行暴力搜索,选出与实例最接近的 K K K 个向量,则意味着要一一计算检索向量与所有底库向量之间的距离值,然后对距离值排序得到最前面的 K K K 个距离值,该距离值的索引就是对应的底库向量的索引。针对全空间的搜索具有最高的召回率 (Recall),但检索速度和内存利用等差强人意。

因此,我们可以考虑两种提高检索速度的策略:一是减小向量 (采用减小维度、量化等方法);二是缩小检索的空间 (采用聚类、将向量调整成树结构等方法)。近似最近邻 (Approximate Nearest Neighbor, ANN) 方法实际将底库全空间分割成许多子空间,通过快速遍历这些子空间,大大缩减遍历的空间范围以提高检索速度。在 ANN 中,我们常采用矢量量化方法将一个向量空间中的点用其中的一个有限子集进行编码,其中的经典方法就是乘积量化 (Prduct Quantization, PQ)。

针对上述遍历底库进行 K K K 最近邻搜索的方式,Faiss 库提供了 indexflat 的接口;针对采用乘积量化方法来降低内存占用并提高检索速度的方式,Faiss 库提供了 indexPQ 的接口。
Faiss 库的 indexflat 包含有 L2 和 IP 两个距离测度,同时用 CUDA 编程利用 GPU 实现硬件加速。indexPQ 包含有对称距离 (Symmetric distance computation, SDC) 和非对称距离 (Asymmetric distance computation, ADC) 两个距离测度,区别在于对称距离是将检索向量与底库向量之间的距离近似为二者对应量化后的编码之间的距离,而非对称距离仅将检索向量与量化后的底库向量编码之间的距离,相较之下非对称距离损失较小,更接近两个向量之间的真实距离。这两种间接近似求取的距离本质上仍旧采用 L2 和 IP 两个距离测度。

请添加图片描述

我们在 Sophon TPU (Tensor Processing Unit) 架构上实现了 Faiss 库的 indexflatindexPQ 接口,发挥了 Sophon TPU 的最大性能。

Sophon TPU

新一代的 Sophon TPU 包含有 64 64 64 个 NPU (Neural Network Processing Unit),每一个 NPU 是一个独立的内存空间,有多个 EU (Execution Unit)。在同一时刻 NPU 可同时执行同样的计算指令对存储在不同的 NPU 中的不同的数据进行运算,是一个标准的 SIMD (Single Instruction Multiple Data) 结构。下图是 Sophon TPU 的架构图。

请添加图片描述

整个 TPU 加速计算过程,首先利用 CDMA 将数据从 host 端传入 TPU 的系统内存 (System Memory) 中,其中片上内存 L2-SRAM 作为缓存使用。随后,利用 GDMA 从 DDR (Global memory) 搬运到 NPU (Local memory),在 NPU 中利用 BDC 指令调用 EU 进行运算,然后将运算结果利用 GDMA 搬运回 DDR。

indexflat 实现

遍历式计算底库向量与多个检索向量的内积距离,实际是计算检索向量组成的左矩阵与底库向量所组成的右矩阵 (需要转置存储) 的乘积,这样得到的结果矩阵就是左矩阵的每一行和右矩阵的每一列的计算结果。将得到的内积距离矩阵的每一行都进行降序排序,每一行取前 K K K 个最大的内积距离值及其对应的索引值,这样就能得到最终的检索结果,输出底库中与检索向量最相似的前 K K K 个向量。
根据上述计算过程描述,我们可以将基于内积距离的全库检索过程转换成矩阵乘积计算和 batch topK 的实现。
请添加图片描述

需要注意的是,Faiss 库中是采用的 L2 距离的平方值进行测度,其实际的计算可根据下面的式子进行转换:
L 2 ( x , y ) 2 = ∑ i = 1 n ∣ x i − y i ∣ 2 = ∥ x ∥ 2 + ∥ y ∥ 2 − 2 x y L_2(\mathbf{x},\mathbf{y})^2=\sum_{i=1}^n|x_i-y_i|^2=\|\mathbf{x}\|^2+\|\mathbf{y}\|^2-2\mathbf{x}\mathbf{y} L2(x,y)2=i=1nxiyi2=x2+y22xy
可见,两个向量之间的 L2 距离的平方等于两个向量的内积距离的 − 2 -2 2 倍再加上各自的 L2 范数的平方值。这样,基于 L2 距离的全库检索过程可转换成常数 − 2 -2 2 乘上矩阵乘积、加上两个 bias 以及 batch topK 的实现。此外,在大多数应用场景中,底库的数据量很大,若每次检索都要 TPU 重新计算底库的 L2 范数的平方值,会对资源造成极大的浪费。因此,在 add 阶段可以利用 CPU 将向量的 L2 范数的平方值计算出来存放进底库;search 阶段,将底库和检索向量及其对应的 L2 范数的平方值从 DDR 搬运至 TPU 的 local memory 中进行计算。

请添加图片描述

200 W 200\text{W} 200W 的底库,向量维度为 256 256 256,数据类型为 FP 32 \text{FP}32 FP32,这样仅底库所需要的 DDR 存储空间就为 200 W × 4 × 256 ≈ 2 GB 200\text{W} \times 4 \times 256 \approx 2 \text{GB} 200W×4×2562GB。为加速数据搬运和运算,我们采用数据切分的方式分批次搬运底库和检索向量分别组成的矩阵块,其次我们采用 GDMA 搬运和 BDC 计算并行的方式提高整体性能。最终测试我们所实现的 indexflatIPindexflatL2 的 search 性能,在 200 W 200\text{W} 200W 底库,向量维度为 256 256 256,检索向量的个数分别为 1 1 1 64 64 64 的情况下在 Sophon TPU 上得到下表中的耗时 (单位: ms \text{ms} ms) 数据。为了比对结果,我们同时在 TESLA T4 上测试了原始 Faiss 库对应的两个 search 接口的耗时。

Sophon TPU

TESLA T4

vec_dims

topk

db_num

query_num

indexflatIP 

indexflatL2

search

256

100

200W

1

40

40

23

64

89

86

33

 

indexPQ 实现

针对 PQ,在 train 阶段,将底库中的每一个向量进行拆分,拆分后的每一个子空间经 K-means 聚类 (用 L2 距离的平方值进行测度) 后生成 256 = 2 8 256=2^8 256=28 个聚类中心,得到一个码表,保证了用 8 8 8 比特即一个字节表示每一个码本中的量化编码。这样底库中每一个向量切分后的子段都能用所在子空间的聚类中心来近似表示,这样仅用很短的编码就可以表示一个底库向量,实现量化的目的,从而减少内存空间的占用。

在 search 阶段,以非对称距离为例,将检索向量拆分成相同数量的子段,在对应的每一个子空间中,计算检索向量子段到该子空间聚类中心的距离得到距离表。依据码表中的编码查询距离表,将所有子段对应的距离取出并求和,得到底库中的向量到查询向量间的非对称距离。最后将非对称距离进行排序得到想要的前 K K K 个与检索向量最相似的底库向量的索引值。
请添加图片描述

在 Sophon TPU 上实现 PQ 的 search 阶段,对于非对称距离,过程为计算距离表、查找距离表以及 topK 的过程;对于对称距离,过程为查询对称距离码表得到距离表、查询距离表以及 topK 的过程。

我们测试了将 256 256 256 维的向量切分成 32 32 32 个子段,在 200 W 200\text{W} 200W 2000 W 2000\text{W} 2000W 底库上检索 1 1 1 个向量的耗时 (单位: ms \text{ms} ms)。经量化之后,对于 FP 32 \text{FP}32 FP32 200 W 200\text{W} 200W 底库,在 DDR 上存储对应的量化码表仅占用 32 × 256 × 8 × 4 = 256 KB 32\times 256\times 8\times 4 = 256\text{KB} 32×256×8×4=256KB,极大降低了所需的内存空间。与 indexflat 相比,针对 200 W 200\text{W} 200W 的底库检索 1 1 1 个向量的时间从 40 ms 40\text{ms} 40ms 降至约 4 ms 4\text{ms} 4ms,检索耗时缩短了 10 10 10 倍。
我们同时在 TESLA T4 上测试了原始 Faiss 库 indexPQ 的 search 接口非对称距离的耗时,TPU 上 200 W 200\text{W} 200W 底库 top100 耗时不到 4 ms 4\text{ms} 4ms,TESLA T4 上大约是 12 ms 12\text{ms} 12ms 2000 W 2000\text{W} 2000W 底库 top100 耗时大约是 34 ms 34\text{ms} 34ms,TESLA T4 上是 112 ms 112\text{ms} 112ms,由此可见,在 Sophon TPU 上实现的 indexPQ 的单向量查询的性能优于 TESLA T4。

m

dim

ksub

datatype

codetype

32

256

256

FP32

INT8

metric

database

topk

ADC

SDC

L2

200W

100

3.682

3.422

1000

9.643

9.656

2000W

100

32.27

30.053

1000

101.928

99.757

IP

200W

100

3.695

3.422

1000

9.541

9.656

2000W

100

32.23

30.053

1000

102.018

99.757

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot教务管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

2022科大讯飞A.I.开发者大赛 柑橘花果梢识别挑战赛冠军方案

2022科大讯飞A.I.开发者大赛 柑橘花果梢识别挑战赛冠军方案PPT

游戏道具平台|基于Springboot+Vue实现游戏道具平台系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Vagrant 搭建虚拟机环境

用 Vagrant 和 VirtualBox 来快速搭建一个开发环境是非常方便的。简单整理一下 Vagrant 搭建 VirtualBox 虚拟机的记录。 首先安装 Vagrant 和 VirtualBox,这一步就直接省略了。自行安装即可。 什么是 Vagrant,我们这里引用 OSChina 上的一段话来进行解释…

浏览器IndexedDB模块损坏及解决办法

浏览器IndexedDB模块损坏及解决办法 表现 提示错误码: UnknownError Internal error opening backing store for indexedDB.open. indexedDB无法展开。 复现方式 进入以下路径 Mac C:\用户\xxx\AppData\Local\Google\Chrome\User Data\Default\IndexedDB Windo…

吴恩达2022机器学习——第二部分高级学习算法第三周笔记

目录1.1决定下一步做什么(构建机器学习的实用建议)1.2模型评估1.3模型选择&交叉验证测试集的训练方法模型选择总结举例2.1通过偏差与方法进行诊断2.2正则化、偏差、方差1.1决定下一步做什么(构建机器学习的实用建议) 从一个例…

C++运算符重载【加号、左移、递增、指针、赋值、中括号、关系、函数调用】,统统载了

学习目标 在c对象的学习中,我们会使用到运算符重载,接下来大家一起学习一下吧! 学习内容 运算符重载: operator overloading运算符重载是一种形式的C多态 即对已有运算符进行重新定义,赋予新的功能,使其…

我的创作纪念日

机缘 成为创作者的初心: 让大家目光向我看齐,来我这CV(狗头) 收获 在创作的过程中都有哪些收获 获得了28粉的关注获得了252赞、83评论、233474阅读量、548收藏 (还好我自己点了几个赞,不然250赞显得我好…

安洵杯-复现

reee 主要就是这个函数 void __noreturn sub_401640() {char Buffer[52]; // [esp0h] [ebp-60h] BYREFchar ArgList[16]; // [esp34h] [ebp-2Ch] BYREFint v2; // [esp44h] [ebp-1Ch]CHAR Text[13]; // [esp48h] [ebp-18h] BYREFint v4; // [esp55h] [ebp-Bh]__int16 v5; // [e…

《Redis实战篇》一、短信登录

1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求,请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开tomcat访问redis,也可以作为静态资源服务器,轻…

Java并发常见面试题(二)

为什么要使用多线程? 从整体上来看 从计算机底层来说: 线程可以看作是轻量级的进程,是最小的程序执行单位,线程间的切换和调度的成本远远小于进程。另外,多核CPU时代,多个线程可以同时运行,这…

PCB布线及后仿真验证过程(干货满满,建议收藏)

一 布线的基本要求 1. 布线次序考虑 1) 规则驱动布线遵循的基本步骤 定义禁布区,或控制区; 若有规则约束,要求设置规则; 试布线,评估单板是否可以布通,若不能布通,需要采用策略&#x…

Linux测试常用命令

Linux测试常用命令1.Linux安装2.linux常用命令1.一些Linux环境下的基本操作2. 目录管理3.文件管理1.Linux安装 在VMWare虚拟机上安装linux操作系统,得到一个ip,然后通过MobaXterm远程连接linux并进行命令操作。 公司测试的时候是直接拿到服务器ip&…

食品经营许可证办理要什么材料

食品经营许可证办理要什么材料 1.食品经营许可申请书; 2.营业执照或者其他主体资格证明文件复印件; 3.法定代表人(负责人)和食品安全管理人员的名册、身份证明复印件。申请人委托他人办理食品经营许可申请的,代理人…

代码审计-2 SQL注入

代码审计之SQL注入审计流程ThinkPHP框架ThinkPHP的路由PbootCMSPbootCMS留言处存在SQL注入代码分析ThinkPHP框架 ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架 MVC模式的php开发框架 MVC:一种软件架构模式,把系统分为三个部分&#xff1a…

基于OpenDaylight和OVSDB搭建VxLAN网络

1 简介 本文主要介绍基于OpenDaylight子项目OVSDB中的southbound组件来搭建VxLAN网络,包括初始环境搭建和southbound RestConf API调用等。OpenDaylight中的northbound组件也可以用来创建VxLAN网络,但northbound不是基于yang的且OVSDB封装的不好&#x…

overflow属性详解

overflow属性详解_桃花扇J的博客-CSDN博客_overflow属性 原链接 overflow是对溢出内容的处理,有四个属性值visible,hidden,scroll,auto,且可以分别设置overflow-x,overflow-y,需要注意的是&am…

从夜间照明到随动转向速锐得解码比亚迪唐车灯升级改装技术方案

汽车大灯犹如人的眼睛一样,在汽车的正脸,灵魂与窗口一样的存在,我们通过技术手段将汽车大灯升级为更高亮度、更智能化,是从根本解决行车安全问题。行车灯发展了几十年,已经不仅限于满足“夜间照明”的功能,…

lt基站学习总结

目录 1.nanocell基站的介 2.lte的网络结构 2.1 网络实体 2.2 功能划分 2.3功能描述 2.4业务类型 2.5语音回落原理 3 S1接口上用户注册消息的简介 3.1 S1接口的位置 3.2 S1接口的协议栈关系 3.3 S1接口建立实例 4 3g用户附着流程 5. Lte用户开机附着过程 1.nanocell基站…

扫描点读笔搭载北京君正X2000多核异构跨界处理器的案例

外研通云畅VT-S30扫描点读笔搭载北京君正X2000多核异构跨界处理器,X2000多核异构跨界处理器主要面向于智能音频、图像识别、智能家电、智能家居、智能办公等五大领域。CPU采取三核结构,搭载双XBurst2,主频1.2GHz,跨界第三核XBurst…