新機能
Milvusは、世界で最も高速で信頼性の高いベクトルデータベースを構築することに焦点を当てた、進行中のオープンソースソフトウェア(OSS)プロジェクトです。Milvus v1.1.0内の新機能は、オープンソースコミュニティからの長期的なサポートとZillizからのスポンサーシップのおかげで、今後予定されている多くのアップデートの最初のものです。このブログでは、Milvus v1.1.0に含まれる新機能、改善点、バグ修正について説明します。
ジャンプ
新機能
他のOSSプロジェクトと同様に、Milvusは永久に進行中の作業です。ユーザーやオープンソースコミュニティの声に耳を傾け、最も重要な機能に優先順位をつけるよう努めています。Milvus v1.1.0では、以下の新機能が追加されました:
get_entity_by_id()
メソッド呼び出しによるパーティションの指定
ベクトル類似検索のさらなる高速化のため、Milvus 1.1.0では指定したパーティションからのベクトル検索に対応しました。通常、Milvusは指定したベクトルIDからベクトルを検索することができます。Milvus1.0では、get_entity_by_id()
のメソッドを呼び出すとコレクション全体を検索するため、大規模なデータセットでは時間がかかります。以下のコードからわかるように、GetVectorsByIdHelper
はFileHolder
構造体を使用してループを通し、特定のベクトルを検索します。
std::vector<meta::CollectionSchema> collection_array;
auto status = meta_ptr_->ShowPartitions(collection.collection_id_, collection_array);
collection_array.push_back(collection);
status = meta_ptr_->FilesByTypeEx(collection_array, file_types, files_holder);
if (!status.ok()) {
std::string err_msg = "Failed to get files for GetVectorByID: " + status.message();
LOG_ENGINE_ERROR_ << err_msg;
return status;
}
if (files_holder.HoldFiles().empty()) {
LOG_ENGINE_DEBUG_ << "No files to get vector by id from";
return Status(DB_NOT_FOUND, "Collection is empty");
}
cache::CpuCacheMgr::GetInstance()->PrintInfo();
status = GetVectorsByIdHelper(id_array, vectors, files_holder);
DBImpl::GetVectorsByIdHelper(const IDNumbers& id_array, std::vector<engine::VectorsData>& vectors,
meta::FilesHolder& files_holder) {
// attention: this is a copy, not a reference, since the files_holder.UnMarkFile will change the array internal
milvus::engine::meta::SegmentsSchema files = files_holder.HoldFiles();
LOG_ENGINE_DEBUG_ << "Getting vector by id in " << files.size() << " files, id count = " << id_array.size();
// sometimes not all of id_array can be found, we need to return empty vector for id not found
// for example:
// id_array = [1, -1, 2, -1, 3]
// vectors should return [valid_vector, empty_vector, valid_vector, empty_vector, valid_vector]
// the ID2RAW is to ensure returned vector sequence is consist with id_array
using ID2VECTOR = std::map<int64_t, VectorsData>;
ID2VECTOR map_id2vector;
vectors.clear();
IDNumbers temp_ids = id_array;
for (auto& file : files) {
FilesByTypeEx()
Milvus v1.1.0では、GetVectorsIdHelper
のループにパーティション名を渡すことで、FileHolder
に指定したパーティションのセグメントのみが含まれるようにすることができます。別の言い方をすれば、検索対象のベクターがどのパーティションに属するかを正確に知っている場合、get_entity_by_id()
メソッド呼び出しでパーティション名を指定することで、検索処理を高速化することができます。
Milvusサーバーレベルでシステムクエリを制御するコードに修正を加えただけでなく、パーティション名を指定するパラメーターを追加することで、すべてのSDK(Python、Go、C++、Java、RESTful)を更新しました。例えば、pymilvusでは、get_entity_by_id
def get_entity_by_id(self, collection_name, ids, timeout=None)
の定義がdef get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None)
に変更されています。
delete_entity_by_id()
メソッド呼び出しでパーティションを指定
Milvus v1.1.0では、ベクタの管理をより効率的にするために、コレクション内のベクタを削除する際にパーティション名を指定できるようになりました。Milvus1.0では、コレクション内のベクターはIDでしか削除できませんでした。削除メソッドを呼び出すと、Milvusはコレクション内のすべてのベクターをスキャンします。しかし、100万、10億、あるいは1兆という巨大なベクトルデータセットを扱う場合、関連するパーティションのみをスキャンする方がはるかに効率的です。get_entity_by_id()
メソッド呼び出しでパーティションを指定する新機能と同様に、同じロジックを用いてMilvusコードに修正を加えました。
新メソッドrelease_collection()
Milvus v1.1.0では、実行時にコレクションをロードするために使用していたメモリを解放するために、キャッシュから特定のコレクションを手動でアンロードするための新しいメソッドrelease_collection()
が追加されました。
改良点
通常、新機能は大流行ですが、既にあるものを改善することも重要です。以下は、Milvus v1.0からのアップグレードとその他の一般的な改善点です。
get_entity_by_id()
メソッド呼び出しのパフォーマンス向上
下のグラフは、Milvus v1.0とMilvus v1.1.0のベクトル検索性能の比較です:
CPU:CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
セグメントファイルサイズ = 1024 MB
行数 = 1,000,000
Dim = 128
クエリーID番号 | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 ms |
Hnswlibをv0.5.0にアップグレード
Milvusは、Faiss、NMSLIB、Hnswlib、Annoyなど、広く使用されている複数のインデックスライブラリを採用し、特定のシナリオに適したインデックスタイプを選択するプロセスを簡素化しています。
Milvus1.1.0では、Hnswlibがv0.3.0からv0.5.0にアップグレードされました。さらに、Hnswlibをアップグレードすることで、インデックス構築におけるaddPoint()
パフォーマンスが改善されました。
Milvusでインデックスを構築する際のHnswlibのパフォーマンスを改善するために、Zillizの開発者がプルリクエスト(PR)を作成しました。詳細はPR #298を参照してください。
以下のグラフは、Hnswlib 0.5.0と提案されたPRとのaddPoint()
パフォーマンスの比較です:
CPU:Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1M (row count = 1000000, dim = 128, space = L2)
0.5.0 | PR-298 | |
---|---|---|
M = 16, ef_construction = 100 | 274406 ms | 265631 ms |
M = 16, ef_construction = 200 | 522411 ms | 499639 ms |
IVFインデックスのトレーニング性能の向上
インデックスの作成には、トレーニング、データの挿入、ディスクへの書き込みが含まれます。Milvus1.1.0では、インデックス作成のトレーニングコンポーネントが改善されました。以下のチャートは、Milvus 1.0とMilvus 1.1.0のIVFインデックストレーニング性能の比較です:
CPU:Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1m (row_count = 1000000, dim = 128, metric_type = L2)
v1.0.0 (ms) | v1.1.0 (ms) | |
---|---|---|
ivf_flat (nlist = 2048) | 90079 | 81544 |
ivf_pq (nlist = 2048, m=16) | 103535 | 97115 |
ivf_pq (nlist = 2048, m=32) | 108638 | 104558 |
ivf_flat (nlist = 4096) | 340643 | 310685 |
ivf_pq (nlist = 4096, m=16) | 351982 | 323758 |
ivf_pq (nlist = 4096, m=32) | 357359 | 330887 |
バグ修正
Milvusがベクトルデータセットを管理する際に、より安定的かつ効率的になるようにいくつかのバグを修正しました。詳しくは修正された問題をご覧ください。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word