46.4kデモを予約するログイン無料で始める

Milvus 2.0ブートキャンプでベクトル検索ソリューションを素早くテスト・展開

Jul 14, 20211 min read

Milvus 2.0のリリースに伴い、チームはMilvus ブートキャンプを刷新しました。新しく改良されたブートキャンプでは、様々なユースケースやデプロイメントに対応した、アップデートされたガイドと分かりやすいコード例を提供しています。さらに、この新しいバージョンは、世界で最も先進的なベクターデータベースの再構築バージョンであるMilvus 2.0用に更新されています。

1M および 100M データセットベンチマークに対するシステムのストレステスト

benchmark ディレクトリ](https://github.com/milvus-io/bootcamp/tree/master/benchmark_test) には、異なるサイズのデータセットに対してシステムがどのように反応するかを示す、100万と1億のベクトルベンチマークテストが含まれています。


このテストは、異なるサイズのデータセットに対してシステムがどのように反応するかを示すものです。

よく使われるベクトル類似検索ソリューションの探索と構築

ソリューションディレクトリ](https://github.com/milvus-io/bootcamp/tree/master/solutions) には、最も人気のあるベクトル類似検索のユースケースが含まれています。各ユースケースには、ノートブックソリューションと docker でデプロイ可能なソリューションが含まれています。ユースケースには以下が含まれます:

  • 画像類似検索](https://github.com/milvus-io/bootcamp/tree/master/solutions/reverse_image_search)
  • 動画類似検索](https://github.com/milvus-io/bootcamp/tree/master/solutions/video_similarity_search)
  • 音声類似検索](https://github.com/milvus-io/bootcamp/tree/master/solutions/audio_similarity_search)
  • レコメンデーションシステム](https://github.com/milvus-io/bootcamp/tree/master/solutions/recommendation_system)
  • 分子検索](https://github.com/milvus-io/bootcamp/tree/master/solutions/molecular_similarity_search)
  • 質問応答システム](https://github.com/milvus-io/bootcamp/tree/master/solutions/question_answering_system)


完全にビルドされたアプリケーションをどんなシステムにも素早くデプロイする

クイックデプロイソリューションは docker 化されたソリューションであり、ユーザーはあらゆるシステム上に完全にビルドされたアプリケーションをデプロイすることができます。これらのソリューションは簡単なデモには理想的ですが、ノートブックに比べるとカスタマイズや理解するための作業が増えます。


<br

シナリオ固有のノートブックを使って、設定済みのアプリケーションを簡単にデプロイする

ノートブックには、与えられたユースケースの問題を解決するためにMilvusをデプロイする簡単な例が含まれています。それぞれの例は、ファイルや設定を管理することなく、最初から最後まで実行することができます。また、各ノートブックはフォローしやすく、変更可能であるため、他のプロジェクトのための理想的なベースファイルとなっています。


<br

画像類似検索ノートブックの例

画像の類似性検索は、自律走行車が物体を認識するなど、様々な技術のコアとなるアイデアの1つです。この例では、Milvusを使ってコンピュータビジョンプログラムを簡単に構築する方法を説明します。

この例では3つのことを扱います:

  • Milvusサーバー
  • Redisサーバ(メタデータ保存用)
  • 事前訓練されたResnet-18モデル。

ステップ1:必要なパッケージのダウンロード

このプロジェクトに必要なパッケージをすべてダウンロードすることから始めます。このノートブックには、使用するパッケージの一覧表が含まれています。

pip install -r requirements.txt

ステップ2:サーバーの起動

パッケージのインストールが完了したら、サーバを起動し、両方が正常に動作していることを確認します。Milvus](https://milvus.io/docs/v2.0.0/install_standalone-docker.md)および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は様々な類似度メトリックをサポートしています。

コレクション名 = "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="画像テストコレクション")
コレクション = コレクション(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)
コレクション.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: ベクトルをコレクションに挿入する

コレクションがセットアップされると、画像を処理し、作成されたコレクションにロードできます。最初に、画像はデータローダによって取り込まれ、resnet-18モデルを通して実行される。その結果のベクトル埋め込みがMilvusに挿入され、各ベクトルに一意のIDが返される。ベクトルIDと画像ファイルのパスは、キーと値のペアとしてRedisサーバーに挿入されます。

ステップ = len(dataloader)
ステップ = 0
for inputs, labels, paths in dataloader:
    with torch.no_grad():
        output = encoder(inputs).squeeze()
        出力 = 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が画像検索結果の表示に使われる。
画像検索結果を表示するためにMatplotlibが使用されます。

図1](https://assets.zilliz.com/pic1_c8652c7fae.png) 図2.](https://assets.zilliz.com/pic2_355b054161.png) 図3.](https://assets.zilliz.com/pic3_01780c6aac.png)


異なる環境におけるMilvusのデプロイ方法を学ぶ

新しいブートキャンプのデプロイメントセクションには、様々な環境やセットアップでMilvusを使用するためのすべての情報が含まれています。Mishardsのデプロイ、KubernetesとMilvusの併用、ロードバランシングなどが含まれます。各環境には、Milvusを動作させる方法を説明する詳細なステップバイステップガイドがあります。


知らない人にならないために

  • ブログ](https://zilliz.com/blog)を読んでください。
  • Slack](https://join.slack.com/t/milvusio/shared_invite/zt-e0u4qu3k-bI2GDNys3ZqX1YCJ9OM~GQ)でオープンソースコミュニティと交流しましょう。
  • GitHubで、世界で最も人気のあるベクトルデータベースであるMilvus](https://github.com/milvus-io/milvus)を使用するか、またはMilvusに貢献する。
Updated on Jul 09, 2026