GCP KubernetesでMilvusを効率的にデプロイする:オープンソースデータベース管理ガイド
Milvus on Kubernetes (K8s)のセルフホスト、特にGoogle Cloud Platform (GCP)環境には多くのメリットがあります。そのメリットとGCP上でのKubernetesクラスタのセットアップ方法については、ブログをお読みください。
シリーズ全体を読む
- 楽々AIワークフロー:Hugging FaceとPyMilvusの初心者ガイド
- MilvusとHaystack 2.0によるRAGパイプラインの構築
- Milvusインスタンスでベクターインデックスを選ぶ方法:ビジュアルガイド
- MilvusとOpenAIによるセマンティック検索
- GCP KubernetesでMilvusを効率的にデプロイする:オープンソースデータベース管理ガイド
- 北極雪片とMilvus上のトランスフォーマーでRAGを作る
- MilvusでJSONデータをベクトル化し、類似性検索を行う
- Gemini 1.5、BGE-M3、Milvus Lite、LangChainによるマルチモーダルRAGの構築
1.はじめに
Milvusのようなベクトルデータベースは、強力な類似検索を可能にし、コンテンツベースの検索機能で業界に革命をもたらします。オープンソースのベクトルデータベースであるMilvusは、高次元のベクトル埋め込みデータの膨大なコレクションを効率的に保存、管理、検索することに優れており、非構造化データの潜在能力を引き出し、AIアプリケーションや機械学習モデルのコンテキスト、ニュアンス、意味的関係を理解する能力を強化します。
Kubernetes(K8s)上でMilvusをセルフホストすること、特にGoogle Cloud Platform(GCP)環境では、数多くの利点があります。K8sは、デプロイメントに対する柔軟性と制御性を提供するため、組織は特定の要件に応じてセットアップをカスタマイズすることができます。K8sはシームレスなスケーリングと負荷分散を可能にし、効率的なリソース利用と高可用性を実現します。GCPエコシステムは、堅牢なセキュリティ、監視、他のGCPサービスとの統合を提供し、Milvusの導入の全体的な管理と運用を合理化します。セルフホスティングにより、企業はデータとインフラストラクチャを管理しながら、Milvusの潜在能力を最大限に活用することができます。
2.なぜKubernetes for Milvus on GCPなのか?
スケーラブルで高速なベクトルデータ検索のために設計されたオープンソースのベクトルデータベースであるMilvusをK8s上にデプロイすることで、スケーラビリティ、耐障害性、管理性の面で大きなメリットが得られます。以下は、K8sがMilvus、特にGCP上での展開に理想的ないくつかの理由です:
スケーラビリティ
K8sは水平スケーリングに優れており、Milvusのポッドがシームレスにスケールアウトすることで、様々なワークロードや大規模なデータセットに対応することができます。この機能は、ベクトル検索操作のパフォーマンスと効率を維持するために重要であり、成功するクラウド展開戦略の重要な要素となっています。
レジリエンス
K8s は、自己修復メカニズムと永続ボリュームのサポートにより、Milvus の耐障害性を向上させます。これらの機能により、堅牢な データベース・セキュリティ を維持するために不可欠な高可用性とデータ耐久性が確保されます。
管理性
管理性の観点から、K8s は自動化されたロールアウト、ロールバック、および宣言的な設定によってデプロイを簡素化します。これにより、Milvusのような複雑なアプリケーションのメンテナンスが効率化されます。
GCPサービスとの統合
K8s上のMilvusをGCP環境にデプロイすることで、GCPサービスとの統合による相乗効果とメリットを引き出すことができます:
セキュアでスケーラブルなネットワーキング:GCP上のK8sクラスタは、GoogleのVirtual Private Cloud (VPC)を活用して安全なネットワーキングを行うことができます。
効率的なロードバランシング**:GCPのロードバランシングソリューションは、Milvusインスタンス間の効率的なリクエスト分散を保証し、リソースの使用と応答時間を最適化します。
高性能ストレージ**:GCPの永続ディスクは、Milvusのようなデータベースに最適で、K8sポッドに簡単に接続できるため、ストレージ管理が簡素化され、パフォーマンスが向上します。
包括的なモニタリング**:GCPのオペレーションスイートと統合することで、Milvusデプロイメントの包括的な監視、ロギング、診断が可能になり、システムの健全性とパフォーマンスの維持に不可欠です。
費用対効果の高いスケーリング**:GCPは、カスタムマシンタイプやプリエンプティブVMも提供しており、ワークロードの需要に応じてMilvusをコスト効率よくスケーリングできます。
これらの要因により、K8sはGCP上でMilvusを展開するための優れたプラットフォームとなり、オープンソースソフトウェア開発の原則をサポートしながら、スケーラビリティ、回復力、管理性、および堅牢なクラウドサービスとの統合を強化します。
3.前提条件
GCP上にMilvusをデプロイする前に、GCPプロジェクトが既にセットアップされていることを確認してください。プロジェクトがない場合は、プロジェクトの作成と管理の手順に従って作成することができます。
ローカルマシンに gcloud CLI をインストールするか、ブラウザベースの Google Cloud Shell を使用する必要があります。kubectlとHelmもK8sクラスタとアプリケーションの管理に不可欠なので、ローカルにインストールしておく必要がある。GCP リソースを効果的に管理するために、GCP アカウントの認証情報でgcloud` CLI を初期化してください。
必要なツールとアクセス
GCP上にMilvusをデプロイするには、以下のツールとアクセス権が必要です:
1.Google Cloud Platform アカウント:Google Cloud Platformアカウント**: リソースの作成および管理権限を持つGCPアカウントへのアクセスが必須です。
2.gcloud CLI:このコマンドラインインターフェイスは、ネットワークやVMを含むGCPサービスを管理するために必要です。このツールをローカルマシンにインストールするか、Google Cloud Shellを使用する必要があります。
3.kubectl:K8sクラスタ管理用のコマンドラインツールです。K8sリソースのデプロイと管理に重要です。
4.Helm:Helmはチャートを通してK8sアプリケーションを管理するために使用され、アプリケーションのデプロイとメンテナンスを簡素化します。
ネットワークアクセス:GCPプロジェクト内でネットワークとファイアウォールルールを設定するには、十分な権限が必要です。以下は、Milvusの安全かつ機能的な接続性を確保するための仮想ネットワークの設定とファイアウォールルールの設定を行うためのコマンドです:
VPCネットワークを作成する:gcloud compute networks create milvus-network
--プロジェクト=milvus-testing-nonprod
-サブネットモード=自動
--mtu=1460
-bgp-ルーティングモード=リージョナル
**ファイアウォールのルールを設定する。
gcloud compute firewall-rules create milvus-network-allow-icmp ` を作成します。
--プロジェクト=milvus-testing-nonprod
--network=projects/milvus-testing-nonprod/global/networks/milvus-network
-description="任意のソースからネットワーク上の任意のインスタンスへの ICMP 接続を許可します。"
-方向=INGRESS
--優先度=65534
--source-ranges=0.0.0.0/0
--action=ALLOW
--rules=icmp
gcloud compute firewall-rules create milvus-network-allow-internal
--プロジェクト=milvus-testing-nonprod
--network=projects/milvus-testing-nonprod/global/networks/milvus-network
-description="ネットワーク IP 範囲内の任意のソースから、すべてのプロトコルを使用してネットワーク上の任意のインスタンスへの接続を許可します。"
-方向=INGRESS
--優先度=65534
--source-ranges=10.128.0.0/9
--action=ALLOW
--rules=all
gcloud compute firewall-rules create milvus-network-allow-rdp
--プロジェクト=milvus-testing-nonprod
--network=projects/milvus-testing-nonprod/global/networks/milvus-network
-description="ポート 3389 を使用して、任意のソースからネットワーク上の任意のインスタンスへの RDP 接続を許可します。"
-方向=INGRESS
--優先度=65534
--source-ranges=0.0.0.0/0
--action=ALLOW
--rules=tcp:3389
gcloud compute firewall-rules create milvus-network-allow-ssh
--プロジェクト=milvus-testing-nonprod
--network=projects/milvus-testing-nonprod/global/networks/milvus-network
-description="ポート 22 を使用して、任意のソースからネットワーク上の任意のインスタンスへの TCP 接続を許可します。"
-方向=INGRESS
--優先度=65534
--source-ranges=0.0.0.0/0
--action=ALLOW
--rules=tcp:22
**ポート19530のMilvusトラフィックを許可する。
--プロジェクト=milvus-testing-nonprod
-description="ポート19530でMilvusのイングレストラフィックを許可する"
-方向=INGRESS
--優先度=1000
--network=projects/milvus-testing-nonprod/global/networks/milvus-network
--action=ALLOW
--rules=tcp:19530
-ソースレンジ=0.0.0.0/0.
これらのツールが正しく設定され、GCPプロジェクト内で操作を実行するために必要な管理者アクセス権を持っていることを確認してください。
4.GCP上のKubernetesクラスタのセットアップ
クラスターの作成と設定
Google Kubernetes Engine (GKE)を使用してGCP上のMilvusに適したK8sクラスタをセットアップするには、以下の詳細な手順に従ってください:
1.**Google Cloud Consoleを開く:Google Cloud Consoleに移動し、Googleアカウントでログインします。
2.**GKEにアクセスします:ナビゲーションメニューから、"Kubernetes Engine"、"Clusters "の順に選択します。
3.**クラスタを作成します:Create" ボタンをクリックして、K8sクラスタの設定を開始します。
4.基本設定:
クラスタに名前を付けます:クラスタ名として "milvus-cluster-1 "を入力します。
ゾーンを選択します:クラスタゾーンに "us-west1-a "を選択し、データソースまたはユーザとの近接性を確保します。
5.ノード構成:
マシンタイプ**:各ノードに "c2-standard-4 "を選択し、ノードあたり16GBのメモリを提供し、最適なパフォーマンスを確保します。
イメージ・タイプCOS_CONTAINERD "を選択する。
ディスク・タイプとサイズディスクタイプを "pd-standard"、サイズを100GBに設定する。
6.詳細設定:
Enable basic authentication "ボックスのチェックを外し、ベーシック認証を無効にします。
マスターバージョン "ドロップダウンでK8sのバージョンを "1.27.3-gke.100 "に設定します。
より良いネットワークパフォーマンスと管理のためにIPエイリアシングを有効にしてください。
7.**クラスタをデプロイします:Create "をクリックしてクラスタをプロビジョニングします。クラスタの準備が整うまで数分かかります。
クラスタがアクティブになったら、リモート管理用の認証情報を取得します:
gcloud container clusters get-credentials milvus-cluster-1 --zone "us-west1-a"
Milvusのクラスタ最適化
Milvus のパフォーマンスを向上させるために GKE クラスタを最適化するには、以下の設定の実装を検討してください:
リソース割り当て
- ノードの調整**:予想されるワークロードに基づいて、ノード数を調整します。最適なパフォーマンスと耐障害性を得るには、クラスタ内に少なくとも3つのノードを維持することが推奨されます。このセットアップにより、負荷が分散され、システムの回復力が確保されます。
ネットワーク・パフォーマンス
- VPCとネットワークティア**:Google の仮想プライベートクラウド(VPC)とプレミアムネットワーク層を活用します。この強化により、ノード間のスループットが向上し、他の GCP サービスとの効率的な通信が促進されます。
ストレージパフォーマンス
SSD対標準ディスク**:Milvus の運用に不可欠な I/O 性能を向上させるには、予算が許す限り、標準ディスク (
pd-standard) よりも高性能な SSD (pd-ssd) を選択する。ディスクサイズ大規模なデータセットを扱うことが予想される場合は、パフォーマンスを低下させることなくデータストレージのニーズに対応できるよう、ディスクサイズの拡張を検討してください。
スケーリングと自動スケーリング
- 自動スケーリング**:クラスタ内で自動スケーリングを有効にして、ワークロードの変動を効率的に管理します。不要なリソースを消費することなくパフォーマンスを維持するには、観察された CPU とメモリーの使用パターンに基づいて、オートスケーリングパラメータを慎重に設定することが重要です。
ポッド密度
- ノードあたりの最大ポッド数**:Milvusインスタンスの運用要件やノードの容量によっては、ノードあたりの最大ポッド数を増やす必要があるかもしれません。ノードあたり最大110ポッドまでサポートされており、大幅なスケーリングと柔軟な展開が可能です。
これらのパラメータを慎重に設定することで、GKEクラスタ上のMilvusのパフォーマンスと安定性を大幅に向上させ、ベクターデータの管理とクエリのための堅牢な環境を確保することができます。
5.Kubernetes上でのMilvusのデプロイ
K8sクラスタにMilvusをデプロイするには、Helmをセットアップし、Milvus Helmリポジトリを追加し、Helmを使ってMilvusアプリケーションをデプロイします。以下はステップバイステップのガイドです:
Helmのインストールとセットアップ
Helmはアプリケーションのデプロイと管理を簡素化するKubernetes用のパッケージマネージャです。Helmを使用してMilvusをインストールするには、まずHelm本体をインストールし、Milvusリポジトリを追加する必要があります。
1.**Helmをインストールします:Helm Docs](https://helm.sh/docs/intro/install/)にある公式のHelmインストールガイドに従って、システムにHelmをインストールします。
2.Milvusリポジトリの追加:以下のコマンドを実行し、Milvus Helmリポジトリを追加します。このリポジトリには、K8sにMilvusをデプロイするために必要なすべてのチャートが含まれています。
Helm repo add milvus [https://zilliztech.github.io/milvus-helm/](https://zilliztech.github.io/milvus-helm/)
helm リポジトリ更新
Helm で Milvus をデプロイする
Helmのセットアップが完了し、Milvusリポジトリが追加されたら、K8sクラスタにMilvusをデプロイします。
設定の準備
Milvusデプロイのコンフィギュレーション設定を指定するvalues.yamlファイルを作成します。このファイルは、永続性、リソース割り当て、サービスタイプなど、さまざまな側面を制御します。
helm show values milvus/milvus > values.yaml
Milvusをデプロイする
以下のコマンドを実行し、Milvusをデプロイします:
helm install -f values.yaml my-release milvus/milvus
このコマンドでは
f values.yaml` は設定ファイルを指定します。
my-release` は Helm のリリース名です。
milvus/milvus` はインストールするチャートを指定する。
サービスタイプ
レイヤ4ロードバランサを通してMilvusインスタンスを外部に公開する場合は、values.yamlのservice.typeの値がLoadBalancerに設定されていることを確認する。
デプロイの検証
以下のコマンドを実行して、Milvus デプロイの外部 IP アドレスを確認します:
kubectl get services | grep my-release-milvus | grep LoadBalancer | awk '{print $4}'.
このコマンドは、すべてのPodがスムーズに動作し、サービスにアクセスできることを確認するのに役立ちます。
6.GCP上のMilvusに永続ストレージを設定する
永続ボリュームの設定
Milvus on GCP用の永続ボリューム(PV)を設定するには、まずGoogle Cloud ConsoleでGCP Persistent Diskを作成します。適切なディスクタイプとサイズを選択してください。次に、K8sでこのディスクを参照するPVを定義し、ストレージ容量、アクセスモード、ディスク名などのプロパティを指定する。最後に、PVからストレージを要求するためのPersistent Volume Claim (PVC)を作成し、Milvusのデプロイ要件と一致することを確認する。
ストレージ管理の実践
GCP上で効果的なストレージ管理を行うには、GCPスナップショットを使用してMilvusデータを定期的にバックアップし、データ損失から保護します。これらのバックアップを自動化し、Google Cloudのオペレーションスイートで状態を監視します。さらに、ディスクの使用率とパフォーマンスメトリクスを監視して、ストレージリソースをタイムリーに拡張します。データの整合性を維持し、コストを最適化するために、異常なアクティビティに対するアラートを実装し、Milvusのインストールが効率的かつ安全に実行され続けるようにします。
7.Milvus へのアクセスと管理
アクセステクニック
内部アクセス:
- クラスタ内のMilvusにアクセスするには、内部ネットワーク構成およびサービス検出メカニズムを使用します。
外部アクセス
以下のような公開エンドポイントを介してMilvusにアクセスします:
RESTful API
SDK
パブリックIPアドレスまたはドメイン名で接続
管理ツール
Milvus Insight:
GUI ベースの対話型管理ツール。
システムの健全性とクエリのパフォーマンスを監視します。
リソースを効率的に管理
コマンドライン・インターフェイス (CLI):**
- 上級ユーザー向けの直接コマンド制御を提供します。
8.使用例
必要なライブラリのインポート
まず、必要なライブラリとモジュールをインポートします。
from pymilvus import MilvusClient, DataType
インポートランダム
Milvusへの接続
クラスタの認証情報またはAPIキーを取得したら、それを使ってMilvusに接続します。
# 1.Milvusクライアントをセットアップする
クライアント = MilvusClient(
uri="http://my-cluster.com/endpoint:19530"、
token="mypassword"、
uri="http://localhost:19530"
)
コレクションの作成
Milvusでは、ベクトル埋め込みをコレクションに格納する必要があります。コレクションに格納されたすべてのベクトル埋め込みは、同じ次元と類似度を測るための距離メトリックを共有します。コレクションは以下のいずれかの方法で作成できます。
クイックセットアップ
クイック・セットアップ・モードでコレクションをセットアップするには、コレクション名とコ レクションのベクトル・フィールドの次元を設定するだけでよい。
# 2.クイック・セットアップ・モードでコレクションを作成する
client.create_collection(
コレクション名="quick_setup"、
ディメンション=5
)
カスタマイズされたセットアップ
コレクションスキーマを自分で定義するには、カスタマイズセットアップを使用します。この方法で、名前、データ型、特定のフィールドの追加属性など、コレクション内の各フィールドの属性を定義できます。
# 3.カスタマイズセットアップモードでコレクションを作成する
# 3.1.スキーマの作成
schema = MilvusClient.create_schema(
auto_id=False、
enable_dynamic_field=True、
)
# 3.2.スキーマにフィールドを追加する
schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)
# 3.3.インデックスパラメータの準備
index_params = client.prepare_index_params()
# 3.4.インデックスの追加
index_params.add_index(
フィールド名="my_id"
)
index_params.add_index(
フィールド名="my_vector"、
index_type="AUTOINDEX"、
metric_type="IP"
)
# 3.5.コレクションの作成
client.create_collection(
collection_name="customized_setup"、
schema=schema、
index_params=index_params
)
上記のセットアップでは、スキーマやインデックス・パラメータなど、コレクションの作成時にさまざまな側面を柔軟に定義できます。
データの挿入
クイック・セットアップ・モードとカスタマイズ・セットアップ・モードの両方で作成されたコレクションは、 インデックス付けされ、ロードされました。準備ができたら、サンプル・データを挿入できます。
# 4.コレクションへのデータの挿入
# 4.1.データの準備
data=[
{"id":0, "vector":[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color":「pink_8682"}、
# その他のデータ...
]
# 4.2.データの挿入
res = client.insert(
コレクション名="quick_setup"、
data=data
)
print(res)
エンティティの取得
取得するエンティティのIDがわかっていれば、以下のようにIDでエンティティを取得できる:
# 5.IDでエンティティを取得する
res = client.get(
コレクション名="quick_setup"、
ids=[1,2,3]、
output_fields=["color", "vector"].
)
print(res)
エンティティの削除
Milvusでは、IDやフィルタによるエンティティの削除が可能です。
# 6.IDによるエンティティの削除
res = client.delete(
コレクション名="quick_setup"、
ids=[0,1,2,3,4]。
)
print(res)
コレクションを削除する
終わったら、コレクションを削除するのを忘れないこと:
# 7.コレクションの削除
client.drop_collection(
コレクション名="quick_setup"
)
client.drop_collection(
コレクション名="customized_setup"
)
このガイドでは、Milvusを使用してデータを挿入、取得、削除する方法の概要と、コレクションの作成について説明しました。データの挿入処理には時間がかかることがあります。データ挿入後、類似検索を行う前に数秒待つことをお勧めします。フィルター式は検索リクエストでもクエリーリクエストでも使用できます。ただし、クエリー要求では必須です。
9.Milvusでのオープンソース課題の提出
Milvusベクターデータベースで問題が発生した場合、問題を提出するプロセスは簡単ですが、メンテナが問題を理解し、効率的に対処できるよう、細部に注意を払う必要があります:
1.既存の問題のチェック:既存の問題をチェックする**: 新しい問題を提出する前に、Milvus GitHub Issues page にアクセスし、誰かが同じ問題を既に報告していないかチェックしてください。これにより、重複した課題報告を避けることができます。
2.Create a New Issue:問題がまだ報告されていない場合は、新しい問題を作成してください。以下を含む詳細な説明を必ず記入してください:
再現するためのステップ**:バグを再現するための手順を明確に記述してください。これはメンテナが実際に問題を確認するために重要です。
Expected Outcome:上記のステップを踏んだときに何が起こると予想されるかを記述してください。
実際の結果**:エラーメッセージや誤った動作を含め、実際に何が起こったかを明確に記述してください。
環境の詳細Milvusのバージョン、オペレーティングシステム、関連する設定などの詳細を含める。
ログ/エラーメッセージ**:ログやエラーメッセージがあれば添付してください。ログをフォーマットして読みやすくするにはMarkdownを使用してください。
3.課題を提出する:必要な情報をまとめたら、課題を提出してください。Milvusコミュニティとメンテナーがそれをレビューし、フィードバックを提供したり、必要であればさらなる情報を求めたりします。
Milvus デプロイメントに関する一般的な問題のトラブルシューティング
Milvusの一般的な配備に関する問題については、以下のトラブルシューティングのステップを検討してください:
Dockerログの確認**:コンテナでMilvusを実行している場合、
docker logs <container_id>コマンドを使用して、何が間違っているのかを示すエラーメッセージを確認します。互換性の確認**:Milvusデプロイのすべてのコンポーネントが互いに互換性があることを確認してください。MilvusのGitHubリポジトリのドキュメントには、多くの場合、特定のバージョン要件と互換性情報が含まれています。
設定チェック**:すべての設定ファイルが Milvus GitHub リポジトリ で提供されているドキュメントに従って正しく設定されていることを確認します。
Milvusコミュニティとサポートリソース
Milvusについてさらにサポートが必要な場合は、いくつかのサポートリソースにアクセスすることができます:
Discord上のMilvusコミュニティ**:Discord上のMilvusコミュニティに参加すると、他のユーザーやMilvusチームからリアルタイムのディスカッションやサポートを受けることができます。この招待リンクから参加することができます:Milvus Discord.
GitHub ディスカッション:より体系的な議論やアイデアの共有については、Milvus Discussions on GitHub をご覧ください。
GCP デプロイメント:GCP特有のデプロイに関する問題については、Google Cloud Platform ドキュメント を参照するか、GCPサポートにお問い合わせください。
これらのリソースを効果的に活用することで、問題を解決し、Milvusを最大限に活用することができます。
読み続けて

MilvusとOpenAIによるセマンティック検索
このガイドでは、MilvusとOpenAIのEmbedding APIを統合したセマンティック検索機能について、書籍のタイトル検索をユースケース例としてご紹介します。

MilvusでJSONデータをベクトル化し、類似性検索を行う
この記事では、MilvusがJSONデータのベクトル化、取り込み、類似検索をどのように効率化するかを紹介する。

Gemini 1.5、BGE-M3、Milvus Lite、LangChainによるマルチモーダルRAGの構築
マルチモーダルRAGは、異なるモダリティからのデータをコンテキストとして受け入れることで、RAGを拡張する。Gemini 1.5、BGE-M3、Milvus、LangChainを使った構築方法を紹介する。
