训练模型
更新时间:2023-08-24
使用ivf、ivf_pq算法需要提前训练模型,训练模型相关API如下:
训练模型
用户需要提前创建索引并设定字段类型为"bpack_vector",写入训练样本数据后,方可对样本数据进行训练,训练模型API如下:
request
POST /_bpack/_knn/models/_train
POST /_bpack/_knn/models/{model_id}/_train
{
"training_index": "train-index-name",
"training_field": "train-field-name",
"dims": 16,
"max_training_vector_count": 1200,
"search_size": 100,
"description": "My model",
"index_type": "ivf_pq",
"space_type": "l2",
"parameters":{
"nlist":128,
"nprobes":8,
"m":8,
"code_size":8
}
}
response
{
"model_id": "model_x"
}
path参数:
参数 | 说明 |
---|---|
model_id |
模型 ID。 |
body参数:
参数 | 说明 |
---|---|
training_index |
选择需要训练的索引。 |
training_field |
选择需要训练的字段,需要在索引中的knn vector字段并且维度相符。 |
dims |
维度。 |
max_training_vector_count |
(可选)索引中用于训练的最大向量数。默认为索引中的所有向量。 |
search_size |
(可选)训练数据是通过scroll查询从索引中查询到的,这个参数是定义每次scroll查询的size。默认为 10,000。 |
description |
(可选)用户提供的模型文字描述简介。 |
index_type |
(可选)索引类型,可选择ivf和ivf_pq,默认为ivf。 |
space_type |
(可选)向量距离算法,支持l2, innerproduct。 |
parameters |
(可选)具体算法参数。 |
index_type:
name |
是否需要训练 | 支持的距离算法 | 说明 |
---|---|---|---|
ivf |
true | l2, innerproduct | ivf算法,原理是基于聚类算法对向量进行分桶,搜索时候仅搜索部分桶,从而提升搜索效率。 |
ivf_pq |
true | l2, innerproduct | 配合将ivf算法与PQ算法进行了结合,通过PQ降低原始向量的存储开销。 |
IVF parameters
参数 | 是否必填 | 默认值 | 是否可修改 | 说明 |
---|---|---|---|---|
nlist |
false | 4 | false | 向量划分的桶数。较高的值可能会以内存和训练延迟为代价换取更准确的搜索准确性。 |
nprobes |
false | 1 | false | 查询期间要搜索的桶数。较高的值导致更准确但更慢的搜索。 |
IVF_PQ parameters
参数 | 是否必填 | 默认值 | 是否可修改 | 说明 |
---|---|---|---|---|
nlist |
false | 4 | false | 向量划分的桶数。较高的值可能会以内存和训练延迟为代价换取更准确的搜索准确性。 |
nprobes |
false | 1 | false | 查询期间要搜索的桶数。较高的值导致更准确但更慢的搜索。 |
m |
false | 1 | false | 代表将向量分成子向量的个数,子向量彼此独立编码。向量的维度必须能被 m 整除。最大值为 1024。 |
code_size |
false | 8 | false | 代表将子向量编码的位数。推荐值为 8,不建议改为其他值。 |
查询模型
执行训练API后,可以对模型进行查询,查询到模型状态(state)为"created"后,方可正常使用。
request
GET /_bpack/_knn/models/{model_id}?pretty
response
{
"model_id" : "test-model",
"model_blob" : "SXdGbIAAAAAAAAAAAA...",
"state": "created",
"timestamp": "2023-06-14T03:02:15.246736Z",
"description": "My model ivf_pq",
"error": "",
"index_type": "IVF",
"parameters": {},
"space_type": "innerproduct",
"dimension": 128
}
说明
参数 | 说明 |
---|---|
model_id | 模型 ID。 |
model_blob | 模型序列化后具体内容。 |
state | 状态有"training"、"created"、"failed",在模型状态为"created"后,才可以正常使用。 |
timestamp | 代表将子向量编码的位数。推荐值为 8,不建议改为其他值。 |
description | 用户提供的模型文字描述简介。 |
error | 错误详情。 |
index_type | 索引类型。 |
parameters | 具体算法参数。 |
space_type | 向量距离算法。 |
dimension | 维度。 |
删除模型
request
DELETE /_bpack/_knn/models/{model_id}
response
{
"model_id": {model_id},
"acknowledged": true
}
使用示例
1、创建一个linear的索引,写入数据
PUT my_index
{
"mappings": {
"properties": {
"field": {
"type": "bpack_vector",
"dims": 4
}
}
}
}
POST my_index/_bulk
{"index":{}}
{"field":[3.5,4.5,6.5,6.5]}
{"index":{}}
{"field":[3.5,4.5,6.5,6.5]}
{"index":{}}
{"field":[5.5,6.5,6.5,6.5]}
...
2、训练模型,这里以ivf_pq为示例。
POST /_bpack/_knn/models/model_ivfpq/_train
{
"training_index": "my_index",
"training_field": "field",
"dims": 4,
"max_training_vector_count": 100000,
"search_size": 1000,
"description": "My model,ivf_pq",
"index_type": "ivf_pq",
"space_type": "l2",
"parameters":{
"nlist":128,
"nprobes":8,
"m":8,
"code_size":8
}
}
{
"model_id": "model_ivfpq"
}
3、查询模型状态,待到状态为created。
GET /_bpack/_knn/models/model_ivfpq?pretty
{
"model_id" : "model_ivfpq",
"model_blob" : "SXdGbIAAAAAAAAAAAA...",
"state": "created",
"timestamp": "2023-06-14T03:02:15.246736Z",
"description": "My model,ivf_pq",
"error": "",
"index_type": "IVF_PQ",
"parameters": {},
"space_type": "l2",
"dimension": 128
}
4、使用model_id创建 ivf\ivf_pq索引,之后即可正常使用索引和写入数据。
PUT my_ivfpq_index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"field_ivf_pq": {
"type": "bpack_vector",
"model_id": "model_ivfpq"
}
}
}
}