Dify で使うためにベクトルDBの Milvus を Kubernetes のクラスターにデプロイして、高品質インデックス化を行う

Jun 6, 2024, 11:19 PM
前回「Kubernetes に Dify をインストールして、Cloudflare Tunnel でインターネット経由で見られるようにしたときの備忘録」で Dify をインストールしましたが、この手順では、ベクトルDBの Milvus がインストールされていませんので、インデックス方法で「高品質」を選択するとエラーになります。


エラー内容

6 validation errors for MilvusConfig host none is not an allowed value (type=type_error.none.not_allowed) port none is not an allowed value (type=type_error.none.not_allowed) user none is not an allowed value (type=type_error.none.not_allowed) password none is not an allowed value (type=type_error.none.not_allowed) secure none is not an allowed value (type=type_error.none.not_allowed) __root__ config MILVUS_HOST is required (type=value_error)

Milvus とは

高性能な向けのベクトルデータベースで、特に大規模なベクトル検索と類似性検索に優れています。ベクトルデータベースとは、主に機械学習やディープラーニングで生成されたベクトルデータ(数値の配列)を効率的に格納し、検索するためのデータベースです。Milvusは以下のような特徴があります。

特徴

  1. 高性能な検索
    • Milvusは、ベクトル検索のために設計されており、特に大規模なデータセットに対して高速な検索を提供します。これにより、数百万から数十億のベクトルを扱うことが可能です。
  2. スケーラビリティ
    • 分散アーキテクチャに基づいており、ノードの追加によって容易にスケールアウトできます。これにより、データセットの増加に応じてシステムの性能を維持することができます。
  3. フレキシブルなデプロイ
    • クラウド、オンプレミス、エッジデバイスなど、さまざまな環境にデプロイ可能です。また、Kubernetes上でのデプロイもサポートしています。
  4. 多様なインデックス作成方法
    • 複数のインデックス作成アルゴリズムをサポートしており、ユーザーのニーズに応じて最適なインデックスを選択できます。たとえば、IVF(Inverted File)、HNSW(Hierarchical Navigable Small World)、ANNOY(Approximate Nearest Neighbors Oh Yeah)などがあります。
  5. 豊富なAPIとツール
    • Python、Java、Goなどのさまざまなプログラミング言語に対応したAPIを提供しています。また、RESTful APIやgRPCもサポートしており、統合が容易です。

Milvus のインストール要件

https://milvus.io/docs/prerequisite-helm.md
を見ると、
CPU: Intel 2nd Gen Core CPU or higher, Apple Silicon
と書かれていますが、
https://github.com/milvus-io/milvus/discussions/30345
によると、Milvus 自体は、arm64 に対応しているが、クラスターを作るときに依存する Pulsar v2.8.2 が、arm64 に対応していないためクラスターは組めないそうです。
なので、スタンドアロンで作っていきます。Pulsar v3.0 は arm64 に対応しているので、そのうち、解決すると思います。


Helmでインストール

https://milvus.io/docs/install_standalone-helm.md
こちらの手順にそって行っていきます。

ストレージクラスの作成

# nano storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-path
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: false

# kubectl apply -f storageclass.yaml

確認

# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 2s

Local Path Provisionerのインストール

# kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
# kubectl get pods -n local-path-storage
NAME READY STATUS RESTARTS AGE
local-path-provisioner-66dc6d9f95-vnlrb 1/1 Running 0 104s

Heml Chart のインストール

# helm repo add milvus https://zilliztech.github.io/milvus-helm/
# helm repo update

Milvus をデプロイする

# kubectl create namespace milvus
# helm install microai-milvus milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false --namespace milvus
一旦、デフォルトでデプロイしてみます。
詳しい設定は、https://artifacthub.io/packages/helm/milvus/milvus に色々載っています。


起動確認

# kubectl get pod,svc -n milvus                                                                                                                                                                                                                      master-01: Thu Jun  6 21:41:44 2024

NAME READY STATUS RESTARTS AGE
pod/microai-milvus-etcd-0 1/1 Running 0 17m
pod/microai-milvus-minio-7cb6f48547-ctvvv 1/1 Running 0 17m
pod/microai-milvus-standalone-79799dbc5b-grt9x 1/1 Running 3 (10m ago) 17m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/microai-milvus ClusterIP 11.1.107.128 <none> 19530/TCP,9091/TCP 17m
service/microai-milvus-etcd ClusterIP 11.1.150.149 <none> 2379/TCP,2380/TCP 17m
service/microai-milvus-etcd-headless ClusterIP None <none> 2379/TCP,2380/TCP 17m
service/microai-milvus-minio ClusterIP 11.1.145.175 <none> 9000/TCP 17m
何度かエラーを繰り返しながらも、無事起動してくれました🍺

アンインストール方法

helm uninstall microai-milvus

Dify から接続して、「高品質」でインデックスする

本日はインストールまでと思っていましたが、思ったよりすんなりインストールで来たいので、このまま Dify からの接続まで行ってしまいます。

https://microai.jp/blog/f5a4dc47-3244-4e89-ba07-4be01f636baa
上記でインストールした際に使用した作成した dify-custome.yaml を修正していきます。

# nano dify-custome.yaml

            - name: VECTOR_STORE
value: milvus
上記の記載が2箇所あります。
それぞれの下に設定を追加して
            - name: VECTOR_STORE
value: milvus
- name: MILVUS_HOST
value: "microai-milvus.milvus.svc.cluster.local"
- name: MILVUS_PORT
value: "19530"
- name: MILVUS_USER
value: "root"
- name: MILVUS_PASSWORD
value: "Milvus"
- name: MILVUS_SECURE
value: "false"
このようにします。繰り返しになりますが2箇所どちらも同じ修正を加えてください。
"microai-milvus.milvus.svc.cluster.local"
は、皆様の環境にあわせて書き換えてください。他の項目はデフォルト値です。

設定適用

# kubectl apply -f dify-custome.yaml


連携確認


見事にできました!🍺
Kubernetes に Dify をインストールして、Cloudflare Tunnel でインターネット経由で見られるようにしたときの備忘録Kubernetes に Dify をインストールして、Cloudflare Tunnel でインターネット経由で見られるようにしたときの備忘録
simple-chat-webui-for-dify を公開しましたsimple-chat-webui-for-dify を公開しました