새로운 기능
Milvus는 세계에서 가장 빠르고 안정적인 벡터 데이터베이스를 구축하는 데 초점을 맞춘 지속적인 오픈 소스 소프트웨어(OSS) 프로젝트입니다. Milvus 1.1.0의 새로운 기능은 오픈 소스 커뮤니티의 장기적인 지원과 Zilliz의 후원 덕분에 앞으로 제공될 많은 업데이트 중 첫 번째 업데이트입니다. 이 블로그 문서에서는 Milvus v1.1.0에 포함된 새로운 기능, 개선 사항 및 버그 수정 사항을 다룹니다.
바로가기:
새로운 기능
다른 OSS 프로젝트와 마찬가지로 Milvus는 끊임없이 진행 중인 작업입니다. 저희는 사용자와 오픈소스 커뮤니티의 의견을 경청하여 가장 중요한 기능의 우선순위를 정하기 위해 노력하고 있습니다. 최신 업데이트인 Milvus v1.1.0은 다음과 같은 새로운 기능을 제공합니다:
get_entity_by_id()
메서드 호출로 파티션 지정
벡터 유사도 검색을 더욱 가속화하기 위해 Milvus 1.1.0은 이제 지정된 파티션에서 벡터를 검색하는 기능을 지원합니다. 일반적으로 Milvus는 지정된 벡터 ID를 통해 벡터를 쿼리하는 기능을 지원합니다. Milvus 1.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에서는 이제 컬렉션에서 벡터를 삭제할 때 파티션 이름을 지정하는 기능이 지원됩니다. Milvus 1.0에서는 컬렉션의 벡터를 ID별로만 삭제할 수 있습니다. 삭제 메서드를 호출할 때 Milvus는 컬렉션의 모든 벡터를 스캔합니다. 그러나 백만, 억 또는 조 단위의 대규모 벡터 데이터 세트로 작업할 때는 관련 파티션만 스캔하는 것이 훨씬 더 효율적입니다. get_entity_by_id()
메서드 호출로 파티션을 지정하는 새로운 기능과 유사하게, 동일한 로직을 사용해 Milvus 코드도 수정되었습니다.
새로운 메서드 release_collection()
Milvus가 런타임에 컬렉션을 로드하는 데 사용하는 메모리를 확보하기 위해 Milvus v1.1.0에 캐시에서 특정 컬렉션을 수동으로 언로드하는 새로운 메서드 release_collection()
가 추가되었습니다.
개선 사항
새로운 기능이 대세인 요즘이지만, 이미 있는 기능을 개선하는 것도 중요합니다. 다음은 Milvus v1.0에 대한 업그레이드 및 기타 일반적인 개선 사항입니다.
get_entity_by_id()
메서드 호출의 성능 개선
아래 차트는 Milvus v1.0과 Milvus v1.1.0의 벡터 검색 성능을 비교한 것입니다:
CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
세그먼트 파일 크기 = 1024MB
행 수 = 1,000,000
Dim = 128
쿼리 ID 번호 | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2ms |
100 | 149ms | 19ms |
Hnswlib v0.5.0으로 업그레이드됨
Milvus는 주어진 시나리오에 적합한 인덱스 유형을 선택하는 프로세스를 간소화하기 위해 Faiss, NMSLIB, Hnswlib, Annoy 등 널리 사용되는 여러 인덱스 라이브러리를 채택하고 있습니다.
이전 버전에서 발견된 버그로 인해 Milvus 1.1.0에서 Hnswlib가 v0.3.0에서 v0.5.0으로 업그레이드되었습니다. 또한 Hnswlib를 업그레이드하면 인덱스 구축에서 addPoint()
성능이 향상됩니다.
한 Zilliz 개발자가 Milvus에서 인덱스를 구축하는 동안 Hnswlib 성능을 개선하기 위해 풀 리퀘스트(PR)를 만들었습니다. 자세한 내용은 PR #298을 참조하세요.
아래 차트는 Hnswlib 0.5.0과 제안된 PR 사이의 addPoint()
성능을 비교한 것입니다:
CPU: 인텔® 코어™ i7-8550U CPU @ 1.80GHz * 8
데이터 세트: sift_1M(행 수 = 1000000, dim = 128, 공간 = 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 인덱스 훈련 성능 개선
인덱스 생성에는 학습, 디스크에 데이터 삽입 및 쓰기가 포함됩니다. Milvus 1.1.0은 인덱스 구축의 훈련 구성 요소를 개선했습니다. 아래 차트는 Milvus 1.0과 Milvus 1.1.0의 IVF 인덱스 훈련 성능을 비교한 것입니다:
CPU: 인텔® 코어™ i7-8550U CPU @ 1.80GHz * 8
데이터 세트: 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 |
버그 수정
벡터 데이터셋을 보다 안정적이고 효율적으로 관리할 수 있도록 몇 가지 버그도 수정했습니다. 자세한 내용은 수정된 문제를 참조하세요.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word