安装支持 GPU 的 Milvus 单机版
在 NVIDIA 的贡献下,Milvus 现在可以使用 GPU 设备来构建索引和执行 ANN 搜索。本指南将向您展示如何在您的机器上安装支持 GPU 的 Milvus。
前提条件
在安装支持 GPU 的 Milvus 之前,请确保您满足以下前提条件:
-
您的 GPU 设备的计算能力为 6.0、7.0、7.5、8.0、8.6、9.0。要检查您的 GPU 设备是否满足要求,请在 NVIDIA 开发者网站上查看您的 GPU 计算能力。
-
您已经在支持的 Linux 发行版之一上安装了 GPU 设备的 NVIDIA 驱动程序,然后按照本指南安装了 NVIDIA Container Toolkit。
对于 Ubuntu 22.04 用户,您可以使用以下命令安装驱动程序和容器工具包:
$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545
对于其他操作系统的用户,请参考官方安装指南。
您可以通过运行以下命令来检查驱动程序是否已正确安装:
$ modinfo nvidia | grep "^version"
version: 545.29.06建议使用 545 及以上版本的驱动程序。
-
您已安装 Kubernetes 集群,并且已配置
kubectl
命令行工具以与您的集群通信。建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。
使用 minikube 创建 K8s 集群
我们建议使用 minikube 在 K8s 上安装 Milvus,这是一个允许您在本地运行 K8s 的工具。
1. 安装 minikube
有关更多信息,请参见安装 minikube。
2. 使用 minikube 启动 K8s 集群
安装 minikube 后,运行以下命令启动 K8s 集群。
$ minikube start --gpus all
3. 检查 K8s 集群状态
运行 $ kubectl cluster-info
检查您刚刚创建的 K8s 集群的状态。确保您可以通过 kubectl
访问 K8s 集群。如果您尚未在本地安装 kubectl
,请参见在 minikube 中使用 kubectl。
Minikube 在安装时依赖于默认的 StorageClass。通过运行以下命令检查依赖项。其他安装方法需要手动配置 StorageClass。有关更多信息,请参见更改默认 StorageClass。
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE
standard (default) k8s.io/minikube-hostpath Delete Immediate false 3m36s
启动带有 GPU 工作节点的 Kubernetes 集群
如果您更喜欢使用启用 GPU 的工作节点,可以按照以下步骤创建带有 GPU 工作节点的 K8s 集群。我们建议在具有 GPU 工作节点的 Kubernetes 集群上安装 Milvus,并使用已配置的默认存储类。
1. 准备 GPU 工作节点
有关更多信息,请参见准备 GPU 工作节点。
2. 在 Kubernetes 上启用 GPU 支持
有关更多信息,请参见使用 helm 安装 nvidia-device-plugin。
设置完成后,运行 kubectl describe node <gpu-worker-node>
查看 GPU 资源。命令输出应类似于以下内容:
Capacity:
...
nvidia.com/gpu: 4
...
Allocatable:
...
nvidia.com/gpu: 4
...
注意:在此示例中,我们设置了一个具有 4 个 GPU 卡的 GPU 工作节点。
3. 检查默认存储类
Milvus 依赖默认存储类来自动配置用于数据持久化的卷。运行以下命令检查存储类:
$ kubectl get sc
命令输出应类似于以下内容:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 461d
安装 Milvus 的 Helm Chart
Helm 是一个 K8s 包管理器,可以帮助您快速部署 Milvus。
- 将 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
# 升级现有的 helm release
helm upgrade my-release zilliztech/milvus
归档的仓库仍然可用于 4.0.31 及之前的版本。对于之后的版本,请使用新的仓库。
- 更新您的本地 chart 仓库。
$ helm repo update
启动 Milvus
安装 Helm chart 后,您可以在 Kubernetes 上启动 Milvus。在本节中,我们将指导您完成启动支持 GPU 的 Milvus 的步骤。
您应该通过指定 release 名称、chart 和您期望更改的参数来使用 Helm 启动 Milvus。在本指南中,我们使用 my-release
作为 release 名称。要使用不同的 release 名称,请将以下命令中的 my-release
替换为您使用的名称。
Milvus 允许您为 Milvus 分配一个或多个 GPU 设备。
-
分配单个 GPU 设备(推荐)
运行以下命令为 Milvus 分配单个 GPU 设备:
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
-
分配多个 GPU 设备
运行以下命令为 Milvus 分配多个 GPU 设备:
cat <<EOF > custom-values.yaml
indexNode:
resources:
requests:
nvidia.com/gpu: "2"
limits:
nvidia.com/gpu: "2"
queryNode:
resources:
requests:
nvidia.com/gpu: "2"
limits:
nvidia.com/gpu: "2"
EOF在上述配置中,indexNode 和 queryNode 共享两个 GPU。要为 indexNode 和 queryNode 分配不同的 GPU,您可以通过在配置文件中设置
extraEnv
来相应地修改配置,如下所示:cat <<EOF > custom-values.yaml
indexNode:
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
有关更多信息,请参见 Milvus Helm Chart 和 Helm。
检查正在运行的 pod 的状态:
$ kubectl get pods
Milvus 启动后,所有 pod 的 READY
列显示 1/1
。
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
连接到 Milvus
验证 Milvus 服务器正在监听哪个本地端口。用您自己的 pod 名称替换。
$ kubectl get pod my-release-milvus-standalone-54c4f88cb9-f84pf --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
19530
打开一个新的终端并运行以下命令,将本地端口转发到 Milvus 使用的端口。您也可以省略指定的端口,使用 :19530
让 kubectl
为您分配一个本地端口,这样您就不必管理端口冲突。
$ kubectl port-forward service/my-release-milvus 27017:19530
Forwarding from 127.0.0.1:27017 -> 19530
默认情况下,由 kubectl 转发的端口只监听 localhost。如果您希望 Milvus 服务器监听选定的 IP 或所有地址,请使用 address
标志。
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
Forwarding from 0.0.0.0:27017 -> 19530
卸载 Milvus
运行以下命令卸载 Milvus。
$ helm uninstall my-release
停止 K8s 集群
停止集群和 minikube VM,但不删除您创建的资源。
$ minikube stop
运行 minikube start
重启集群。
删除 K8s 集群
在删除集群和所有资源之前,运行 $ kubectl logs
获取 pod 的 pod_name
stderr
日志。
删除集群、minikube VM 和您创建的所有资源,包括持久卷。
$ minikube delete
下一步
安装 Milvus 后,您可以:
-
查看 Hello Milvus,使用不同的 SDK 运行示例代码,了解 Milvus 的功能。
-
学习 Milvus 的基本操作:
-
探索 Milvus Backup,一个用于 Milvus 数据备份的开源工具
-
探索 Birdwatcher,一个用于调试 Milvus 和动态配置更新的开源工具
-
探索 Attu,一个用于直观管理 Milvus 的开源 GUI 工具