faq
产品常见问题(Product_faq)

产品常见问题解答

Milvus 的价格是多少?

Milvus 是一个 100%免费的开源项目。

在使用 Milvus 进行生产或分发时,请遵守 Apache License 2.0 (opens in a new tab)

作为 Milvus 背后的公司,Zilliz 还为那些不想构建和维护自己的分布式实例的用户提供了一个完全托管的云版本的平台。Zilliz Cloud (opens in a new tab) 自动维护数据可靠性,并允许用户按实际使用情况付费。

Milvus 支持非 x86 架构吗?

Milvus 无法安装或运行在非 x86 平台上。

要运行 Milvus,你的 CPU 必须支持以下指令集之一:SSE4.2,AVX,AVX2,AVX512。 这些都是专门为 x86 设计的 SIMD 指令集。

Milvus 能处理的最大数据集有多大?

从理论上讲,Milvus 能处理的最大数据集大小取决于运行它的硬件,具体来说是系统内存和存储:

  • Milvus 在运行查询之前将所有指定的集合和分区加载到内存中。因此,内存大小决定了 Milvus 可以查询的数据量的最大限制。
  • 当新实体和与集合相关的模式(当前仅支持 MinIO 作为数据持久化)被添加到 Milvus 中时,系统存储决定了插入数据的最大允许大小。

Milvus 将数据存储在哪里?

Milvus 处理两种类型的数据:插入数据和元数据。

插入数据,包括向量数据、标量数据和特定于集合的模式,以增量日志的形式存储在持久化存储中。Milvus 支持多种对象存储后端,包括 MinIO (opens in a new tab)AWS S3 (opens in a new tab)、[Google Cloud Storage](https://cloud.google.com/storage?hl=en#object (opens in a new tab) storage-for-companies-of-all-sizes) (GCS)、Azure Blob Storage (opens in a new tab)Alibaba Cloud OSS (opens in a new tab)腾讯云对象存储 (opens in a new tab) (COS)。

元数据是在 Milvus 中生成的。每个 Milvus 模块都有自己的元数据存储在 etcd 中。

为什么在 etcd 中没有向量数据?

etcd 存储 Milvus 模块的元数据,MinIO 存储实体。

Milvus 支持同时插入和搜索数据吗?

是的。插入操作和查询操作由两个相互独立的模块处理。从客户端的角度来看,插入操作在插入的数据进入消息队列时完成。然而,在数据被加载到查询节点之前,插入的数据是不可搜索的。如果段的大小未达到建立索引的阈值(默认为 512 MB),Milvus 将自动使用暴力搜索,查询性能可能会下降。

可以在 Milvus 中插入具有重复主键的向量吗?

可以。Milvus 不会检查向量主键是否重复。

当插入具有重复主键的向量时,Milvus 将其视为更新操作吗?

不会。Milvus 目前不支持更新操作,也不会检查实体主键是否重复。你需要确保实体主键是唯一的,如果它们不是唯一的,Milvus 可能包含具有重复主键的多个实体。

如果出现这种情况,查询时将返回哪个数据副本将是一个未知行为。此限制将在将来的版本中修复。

自定义实体主键的最大长度是多少?

实体主键必须是非负 64 位整数。

单次插入操作最多可以添加多少数据量?

插入操作的大小不能超过 1024 MB。这是由 gRPC 所强加的限制。

集合的大小是否会影响在特定分区中进行搜索时的查询性能?

不会。如果指定了搜索的分区,Milvus 只会搜索指定的分区。

当指定了分区进行搜索时,Milvus 是否加载整个集合?

否。Milvus 的行为各不相同。在搜索之前,数据必须加载到内存中。

  • 如果你知道数据所在的分区,可以先调用 load_partition() 加载所需的分区,然后在 search() 方法调用中指定分区。
  • 如果你不知道确切的分区,请在调用 search() 之前调用 load_collection()
  • 如果在搜索之前未加载集合或分区,Milvus 将返回错误。

是否可以在插入向量后创建索引?

可以。如果在 create_index() 之前对一个集合建立了索引,Milvus 将自动为后续插入的向量建立索引。然而,Milvus 只有在新插入的向量填满一个完整的段且新创建的索引文件与先前的索引文件分离时才建立索引。

FLAT 和 IVF_FLAT 索引有什么区别?

IVF_FLAT 索引将向量空间划分为列表聚类。在默认的列表值 16,384 下,Milvus 将比较目标向量与所有 16,384 个聚类中心之间的距离,以返回最近的聚类。然后,Milvus 将比较目标向量与所选聚类中的向量之间的距离,以获取最近的向量。与 IVF_FLAT 不同,FLAT 直接比较目标向量与其他所有向量之间的距离。

当向量的总数约等于 nlist 时,IVF_FLAT 和 FLAT 在计算要求和搜索性能方面的差距很小。然而,当向量的数量超过 nlist 的两倍或更多时,IVF_FLAT 开始展示出性能优势。

更多信息请参见 向量索引

Milvus 如何刷新数据?

当插入的数据被加载到消息队列时,Milvus 会返回成功。然而,数据尚未刷新到磁盘。然后 Milvus 的数据节点将消息队列中的数据作为增量日志写入持久化存储。如果调用 flush(),数据节点将被强制立即将消息队列中的所有数据写入持久化存储。

什么是归一化?为什么需要归一化?

归一化是指将向量转换为单位长度。归一化是为了消除向量长度对距离度量的影响,确保向量之间的相似度仅受方向角度的影响,而不受向量长度的影响。在某些应用中,特征向量的幅度不相关,只有方向才重要,这时候归一化就非常必要了。

规范化是指将向量转换为其范数等于 1 的过程。如果使用内积来计算向量相似度,则必须对向量进行归一化。归一化后,内积等于余弦相似度。

更多信息请参见 [Wikipedia] (https://en.wikipedia.org/wiki/Unit_vector)。 (opens in a new tab)

为什么欧几里得距离(L2)和内积(IP)返回不同的结果?

对于归一化的向量,欧几里得距离(L2)在数学上等价于内积(IP)。如果这些相似性度量返回不同的结果,请检查你的向量是否已归一化。

Milvus 中的收藏和分区的总数有限制吗?

有的。你可以在 Milvus 实例中创建多达 65,535 个收藏。在计算现有收藏的数量时,Milvus 会计算所有具有片段和分区的收藏。

例如,假设你已经创建了 100 个收藏,其中 60 个收藏有 2 个片段和 4 个分区,其余 40 个收藏有 1 个片段和 12 个分区。可以计算出当前收藏的数量:

60 * 2 * 4 + 40 * 1 * 12 = 960

为什么我在搜索 topk 向量时返回的向量数量较少?

在 Milvus 支持的索引中,IVF_FLAT 和 IVF_SQ8 实现了 k-means 聚类方法。一个数据空间被划分为 nlist 个聚类,并且插入的向量被分布到这些聚类中。然后,Milvus 选择 nprobe 个最近的聚类,并比较目标向量与所选聚类中的所有向量之间的距离,以返回最终结果。

如果 nlisttopk 都很大,而 nprobe 很小,则 nprobe 聚类中的向量数量可能小于 k。因此,当你搜索 topk 个最近的向量时,返回的向量数量少于 k

为了避免这种情况,请尝试将 nprobe 设置得更大,而将 nlistk 设置得更小。

更多信息请参见 [Vector Index] (index.md)。

Milvus 支持的最大向量维度是多少?

Milvus 可以管理具有多达 32,768 个维度的向量。

Milvus 支持 Apple M1 CPU 吗?

当前的 Milvus 版本不支持 Apple M1 CPU。

Milvus 在主键字段上支持哪些数据类型?

在当前版本中,Milvus 支持 INT64 和字符串。

Milvus 可扩展吗?

是的。你可以通过在 Kubernetes 上使用 Helm Chart 部署多个节点的 Milvus 集群。有关更多指示,请参见 [扩展指南] (scaleout.md)。

查询是否在内存中执行?什么是增量数据和历史数据?

是的。当查询请求到来时,Milvus 通过将增量数据和历史数据加载到内存中来搜索。增量数据位于不断增长的段中,在它们达到持久存储引擎的阈值之前,它们在内存中缓冲。而历史数据来自已封存的段,存储在对象存储中。增量数据和历史数据共同构成要搜索的整个数据集。

Milvus 是否支持并发搜索?

是的。对于同一收藏的查询,Milvus 同时搜索增量数据和历史数据。但是,对于不同收藏的查询按顺序进行。尽管历史数据可能是一个非常庞大的数据集,但对历史数据的搜索相对更耗时,本质上是按顺序执行的。

对应的收藏删除后,MinIO 中的数据为什么仍然保留?

MinIO 中的数据保留一段时间是为了方便数据回滚。

Milvus 支持除了 Pulsar 之外的其他消息引擎吗?

是的。在 Milvus 2.1.0 中支持 Kafka。

搜索和查询之间有什么区别?

在 Milvus 中,向量相似度搜索根据相似度计算和向量索引加速检索向量。与向量相似度搜索不同,向量查询通过布尔表达式基于标量过滤检索向量。布尔表达式对标量字段或主键字段进行过滤,并检索与过滤器匹配的所有结果。在查询中,不涉及相似性度量和向量索引。

为什么在 Milvus 中浮点向量值的精度为 7 位小数?

Milvus 支持将向量存储为 Float32 数组。Float32 值的精度为 7 位小数。即使是 Float64 值,例如 1.3476964684980388,Milvus 也会将其存储为 1.347696。因此,当你从 Milvus 检索此类向量时,Float64 值的精度会丢失。

Milvus 如何处理向量数据类型和精度?

Milvus 支持二进制、Float32、Float16 和 BFloat16 向量类型。

  • 二进制向量:将二进制数据存储为 0 和 1 的序列,用于图像处理和信息检索。
  • Float32 向量:默认存储,精度约为 7 位小数。即使是 Float64 值也会以 Float32 的精度存储,在检索时可能会导致精度损失。
  • Float16 和 BFloat16 向量:提供降低的精度和存储空间。Float16 适用于带宽和存储受限的应用程序,而 BFloat16 在平衡范围和效率方面具有优势,通常在深度学习中用于减少计算要求而不会对准确性产生显着影响。

仍有问题?

你可以: