本文介绍向量检索服务DashVector动态量化功能和作用。
背景介绍
量化(Quantization)是向量检索技术中一种常用的优化方法,通过一定程度的精度(召回率)损失,来换取性能的大幅度提升,以及内存占用(索引文件大小)大幅度降低。
向量检索服务DashVector支持向量的动态量化,用户仅需在新建Collection时选择对应的量化策略,即可无感的使用量化功能。
量化功能局限性说明:现阶段,开启量化功能的Collection无法使用Sparse Vector功能。若您有量化+SparseVector结合使用的需求,可加群(官方钉钉群:25130022704)联系我们。
开启动态量化
前提条件
已创建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
from dashvector import VectorParam
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
assert client
# 创建带有量化策略的collection
ret = client.create('quantize_demo',
vectors=VectorParam(768, 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
)
参数描述
创建Collection时可通过VectorParam
类的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% |
可以看到这个示例中,以4.38%的召回率下降为代价,将索引大小缩减为原来的1/3,同时QPS提升了48%。
以上数据为基于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,经过实际对比、测试、验证后再确定是否可将量化策略用于生产环境。