产品常见问题
Milvus 的成本是多少?
Milvus 是一个 100% 免费的开源项目。
在将 Milvus 用于生产或发布目的时,请遵守Apache License 2.0。
Milvus 背后的公司 Zilliz 还为那些不想构建和维护自己的分布式实例的用户提供完全托管的云版平台。Zilliz 云平台可自动维护数据的可靠性,用户只需支付使用费用。
Milvus 支持非 x86 架构吗?
Milvus不能在非x86平台上安装或运行。
您的 CPU 必须支持以下指令集之一,才能运行 Milvus:SSE4.2、AVX、AVX2、AVX512。这些都是 x86 专用 SIMD 指令集。
Milvus 能处理的最大数据集大小是多少?
从理论上讲,Milvus 能处理的最大数据集大小取决于其运行的硬件,特别是系统内存和存储:
- 在运行查询之前,Milvus 会将所有指定的集合和分区加载到内存中。因此,内存大小决定了 Milvus 能查询的最大数据量。
- 当新实体和与集合相关的模式(目前只支持 MinIO 用于数据持久化)被添加到 Milvus 时,系统存储将决定插入数据的最大允许大小。
Milvus 在哪里存储数据?
Milvus 处理两种类型的数据:插入数据和元数据。
插入数据(包括向量数据、标量数据和特定于集合的模式)以增量日志的形式存储在持久存储中。Milvus 支持多种对象存储后端,包括MinIO、AWS S3、谷歌云 存储(GCS)、Azure Blob 存储、阿里云 OSS 和腾讯云对象存储(COS)。
元数据在 Milvus 内部生成。每个 Milvus 模块都有自己的元数据,这些元数据存储在 etcd 中。
为什么 etcd 中没有向量数据?
etcd 存储 Milvus 模块元数据;MinIO 存储实体。
Milvus 支持同时插入和搜索数据吗?
是的。插入操作和查询操作由两个相互独立的模块处理。从客户端的角度来看,当插入的数据进入消息队列时,插入操作就完成了。但是,插入的数据在加载到查询节点之前是不可查询的。如果数据段的大小没有达到建立索引的阈值(默认为 512 MB),Milvus 就会采用暴力搜索,查询性能可能会降低。
能否在 Milvus 中插入主键重复的向量?
可以。Milvus 不会检查向量主键是否重复。
插入主键重复的向量时,Milvus 是否将其视为更新操作?
Milvus 目前不支持更新操作,也不检查实体主键是否重复。你有责任确保实体主键是唯一的,如果它们不是唯一的,Milvus 可能包含多个主键重复的实体。
如果出现这种情况,查询时将返回哪个数据副本仍是未知行为。这一限制将在今后的版本中修复。
自定义实体主键的最大长度是多少?
实体主键必须是非负 64 位整数。
每次插入操作可添加的最大数据量是多少?
插入操作的大小不得超过 1,024 MB。这是 gRPC 规定的限制。
在特定分区中搜索时,集合大小会影响查询性能吗?
如果为搜索指定了分区,Milvus 只搜索指定的分区。
为搜索指定分区时,Milvus 会加载整个集合吗?
不会。Milvus 的行为各不相同。数据必须在搜索前加载到内存中。
- 如果您知道数据位于哪个分区,请调用
load_partition()
加载目标分区,然后在search()
方法调用中指定分区。 - 如果不知道确切的分区,请先调用
load_collection()
,然后再调用search()
。 - 如果在搜索前没有加载集合或分区,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 的过程。如果使用内积来计算向量的相似性,则必须对向量进行归一化。归一化后,内积等于余弦相似度。
更多信息,请参见维基百科。
为什么欧氏距离(L2)和内积(IP)返回的结果不同?
对于归一化向量,欧氏距离 (L2) 在数学上等同于内积 (IP)。如果这些相似度指标返回的结果不同,请检查您的向量是否已归一化。
Milvus 的集合和分区总数有限制吗?
有。在 Milvus 实例中最多可以创建 65,535 个集合。在计算现有集合数量时,Milvus 会计算所有包含分片和分区的集合。
例如,假设您已经创建了 100 个集合,其中 60 个集合有 2 个分块和 4 个分区,其余 40 个集合有 1 个分块和 12 个分区。当前的集合数可以计算为
60 * 2 * 4 + 40 * 1 * 12 = 960
在搜索topk
向量时,为什么得到的向量少于 k 个?
在 Milvus 支持的索引中,IVF_FLAT 和 IVF_SQ8 实现了 k-means 聚类方法。数据空间被划分为nlist
个簇,插入的向量被分配到这些簇中。然后,Milvus 会选择nprobe
最近的簇,并比较目标向量与所选簇中所有向量之间的距离,返回最终结果。
如果nlist
和topk
较大,而 nprobe 较小,则 nprobe 簇中的向量数量可能少于k
。因此,当搜索topk
最近的向量时,返回的向量数量少于k
。
为避免这种情况,可尝试将nprobe
设置得大一些,将nlist
和k
设置得小一些。
更多信息,请参阅 "向量索引"。
Milvus 支持的最大向量维度是多少?
Milvus 默认最多可管理 32,768 维的向量。你可以增加Proxy.maxDimension
的值,以允许更大维度的向量。
Milvus 支持苹果 M1 CPU 吗?
当前的 Milvus 版本不支持苹果 M1 CPU。
Milvus 支持主键字段的哪些数据类型?
在当前版本中,Milvus 支持 INT64 和字符串。
Milvus 可以扩展吗?
可以。你可以在 Kubernetes 上通过 Helm Chart 部署多节点的 Milvus 集群。更多说明请参阅《扩展指南》。
查询是否在内存中执行?什么是增量数据和历史数据?
是的。当收到查询请求时,Milvus 会将增量数据和历史数据加载到内存中进行搜索。增量数据是不断增长的数据段,它们在达到在存储引擎中持久化的阈值之前会被缓冲到内存中,而历史数据则来自存储在对象存储中的密封数据段。增量数据和历史数据共同构成了要搜索的整个数据集。
Milvus 是否支持并发搜索?
可以。对于同一数据集的查询,Milvus 会同时搜索增量数据和历史数据。不过,对不同数据集的查询是串联进行的。历史数据可能是一个极其庞大的数据集,因此对历史数据的搜索相对更耗时,而且基本上是串联进行的。
为什么 MinIO 中的数据会在相应的数据集被删除后保留下来?
MinIO 中的数据被设计为保留一段时间,以方便数据回滚。
除了 Pulsar 之外,Milvus 还支持其他消息引擎吗?
支持。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 则兼顾了范围和效率,常用于深度学习,在不显著影响精度的情况下降低计算要求。
Milvus 是否支持为标量或向量字段指定默认值?
目前,Milvus 2.4.x 不支持为标量或向量字段指定默认值。该功能计划在未来版本中推出。
仍有问题?
您可以