インデックスビルドレベルを調整する
Zilliz Cloud には build_level というパラメーターがあり、対象コレクションのストレージ容量と検索再現率のバランスを取ることができます。使用頻度が低いコレクションや、より多くのストレージ容量が必要なコレクションでは、再現率がわずかに低下する代わりにストレージ容量を大幅に増やすことができます。その逆も同様です。本ガイドでは、利用可能なオプションと、それらを使用してコレクションのインデックスを構築する方法について説明します。
この機能は現在 PUBLIC REVIEW 段階にあり、以下の条件を満たす Dedicated クラスターにのみ適用されます。
-
クラスターが Performance-optimized、Capacity-optimized、Tiered-storage タイプです。
-
クラスターが Milvus v2.6.x と互換性があります。
この機能をテストするためにクラスターをアップグレードできます。さらに確認が必要な事項がある場合は、お問い合わせください。
概要
Zilliz Cloud のクラスターはタイプによって公称ストレージ容量が大きく異なります。Performance-optimized クラスター内のコレクションが使用頻度の低い用途を想定している場合や、追加のストレージが必要な場合は、そのコレクション内の FLOAT_VECTOR、FLOAT16_VECTOR、BFLOAT16_VECTOR などの浮動小数点ベクトル型のベクトルフィールドにインデックスを作成する際に、build_level を Capacity-first オプションに設定することを検討してください。これにより再現率がわずかに低下する可能性がありますが、ストレージ容量を 30% から 40% 増やすことができます。
build_level パラメーターには、Precision-first (2)、Balanced (1)、Capacity-first (0) の 3 つのオプションがあります。
-
Balanced (1)
これはデフォルトのオプションで、ほとんどのシナリオで検索精度とストレージ容量のバランスを取ります。
-
Precision-first (2)
このオプションは検索パフォーマンスと高い再現率を優先し、高い精度が求められるコレクションに適しています。
-
Capacity-first (0)
このオプションはストレージ容量を重視し、追加のストレージ容量が必要なコレクションに最適です。
社内ベンチマークテストで示されているように、デフォルトのオプションはクラスターのタイプに関係なく、すべてのクラスターのストレージ容量を増やします。Performance-optimized クラスターでは、デフォルトのオプションによってストレージ容量が 60% 増加し、パフォーマンス(QPS)が 17% 向上します。
Performance-optimized クラスター
次の表は、build_level の導入前後で Performance-optimized クラスターの容量、QPS、再現率を比較したものです。デフォルトのオプションが再現率を維持しながら、QPS とストレージ容量の両方を増やしていることがわかります。
| ビルドレベルオプション | 容量(CU あたり) | QPS | 再現率 |
|---|---|---|---|
| Capacity-first (0) | 500 万個の 768 次元ベクトル | ~ 1,800 | 90% - 95% |
| Balanced (1) | 200 万個の 768 次元ベクトル | ~ 2,800 | 91% - 97% |
| Precison-first (2) | 150 万個の 768 次元ベクトル | ~ 2,900 | 92% - 98% (↑) |
Capacity-optimized クラスター
次の表は、build_level の導入前後で Capacity-optimized クラスターの容量、QPS、再現率を比較したものです。デフォルトのオプションが再現率を維持しながら、QPS とストレージ容量の両方を増やしていることがわかります。
| ビルドレベルオプション | 容量(CU あたり) | QPS | 再現率 |
|---|---|---|---|
| Capacity-first (0) | 1,200 万個の 768 次元ベクトル | ~ 200 | 89% - 97% |
| Balanced (1) | 800 万個の 768 次元ベクトル | ~ 300 | 93% - 98% |
| Precision-first (2) | 500 万個の 768 次元ベクトル | ~ 350 | 94% - 98% |
Tiered-storage クラスター
データの大部分が S3 に保存されるため、メモリはもはや主要なボトルネックではありません。その結果、クラスターの最大容量は比較的安定したままになります。最も大きな影響を受けるのは 再現率 であり、量子化レベルの違いによりパフォーマンスがわずかに変動します。
-
Balanced (1): これは現在の状態を表しており、パフォーマンスは既存のベンチマークと一致したままです。
-
Precision-first (2): ビルドレベルを上げると 再現率が約 3%–4% 向上 しますが、QPS がわずかに低下し、レイテンシーが若干増加します。
-
Capacity-first (0): この構成はメリットが最小限であるため、まれであると想定されます。容量は変わらないまま、QPS とレイテンシーがわずかに改善される代わりに 再現率が 3%–4% 低下 します。
制限事項
操作を開始する前に、以下の制限事項を確認してください。
-
コレクションのインデックスを作成する際は、FLOAT_VECTOR、FLOAT16_VECTOR、BFLOAT16_VECTOR などの浮動小数点ベクトル型のベクトルフィールドにこのパラメーターを設定する必要があります。
-
一度設定すると、このパラメーターは変更できません。ただし、必要に応じてインデックスを削除し、目的の設定で別のインデックスを作成できます。
-
移行またはバックアップを行うと、
build_levelの設定は削除されます。移行または復元が完了した後は、必要に応じてインデックスを削除し、目的の設定で別のインデックスを作成できます。
手順
ほとんどの場合、build_level を設定する必要はありません。デフォルト設定により、検索パフォーマンス、精度、ストレージ容量のバランスを取ることができます。
Zilliz Cloud では、build_level をプログラムから、または Zilliz Cloud コンソールで設定できます。
build_level をプログラムで設定する
build_level を設定するには、FLOAT_VECTOR、FLOAT16_VECTOR、BFLOAT16_VECTOR などの浮動小数点型のベクトルフィールドにインデックスを作成するときに行う必要があります。
次の例では、コレクションがすでに作成されていることを前提としています。build_level を 1 に設定すると、Balanced オプションが適用されることを示します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
# 4. Set up index
# 4.1. Set up the index parameters
index_params = MilvusClient.prepare_index_params()
# 4.2. Add an index on the vector field
index_params.add_index(
field_name="vector",
metric_type="COSINE",
index_type="AUTOINDEX",
index_name="vector_index",
build_level=1
)
# 4.3. Create the index
client.create_index(
collection_name="customized_setup",
index_params=index_params
)
# 5. List indexes
res = client.list_indexes(
collection_name="customized_setup"
)
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;
import io.milvus.v2.service.index.request.ListIndexesReq;
import java.util.Collections;
import java.util.List;
IndexParam indexParam = IndexParam.builder()
.fieldName("vector")
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.COSINE)
.indexName("vector_index")
.extraParams(Collections.singletonMap("build_level", 1))
.build();
client.createIndex(CreateIndexReq.builder()
.collectionName("customized_setup")
.indexParams(Collections.singletonList(indexParam))
.build());
// 5. List indexes
List<String> indexNames = client.listIndexes(ListIndexesReq.builder()
.collectionName("customized_setup")
.build());
import (
"log"
"github.com/milvus-io/milvus/client/v3/entity"
"github.com/milvus-io/milvus/client/v3/index"
milvusclient "github.com/milvus-io/milvus/client/v3/milvusclient"
)
idx := index.WithExtraIndexParams(
index.NewAutoIndex(entity.COSINE),
map[string]string{"build_level": "1"},
)
_, err := client.CreateIndex(ctx, milvusclient.NewCreateIndexOption("customized_setup", "vector", idx).WithIndexName("vector_index"))
if err != nil {
log.Fatal(err)
}
// 5. List indexes
indexes, err := client.ListIndexes(ctx, milvusclient.NewListIndexOption("customized_setup"))
if err != nil {
log.Fatal(err)
}
log.Println(indexes)
use milvus::v2::prelude::*;
use std::collections::HashMap;
const COLLECTION_NAME: &str = "customized_setup";
client
.create_index(
CreateIndexRequest::builder()
.collection_name(COLLECTION_NAME)
.index_params(vec![
IndexParam::new()
.field_name("vector")
.index_name("vector_index")
.index_type(IndexType::AutoIndex)
.metric_type(MetricType::Cosine)
.extra_params(HashMap::from([("build_level".into(), "1".into())])),
])
.build()?,
)
.await?;
let res = client
.list_indexes(
ListIndexesRequest::builder()
.collection_name(COLLECTION_NAME)
.build()?,
)
.await?;
println!("{:?}", res.index_names());
#include <iostream>
#include <string>
const std::string collection_name = "customized_setup";
milvus::IndexDesc index_vector("vector", "vector_index", milvus::IndexType::AUTOINDEX, milvus::MetricType::COSINE);
index_vector.AddExtraParam("build_level", "1");
auto status = client->CreateIndex(milvus::CreateIndexRequest()
.WithCollectionName(collection_name)
.AddIndex(std::move(index_vector)));
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
milvus::ListIndexesResponse list_resp;
status = client->ListIndexes(milvus::ListIndexesRequest().WithCollectionName(collection_name), list_resp);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
const collectionName = 'customized_setup';
// 4. Create the index with build_level
await client.createIndex({
collection_name: collectionName,
field_name: 'vector',
index_type: 'AUTOINDEX',
index_name: 'vector_index',
metric_type: 'COSINE',
params: { build_level: 1 },
});
// 5. List indexes
const res = await client.listIndexes({ collection_name: collectionName });
console.log(res);
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/indexes/create" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"collectionName": "customized_setup",
"indexParams": [
{
"fieldName": "vector",
"indexName": "vector_index",
"metricType": "COSINE",
"indexType": "AUTOINDEX",
"params": { "build_level": 1 }
}
]
}'
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/indexes/list" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
--data '{"collectionName": "customized_setup"}'
Zilliz Cloud コンソールで build_level を設定する
build_level をプログラムで設定する代わりに、コレクションの作成時に Zilliz Cloud コンソールで設定することもできます。
-
対象クラスターの コレクション タブで + Create Collection をクリックします。
-
Create Collection ページでスキーマを設定します。
ベクトルフィールドのデータ型が、FLOAT_VECTOR、FLOAT16_VECTOR、BFLOAT16_VECTOR のいずれかの有効なオプションであることを確認してください。
-
Create インデックス セクションで Edit Index をクリックします。
-
表示される Edit ベクトル Index フィールドで、Metric Type と Index Build Level を設定できます。