向量数据库FAISS之一:官方简单教程

1.安装

1.conda安装

# CPU-only version --> Linux (x86_64 and arm64), OSX (arm64 only), and Windows (x86_64)
$ conda install -c pytorch faiss-cpu=1.8.0# GPU(+CPU) version --> Linux (x86_64 only) for CUDA 11.4 and 12.1
$ conda install -c pytorch -c nvidia faiss-gpu=1.8.0# GPU(+CPU) version with NVIDIA RAFT --> Linux (x86_64 only) for CUDA 11.8 and 12.1.
$ conda install -c pytorch -c nvidia -c rapidsai -c conda-forge faiss-gpu-raft=1.8.0
# CPU version
$ conda install -c conda-forge faiss-cpu# GPU version
$ conda install -c conda-forge faiss-gpu

2.总览

  • 什么是相似度搜索

    • 给出一组向量d维 { x 1 , … , x n } \{x_1, …,x_n \} {x1,,xn},Fassi 在 RAM 中建立数据结构。

    • 结构构建完成后,如果给定一个新的 d 维度向量 x 时,它就能高效地执行运算:

      i = a r g m i n i ∣ ∣ x − x i ∣ ∣ i = argmin_i||x - x_i|| i=argmini∣∣xxi∣∣

      • || · || 是 L2 距离
    • Faiss 术语中,数据结构是一个索引,一个具有 add 方法去增加 x i x_i xi 向量的对象

    • Note : x i x_i xi 的维度固定

    • 计算 argmin 就是对索引进行 search 操作。

  • Fsiss 还可以

    • 还可以返回第 k 相似的邻居
    • 一次性查找几个向量,而不是一次一个
    • 以精度黄速度。以 10% 的精度使用快 10% 的方法或 少 10 倍的内存
    • 使用最大化内积搜索 a r g m a x i < x , x i > argmax_i<x, x_i> argmaxi<x,xi> 代替最小化欧式搜索
    • 存索引到磁盘而不是 RAM
    • 检索二进制向量而不是浮点向量

    在这里插入图片描述

2.开始使用

1.获取数据

Faiss 处理固定维度 d 的向量集合,通常为几十到几百。

这些集合可以存储在矩阵中。

我们假设行优先存储,即向量编号 i 的第 j 个分量存储在矩阵的第 i 行、j 列中。

Faiss 仅使用 32 位浮点矩阵。

需要两个指标

xb 给数据库:包含所有的必须被索引化的、需要去查找的 向量

xq 给查询向量:需要去查找最接近的邻居。

在下面的示例中,我们将使用在 d=64 维度上形成均匀分布的向量。只是为了好玩,我们沿着第一个维度添加取决于向量索引的小平移。

import numpy as np
d = 64
nb = 100_000
nq = 10_000
np.random.seed(1234)
xb = np.random.random((nb, d)).astype("float32")
xb[:, 0] += np.arange(nb) / 1000
xq = np.random.random((nq, d)).astype("float32")
xq[:, 0] += np.arange(nq) / 1000print(xb.shape)
print(xq.shape)
'''
(100000, 64)
(10000, 64)
'''

2.建造索引并加入向量

Faiss 是围绕 Index 对象构建的。

它封装了数据库向量集,并可选择对它们进行预处理以提高搜索效率。

索引有很多种类型,我们将使用最简单的版本,仅对它们执行强力的 L2 距离搜索:IndexFlatL2

  • 当 index 被建立和训练后,两个操作能在索引上执行:addsearch
    • 为了添加元素给 index,需要在 xb 上调用 add。也可以展示 index 的两个状态变量:
      • is_trained: 指向是否需要训练
      • ntotal: 索引的向量的总数
import faiss
index = faiss.IndexFlatL2(d)
print(index.is_trained)
index.add(xb)
print(index.ntotal)
'''
True
100000
'''

3.Searching

最基本的搜索操作能在 index 上执行,通过 knn 搜索实现。

k = 4
D, I = index.search(xb[:5], k)
print(I)
print(D)
'''
[[  0 393 363  78][  1 555 277 364][  2 304 101  13][  3 173  18 182][  4 288 370 531]]
[[0.        7.1751738 7.20763   7.2511625][0.        6.323565  6.684581  6.799946 ][0.        5.7964087 6.391736  7.2815123][0.        7.2779055 7.527987  7.6628466][0.        6.7638035 7.2951202 7.3688145]]'''
  • D:距离
  • I:索引
    • I[0] = [0, 393, 363, 78] 表示查询点 0 的最近邻点的索引:
      •最近的是自身,索引为 0。
      •第二个最近邻是索引为 393 的点。
      •第三个最近邻是索引为 363 的点。
      •第四个最近邻是索引为 78 的点。

3.更快的搜索

  1. 为了加快搜索速度,可以将数据集分段。我们在 d 维空间中定义 Voronoi 单元,每个数据库向量落在其中一个单元中。
    在搜索时,仅将查询 x 所在单元中包含的数据库向量 y 以及一些相邻的向量与查询向量进行比较。
  2. 这是通过 IndexIVFFlat 索引实现的。这种索引需要一个训练阶段,可以在任何与数据库向量分布相同的向量集合上进行。
  3. IndexIVFFlat 还需要另一个索引,即量化器,它将向量分配给 Voronoi 单元。每个单元都由一个质心定义,找到向量所属的 Voronoi 单元就是在质心集中找到该向量的最近邻居。
    这是另一个索引的任务,该索引通常是 IndexFlatL2。
  4. search 有两个参数
    1. nlist:cells 数量
    2. nprobe:搜索时要访问的 cells 数量(nlist 之外)
nlist = 100
k = 4
quantizer = faiss.IndexFlatL2(d)  # the other index
index = faiss.IndexIVFFlat(quantizer, d, nlist)
assert not index.is_trained
index.train(xb)
assert index.is_trainedindex.add(xb)                  # add may be a bit slower as well
D, I = index.search(xq, k)     # actual search
print(I[-5:])                  # neighbors of the 5 last queries
index.nprobe = 10              # default nprobe is 1, try a few more
D, I = index.search(xq, k)
print(I[-5:])                  # neighbors of the 5 last queries

4.更低的内存占用

1.如何所见内存呢?

正如我们看见的,IndexFlatL2 和 IndexIVFFlat 都存储全部的向量。

为了扩展到非常大的数据集,Faiss 提供了基于乘积量化的有损压缩来压缩存储的向量的变体。

向量仍然存储在 Voronoi 单元中,但它们的大小减小到可配置的字节数 m(d 必须是 m 的倍数)。

nlist = 100
m = 8                             # number of subquantizers
k = 4
quantizer = faiss.IndexFlatL2(d)  # this remains the same
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)# 8 specifies that each sub-vector is encoded as 8 bits
index.train(xb)
index.add(xb)
D, I = index.search(xb[:5], k) # sanity check
print(I)
print(D)
index.nprobe = 10              # make comparable with experiment above
D, I = index.search(xq, k)     # search
print(I[-5:])

5.运行在 GPU 上

  • 使用单个GPU
res = faiss.StandardGpuResources()  # use a single GPU
  • 把 cpu 上的资源放到 GPU 上
# build a flat (CPU) index
index_flat = faiss.IndexFlatL2(d)
# make it into a gpu index
gpu_index_flat = faiss.index_cpu_to_gpu(res, 0, index_flat)
  • 用法和在CPU上一样
gpu_index_flat.add(xb)         # add vectors to the index
print(gpu_index_flat.ntotal)k = 4                          # we want to see 4 nearest neighbors
D, I = gpu_index_flat.search(xq, k)  # actual search
print(I[:5])                   # neighbors of the 5 first queries
print(I[-5:])                  # neighbors of the 5 last queries
  • 多GPU情况
ngpus = faiss.get_num_gpus()print("number of GPUs:", ngpus)cpu_index = faiss.IndexFlatL2(d)gpu_index = faiss.index_cpu_to_all_gpus(  # build the indexcpu_index
)gpu_index.add(xb)              # add vectors to the index
print(gpu_index.ntotal)k = 4                          # we want to see 4 nearest neighbors
D, I = gpu_index.search(xq, k) # actual search
print(I[:5])                   # neighbors of the 5 first queries
print(I[-5:])                  # neighbors of the 5 last queries

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用&#xff0c;越来越多的开发者希望在前端直接运行机器学习模型&#xff0c;从而减少对后端的依赖&#xff0c;并提升用户体验。Transformer.js 是一个专为前端环境设计的框架&#xff0c;它支持运行基于 Transformer 架构的深度学习模型&#xff0c;尤其是…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么&#xff1f; HTTP 是超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些&#xff1f; …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题 1.2概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机物理内存存储逻辑上连续的数据 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候&#xff0c;需要用到百度站长平台&#xff08;资源平台&#xff09;的工具&#xff0c;在站长工具中【普通收录】-【资源提交】-【API提交】这个功能&#xff0c;对网站的抓取进行一个提交。 这里估计很多站长就有疑问&#xff0c;如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具&#xff0c;是由JAVA开发而成 2. Jenkins是一个调度平台&#xff0c;本身不处理任何事情&#xff0c;调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature&#xff0c;AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了&#xff0c;这次瞄准了量子计算领域。 今天凌晨&#xff0c;新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

Unable to find image ‘hello-world:latest‘ locally

网上对于这个问题的解答有很多了&#xff0c;我尝试了后并有解决&#xff0c;最后发现重启指令并没有使用sudo导致的。这里写一下总的解决方法&#xff1a; 1 查看是否已经有了hello-world sudo docker info如果有hello-world&#xff0c;就先删除 sudo docker rmi hello-w…

Web3.0安全开发实践:Clarity最佳实践总结

在过去的一段时间里&#xff0c;CertiK团队对比特币生态系统及其发展进行了深入研究。同时&#xff0c;团队还审计了多个比特币项目以及基于不同编程语言的智能合约&#xff0c;包括OKX的BRC-20钱包和MVC DAO的sCrypt智能合约实现。 现在&#xff0c;我们的研究重点转向了Clar…

Chrome离线安装包下载

1、问Chrome的官网&#xff1a;https://www.google.cn/chrome/ 直接下载的是在线安装包&#xff0c;安装需要联网。 2、如果需要在无法联网的设备上安装Chrome&#xff0c;需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址&#xff1a;https://www.google.c…

【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。 如果 Alice 能赢得这场游…