Milvus 2.0 Bootcamp로 벡터 검색 솔루션을 빠르게 테스트하고 배포하기
Milvus 2.0 출시와 함께, 팀은 Milvus 부트캠프를 개편했습니다. 새롭게 개선된 부트캠프는 다양한 사용 사례와 배포를 위한 업데이트된 가이드와 더 따라 하기 쉬운 코드 예제를 제공합니다. 또한 이 새 버전은 세계에서 가장 진보된 벡터 데이터베이스를 새롭게 재구상한 버전인 Milvus 2.0에 맞춰 업데이트되었습니다.
1M 및 100M 데이터셋 벤치마크로 시스템 스트레스 테스트하기
벤치마크 디렉터리에는 서로 다른 크기의 데이터셋에 시스템이 어떻게 반응하는지 보여주는 100만 및 1억 벡터 벤치마크 테스트가 포함되어 있습니다.
인기 있는 벡터 유사도 검색 솔루션 탐색 및 구축하기
솔루션 디렉터리에는 가장 인기 있는 벡터 유사도 검색 사용 사례가 포함되어 있습니다. 각 사용 사례에는 노트북 솔루션과 docker 배포 가능 솔루션이 포함되어 있습니다. 사용 사례는 다음과 같습니다:
모든 시스템에서 완성된 애플리케이션을 빠르게 배포하기
빠른 배포 솔루션은 사용자가 모든 시스템에서 완성된 애플리케이션을 배포할 수 있게 해주는 docker화된 솔루션입니다. 이러한 솔루션은 간단한 데모에 이상적이지만, 노트북에 비해 사용자 지정하고 이해하려면 추가 작업이 필요합니다.
시나리오별 노트북을 사용해 사전 구성된 애플리케이션을 쉽게 배포하기
노트북에는 주어진 사용 사례의 문제를 해결하기 위해 Milvus를 배포하는 간단한 예제가 포함되어 있습니다. 각 예제는 파일이나 구성을 관리할 필요 없이 처음부터 끝까지 실행할 수 있습니다. 각 노트북은 따라 하기 쉽고 수정 가능하여 다른 프로젝트를 위한 이상적인 기본 파일이 됩니다.
이미지 유사도 검색 노트북 예제
이미지 유사도 검색은 자율주행차가 객체를 인식하는 것을 포함해 다양한 기술의 핵심 아이디어 중 하나입니다. 이 예제는 Milvus로 컴퓨터 비전 프로그램을 쉽게 구축하는 방법을 설명합니다.
이 예제는 세 가지를 다룹니다:
- Milvus 서버
- Redis 서버(메타데이터 저장용)
- 사전 학습된 Resnet-18 모델.
1단계: 필요한 패키지 다운로드
이 프로젝트에 필요한 모든 패키지를 다운로드하는 것부터 시작하세요. 이 노트북에는 사용할 패키지를 나열한 표가 포함되어 있습니다.
pip install -r requirements.txt
2단계: 서버 시작
패키지가 설치되면 서버를 시작하고 둘 다 제대로 실행 중인지 확인하세요. Milvus 및 Redis 서버를 시작하기 위한 올바른 지침을 반드시 따르세요.
3단계: 프로젝트 데이터 다운로드
기본적으로 이 노트북은 예제로 사용하기 위해 VOCImage 데이터의 일부를 가져오지만, 노트북 상단에서 볼 수 있는 파일 구조를 따르는 한 이미지가 있는 모든 디렉터리를 사용할 수 있습니다.
! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'
4단계: 서버에 연결하기
이 예제에서 서버는 localhost의 기본 포트에서 실행 중입니다.
connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)
5단계: 컬렉션 생성
서버를 시작한 후, 모든 벡터를 저장하기 위해 Milvus에 컬렉션을 생성합니다. 이 예제에서는 차원 크기를 resnet-18 출력의 크기인 512로 설정하고, 유사도 메트릭은 유클리드 거리(L2)로 설정합니다. Milvus는 다양한 유사도 메트릭을 지원합니다.
collection_name = "image_similarity_search"
dim = 512
default_fields = [
schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)
6단계: 컬렉션에 대한 인덱스 빌드
컬렉션이 만들어지면, 해당 컬렉션에 대한 인덱스를 빌드합니다. 이 경우 IVF_SQ8 인덱스가 사용됩니다. 이 인덱스에는 'nlist' 매개변수가 필요하며, 이는 각 데이터 파일(세그먼트) 내에 몇 개의 클러스터를 만들지 Milvus에 알려줍니다. 서로 다른 인덱스는 서로 다른 매개변수를 필요로 합니다.
default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()
7단계: 모델 및 데이터 로더 설정
IVF_SQ8 인덱스가 빌드된 후, 신경망과 데이터 로더를 설정합니다. 이 예제에서 사용되는 사전 학습된 pytorch resnet-18은 마지막 레이어가 제거되어 있으며, 해당 레이어는 분류를 위해 벡터를 압축하므로 가치 있는 정보를 잃을 수 있습니다.
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))
데이터셋과 데이터 로더는 이미지의 파일 경로도 제공하면서 이미지를 전처리하고 배치 처리할 수 있도록 수정되어야 합니다. 이는 약간 수정된 torchvision dataloader로 수행할 수 있습니다. 전처리의 경우, resnet-18 모델이 특정 크기와 값 범위로 학습되었기 때문에 이미지를 크롭하고 정규화해야 합니다.
dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))
dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si
8단계: 컬렉션에 벡터 삽입
컬렉션 설정이 완료되면, 이미지를 처리하여 생성된 컬렉션에 로드할 수 있습니다. 먼저 dataloader가 이미지를 가져오고 resnet-18 모델을 통해 실행합니다. 그 결과 생성된 벡터 임베딩은 Milvus에 삽입되며, Milvus는 각 벡터에 대해 고유 ID를 반환합니다. 그런 다음 벡터 ID와 이미지 파일 경로는 키-값 쌍으로 Redis 서버에 삽입됩니다.
steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
with torch.no_grad():
output = encoder(inputs).squeeze()
output = output.numpy()
mr = collection.insert([output.tolist()])
ids = mr.primary_keys
for x in range(len(ids)):
red.set(str(ids[x]), paths[x])
if step%5 == 0:
print("Insert Step: " + str(step) + "/" + str(steps))
step += 1
9단계: 벡터 유사도 검색 수행
모든 데이터가 Milvus와 Redis에 삽입되면, 실제 벡터 유사도 검색을 수행할 수 있습니다. 이 예제에서는 벡터 유사도 검색을 위해 Redis 서버에서 무작위로 선택된 세 개의 이미지를 가져옵니다.
random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]
이 이미지들은 먼저 7단계에서와 동일한 전처리를 거친 다음 resnet-18 모델을 통과합니다.
transform_ops = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)
with torch.no_grad():
embeddings = encoder(embeddings).squeeze().numpy()
그런 다음 결과 벡터 임베딩을 사용하여 검색을 수행합니다. 먼저 검색할 컬렉션의 이름, nprobe(검색할 클러스터 수), top_k(반환되는 벡터 수)를 포함한 검색 매개변수를 설정합니다. 이 예제에서는 검색이 매우 빠르게 수행되어야 합니다.
search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start
10단계: 이미지 검색 결과
쿼리에서 반환된 벡터 ID는 해당 이미지를 찾는 데 사용됩니다. 그런 다음 Matplotlib을 사용하여 이미지 검색 결과를 표시합니다.
그림 1.
그림 2.
그림 3.
다양한 환경에서 Milvus를 배포하는 방법 알아보기
새 bootcamp의 배포 섹션에는 다양한 환경과 설정에서 Milvus를 사용하는 데 필요한 모든 정보가 포함되어 있습니다. Mishards 배포, Kubernetes와 Milvus 사용, 로드 밸런싱 등이 포함됩니다. 각 환경에는 해당 환경에서 Milvus가 작동하도록 하는 방법을 설명하는 자세한 단계별 가이드가 있습니다.
낯설게 지내지 마세요
- 저희 블로그를 읽어보세요.
- Slack에서 저희 오픈 소스 커뮤니티와 소통하세요.
- GitHub에서 세계에서 가장 인기 있는 벡터 데이터베이스인 Milvus를 사용하거나 기여하세요.
계속 읽기

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

Similarity Metrics for Vector Search
Exploring five similarity metrics for vector search: L2 or Euclidean distance, cosine distance, inner product, and hamming distance.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.



