製品に関するFAQ
Milvusの価格はいくらですか?
Milvusは100%無償のオープンソースプロジェクトです。
Milvusを使用する際は、Apache License 2.0を遵守してください。
Milvusの開発元であるZilliz社では、分散インスタンスの構築や保守が不要なお客様向けに、完全マネージド型のクラウドプラットフォームも提供しております。Zilliz Cloudは自動的にデータの信頼性を維持し、ユーザーは使用した分だけ支払うことができる。
Milvusはx86以外のアーキテクチャに対応していますか?
Milvusはx86以外のプラットフォームにはインストール、実行できません。
Milvusを実行するには、CPUが以下の命令セットのいずれかをサポートしている必要があります: SSE4.2、AVX、AVX2、AVX512。これらはすべてx86専用のSIMD命令セットです。
Milvusはどこにデータを格納するのですか?
Milvusでは、挿入データとメタデータの2種類のデータを扱います。
ベクターデータ、スカラーデータ、コレクション固有のスキーマを含む挿入データは、インクリメンタルログとして永続ストレージに保存されます。Milvusは、MinIO、AWS S3、Google Cloud Storage(GCS)、Azure Blob Storage、Alibaba Cloud OSS、Tencent Cloud Object Storage(COS)など、複数のオブジェクトストレージバックエンドをサポートしています。
メタデータはMilvus内で生成されます。Milvusモジュールはそれぞれ独自のメタデータを持ち、etcdに保存されます。
なぜetcdにはベクターデータがないのか?
etcdにはMilvusモジュールのメタデータが格納され、MinIOにはエンティティが格納されます。
Milvusはデータの挿入と検索を同時にサポートしていますか?
挿入操作と検索操作は、互いに独立した2つのモジュールによって処理されます。クライアントから見ると、挿入されたデータがメッセージキューに入った時点で挿入操作は完了します。しかし、挿入されたデータはクエリ・ノードにロードされるまで検索できません。セグメントサイズがインデックス構築のしきい値(デフォルトでは512MB)に達しない場合、Milvusはブルートフォース検索に頼り、クエリのパフォーマンスが低下する可能性があります。
主キーが重複しているベクターをMilvusに挿入できますか?
はい。Milvusはベクターの主キーが重複しているかどうかをチェックしません。
主キーが重複しているベクターが挿入された場合、Milvusはそれを更新操作として扱いますか?
いいえ。Milvusは現在更新操作に対応しておらず、エンティティの主キーが重複しているかどうかのチェックも行っていません。エンティティの主キーが一意であることを確認するのはお客様の責任であり、そうでない場合、Milvusには主キーが重複した複数のエンティティが含まれる可能性があります。
このような場合、クエリ時にどのデータコピーが返されるかは未知のままです。この制限は将来のリリースで修正される予定です。
自分で定義したエンティティの主キーの最大長は?
エンティティ主キーは非負の64ビット整数でなければなりません。
1回の挿入操作で追加できるデータ量の上限は?
挿入操作のサイズは1,024 MBを超えてはなりません。これはgRPCによる制限です。
特定のパーティションで検索する場合、コレクション・サイズはクエリ・パフォーマンスに影響しますか?
いいえ。検索用のパーティションが指定されている場合、Milvusは指定されたパーティションのみを検索します。
検索にパーティションを指定した場合、Milvusはコレクション全体を読み込む必要がありますか?
検索に必要なデータによって異なります。検索結果に表示される可能性のあるパーティションは、検索前にすべて読み込む必要があります。
- たとえば、特定のパーティションだけを検索したい場合は、すべてをロードする必要はありません。
load_partition()
を呼び出して目的のパーティションをロードし、search()
メソッド呼び出しでパーティションを指定します。 - すべてのパーティションを検索したい場合は、
load_collection()
を呼び出して、すべてのパーティションを含むコレクション全体をロードします。 - 検索前にコレクションまたは特定のパーティションをロードしなかった場合、Milvusはエラーを返します。
ベクター挿入後にインデックスを作成することはできますか?
Milvusは、以前create_index()
、コレクションに対してインデックスを作成したことがある場合、その後に挿入されたベクターに対しても自動的にインデックスを作成します。ただし、Milvusは、新しく挿入されたベクターがセグメント全体を満たし、新しく作成されたインデックスファイルが以前のものから分離されるまで、インデックスを作成しません。
FLATインデックスとIVF_FLATインデックスの違いは何ですか?
IVF_FLATインデックスはベクター空間をリスト・クラスターに分割します。デフォルトのリスト値16,384の場合、Milvusはターゲットベクトルと16,384クラスタすべてのセントロイド間の距離を比較し、最も近いクラスタを返します。その後、Milvusはターゲットベクトルと選択されたクラスタ内のベクトルとの距離を比較し、最近接ベクトルを取得します。IVF_FLATとは異なり、FLATはターゲットベクトルと他のすべてのベクトルとの距離を直接比較します。
ベクトルの総数がnlistにほぼ等しい場合、IVF_FLATとFLATの間には計算要件と探索性能の点でほとんど差がありません。しかし、ベクトル数が nlist の 2 倍以上になると、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はApple M1 CPUをサポートしていますか?
現在のMilvusはApple M1 CPUを直接サポートしておりません。Milvus 2.3以降では、ARM64アーキテクチャ用のDockerイメージが提供されます。
Milvusはプライマリキーフィールドでどのようなデータタイプをサポートしていますか?
現在のリリースでは、MilvusはINT64と文字列の両方をサポートしています。
Milvusはスケーラブルですか?
Kubernetes上のHelm Chartを利用することで、複数ノードのMilvusクラスタをデプロイすることができます。詳しくはスケールガイドをご参照ください。
growing segmentとsealed segmentとは何ですか?
Milvusは検索要求が来ると、インクリメンタルデータとヒストリカルデータの両方を検索します。増分データは最近更新されたデータで、オブジェクトストレージに永続化される閾値に達する前にメモリにバッファリングされ、より効率的なインデックスが構築される成長セグメントに保存されます。一方、履歴データは少し前に更新されたもので、オブジェクト・ストレージに永続化される前にメモリ上にバッファリングされる。インクリメンタルデータとヒストリカルデータは、検索用のデータセット全体を構成する。この設計により、Milvusに取り込まれたデータは即座に検索可能となる。Milvus Distributedの場合、インジェストされたばかりのレコードがいつ検索結果に表示されるかは、より複雑な要因によって決定される。その詳細については一貫性レベルをご覧ください。
Milvusは同時検索に対応していますか?
はい。Milvusは、同じコレクションに対するクエリの場合、インクリメンタルデータと履歴データを同時に検索します。ただし、異なるコレクションに対するクエリは直列に行われます。履歴データは非常に巨大なデータセットになる可能性がありますが、履歴データに対する検索は比較的時間がかかり、基本的に直列に実行されます。
対応するコレクションが削除された後も、MinIOのデータが残るのはなぜですか?
MinIOのデータは、データのロールバックの便宜のため、一定期間残るように設計されています。
MilvusはPulsar以外のメッセージ・エンジンをサポートしていますか?
はい。Milvus 2.1.0ではKafkaがサポートされています。
検索とクエリの違いは何ですか?
Milvusでは、ベクトル類似度検索は類似度計算とベクトル・インデックス加速に基づいてベクトルを検索します。ベクトル類似性検索とは異なり、ベクトル検索はブーリアン式に基づくスカラーフィルタリングによってベクトルを検索します。ブーリアン式はスカラーフィールドまたは主キーフィールドをフィルタリングし、フィルタに一致するすべての結果を取得します。クエリでは、類似度メトリクスもベクトル・インデックスも関与しません。
なぜmilvusではfloatベクトル値の精度が小数点以下7桁なのですか?
MilvusはベクトルをFloat32配列として格納することをサポートしています。Float32の値の精度は小数点以下7桁です。1.3476964684980388のようなFloat64の値であっても、Milvusは1.347696として格納します。したがって、このようなベクトルをMilvusから取り出すと、Float64の値の精度は失われてしまいます。
Milvusではベクトルのデータ型と精度をどのように扱っているのですか?
MilvusはBinary、Float32、Float16、BFloat16のベクトル型をサポートしています。
- バイナリベクタ:0と1のシーケンスとしてバイナリデータを格納し、画像処理や情報検索に使用されます。
- Float32ベクトル:10進数約7桁の精度で格納される。Float64の値もFloat32の精度で格納されるため、検索時に精度が低下する可能性がある。
- Float16 および BFloat16 ベクタ:精度とメモリ使用量が低減されている。Float16は帯域幅とストレージが限られたアプリケーションに適しており、BFloat16は範囲と効率のバランスが取れており、精度に大きな影響を与えることなく計算量を減らすためにディープラーニングでよく使用されます。
Milvusはスカラーフィールドやベクトルフィールドのデフォルト値の指定に対応していますか?
現在、Milvus 2.4.xではスカラーフィールドやベクトルフィールドのデフォルト値の指定はサポートしていません。この機能は将来のリリースを予定しています。
まだ質問がありますか?
できます:
- GitHubでMilvusをチェックしてください。質問を投げかけたり、アイデアを共有したり、他の人を助けたりすることができます。
- Slackのコミュニティに参加して、オープンソースコミュニティに参加してください。