10억 벡터 검색 방법 (SIFT1B)
8069 단어 Milvus
기사 목록
시작하기 전에
Milvus의 기본 작동 방식에 대해서는 다음 기사를 참조하십시오.
Component
Minimum Config
OS
CentOS 7.6
CPU
Intel Xeon E5-2678 v3 @ 2.50GHz x 2
GPU
Nvidia GeForce GTX 1080, 8GB GDDR5 x 2
GPU Driver
CUDA 10.1, Driver 418.74
Memory
256 GB
Storage
NVMe SSD 2 TB
(실험에서 약 140GB의 메모리가 소모됨)
10억 벡터 검색
ANN_SIFT1B 데이터 세트
본문 10억 벡터는 ANN_SIFT1B, 다운로드 ANN_SIFT1B의 네 개의 파일그 중에서 Baseseset은 기초 데이터 집합으로 10억 개의 128차원 벡터가 있다.Learning set은 특정 매개변수를 나타내는 학습 세트입니다.Query set은 128비트 조회 벡터 집합 1만 개입니다.Ground truth는 서로 다른 크기의 데이터 집합을 대상으로 유럽식 거리를 계산하여 가장 가까운 1000개의 벡터를 얻는다.
데이터 사전 처리 및 데이터 가져오기
① 데이터 사전 처리
Milvus가 지원하는 벡터 데이터는 부동점형(소수)의 2차원 그룹이기 때문에 특징 벡터를 2차원 그룹으로 전환해야 한다. 예를 들어 본고의 10억 벡터는 ANN_기본 세트 데이터 형식bvecs
인 SIFT1B는 이 파일을 Milvus가 지원하는 부동 소수점 2차원 그룹으로 변환해야 합니다. 주로 Python 코드를 통해 이루어집니다.x = np.memmap(fname_base, dtype='uint8', mode='r')
d = x[:4].view('int32')[0]
data = x.reshape(-1, d + 4)[:, 4:]
vectors = data.tolist()
# vectors Milvus
② 데이터 가져오기
먼저 Milvus에서 테이블을 만들고 관련 매개 변수 table_name
, dimension
, index_type
(인덱스 형식) 를 만듭니다.테이블을 만들 때 색인 유형을 지정하면 Milvus는 벡터 가져오기 시 자동으로 색인을 만듭니다. 본고는 10억 데이터 색인 유형IVF_SQ8
으로 데이터 파일 크기 압축을 실현할 수 있습니다. ANN_SIFT1B
10억 데이터는 저장 공간 140GB만 필요합니다.
Milvus는 호출add_vectors
을 통해 벡터 데이터 가져오기를 실현하고 벡터 가져오기 차원은 테이블을 만들 때의 차원과 일치해야 합니다. 예를 들어 ANN_SIFT1B의 Base set은 128비트로 100000개의 벡터를 Milvus로 가져오는 데 1.5초가 걸린다.param = {'table_name':'test01', 'dimension':128, 'index_type':IndexType.IVF_SQ8}
# Milvus 'test01'
milvus.create_table(param)
# 'test01'
milvus.add_vectors(table_name='test01', records=vectors)
데이터 검색
Milvus는 대량으로 여러 개의 벡터를 검색할 수 있을 뿐만 아니라 query_ranges
(검색 범위)를 지정할 수 있으며, 매개 변수query_records
(검색 벡터)와top_k
를 통해 Milvus에서 검색query_records
을 통해 이 벡터 그룹과 유사도가 가장 높은 top_k
개의 벡터를 얻을 수 있으며, query_records
차원을 구하려면 작성된 표의 차원과 일치해야 하며, 그 데이터 유형은 부동점형 2차원 그룹이다.# ANN_SIFT1B Query set query_records
x = np.memmap(fname_query, dtype='uint8', mode='r')
d = x[:4].view('int32')[0]
data = x.reshape(-1, d + 4)[:, 4:]
query_records = data.tolist()
# top_k , Milvus
milvus.search_vectors(table_name='test01', query_records=query_records, top_k=10, query_ranges=None)
① 정확도 조회
본문은 ANN_ 사용SIFT1B의 Ground truth를 사용하여 질의 정확도를 평가합니다.여기서 query_records
은 ANN_SIFT1B의 Query set에서 무작위로 선택한 20개의 벡터입니다.Milvus에서 매개 변수nprobe
를 수정하면 검색 하위 공간의 범위를 제어할 수 있으며, nprobe
참고값 1~1684는 이 값이 클수록 정확도가 높지만 검색 시간도 길다.다음 표에서는 변경된 값의 평균 정확도를 계산한 테스트 결과입니다.
평균 정확도
top_k=1
top_k=10
top_k=30
top_k=50
top_k=100
top_k=500 nprobe
=16
95.0%
89.5%
85.0%
89.8%
83.0%
81.9% nprobe
=32
90.0%
96.0%
91.0%
92.3%
92.0%
94.2% nprobe
=64
95.0%
97.0%
96.2%
94.5%
97.4%
93.6% nprobe
=128
95.0%
98.0%
98.0%
98.5%
97.6%
97.4%
그중에서
평균 정확도 = M i l v u s 검색 결과와 G r o n d t r u t h 일치하는 벡터 개수 q u e r c o r d s 의 벡터 개수 ∗t o p k 평균 정확도 =\frac {Milvus 검색 결과와 Ground truth 일치하는 벡터 개수} {query records 의 벡터 개수 * top_k} 평균 정확도 =queryrecords 벡터 개수 ∗ topk Milvus 검색 결과와 Groundtruth 일치하는 벡터 개수
② 성능 조회
정확도 조회 결과에 따라 nprobe
= 32(확보nprobe
= 1/10/30/50/100/500시 정확도 > 90%) 를 선택하여 성능 평가를 실시한다.
변경top_k
을 통해 조회 벡터가 하나일 때 단일 벡터 조회 시간을 얻습니다.조회 벡터 개수가 1보다 크면 대량 조회의 평균 시간을 계산해 낼 수 있다.그중에서
단일 벡터 조회 평균 시간 = M i l v u s 대량 조회 총 시간 q u e r y r e c o r d s 벡터 개수 단일 벡터 조회 평균 시간 =\frac {Milvus 대량 조회 총 시간} {query_records 벡터 조회 평균 시간 =queryr ecords 벡터 개수 Milvus 대량 조회 총 시간은 여러 차례의 테스트 실험을 거쳐 같은 환경에서 데이터 규모가 조회 시간과 정비례한다.다음 표는 서로 다른 환경에서 성능 조회 결과입니다.
데이터 규모
단일 벡터 조회 시간 (s)
대량 조회 평균 시간 (s)
ANN_SIFT 백만
0.0029
0.3-1.4
ANN_1억 SIFT
0.092
0.0078~0.010
ANN_SIFT 10억
1.3~1.5
0.03~0.08
참고: 1.ANN_SIFT1B 백만 테스트는 Intel Core i5-8250U CPU*1 환경에서 수행됩니다.튜토리얼 보기 2.ANN_SIFT1B 1억 테스트는 Intel Core i7-8700 CPU*1 환경에서 수행됩니다.튜토리얼 보기 3.ANN_SIFT1B 10억 테스트는 Intel Xeon E5-2678 v3 * 2 환경에서 수행됩니다.
총결산
초대형 데이터량에서 Milvus는 여전히 초고성능을 갖추고 있다. 10억 벡터 조회 시 단일 벡터 조회 시간은 1.5초보다 높지 않고 대량 조회의 평균 시간은 0.08초보다 높지 않으며 밀리초급에서 10억 벡터를 검색한다.
사용 측면에서 볼 때 Milvus 특징 벡터 데이터베이스는 복잡한 데이터가 서로 다른 시스템 간의 전환과 이동을 고려할 필요가 없고 벡터 데이터에만 관심을 가진다. 이것은 서로 다른 AI 모델이 훈련한 특징 벡터를 지원하며 GPU/CPU 이구성이 가져온 초고산력을 사용하기 때문에 한 기기에서 10억 벡터의 고성능 검색을 실현할 수 있다.
직접 해량 벡터 검색을 시도하려면 Milvus 온라인 캠프를 방문하여 손에 해량 벡터 검색을 가르쳐 주십시오.
Milvus는 온라인 개발자 커뮤니티를 구축하고 있습니다. 만약에 Milvus의 기술 토론과 시용에 관심이 있다면 위챗 y18621178893을 추가하여 단체로 소통하는 것을 환영합니다.
x = np.memmap(fname_base, dtype='uint8', mode='r')
d = x[:4].view('int32')[0]
data = x.reshape(-1, d + 4)[:, 4:]
vectors = data.tolist()
# vectors Milvus
param = {'table_name':'test01', 'dimension':128, 'index_type':IndexType.IVF_SQ8}
# Milvus 'test01'
milvus.create_table(param)
# 'test01'
milvus.add_vectors(table_name='test01', records=vectors)
# ANN_SIFT1B Query set query_records
x = np.memmap(fname_query, dtype='uint8', mode='r')
d = x[:4].view('int32')[0]
data = x.reshape(-1, d + 4)[:, 4:]
query_records = data.tolist()
# top_k , Milvus
milvus.search_vectors(table_name='test01', query_records=query_records, top_k=10, query_ranges=None)
초대형 데이터량에서 Milvus는 여전히 초고성능을 갖추고 있다. 10억 벡터 조회 시 단일 벡터 조회 시간은 1.5초보다 높지 않고 대량 조회의 평균 시간은 0.08초보다 높지 않으며 밀리초급에서 10억 벡터를 검색한다.
사용 측면에서 볼 때 Milvus 특징 벡터 데이터베이스는 복잡한 데이터가 서로 다른 시스템 간의 전환과 이동을 고려할 필요가 없고 벡터 데이터에만 관심을 가진다. 이것은 서로 다른 AI 모델이 훈련한 특징 벡터를 지원하며 GPU/CPU 이구성이 가져온 초고산력을 사용하기 때문에 한 기기에서 10억 벡터의 고성능 검색을 실현할 수 있다.
직접 해량 벡터 검색을 시도하려면 Milvus 온라인 캠프를 방문하여 손에 해량 벡터 검색을 가르쳐 주십시오.
Milvus는 온라인 개발자 커뮤니티를 구축하고 있습니다. 만약에 Milvus의 기술 토론과 시용에 관심이 있다면 위챗 y18621178893을 추가하여 단체로 소통하는 것을 환영합니다.