免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector
背景介绍
量化(Quantization)是向量检索技术中一种常用的优化方法,通过一定程度的精度(召回率)损失,来换取性能的大幅度提升,以及内存占用(索引文件大小)大幅度降低。
数据压缩是将一串模拟数据或非常高速的离散数据转换为相对低速的数据流,用于在数字通信链路上进行通信或存储在数字存储器中。随着数字通信和安全通信变得越来越重要,数据压缩的理论和实践得到了越来越多的关注。虽然在许多系统中带宽相对廉价,例如光纤和电缆网络,但在大多数系统中,用户希望传输或存储的信息量不断增长,这就需要对通信或存储介质进行某种形式的压缩,以实现高效、安全和可靠的使用。
一个典型的例子是图像数据,简单的方案所需的比特率对于许多通信链路或存储设备来说都太大。另一个需要压缩的例子源于以下事实:如果使用由采样器和标量量化器组成的简单PCM系统对语音进行数字化,得到的信号的带宽将不再足够小,以适应普通电话通道。也就是说,数字化(可能出于安全性或可靠性的考虑)导致了带宽的扩展。因此,如果要使用原始的通信信道,就需要进行数据压缩。
图像压缩和语音压缩(通常被称为图像编码和语音编码)是当前最重要的数据压缩应用之一。它们也是最有趣的研究对象之一,因为经验表明,这两种类型的数据都具有足够的结构,可以通过足够复杂的编码实现相当大的压缩。将相对高速的数据转换为较低速的数据几乎总会导致保真度降低或失真增加。因此,数据压缩的一个基本目标是在给定比特率下获得尽可能好的保真度,或者等效地说,对于给定的保真度,尽量减小所需的比特率。
向量检索服务DashVector支持向量的动态量化,用户仅需在新建Collection时选择对应的量化策略,即可无感的使用量化功能。
开启动态量化
前提条件
- 已创建Cluster:创建Cluster。
- 已获得API-KEY:API-KEY管理。
- 已安装最新版SDK:安装DashVector SDK。
代码示例
说明
- 需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。
- Cluster Endpoint,可在控制台“Cluster详情”中查看。
import dashvector import numpy as np client = dashvector.Client( api_key='YOUR_API_KEY', endpoint='YOUR_CLUSTER_ENDPOINT' ) assert client # 创建带有量化策略的collection ret = client.create( 'quantize_demo', dimension=768, extra_params={ 'quantize_type': 'DT_VECTOR_INT8' } ) print(ret) collection = client.get('quantize_demo') # 正常写入向量数据,该向量数据会按照创建collection时定义的量化策略自动进行量化 collection.insert(('1', np.random.rand(768).astype('float32'))) # 通过id获取对应的doc,需注意,这里获取到的向量数据是经过反量化后的近似值,非插入时的原值 doc = collection.fetch('1') # 若检索时设置返回向量数据,返回的向量数据同样是经过反量化后的近似值,非插入时的原值 docs = collection.query( vector=np.random.rand(768).astype('float32'), include_vector=True )
python
说明
通过获取Doc和检索Doc(include_vector=True
时)获取到的向量数据,是经过反量化后的近似值,非插入时的原值。
参数描述
创建Collection时可通过extra_params: Dict[str, str]
参数的quantize_type
字段来定义量化策略。quantize_type
当前可选值如下:
DT_VECTOR_INT8
:将Float32向量量化为INT8类型
性能和召回率参考
基于1百万768维数据集
- DashVector规格:P.large
- 度量方式:cosine
- topk:100
量化策略 |
索引比 |
QPS |
召回率 |
无 |
100% |
495.6 |
99.05% |
DT_VECTOR_INT8 |
33.33% |
733.8(+48%) |
94.67% |
说明
1.可以看到这个示例中,以4.38%的召回率下降为代价,将索引大小缩减为原来的1/3,同时QPS提升了48%。
2.以上数据为基于Cohere数据集实测结果,但不同数据集的数据分布对QPS、召回以及压缩比有影响,上述数据仅供参考。
更多参考
数据集 |
量化策略 |
索引比 |
召回比 |
QPS比 |
Cohere 10M 768 Cosine |
DT_VECTOR_INT8 |
33% |
95.28% |
170% |
GIST 1M 960 L2 |
DT_VECTOR_INT8 |
35% |
99.54% |
134% |
OpenAI 5M 1536 Cosine |
DT_VECTOR_INT8 |
34% |
67.34% |
189% |
Deep1B 10M 96 Cosine |
DT_VECTOR_INT8 |
52% |
99.97% |
135% |
内部数据集 8M 512 Cosine |
DT_VECTOR_INT8 |
38% |
99.92% |
152% |
重要
可以看到,DashVector量化策略并非适用于所有数据集。在实际生产环境中,请谨慎使用量化策略。
建议创建不带量化策略、带量化策略的两个Collection,经过实际对比、测试、验证后再确定是否可将量化策略用于生产环境。
了解更多阿里云向量检索服务DashVector的使用方法,请点击:
https://help.aliyun.com/product/2510217.html?spm=a2c4g.2510217.0.0.54fe155eLs1wkT