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

news2024/11/25 7:02:02

文章目录

  • 1. Faiss 简介
  • 2. 距离度量
  • 3. 在 Sophon TPU 上的接口实现
    • 3.1 Sophon TPU
    • 3.2 indexflat 实现
    • 3.3 indexPQ 实现

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

1. Faiss 简介

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

2. 距离度量

那么,如何确定两个向量之间的相似性呢?
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

3. 在 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 的最大性能。

3.1 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。

3.2 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

 

3.3 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/68512.html

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

相关文章

【Pytorch】第 2 章 :马尔可夫决策过程和动态规划

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

python之对比两张图像的相似度

python之图像背景识别 本着结合实际工作,实际落地并已应用的态度去码文。 python之对比两张图像的相似度 需求:在某个手机端项目中,有多个页面图片,但每个图片都做了相应的修改,由于这种图片非常多,高达上万…

澳亚通过聆讯:上半年营收近3亿美元 元气森林与新希望乳业是股东

雷递网 雷建平 12月6日澳亚集团有限公司(简称:“澳亚集团”)日前通过聆讯,准备在港交所上市。澳亚集团是2022年10月中旬递交招股书,不到2个月时间,澳亚集团就通过上市聆讯,这在最近两年的港交所…

小型扫雪机结构设计

目 录 摘 要 I ABSTRACT II 1、绪论 1 1.1 选题意义 1 1.2小型扫雪机国内发展现状 1 1.2.1国内小型扫雪机械现状 1 1.2.2犁式小型扫雪机 2 1.2.3旋切式小型扫雪机 2 1.2.4国内小型扫雪机械的发展方向 3 1.3国外道路小型扫雪机械技术发展概况 3 1.3.1综合式扫雪 3 1.3.2融雪扫雪…

【华为上机真题 2022】数组组成的最小数字

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

深入探索 Kubernetes 网络模型和网络通信

Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结构的设计,无需将主机端口与网络端口进行映射便可以进行高效地通讯,也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。 …

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽,是一种非竞争性,可逆和变构的蛋白酶体 (proteasome) 抑制剂。PR-39 TFA 可逆地结合到蛋白酶体的 α7 亚基上,并通过泛素-蛋白酶体途径阻断 NF-κB 抑制剂 IκBα 的降解。PR-39 TFA 刺激小鼠的血…

Java中的final关键字,你清楚吗?

前言 在学习Java基础阶段应该都认识关键字 final,在声明常量和匿名内部类时都会用到它。我们最熟悉的 String 类就是 final类,如果经常查看API源码,肯定还会遇到其他 final类。本篇就来深入了解一下关键字 final,加深对它的运用。 概览 可用…

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库)

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

CRC 循环冗余检验【计网必考】

CRC 循环冗余检验作为一个重点,也是数据链路层必考的一个考点,所以我把差错检测单独拿出来分析一起看一下。总结不易,一个简单的攒,Thanks♪(・ω・)ノ 目录 一、介绍及工作原理 二、校验计算过程…

zookeeper四字命令_java培训

zookeeper支持某些特定的四字命令,他们大多是用来查询ZK服务的当前状态及相关信息的, 通过telnet或nc向zookeeper提交相应命令,如:echo ruok | nc 127.0.0.1 2181 运行公式:echo 四字命令 | nc 主机IP zookeeper端口…

一文读懂Linux内存分配策略

转载:一文读懂Linux内存分配策略-今日头条 (toutiao.com) 在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示…

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现

原文链接:http://tecdat.cn/?p3795Glmnet是一个通过惩罚最大似然关系拟合广义线性模型的软件包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net(弹性网络)惩罚值计算的(点击文末“阅读原文”获取完整代码数据&…

[附源码]JAVA毕业设计社区图书馆借阅管理系统(系统+LW)

[附源码]JAVA毕业设计社区图书馆借阅管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

【微服务】版本确认完成,传统方式安装Nacos

目录安装Nacos1.4.1【微服务】SpringCloud和SpringBoot版本选择 【微服务】传统方式安装Nacos 安装Nacos1.4.1 Github地址:https://github.com/alibaba/nacos/releases Nacos1.4.1版本下载地址:https://github.com/alibaba/nacos/releases/download/1.…

170-本地WIFI测试环境配置IP

前几天的时候 博客被删了好多好多篇 算一下 现在是169 按道理的话应该总数是1169的 但是现在只剩下1157了 所以就是被删除了12篇 算了 问题不大 被删了就被删了吧 最近心情真的很不好 五月份的事情一直到现在还是没有走出来 我估计可能要等到下一次自己赚到钱了之后…

基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本次使用轨迹优化技术来控制汽车。假设汽车遵循自行车模型的动力学。为了实现稳定和安全的跟踪,我们使用了离散时间…

微信内嵌H5调用相机及支付相关问题

前言 进来项目在做公众号,遇到了一些问题及解决方案,在这里进行记录及分享,希望给大家带来一丝帮助 手机上控制台调试我建议使用vConsole(npm install vconsole) 微信内嵌H5的相机调用 微信内嵌H5我们需要调用扫码功能,则需要用…

如何发布WMS/WMTS离线地图服务

介绍: WMTS(OpenGIS Web Map Tile Service)当前版本是1.0.0。WMTS标准定义了一些操作,这些操作允许用户访问切片地图。WMTS可能是OGC首个支持RESTful访问的服务标准。 WMTS的原理和操作 如果知道一个请求的边界范围&#x…

浅谈用Redis实现分布式锁的方案及细节

前言 我们都知道,在面对并发问题时,有加锁操作和保证原子操作两种解决方案。当我们采用加锁操作的时候,因为Redis多采用集群的方式部署,因此我们就需要考虑到锁在分布式系统中使用的注意事项。接下来就看看Redis的分布式锁问题。…