🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
  • Home
  • Blog
  • 使用 Milvus 2.0 Bootcamp 快速測試和部署矢量搜尋解決方案

使用 Milvus 2.0 Bootcamp 快速測試和部署矢量搜尋解決方案

  • Engineering
July 15, 2021
milvus

隨著 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:啟動伺服器

套件安裝完成後,啟動伺服器並確保兩者都能正常執行。請務必按照正確的指示啟動MilvusRedis伺服器。

步驟 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

一旦所有資料都插入 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 pic1.png pic2.pngpic2.png pic3.pngpic3. png


學習如何在不同環境下部署 Milvus

新 Bootcamp 的部署部分包含了在不同環境和設置下使用 Milvus 的所有資訊。它包括部署 Mishards、使用 Kubernetes 與 Milvus、負載平衡等。每個環境都有詳細的步驟說明,解釋如何讓 Milvus 在其中運作。


不要成為陌生人

  • 閱讀我們的部落格
  • Slack 上與我們的開放原始碼社群互動。
  • Github 上使用或貢獻世界上最流行的向量資料庫 Milvus。

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    繼續閱讀