Helmチャートを使用したGPUサポート付きMilvusの実行

このページでは、Helm Chartを使用してGPUをサポートしたMilvusインスタンスを起動する方法を説明します。

概要

Helmはチャートと呼ばれるパッケージングフォーマットを使用します。チャートとは、Kubernetesリソースの関連セットを記述したファイルの集まりです。Milvusは、Milvusの依存関係やコンポーネントをデプロイするのに役立つチャートのセットを提供します。Milvus Helm Chartは、Helmパッケージマネージャを使用してKubernetes (K8s)クラスタ上でMilvusデプロイメントをブートストラップするソリューションです。

前提条件

イメージのプル時に問題が発生した場合は、community@zilliz.comまで問題の詳細をご連絡ください。

Milvus 用 Helm チャートのインストール

HelmはK8sパッケージマネージャであり、Milvusの迅速な導入に役立ちます。

  1. Milvus Helmリポジトリを追加します。
$ helm repo add milvus https://zilliztech.github.io/milvus-helm/

https://milvus-io.github.io/milvus-helm/ にある Milvus Helm Charts リポジトリはアーカイブされ、https://zilliztech.github.io/milvus-helm/ から以下のように更新を取得できます:

helm repo add zilliztech https://zilliztech.github.io/milvus-helm
helm repo update
# upgrade existing helm release
helm upgrade my-release zilliztech/milvus

アーカイブされたリポジトリは4.0.31までのチャートで利用可能です。それ以降のリリースについては、代わりに新しいレポを使用してください。

  1. ローカルでのチャート更新
$ helm repo update

Milvusの起動

Helmチャートをインストールしたら、Kubernetes上でMilvusを起動できます。このセクションでは、GPUをサポートしたMilvusを起動する手順を説明します。

リリース名、チャート、変更するパラメータを指定して、HelmでMilvusを起動する必要があります。このガイドでは、リリース名としてmy-release を使用します。別のリリース名を使用するには、以下のコマンドのmy-release を使用しているものに置き換えてください。

Milvusでは、1つまたは複数のGPUデバイスをMilvusに割り当てることができます。

1.単一のGPUデバイスを割り当てる

GPUをサポートするMilvusでは、1つ以上のGPUデバイスを割り当てることができます。

  • Milvusクラスタ

    cat <<EOF > custom-values.yaml
    dataNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
    queryNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
    EOF
    
    $ helm install my-release milvus/milvus -f custom-values.yaml
    
  • Milvusスタンドアロン

    cat <<EOF > custom-values.yaml
    standalone:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
    EOF
    
    $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsarv3.enabled=false -f custom-values.yaml
    

2.複数のGPUデバイスの割り当て

Milvusには、1つのGPUデバイスに加えて、複数のGPUデバイスを割り当てることができます。

  • Milvusクラスタ

    cat <<EOF > custom-values.yaml
    dataNode:
      resources:
        requests:
          nvidia.com/gpu: "2"
        limits:
          nvidia.com/gpu: "2"
    queryNode:
      resources:
        requests:
          nvidia.com/gpu: "2"
        limits:
          nvidia.com/gpu: "2"
    EOF
    

    上記の構成では、4つのCPUが利用可能で、各dataNodeとqueryNodeは2つのGPUを使用します。dataNodeとqueryNodeに異なるGPUを割り当てるには、設定ファイルのextraEnv

    cat <<EOF > custom-values.yaml
    dataNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
      extraEnv:
        - name: CUDA_VISIBLE_DEVICES
          value: "0"
    queryNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
      extraEnv:
        - name: CUDA_VISIBLE_DEVICES
          value: "1"
    EOF
    
    $ helm install my-release milvus/milvus -f custom-values.yaml
    
    • リリース名にはアルファベット、数字、ダッシュのみを使用します。リリース名には、文字、数字、およびダッシュのみを含める必要があります。リリース名にドットを使用することはできません。
    • デフォルトのコマンドラインは、Helmを使用してMilvusをインストールする際にMilvusのクラスタバージョンをインストールします。Milvusをスタンドアロンでインストールする場合は、さらなる設定が必要です。
    • Kuberenetesのdeprecated API migration guideによると、PodDisruptionBudgetのpolicy/v1beta1APIバージョンはv1.25から提供されなくなった。代わりにpolicy/v1APIバージョンを使用するようにマニフェストおよびAPIクライアントを移行することが推奨されます。
      Kuberenetes v1.25以降でPodDisruptionBudgetのpolicy/v1beta1APIバージョンを使用しているユーザのための回避策として、代わりに以下のコマンドを実行してmilvusをインストールすることができます:
      helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
    • 詳細はMilvus Helm ChartおよびHelmを参照してください。
  • Milvusスタンドアローン

    cat <<EOF > custom-values.yaml
    dataNode:
      resources:
        requests:
          nvidia.com/gpu: "2"
        limits:
          nvidia.com/gpu: "2"
    queryNode:
      resources:
        requests:
          nvidia.com/gpu: "2"
        limits:
          nvidia.com/gpu: "2"
    EOF
    

    上記の構成では、4つのCPUが使用可能で、各dataNodeとqueryNodeは2つのGPUを使用します。dataNodeとqueryNodeに異なるGPUを割り当てるには、設定ファイルのextraEnvを以下のように設定することで、それに応じて設定を変更することができます:

    cat <<EOF > custom-values.yaml
    dataNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
      extraEnv:
        - name: CUDA_VISIBLE_DEVICES
          value: "0"
    queryNode:
      resources:
        requests:
          nvidia.com/gpu: "1"
        limits:
          nvidia.com/gpu: "1"
      extraEnv:
        - name: CUDA_VISIBLE_DEVICES
          value: "1"
    EOF
    
    $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsarv3.enabled=false -f custom-values.yaml
    

2.Milvusステータスのチェック

以下のコマンドを実行して、Milvusのステータスをチェックします:

$ kubectl get pods

Milvusが起動すると、READY 列にすべてのPodの1/1 が表示されます。

  • Milvusクラスタ

    NAME                                             READY  STATUS   RESTARTS  AGE
    my-release-etcd-0                                  1/1     Running     0             3m24s
    my-release-etcd-1                                  1/1     Running     0             3m24s
    my-release-etcd-2                                  1/1     Running     0             3m24s
    my-release-milvus-datanode-698dbf7d77-rjkkq        1/1     Running     0             3m24s
    my-release-milvus-mixcoord-856d666559-rpj8z        1/1     Running     0             3m24s
    my-release-milvus-proxy-7f7cf47689-pzltw           1/1     Running     0             3m24s
    my-release-milvus-querynode-7fb6d5b5f8-92phj       1/1     Running     0             3m24s
    my-release-milvus-streamingnode-5867bfbcbf-cg9xx   1/1     Running     0             3m24s
    my-release-minio-0                                 1/1     Running     0             3m24s
    my-release-minio-1                                 1/1     Running     0             3m24s
    my-release-minio-2                                 1/1     Running     0             3m24s
    my-release-minio-3                                 1/1     Running     0             3m24s
    my-release-pulsarv3-bookie-0                       1/1     Running     0             3m24s
    my-release-pulsarv3-bookie-1                       1/1     Running     0             3m24s
    my-release-pulsarv3-bookie-2                       1/1     Running     0             3m24s
    my-release-pulsarv3-bookie-init-p8hcq              0/1     Completed   0             3m24s
    my-release-pulsarv3-broker-0                       1/1     Running     0             3m24s
    my-release-pulsarv3-broker-1                       1/1     Running     0             3m24s
    my-release-pulsarv3-proxy-0                        1/1     Running     0             3m24s
    my-release-pulsarv3-proxy-1                        1/1     Running     0             3m24s
    my-release-pulsarv3-pulsar-init-8kjsj              0/1     Completed   0             3m24s
    my-release-pulsarv3-recovery-0                     1/1     Running     0             3m24s
    my-release-pulsarv3-zookeeper-0                    1/1     Running     0             3m24s
    my-release-pulsarv3-zookeeper-1                    1/1     Running     0             3m24s
    my-release-pulsarv3-zookeeper-2                    1/1     Running     0             3m24s
    
  • Milvusスタンドアロン

    NAME                                               READY   STATUS      RESTARTS   AGE
    my-release-etcd-0                                  1/1     Running     0          30s
    my-release-milvus-standalone-54c4f88cb9-f84pf      1/1     Running     0          30s
    my-release-minio-5564fbbddc-mz7f5                  1/1     Running     0          30s
    

3.ローカルポートをMilvusに転送する。

Milvusサーバがリッスンしているローカルポートを確認します。ポッド名を自分のものに置き換えてください。

$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
19530

次に、以下のコマンドを実行し、ローカルポートをMilvusがリッスンしているポートに転送する。

$ kubectl port-forward service/my-release-milvus 27017:19530
Forwarding from 127.0.0.1:27017 -> 19530

オプションとして、上記のコマンドで27017:19530 の代わりに:19530 を使用すると、kubectl にローカルポートを割り当てさせることができ、ポートの競合を管理する必要がなくなります。

デフォルトでは、kubectlのポートフォワーディングはlocalhost のみをリッスンします。Milvusに選択したIPアドレスまたはすべてのIPアドレスをリッスンさせたい場合は、address フラグを使用してください。以下のコマンドは、port-forwardをホストマシンのすべてのIPアドレスでリッスンするようにします。

$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
Forwarding from 0.0.0.0:27017 -> 19530

これで、転送されたポートを使ってMilvusに接続できるようになります。

Milvus WebUIへのアクセス

MilvusにはMilvus WebUIというGUIツールが組み込まれており、ブラウザからアクセスすることができます。Milvus WebUIは、シンプルで直感的なインターフェースにより、システムの監視性を向上させます。Milvus Web UIを使用することで、Milvusのコンポーネントや依存関係の統計やメトリクスの観察、データベースやコレクションの詳細の確認、Milvusの詳細な設定の一覧などを行うことができます。Milvus Web UIの詳細については、Milvus WebUIを参照してください。

Milvus Web UIへのアクセスを有効にするには、プロキシポッドをローカルポートにポートフォワードする必要があります。

$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
Forwarding from 0.0.0.0:27018 -> 9091

これで、Milvus Web UI にhttp://localhost:27018 からアクセスできるようになります。

Milvusのアンインストール

以下のコマンドを実行し、Milvusをアンインストールします。

$ helm uninstall my-release

次の作業

Milvusをインストールしたら、次のことができます: