faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-7
流程
代码
void IndexIVF::search(idx_t n,const float* x,idx_t k,float* distances,idx_t* labels,const SearchParameters* params_in) const {FAISS_THROW_IF_NOT(k > 0);const IVFSearchParameters* params = nullptr;if (params_in) {params = dynamic_cast<const IVFSearchParameters*>(params_in);FAISS_THROW_IF_NOT_MSG(params, "IndexIVF params have incorrect type");}const size_t nprobe =std::min(nlist, params ? params->nprobe : this->nprobe);FAISS_THROW_IF_NOT(nprobe > 0);// search function for a subset of queriesauto sub_search_func = [this, k, nprobe, params](idx_t n,const float* x,float* distances,idx_t* labels,IndexIVFStats* ivf_stats) {std::unique_ptr<idx_t[]> idx(new idx_t[n * nprobe]);std::unique_ptr<float[]> coarse_dis(new float[n * nprobe]);double t0 = getmillisecs();quantizer->search(n,x,nprobe,coarse_dis.get(),idx.get(),params ? params->quantizer_params : nullptr);double t1 = getmillisecs();invlists->prefetch_lists(idx.get(), n * nprobe);search_preassigned(n,x,k,idx.get(),coarse_dis.get(),distances,labels,false,params,ivf_stats);double t2 = getmillisecs();ivf_stats->quantization_time += t1 - t0;ivf_stats->search_time += t2 - t0;};if ((parallel_mode & ~PARALLEL_MODE_NO_HEAP_INIT) == 0) {int nt = std::min(omp_get_max_threads(), int(n));std::vector<IndexIVFStats> stats(nt);std::mutex exception_mutex;std::string exception_string;#pragma omp parallel for if (nt > 1)for (idx_t slice = 0; slice < nt; slice++) {IndexIVFStats local_stats;idx_t i0 = n * slice / nt;idx_t i1 = n * (slice + 1) / nt;if (i1 > i0) {try {sub_search_func(i1 - i0,x + i0 * d,distances + i0 * k,labels + i0 * k,&stats[slice]);} catch (const std::exception& e) {std::lock_guard<std::mutex> lock(exception_mutex);exception_string = e.what();}}}if (!exception_string.empty()) {FAISS_THROW_MSG(exception_string.c_str());}// collect statsfor (idx_t slice = 0; slice < nt; slice++) {indexIVF_stats.add(stats[slice]);}} else {// handle paralellization at level below (or don't run in parallel at// all)sub_search_func(n, x, distances, labels, &indexIVF_stats);}
}
代码解析
IndexIVF::search 函数是 FAISS 的 IndexIVF 类中实现的一个核心函数,用于在倒排文件(Inverted File List, IVF)索引中执行搜索操作。以下是对函数的详细解析:
函数功能
在倒排文件索引中搜索最近的 k 个向量,返回它们的距离和对应的索引。
支持多线程并行化以提高查询性能。
参数说明
void IndexIVF::search(idx_t n, // 查询向量的数量const float* x, // 查询向量(每个向量有 d 个维度)idx_t k, // 每个查询向量要找到的最近邻个数float* distances, // 输出的距离数组,大小为 n*kidx_t* labels, // 输出的索引数组,大小为 n*kconst SearchParameters* params_in // 搜索参数,可选
) const;
- n:查询向量的数量。
- x:指向查询向量的指针,形状为 (n, d)。
- k:每个查询向量需要返回的最近邻数量。
- distances:保存结果的距离数组。
- labels:保存结果的索引数组。
- params_in:可选的搜索参数对象,通常包括 nprobe(控制搜索的倒排列表数量)等。
函数实现解析
- 参数验证
FAISS_THROW_IF_NOT(k > 0);
确保 k > 0,即需要找到至少一个最近邻。
2. 处理搜索参数
const IVFSearchParameters* params = nullptr;
if (params_in) {params = dynamic_cast<const IVFSearchParameters*>(params_in);FAISS_THROW_IF_NOT_MSG(params, "IndexIVF params have incorrect type");
}
const size_t nprobe = std::min(nlist, params ? params->nprobe : this->nprobe);
FAISS_THROW_IF_NOT(nprobe > 0);
- 检查输入的搜索参数 params_in 是否是 IVFSearchParameters 类型。
- 从参数中提取 nprobe,即查询时访问的倒排列表数量:
- 如果参数提供了 nprobe,则使用参数中的值。
- 如果未提供,则使用索引默认的 nprobe。
- 确保 nprobe > 0。
- 定义子搜索函数
auto sub_search_func = [this, k, nprobe, params](idx_t n,const float* x,float* distances,idx_t* labels,IndexIVFStats* ivf_stats) {...
};
定义一个局部 lambda 函数 sub_search_func,处理子查询任务。参数包括当前的查询向量、结果存储位置和统计信息。
内部实现的步骤:
量化查询向量:
quantizer->search(n, x, nprobe, coarse_dis.get(), idx.get(), params ? params->quantizer_params : nullptr);
使用量化器将查询向量分配到 nprobe 个倒排列表中。idx 保存分配的倒排列表索引。coarse_dis 保存量化后的距离。
倒排列表的预取:
invlists->prefetch_lists(idx.get(), n * nprobe);
预取倒排列表数据以提高内存访问性能。
实际搜索:
search_preassigned(n, x, k, idx.get(), coarse_dis.get(), distances, labels, false, params, ivf_stats);
在分配好的倒排列表中执行搜索,返回最近邻结果的距离和索引。
更新统计信息:
ivf_stats->quantization_time += t1 - t0;
ivf_stats->search_time += t2 - t0;
记录量化时间和搜索时间。
4. 选择并行模式
if ((parallel_mode & ~PARALLEL_MODE_NO_HEAP_INIT) == 0) {...
} else {sub_search_func(n, x, distances, labels, &indexIVF_stats);
}
根据 parallel_mode 决定并行模式:如果启用了并行模式,则使用 OpenMP 进行多线程查询。否则直接调用 sub_search_func 处理整个查询。
5. 并行查询
int nt = std::min(omp_get_max_threads(), int(n));
std::vector<IndexIVFStats> stats(nt);
std::mutex exception_mutex;
std::string exception_string;#pragma omp parallel for if (nt > 1)
for (idx_t slice = 0; slice < nt; slice++) {...
}
- 线程数量:设置线程数量为查询向量数和最大线程数的较小值。
- 分片查询:将查询向量分配到多个线程进行并行处理。
- 异常处理:捕获并记录线程中的异常。
- 统计合并:将各线程的统计结果合并到全局统计对象。
关键步骤总结
- 查询向量量化:使用量化器将查询向量映射到倒排列表。
- 倒排列表预取:优化内存访问以提高效率。
- 倒排列表搜索:在分配的倒排列表中执行精确搜索。
- 支持并行化:利用 OpenMP 将查询任务分片并行化处理。
函数作用
- 高效搜索:支持通过 nprobe 调整查询范围,平衡搜索速度和准确率。
- 并行优化:通过多线程实现大规模查询的加速。
- 灵活性:支持自定义搜索参数(如量化器配置)以适应不同场景。
适用场景
海量数据的最近邻搜索,例如向量化文档、推荐系统和图像检索
相关文章:
faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-7
流程 代码 void IndexIVF::search(idx_t n,const float* x,idx_t k,float* distances,idx_t* labels,const SearchParameters* params_in) const {FAISS_THROW_IF_NOT(k > 0);const IVFSearchParameters* params nullptr;if (params_in) {params dynamic_cast<const I…...
ORA-65198 PDB clone 时 不能新加datafile 以及hang的一个原因
create pluggable database XX from SS keystore identified by "YYY" parallel 32 service_name_convert( _srv, _srv); 20TB 4小时 update /* rule */ undo$ set name:2,file#:3,block#:4,status$:5,user#:6,undosqn:7,xactsqn:8,scnbas:9,scnwrp:10,inst#:11,…...
大秦朝历史
大秦朝是中国历史上一个虚构的朝代,通常被认为是秦朝的后继者。根据一些历史小说和影视作品的描述,大秦朝被描绘为一个强大的中央集权国家,统一了整个中国。大秦朝的帝王被描述为英明神武,开创了繁荣富强的盛世。 根据这些虚构的…...
docker部署工业操作系统基础环境手册
在 Docker 上安装最新的 TDengine 数据库并将数据文件和配置文件映射到宿主机,可以按照以下步骤操作: 一、Tdengine 篇章 1. 拉取最新的 TDengine 镜像 首先,确保你的 Docker 环境已安装并运行。然后,使用以下命令拉取 TDengine…...
算法 class 003
二进制表示数 8位 有符号二进制位,能表示正数128位 ,0 ~ 127(2的7次方减1) ,能表示负数128位 ,-1 ~ -128。 n 位有符号二进制位,一共能表示 2的n次放个数,正数为0 ~ (2的n-1次方) - 1(再减1&…...
gcc和gcc -c区别
gcc 和 gcc -c 之间的主要区别在于编译过程的不同阶段以及最终生成的输出文件类型。理解这两者的区别对于有效地管理和构建项目非常重要。 ### gcc(默认行为) 当你使用 gcc 编译器而没有指定 -c 选项时,GCC 会执行整个编译链的所有步骤&…...
从一次线上故障聊聊接口自动化测试
1、背景 3月初,运营同事配置了个还未上线的页面到网站首页 banner,导致用户点了报错。尽管这次很明确是运营人为操作失误引起的故障,但过往此类核心页面的访问异常,我们已不是第一次遇见。 从平台整体利益触发,我们各…...
工业大数据分析算法实战-day15
文章目录 day15特定数据类型的算法工业分析中的数据预处理工况划分数据缺失时间数据不连续强噪声大惯性系统趋势项消除 day15 今天是第15天,昨日是针对最优化算法、规则推理算法、系统辨识算法进行了阐述,今日主要是针对其他算法中的特定数据类型的算法…...
QLocalServer本地进程通信发送数据丢失部分数据丢失解决方案
问题说明 Qt使用QLocalServer进行本地进程通信,发现数据随机丢失。例如,我需要连续发送7个数据,如果连续调用socket的write接口,会引起数据随机丢失,导致数据不完整。 解决方案 我这里的解决方案是,将7个…...
0.gitlab ubuntu20.04 部署问题解决
安装依赖: ① sudo apt-get update 出现: 解决方式: 去 /etc/apt/sources.list.d 这个目录删除或注释对应的list文件 第三方软件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 这个目录 重新运行sudo apt-get update 安装…...
tomcat temp临时文件不清空,占用硬盘,jdk字体内存泄漏
JSP老旧项目迁移过来的代码,生成海报,会读取图片,读取字体文件,绘制图片,会生成大量临时文件,内存泄漏。 方案一,服务器定时删除temp临时文件夹 方案二,图片、字体改用静态类读取文件…...
元宇宙中的去中心化应用:Web3的未来角色
随着科技的快速发展,元宇宙已经成为了全球关注的焦点,成为一种新型的虚拟世界互动平台。与此同时,Web3作为新一代互联网技术,借助去中心化的理念,为元宇宙的发展提供了技术支撑。从虚拟互动到数字身份管理,…...
中关村科金智能客服机器人如何解决客户个性化需求与标准化服务之间的矛盾?
客户服务的个性化和标准化之间的矛盾一直是一个挑战。一方面,企业需要提供标准化的服务以保持运营效率和成本控制;另一方面,为了提升客户满意度和忠诚度,企业又必须满足客户的个性化需求。为此,中关村科金推出了智能客…...
【ROS2】坐标TF发布(动态)
1、创建目录 mkdir -p ~/ros/src/laoer_tf2、创建包 cd /home/laoer/ros/eg/src/cpp/laoer_tf ros2 pkg create --build-type ament_cmake laoer_tf \--dependencies rclcpp tf2_ros geometry_msgs \--license Apache-2.03、源码 3.1 TF消息TransformStamped 1)消息类型 …...
图解HTTP-HTTP状态码
状态码 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。 类别原因短语1XXInformational(信息状态码)接收的请求正在处理2XXSuccess(成功状态码)请求正常处理完毕4XXRedirection (重定向状态码)需要…...
SAP消息号 FD014 (抬头)没有指定国际标准货币代码 CNY
1、IDOC配置完成后, 2、业务下单-发货-开票(2张) 3、WE02 查看IDOC时发现 从报错看是货币代码设置问题。 4、解决: OY03 RMB和CNY同时勾选导致 RMB不勾选主要。...
GRUtopia:构建虚拟世界中的智能机器人社会
人工智能咨询培训老师叶梓 转载标明出处 人工智能讲师大模型讲师叶梓前沿技术分享:GRUtopia:构建虚拟世界中的智能机器人社会 随着Embodied AI(具身智能)领域的快速发展,对于能够在复杂环境中执行任务的机器人的需求日…...
华为:数字化转型只有“起点”,没有“终点”
上个月,我收到了一位朋友的私信,他询问我是否有关于华为数字化转型的资料。幸运的是,我手头正好收藏了一些,于是我便分享给他。 然后在昨天,他又再次联系我,并感慨:“如果当初我在进行企业数字…...
在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
00 两种可行方法分别是: 使用数组存储每一位数据并进行进位运算:通过将大数按位拆分成数组,然后实现逐位加法、进位等操作。使用符号变量进行计算:将数值分成低位和高位,分别用符号变量进行计算。 01:使用…...
STM32 与 AS608 指纹模块的调试与应用
前言 在嵌入式系统中,指纹识别作为一种生物识别技术,广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块,实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…...
腾讯PHP经典面试题(附答案)
腾讯PHP经典面试题(附答案) PHP开发工程师笔试试卷 姓名:PHP 一、PHP开发部分 1.合并两个数组有几种方式,试比较它们的异同 答: 1、array_merge() 2、’’ 3、array_merge_recursive array_merge 简单的合并数…...
LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)
一、引言 1.1 医疗数据挖掘的重要性与挑战 在当今数字化医疗时代,医疗数据呈爆炸式增长,这些数据蕴含着丰富的信息,对医疗决策具有极为重要的意义。通过对医疗数据的深入挖掘,可以发现潜在的疾病模式、治疗效果关联以及患者的健康风险因素,从而为精准医疗、个性化治疗方…...
【PCIe 总线及设备入门学习专栏 1.1 -- PCIe 基础知识 lane和link介绍】
文章目录 OverivewLane 和 LinkRC 和 RPPCIe controllerPCIE ControllerPHY模块 Inbound 和 OutboundPCIe transaction modelPIODMAP2P Overivew PCIe,即PCI-Express总线(Peripheral Component Interconnect Express),是一种高速…...
PCDN 适合哪些人群?
家用宽带用户:对于家中有宽带,且宽带闲置时间较多的用户来说,PCDN是一个非常好的赚钱方式。只要你有足够的带宽和一台稳定的设备,就可以轻松参与。 小型网络运营者:如果你是小型网络运营者,拥有大量的闲置带宽资源PCDN 可以帮助你…...
C++之红黑树模拟实现
目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现,在此基础上,我们本期将学习另一个数据结构-…...
一分钟快速解读LEED绿色建筑认证
一分钟快速解读LEED绿色建筑认证——引领未来建筑绿色革命的风向标 LEED,全称为“Leadership in Energy and Environmental Design”,是美国绿色建筑委员会(USGBC)开发并推广的一套国际公认的绿色建筑评估体系。它如同一座灯塔&am…...
C# 语法糖集锦
文章目录 1、自动属性(Auto - Properties)2、对象和集合初始化器(Object and Collection Initializers)3、匿名类型(Anonymous Types)4、扩展方法(Extension Methods)5、Lambda 表达式(Lambda Expressions)6、空合并运算符(??)和空条件运算符(?.)7、隐式类型数…...
centos制作离线安装包
目录 1.yumdownloader与repotrack怎么选择? yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择? yumdownloader --resolve 和 repotrack 都是与 YUM(Yellowdog Updater Modified…...
HTML5 学习资源
HTML5 学习资源 学习HTML5的资源丰富多样,以下是一些推荐的在线教程、书籍和社区论坛,帮助你更好地掌握HTML5。 11.1 在线教程和课程 MDN Web Docs: MDN HTML 教程提供详细的HTML5文档和实例,适合各个水平的开发者。 W3Schools…...
大模型(LLM)提示工程(Prompt Engineering)初识
大模型提示工程(Prompt Engineering)是指设计和优化给定任务的输入提示,以便从大型语言模型(如GPT-4、GPT-3等)中获得最佳输出。其核心目标是通过合理设计输入内容(提示词或提示结构)࿰…...
uni-app 统一请求处理 请求拦截器 响应拦截器 请求封装
封装API接口 import {http} from ../utils/request.js export function login(code){return http({url:/wx/getSession,method: GET,data:{code}}) }调用接口 import {login,test,phoneMessage,updateAvatar} from ../../api/user.js function userLogin(){ login(code.value…...
web 渗透学习指南——初学者防入狱篇
目录 一、学习方向和基础知识二、知识点详细总结三、学习流程和典型案例 案例1:SQL注入漏洞检测与利用案例2:XSS攻击检测与利用案例3:文件上传漏洞利用案例4:CSRF攻击实现 四、常用工具推荐和使用方法五、初学者实用学习资源六、渗…...
卷积神经网络入门指南:从原理到实践
目录 1 CNN的发展历史 2 CNN的基本原理 3 CNN核心组件 3.1 卷积操作基础 3.2 卷积层详解 3.3 高级卷积操作 3.3.1 分组卷积(Group Convolution) 3.3.2 深度可分离卷积(Depthwise Separable Convolution): 3.3 池…...
vscode添加全局宏定义
利用vscode编辑代码时,设置了禁用非活动区域着色后,在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色,想查看代码不是很方便。如下图: 一 解决: 在vscode中添加全局宏定义。 二 步骤:…...
Mysql InnoDB存储引擎中聚簇索引和非聚簇索引的区别
最核心的区别还是从需求角度来看比较好: 1.创建索引时 在创建表时,InnoDB存储引擎会根据不同情况,选择不同的列作为索引 (1)有主键,通过主键作为聚簇索引的索引键(key) (2…...
使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效
使用vcpkg安装opencv>4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效\无法查找或打开 至少从2024年开始,发布的vcpkg默认安装的opencv版本都是4.x版。4.8版本及以前,vcpkg编译后的opencv头文件目录是*/vcpkg/x64-win…...
opencv sdk for java中提示无stiching模块接口的问题
1、问题介绍 安卓项目中有新的需求,在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时,出现大量报错,如下截图所示 实际上,其他opencv的接口函数 例如 core dnn等都能正常使用,直觉上初步怀疑 ope…...
大恒相机开发(2)—Python软触发调用采集图像
大恒相机开发(2)—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码: # version:…...
gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘
首次克隆仓库,失效了,上网查方法,都说是网络代理的问题,各种清理网络代理后都无效,去问同事: 先前都是直接复制的网页url当做远端url,或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…...
代码随想录day27 贪心1
题目:455.分发饼干 376.摆动序列 53.最大子序和 需要重做:全部 贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。 理论基础 贪心的…...
Hive 部署
1 下载并安装 1.1 Hadoop安装 参考另一篇博客:Hadoop 部署 1.2 安装包下载 可通过下面网站下载: 官网:https://dlcdn.apache.org/hive/。清华源:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…...
SDK 指南
在前端开发中,SDK(Software Development Kit,软件开发工具包)是一个用于帮助开发者在特定平台、框架或技术栈中实现某些功能的工具集。 1. SDK 是什么? SDK 是一种开发工具包,它提供了开发人员实现某些功…...
unity Default constructor not found for type 的问题
文章目录 前言一、怎么解决?总结 前言 突然有一次打包PC的包出来,JSON就无法正常获取,后来找到原因: 应该是设置渲染等级相关的东西,不小心把剥离等级设置套高了。 一般情况不会出现,向我这种老爱unity 编…...
富文本编辑器实现表单非空校验
首先尝试使用form的rules规则去验证,发现未生效; <el-form ref"form" :disabled"readonly" :model"form" :rules"rules" label-width"120px"><el-form-item label"内容" prop&quo…...
使用uniapp开发微信小程序-框架搭建
最近要开发一个小程序,为了降低学习成本,最后还是选择使用uniapp来开发,但是由于电脑性能不行,实在不想多跑一个应用程序,就简单搭建了一个可以用vscode跑的uniapp项目。 项目整体技术栈:vue3 pinia type…...
华为浏览器(HuaweiBrowser),简约高效上网更轻松
华为浏览器是一款由华为公司自主研发的网页浏览工具,凭借其独特的设计理念和优质的用户体验,正在吸引越来越多的用户关注。这款基于Chromium技术打造的浏览器不仅继承了Chrome的高性能特质,更融入了华为自身的创新元素,为用户打造…...
SQLite
文章目录 1、什么是信息?2、 数据库模型3、sqLite 数据库4、 SQL 语句基础5、对数据库文件 SQL 语句:6、创建表:create 语句7、创建表:create 语句(设置主键)8、查看表: .table9、修改表: alter语句10、删除表:drop table 语句11、插入新行:insert into 语句(全部赋值)12、插入…...
uniapp下拉选择组件
目录 背景 实现思路 代码实现 配置项 使用 尾巴 背景 最近遇到一个这样的需求,在输入框中输入关键字,通过接口查询到结果之后,以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库,没找到符合条件的…...
解决 vue3 中 echarts图表在el-dialog中显示问题
原因: 第一次点开不显示图表,第二次点开虽然显示图表,但是图表挤在一起,页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成,而你的 echarts 组件已经开始尝试渲染图…...
WebSSH:基于Go实现的高效Web SSH客户端指南
WebSSH:基于Go实现的高效Web SSH客户端指南 WebSSH 功能强大,Go 实现的一个WebSSH,支持文件上传下载 [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/webssh1/WebSSH 项目基础介绍: WebSSH是一个由Golang编写的高效…...