GPU服务器安装MilvusDB手记

目录

背景

操作步骤回顾说明

1、关于安装方式选择

2、准备镜像方面的物料

2-1、下载镜像物料

2-2、将成功下载后的镜像输出到文件

2-3、在测试服务器上准备docker与docker-compose环境

2-4、将准备好的物料上传到测试服务器并使用docker-compose命令启动相关容器

3、对于GPU环境的思考后返工

3-1、重新下载docker-compose.yml文件

[3-2、解决nvidia-smi报错:command not found的问题](#3-2、解决nvidia-smi报错:command not found的问题)

3-2-1、将nvidia-driver-local-repo-kylin10-550.163.01-1.0-1.x86_64.rpm包上传到测试服务器

3-2-2、执行前置准备工作,安装编译套件、内核开发包,用来编译NVIDIA内核模块

3-2-3、其他的前置操作

3-2-4、安装本地仓库包

3-2-5、清理旧缓存,加载本地repo

3-2-6、重启与验证

[3-3、解决nvidia-smi报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is install的问题](#3-3、解决nvidia-smi报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is install的问题)

3-3-1、这个报错的原因其实不太好解释,之后又补充了1个命令

3-3-2、验证命令nvidia-smi

3-4、nvidia-container-toolkit工具的适配Docker安装

3-4-1、在可以联网机器上准备好相关的.rpm包

3-4-2、将上述的.rpm包都上传到测试服务器上,做本地安装与验证

[3-4-3、自动配置 nvidia 运行时](#3-4-3、自动配置 nvidia 运行时)

3-4-4、重启Docker

3-4-5、确认目前测试机器中的Docker镜像的情况

3-4-6、启动容器

3-4-7、验证查看容器的运行情况

3-4-8、再次验证nvidia-smi命令

小结


背景

最近在项目中,有学习使用向量数据库Milvus的需要。所以,学习研究了一下怎么安装单机版本的MilvusDB。在此,也希望把一些遇到的踩坑问题,做一下笔记记录,便于后续回顾。

主要参考的文献:https://milvus.io/docs/zh

测试服务器操作系统: Kylin Linux Advanced Server V10 (Halberd)

安装的版本说明:v2.6.12-GPU

联网情况说明:无法直接连接外网,有公司内部基础功能组件的yum源

操作步骤回顾说明

1、关于安装方式选择

一开始考虑使用比较简单一些的:Docker(Linux)方式 ,最后,验证下来有缺少组件的问题,无法成功完成安装。从而,之后,真正选择的方案是Docker Compose(Linux)方式。

2、准备镜像方面的物料

2-1、下载镜像物料

https://github.com/milvus-io/milvus/releases/download/v2.6.12/milvus-standalone-docker-compose.yml

阅读docker-compose.yml(将下载得到的milvus-standalone-docker-compose.yml更名为docker-compose.yml,最后经过验证证明这个milvus版本其实还是使用了CPU的能力)文件内容

确认需要3个主要镜像:

使用docker镜像的拉取命令,将3个主要镜像在可联网的机器上做一下下载拉取:

bash 复制代码
docker pull quay.io/coreos/etcd:v3.5.25
docker pull minio/minio:RELEASE.2024-12-18T13-15-44Z
docker pull milvusdb/milvus:v2.6.12

**备注:**此处需要配置国内镜像源或者可以直接访问外部网络,否则,下载过程将会非常缓慢甚至超时中断。

2-2、将成功下载后的镜像输出到文件

由于最终需要部署milvusdb的测试服务器并不存在联网的条件,所以,需要提前准备好相关的离线物料用于上传和使用。

bash 复制代码
# 输出镜像到文件
docker save -o etcd.tar quay.io/coreos/etcd:v3.5.25
docker save -o minio.tar minio/minio:RELEASE.2024-12-18T13-15-44Z
docker save -o milvusdb.tar milvusdb/milvus:v2.6.12
# 做一下压缩处理,便于文件传送
tar -zcvf etcd.tar.gz etcd.tar
tar -zcvf minio.tar.gz minio.tar
tar -zcvf milvusdb.tar.gz milvusdb.tar

2-3、在测试服务器上准备docker与docker-compose环境

具体操作步骤可以参考:离线安装docker与docker-compose手记-CSDN博客

2-4、将准备好的物料上传到测试服务器并使用docker-compose命令启动相关容器

导入相关docker镜像:

bash 复制代码
docker load -i etcd.tar
docker load -i minio.tar
docker load -i milvusdb.tar

并将docker-compose.yml文件放入指定的项目文件夹下,我这边选择的项目文件夹路径是:

/root/project/milvus_db

可选操作,在该目录下再新建一个.env文件,用于管理环境变量:DOCKER_VOLUME_DIRECTORY

bash 复制代码
# .env 文件内容
DOCKER_VOLUME_DIRECTORY=/data/milvus_db

启动相关的容器:

bash 复制代码
docker-compose up -d

验证容器的运行效果:

3、对于GPU环境的思考后返工

根据以上步骤,milvus似乎是被成功安装成功,也正常运行了。但是,为啥感觉没有怎么体现GPU显卡的性能的设置呢?这个问题,则成了很困扰我的一个问题点。于是乎,我再次搜索相关Docker容器获取宿主机GPU资源的文章以及milvus官网对于这段内容的描述。

我发现之前安装的Milvus其实本身还是借助CPU的计算能力,并没有使用到GPU的计算能力。

于是,便开始了调整返工之旅。

3-1、重新下载docker-compose.yml文件

Releases · milvus-io/milvus · GitHub

找到v2.6.12版本后,进行选取和下载

修改需要拉取的milvus镜像

完整的带-gup结尾的.yml文件内容如下:

bash 复制代码
version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.25
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2024-12-18T13-15-44Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
    command: minio server /minio_data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.6.12-gpu
    command: ["milvus", "run", "standalone"]
    security_opt:
    - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
      MQ_TYPE: woodpecker
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 60s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"
      - "9091:9091"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: ["gpu"]
              device_ids: ["0"]
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus
bash 复制代码
docker pull milvusdb/milvus:v2.6.12-gpu

再次将相关更新后的镜像和docker-compose.yml文件都上传到测试服务器,并启动容器。这次,

对应容器就启动失败了。失败的原因是,宿主机的GPU显卡驱动未安装,且docker的GPU运行时(nvidia-container-toolkit工具)也未配置,则docker容器无法使用到宿主机的GPU计算能力。

3-2、解决nvidia-smi报错:command not found的问题

目前,测试机器的基本性能参数如下:

bash 复制代码
[root@localhost ~]# lspci | grep -i nvidia
36:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
37:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
9d:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
9e:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
[root@localhost yum.repos.d]# uname -a
Linux localhost.localdomain 4.19.90-89.11.v2401.ky10.x86_64 #1 SMP Tue May 7 18:33:01 CST 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost yum.repos.d]# uname -r
4.19.90-89.11.v2401.ky10.x86_64
[root@localhost yum.repos.d]# hostnamectl
   Static hostname: localhost.localdomain
         Icon name: computer-server
           Chassis: server
        Machine ID: ##################################
           Boot ID: ##################################
  Operating System: Kylin Linux Advanced Server V10 (Halberd)
            Kernel: Linux 4.19.90-89.11.v2401.ky10.x86_64
      Architecture: x86-64

前往NVIDIA驱动官网查询并下载需要适配测试环境机器的显卡驱动.rpm包

下载 NVIDIA 官方驱动 | NVIDIA

3-2-1、将nvidia-driver-local-repo-kylin10-550.163.01-1.0-1.x86_64.rpm包上传到测试服务器
3-2-2、执行前置准备工作,安装编译套件、内核开发包,用来编译NVIDIA内核模块
bash 复制代码
yum install -y gcc gcc-c++ make kernel-devel-$(uname -r) kernel-headers-$(uname -r) libglvnd-devel
3-2-3、其他的前置操作
bash 复制代码
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf

dracut -f /boot/initramfs-$(uname -r).img $(uname -r)

# 重启
reboot

# 执行此命令后确认无任何输出
lsmod | grep nouveau
3-2-4、安装本地仓库包
bash 复制代码
rpm -ivh /root/nvidia-driver-local-repo-kylin10-550.163.01-1.0-1.x86_64.rpm

作用:

在 /etc/yum.repos.d/ 生成本地 nvidia 源文件;

导入 NVIDIA 官方 GPG 校验密钥;

后续 yum 会从这个本地 rpm 仓库读取驱动安装包。

3-2-5、清理旧缓存,加载本地repo
bash 复制代码
yum clean all && yum makecache
# 安装DKMS版数据中心驱动(Tesla T4推荐,自动带nvidia-smi)
yum -y module install nvidia-driver:latest-dkms
3-2-6、重启与验证
bash 复制代码
reboot
# 预期会输出 4 张 Tesla T4 显卡信息,则代表显卡驱动安装完成。
nvidia-smi

**特别备注:**此处又出现了1个新的报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is install

其实,在一开始为了解决nvidia-smi出现"command not found"问题时候,不知道因为哪步的命令执行还曾经导致过系统基础命令完全失效的场景,不得不重装系统来解决,所以,这块还是让人感觉问题挺多的。

3-3、解决nvidia-smi报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is install的问题

3-3-1、这个报错的原因其实不太好解释,之后又补充了1个命令
bash 复制代码
yum -y install nvidia-driver
3-3-2、验证命令nvidia-smi
bash 复制代码
[root@localhost ~]# nvidia-smi
Fri Jun 26 17:06:07 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla T4                       Off |   00000000:36:00.0 Off |                    0 |
| N/A   56C    P0             31W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  Tesla T4                       Off |   00000000:37:00.0 Off |                    0 |
| N/A   52C    P0             30W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   2  Tesla T4                       Off |   00000000:9D:00.0 Off |                    0 |
| N/A   52C    P0             29W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   3  Tesla T4                       Off |   00000000:9E:00.0 Off |                    0 |
| N/A   53C    P0             30W /   70W |       1MiB /  15360MiB |      7%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

这次就可以确实看到4块显卡的基础信息了。

3-4、nvidia-container-toolkit工具的适配Docker安装

3-4-1、在可以联网机器上准备好相关的.rpm包
bash 复制代码
yum install -y nvidia-container-toolkit nvidia-container-runtime
3-4-2、将上述的.rpm包都上传到测试服务器上,做本地安装与验证
bash 复制代码
yum localinstall -y *.rpm

# 验证
which nvidia-container-runtime
nvidia-ctk --version
3-4-3、自动配置 nvidia 运行时
bash 复制代码
# 自动配置 nvidia 运行时
nvidia-ctk runtime configure --runtime=docker
该命令会自动写入 /etc/docker/daemon.json,生成内容大致如下:
{
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}
3-4-4、重启Docker
bash 复制代码
# 重启 Docker 服务
systemctl restart docker
# 验证docker状态
systemctl status docker
3-4-5、确认目前测试机器中的Docker镜像的情况
bash 复制代码
[root@localhost milvus_db]# docker images
REPOSITORY            TAG                            IMAGE ID       CREATED         SIZE
milvusdb/milvus       v2.6.12-gpu                    a6eb81204bf4   3 months ago    6.33GB
quay.io/coreos/etcd   v3.5.25                        ce1ffcaa22b9   7 months ago    64.7MB
minio/minio           RELEASE.2024-12-18T13-15-44Z   6aed1b694901   18 months ago   179MB
3-4-6、启动容器
bash 复制代码
# 启动运行容器,后台运行
docker-compose up -d
3-4-7、验证查看容器的运行情况
bash 复制代码
[root@localhost milvus_db]# docker-compose ps
NAME                IMAGE                                      COMMAND                  SERVICE      CREATED        STATUS                  PORTS
milvus-etcd         quay.io/coreos/etcd:v3.5.25                "etcd -advertise-cli..."   etcd         20 hours ago   Up 20 hours (healthy)   2379-2380/tcp
milvus-minio        minio/minio:RELEASE.2024-12-18T13-15-44Z   "/usr/bin/docker-ent..."   minio        20 hours ago   Up 20 hours (healthy)   0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp
milvus-standalone   milvusdb/milvus:v2.6.12-gpu                "/tini -- milvus run..."   standalone   20 hours ago   Up 20 hours (healthy)   0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp

STATUS均显示"healthy",说明:容器均被成功启动了。

3-4-8、再次验证nvidia-smi命令
bash 复制代码
[root@localhost ~]# nvidia-smi
Tue Jun 30 17:32:31 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla T4                       Off |   00000000:36:00.0 Off |                    0 |
| N/A   48C    P0             29W /   70W |    1127MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  Tesla T4                       Off |   00000000:37:00.0 Off |                    0 |
| N/A   41C    P0             29W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   2  Tesla T4                       Off |   00000000:9D:00.0 Off |                    0 |
| N/A   40C    P0             28W /   70W |       1MiB /  15360MiB |      8%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   3  Tesla T4                       Off |   00000000:9E:00.0 Off |                    0 |
| N/A   41C    P0             29W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A    857843      C   milvus                                       1124MiB |
+-----------------------------------------------------------------------------------------+

备注:可以看到此时Processes 栏出现了0号显卡被进程milvus 使用的信息。初步验证说明创建的milvus数据库使用到了GPU显卡的计算分析能力。

小结

此次在GPU显卡环境中安装milvusdb可谓是一波多折了。从安装方式的选择,各个软件的版本确定,可联网测试机器的模拟创建,到后面首次安装了没有用到GPU计算能力的版本的milvus,再到返工过程中莫名导致系统损毁需要重装操作系统。。。。。。包括至今都不知道"nvidia-smi"命令究竟是怎么就从"command not found"状态到可以正常工作了。这其中,实在是有太多需要继续去总结,学习了解的地方了。我也希望将整个过程分享给到大家,让大家少踩坑之余,有更多信心和勇气面对陌生的技术领域。