使用 Milvus 2.0 Bootcamp 快速測試和部署矢量搜尋解決方案
隨著 Milvus 2.0 的釋出,團隊對 MilvusBootcamp 進行了改良。全新改良的 Bootcamp 為各種使用案例和部署提供更新的指南和更容易遵循的程式碼範例。此外,新版本還針對Milvus 2.0 進行了更新,Milvus 2.0 是世界上最先進的向量資料庫的重構版本。
根據 1M 和 100M 資料集基準測試您的系統
基準目錄包含 1 百萬與 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 中建立一個集合來儲存所有向量。在本範例中,維度大小設定為 512,即 resnet-18 輸出的大小,相似度指標設定為歐氏距離 (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 資料載入程式來完成。對於預處理,由於 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,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
新 Bootcamp 的部署部分包含了在不同環境和設置下使用 Milvus 的所有資訊。它包括部署 Mishards、使用 Kubernetes 與 Milvus、負載平衡等。每個環境都有詳細的步驟說明,解釋如何讓 Milvus 在其中運作。
不要成為陌生人
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word