Milvus 2.0 부트캠프로 벡터 검색 솔루션을 빠르게 테스트하고 배포하세요.
Milvus 2.0의 출시와 함께 Milvus 부트캠프가 개편되었습니다. 새롭고 개선된 부트캠프는 다양한 사용 사례와 배포를 위한 업데이트된 가이드와 따라 하기 쉬운 코드 예제를 제공합니다. 또한 이 새 버전은 세계에서 가장 진보된 벡터 데이터베이스를 새롭게 재해석한 Milvus 2.0용으로 업데이트되었습니다.
100만 및 1억 데이터 세트 벤치마크로 시스템 스트레스 테스트하기
벤치마크 디렉터리에는 다양한 크기의 데이터 세트에 대해 시스템이 어떻게 반응하는지 보여주는 100만 및 1억 개의 벡터 벤치마크 테스트가 포함되어 있습니다.
인기 있는 벡터 유사도 검색 솔루션 탐색 및 구축
솔루션 디렉터리에는 가장 인기 있는 벡터 유사도 검색 사용 사례가 포함되어 있습니다. 각 사용 사례에는 노트북 솔루션과 도커 배포 가능한 솔루션이 포함되어 있습니다. 사용 사례는 다음과 같습니다:
모든 시스템에 완벽하게 빌드된 애플리케이션을 빠르게 배포하세요
빠른 배포 솔루션은 도커화된 솔루션으로, 사용자가 모든 시스템에 완벽하게 구축된 애플리케이션을 배포할 수 있도록 해줍니다. 이러한 솔루션은 간단한 데모에 이상적이지만 노트북에 비해 사용자 지정 및 이해에 추가적인 작업이 필요합니다.
시나리오별 노트북을 사용해 사전 구성된 애플리케이션을 쉽게 배포하세요.
노트북에는 주어진 사용 사례의 문제를 해결하기 위해 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단계: 서버에 연결
이 예에서는 서버가 로컬 호스트의 기본 포트에서 실행되고 있습니다.
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 인덱스가 사용됩니다. 이 인덱스에는 각 데이터 파일(세그먼트) 내에 몇 개의 클러스터를 만들 것인지 Milvus에 알려주는 'nlist' 매개변수가 필요합니다. 인덱스마다 다른 매개변수가 필요합니다.
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 인덱스가 구축되면 신경망과 데이터 로더를 설정합니다. 이 예에서 사용된 사전 학습된 파이토치 resnet-18은 분류를 위해 벡터를 압축하는 마지막 계층이 없어 중요한 정보가 손실될 수 있습니다.
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))
데이터 세트와 데이터 로더는 이미지의 파일 경로를 제공하면서 이미지를 전처리하고 일괄 처리할 수 있도록 수정해야 합니다. 이는 약간 수정된 토치비전 데이터 로더를 사용하여 수행할 수 있습니다. 전처리를 위해서는 특정 크기와 값 범위에 대해 학습된 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단계: 컬렉션에 벡터 삽입하기
컬렉션 설정이 완료되면 이미지를 처리하여 생성된 컬렉션에 로드할 수 있습니다. 먼저 데이터 로더를 통해 이미지를 가져와 resnet-18 모델을 통해 실행합니다. 그런 다음 결과 벡터 임베딩을 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를 사용합니다.
pic1.png
pic2.png
pic3.png
다양한 환경에서 Milvus를 배포하는 방법 알아보기
새로운 부트캠프의 배포 섹션에는 다양한 환경과 설정에서 Milvus를 사용하기 위한 모든 정보가 포함되어 있습니다. 여기에는 미샤드 배포, Milvus와 함께 Kubernetes 사용, 로드 밸런싱 등이 포함됩니다. 각 환경에는 Milvus를 작동시키는 방법을 설명하는 자세한 단계별 가이드가 있습니다.
낯선 사람이 되지 마세요.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word