MilvusクラスタとK8sを使い始める
はじめに
Milvusは分散型ベクトルデータベースであり、膨大な埋め込みベクトルの保存、インデックス付け、管理を目的としている。Milvusは、何兆ものベクトルを効率的にインデックス化し、検索することができるため、AIや機械学習のワークロードに最適な選択肢となっている。
一方、Kubernetes(K8s)はコンテナ化されたアプリケーションの管理とスケーリングに優れている。自動スケーリング、セルフヒーリング、ロードバランシングなどの機能を提供し、本番環境での高可用性とパフォーマンスの維持に欠かせない。
なぜ併用するのか?
K8sは、ワークロードに応じてmilvusクラスタを自動的にスケールすることができます。データの増加やクエリの増加に伴い、K8sはより多くのMilvusインスタンスをスピンアップして負荷に対応し、アプリケーションの応答性を確保します。
K8sの特筆すべき特徴の1つは、Milvusクラスタを簡単に拡張できる水平スケーリングです。データセットが大きくなっても、K8sはその増加に難なく対応し、わかりやすく効率的なソリューションを実現します。
さらに、K8sはクエリ処理能力も水平方向に拡張します。クエリの負荷が増加するにつれ、K8sは増加する類似検索クエリに対応するため、より多くのMilvusインスタンスをデプロイすることができ、高負荷下でも低レイテンシーのレスポンスを保証します。
前提条件とK8sのセットアップ
前提条件
Docker- Dockerがシステムにインストールされていること。
Kubernetes- Kubernetesクラスタを用意してください。ローカル開発には
minikube
、本番環境にはクラウドプロバイダのKubernetesサービスを利用できます。Helm- Kubernetesアプリケーションを管理するために、Kubernetes用のパッケージマネージャーであるHelmをインストールします。https://milvus.io/docs/install_cluster-helm.md、その方法はドキュメントを参照してください。
Kubectl- Kubernetesクラスタと対話するためのコマンドラインツールである
kubectl
、アプリケーションのデプロイ、クラスタリソースの検査と管理、ログの表示を行うためにインストールします。
K8sのセットアップ
K8sクラスタの実行に必要なものをすべてインストールした後、minikube
を使用した場合は、 でクラスタを開始します:
minikube start
でK8sクラスタのステータスを確認します:
kubectl cluster-info
K8sへのMilvusのデプロイ
今回のデプロイでは、Milvusの分散機能をフルに活用するため、クラスタモードでのMilvusを選択します。インストールプロセスを効率化するためにHelmを使用します。
1.Helmインストールコマンド
helm install my-milvus milvus/milvus --set pulsar.enabled=false --set kafka.enabled=true
このコマンドは、Kafkaを有効にし、Pulsarを無効にした状態で、K8sクラスタにMilvusをインストールします。KafkaはMilvus内のメッセージング・システムとして機能し、異なるコンポーネント間のデータ・ストリーミングを処理します。Pulsarを無効化し、Kafkaを有効化することで、デプロイメントを特定のメッセージング設定および要件に合わせることができます。
2.ポート転送
ローカル・マシンからMilvusにアクセスするには、ポート・フォワードを作成します:kubectl port-forward svc/my-milvus 27017:19530
。
このコマンドは、Milvusサービスsvc/my-milvus
のポート19530
をローカルマシンの同じポートにマップし、ローカルツールを使用してMilvusに接続できるようにします。ローカルポートを未指定のままにしておくと(:19530
のように)、K8s が利用可能なポートを割り当て、動的に使用できるようにします。この方法を選択した場合、割り当てられたローカルポートをメモしておいてください。
3.デプロイの確認
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-milvus-datacoord-595b996bd4-zprpd 1/1 Running 0 85m
my-milvus-datanode-d9d555785-47nkt 1/1 Running 0 85m
my-milvus-etcd-0 1/1 Running 0 84m
my-milvus-etcd-1 1/1 Running 0 85m
my-milvus-etcd-2 1/1 Running 0 85m
my-milvus-indexcoord-65bc68968c-6jg6q 1/1 Running 0 85m
my-milvus-indexnode-54586f55d-z9vx4 1/1 Running 0 85m
my-milvus-kafka-0 1/1 Running 0 85m
my-milvus-kafka-1 1/1 Running 0 85m
my-milvus-kafka-2 1/1 Running 0 85m
my-milvus-minio-0 1/1 Running 0 96m
my-milvus-minio-1 1/1 Running 0 96m
my-milvus-minio-2 1/1 Running 0 96m
my-milvus-minio-3 1/1 Running 0 96m
my-milvus-proxy-76bb7d497f-sqwvd 1/1 Running 0 85m
my-milvus-querycoord-6f4c7b7598-b6twj 1/1 Running 0 85m
my-milvus-querynode-677bdf485b-ktc6m 1/1 Running 0 85m
my-milvus-rootcoord-7498fddfd8-v5zw8 1/1 Running 0 85m
my-milvus-zookeeper-0 1/1 Running 0 85m
my-milvus-zookeeper-1 1/1 Running 0 85m
my-milvus-zookeeper-2 1/1 Running 0 85m
上の出力と同じようなポッドのリストが表示され、すべてRunning状態になっているはずです。これはMilvusクラスタが稼働していることを示しています。特に、READY
列の下にある 1/1 を探してください。これは、各 Pod が完全に準備できていて稼働していることを意味します。Running状態にないPodがある場合は、デプロイを成功させるためにさらに調査する必要があるかもしれません。
Milvusクラスタがデプロイされ、すべてのコンポーネントが動作していることが確認されたので、データの取り込みとインデックス作成に進む準備ができました。これには、Milvusインスタンスへの接続、コレクションの作成、検索および取得のためのベクトルの挿入が含まれます。
データの取り込みとインデックス作成
Milvusクラスタでデータの取り込みとインデックス作成を開始するために、pymilvus SDKを使用します。2つのインストールオプションがあります:
基本SDK:
pip install pymilvus
Basic SDK: リッチテキスト埋め込みと高度なモデル用:
pip install pymilvus[model]
クラスタにデータを挿入する時間には、pymilvus
を使用します。pip install pymilvus
を使用してSDKのみをインストールするか、リッチテキストの埋め込みを抽出したい場合は、pip install pymilvus[model]
をインストールしてPyMilvus Models
を使用することもできます。
接続とコレクションの作成
まず、Milvusインスタンスに先ほど転送したポートを使って接続します。URIがK8sによって割り当てられたローカルポートと一致していることを確認してください:
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://127.0.0.1:52070",
)
client.create_collection(collection_name="quick_setup", dimension=5)
dimension=5
パラメータは、このコレクションのベクターサイズを定義します。これは、ベクター検索機能に不可欠です。
データの挿入
各ベクターがアイテムを表し、カラーフィールドが説明属性を追加します:
data=[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]
res = client.insert(
collection_name="quick_setup",
data=data
)
print(res)
提供されるコードは、クイックセットアップの方法でコレクションを作成したと仮定します。上のコードに示すように
挿入するデータはディクショナリのリストに編成され、各ディクショナリはデータ・レコードを表し、エンティ ティと呼ばれます。
各ディクショナリには、color という名前の非スキーマ定義フィールドが含まれます。
各ディクショナリには、定義済みフィールドとダイナミック・フィールドの両方に対応するキーが含まれています。
さらに多くのデータを挿入する
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}"
} for i in range(1000) ]
res = client.insert(
collection_name="quick_setup",
data=data[10:]
)
print(res)
類似検索
コレクションに入力した後、類似性検索を実行して、クエリ・ベクタに近いベクトルを見つけることができます。query_vectors 変数の値は、float のサブリストを含むリストです。このサブリストは、5次元のベクトル埋め込みを表します。
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]
res = client.search(
collection_name="quick_setup", # target collection
data=query_vectors, # query vectors
limit=3, # number of returned entities
)
print(res)
このクエリでは、クエリベクトルに最も近い上位3つのベクトルを検索し、Milvusの強力な検索機能を示しています。
K8sからMilvusをアンインストールする。
このチュートリアルが終わったら、helm uninstall my-milvus
でK8sクラスタからMilvusをアンインストールしてください。
このコマンドを実行すると、my-milvus
リリースでデプロイされたすべてのMilvusコンポーネントが削除され、クラスタリソースが解放されます。
まとめ
KubernetesクラスタにMilvusをデプロイすることで、AIや機械学習のワークロードを処理するためのベクトルデータベースのスケーラビリティと柔軟性が示されます。このチュートリアルを通じて、Helmを使用したMilvusのセットアップ、コレクションの作成、データの取り込みと類似検索の実行の基本を学びました。
Helmを使ったKubernetesクラスタへのMilvusのインストールは簡単なはずです。より大きなデータセットやより集中的なワークロードのためにMilvusクラスタをスケーリングするために、私たちのドキュメントは詳細なガイダンスを提供していますhttps://milvus.io/docs/scaleout.md。
Githubでコードをチェックアウトし、Milvusをチェックアウトし、様々な構成やユースケースを試し、私たちのDiscordに参加してコミュニティと経験を共有してください。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word