🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI

新機能

  • News
May 20, 2021
milvus

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() のメソッドを呼び出すとコレクション全体を検索するため、大規模なデータセットでは時間がかかります。以下のコードからわかるように、GetVectorsByIdHelperFileHolder 構造体を使用してループを通し、特定のベクトルを検索します。

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.0v1.1.0
109 ms2 ms
100149 ms19 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.0PR-298
M = 16, ef_construction = 100274406 ms265631 ms
M = 16, ef_construction = 200522411 ms499639 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)9007981544
ivf_pq (nlist = 2048, m=16)10353597115
ivf_pq (nlist = 2048, m=32)108638104558
ivf_flat (nlist = 4096)340643310685
ivf_pq (nlist = 4096, m=16)351982323758
ivf_pq (nlist = 4096, m=32)357359330887


バグ修正

Milvusがベクトルデータセットを管理する際に、より安定的かつ効率的になるようにいくつかのバグを修正しました。詳しくは修正された問題をご覧ください。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

続けて読む