milvus2.0ブートキャンプでベクトル検索ソリューションを素早くテスト・展開
Milvus 2.0のリリースに伴い、チームはMilvusブートキャンプを刷新しました。新しく改良されたブートキャンプでは、様々なユースケースやデプロイメントに対応した最新のガイドと、より分かりやすいコード例を提供しています。さらに、この新しいバージョンは、世界で最も先進的なベクターデータベースの新バージョンであるMilvus 2.0用にアップデートされています。
1Mおよび100Mデータセットベンチマークに対するシステムのストレステスト
ベンチマークディレクトリには100万と1億のベクトルベンチマークテストが含まれており、異なるサイズのデータセットに対してシステムがどのように反応するかを示します。
一般的なベクトル類似検索ソリューションの検索と構築
ソリューションディレクトリには、最も一般的なベクトル類似検索のユースケースが含まれています。各ユースケースにはノートブックソリューションとDockerデプロイ可能なソリューションが含まれています。ユースケースには以下が含まれます:
完全に構築されたアプリケーションをあらゆるシステムに素早くデプロイ
クイックデプロイ・ソリューションはドッカー化されたソリューションで、ユーザーはあらゆるシステム上に完全にビルドされたアプリケーションをデプロイすることができます。これらのソリューションは簡単なデモには理想的ですが、ノートブックと比較するとカスタマイズや理解するための作業が増えます。
シナリオ固有のノートブックを使用して、設定済みのアプリケーションを簡単にデプロイできます。
ノートブックには、与えられたユースケースにおける問題を解決するためにMilvusをデプロイする簡単な例が含まれています。それぞれの例は、ファイルや設定を管理することなく、最初から最後まで実行することができます。また、各ノートブックは簡単に従うことができ、変更可能であるため、他のプロジェクトのための理想的なベースファイルとなります。
画像類似検索ノートブックの例
画像の類似性検索は、物体を認識する自律走行車など、さまざまな技術の中核となるアイデアの1つです。この例では、Milvusを使ってコンピュータビジョンプログラムを簡単に構築する方法を説明します。
このノートブックは以下の3つを中心に構成されています:
- 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に挿入されると、実際のベクトル類似性検索を実行することができます。この例では、ランダムに選んだ3つの画像を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を使用するためのすべての情報が含まれています。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